DoDo - A stateful agentic framework
Project description
dodo
An AI workflow automation engine for browser automation, RPA, testing, and more.
Built for frameworks like webtask.
Installation
pip install dodoai
pip install dodoai[gemini] # With Gemini support
Overview
from dodo import Agent, Gemini
agent = Agent(llm=Gemini(), tools=[...])
# First time - LLM figures out the workflow
run = await agent.do("add item to cart")
# Later - replay without LLM (fast & cheap)
await agent.redo(run)
Core Concepts
Two simple methods for workflow automation:
do(task)- Execute workflow steps with LLM reasoningredo(run)- Replay recorded workflows without LLM
Features
Stateful workflows
Agent remembers context across multiple steps:
# Multi-step workflow with context
await agent.do("search for laptop on Amazon")
await agent.do("add the first result to cart")
await agent.do("proceed to checkout")
Efficient replay
Record once, replay when environment is similar:
# First time - LLM figures out the workflow (expensive)
run = await agent.do("add laptop to cart and checkout")
# Later - replay the same workflow (cheap)
await agent.redo(run)
Structured output
Get typed results using Pydantic models:
from pydantic import BaseModel
class ProductInfo(BaseModel):
name: str
price: float
in_stock: bool
run = await agent.do("extract product information", output_schema=ProductInfo)
product = run.output # Typed ProductInfo object
Use Cases
Browser automation:
# Automate web workflows
await agent.do("go to linkedin.com")
await agent.do("search for software engineers in SF")
await agent.do("message the first 5 results")
RPA (Robotic Process Automation):
# Automate repetitive workflows
await agent.do("login to portal")
await agent.do("navigate to reports section")
await agent.do("download monthly report")
Testing & QA:
# Record test cases, replay for regression
run = await agent.do("complete checkout flow")
# Regression test
await agent.redo(run)
Building Workflows
1. Define tools
Tools are the actions your agent can perform:
from dodo import tool
@tool
async def click_button(element_id: str) -> str:
"""Click a button on the page.
Args:
element_id (str): ID of button to click
"""
# Your automation logic
return "Button clicked"
@tool
class DatabaseTool:
"""Query the database."""
def __init__(self, db_connection):
self.db = db_connection
async def run(self, query: str) -> str:
"""
Args:
query (str): SQL query to execute
"""
return self.db.execute(query)
2. Define observation
Observation provides context to the agent:
async def observe():
"""Return current state for the agent to see."""
return [
f"Current page: {browser.current_url}",
f"Visible elements: {browser.get_elements()}",
]
3. Create and run agent
from dodo import Agent, Gemini
agent = Agent(
llm=Gemini(),
tools=[click_button, DatabaseTool(db)],
observe=observe
)
# Execute workflows
run = await agent.do("click login button and verify")
if run.output:
print("Workflow succeeded!")
4. Handle errors
from dodo import TaskAbortedError
try:
await agent.do("impossible task")
except TaskAbortedError as e:
print(f"Workflow aborted: {e}")
Run Objects
Every do() call returns a Run object with full execution details:
run = await agent.do("complete checkout")
run.output # Structured output (if output_schema provided)
run.feedback # Brief summary: "Checkout completed successfully"
run.action_log # Detailed trace of all actions taken
run.messages # Full conversation history
run.steps_used # Number of LLM calls made
Supported LLMs
from dodo import Gemini
# Gemini models
agent = Agent(llm=Gemini(model="gemini-2.0-flash-exp"))
agent = Agent(llm=Gemini(model="gemini-2.5-pro"))
Custom LLM:
from dodo import LLM
class MyLLM(LLM):
async def call_tools(self, messages, tools):
# Your LLM implementation
pass
Examples
- webtask - Browser automation framework built on dodo
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dodoai-0.1.4.tar.gz.
File metadata
- Download URL: dodoai-0.1.4.tar.gz
- Upload date:
- Size: 22.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db77d62ab6a9314f82b559c375c4e113c0f923354f0426c9386f7580aa68509f
|
|
| MD5 |
c6afe6f7fe66b9867ae9e83c200d1f24
|
|
| BLAKE2b-256 |
60b7f0d6d16ac5093d5dc0dda189fdf21978ee7d6cb5efdce8eaea87dd9d64fd
|
Provenance
The following attestation bundles were made for dodoai-0.1.4.tar.gz:
Publisher:
publish.yml on steve-z-wang/dodo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dodoai-0.1.4.tar.gz -
Subject digest:
db77d62ab6a9314f82b559c375c4e113c0f923354f0426c9386f7580aa68509f - Sigstore transparency entry: 737402830
- Sigstore integration time:
-
Permalink:
steve-z-wang/dodo@349d646dbb3a2591b3ded4cd8fbcd094ed5cb00d -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/steve-z-wang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@349d646dbb3a2591b3ded4cd8fbcd094ed5cb00d -
Trigger Event:
release
-
Statement type:
File details
Details for the file dodoai-0.1.4-py3-none-any.whl.
File metadata
- Download URL: dodoai-0.1.4-py3-none-any.whl
- Upload date:
- Size: 26.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b441b0a0399a1dfb9ae7b283011128a18abf0e39d7e0d91a14b733504f351d62
|
|
| MD5 |
4152402d615936ba138b077608ec171e
|
|
| BLAKE2b-256 |
f54d53e64955647e3f23c46abf6b8aca88ddf72166e661640b69cc5d35de8834
|
Provenance
The following attestation bundles were made for dodoai-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on steve-z-wang/dodo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dodoai-0.1.4-py3-none-any.whl -
Subject digest:
b441b0a0399a1dfb9ae7b283011128a18abf0e39d7e0d91a14b733504f351d62 - Sigstore transparency entry: 737402838
- Sigstore integration time:
-
Permalink:
steve-z-wang/dodo@349d646dbb3a2591b3ded4cd8fbcd094ed5cb00d -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/steve-z-wang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@349d646dbb3a2591b3ded4cd8fbcd094ed5cb00d -
Trigger Event:
release
-
Statement type: