Skip to main content

DoDo - A stateful agentic framework

Project description

dodo

PyPI version License: MIT

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 reasoning
  • redo(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

dodoai-0.1.3.tar.gz (22.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dodoai-0.1.3-py3-none-any.whl (27.1 kB view details)

Uploaded Python 3

File details

Details for the file dodoai-0.1.3.tar.gz.

File metadata

  • Download URL: dodoai-0.1.3.tar.gz
  • Upload date:
  • Size: 22.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for dodoai-0.1.3.tar.gz
Algorithm Hash digest
SHA256 4433af2f07c24e88e8f465880b39b9f0e1f98db39cfe600bc554592042e3602a
MD5 941c129b984939f7fc4e132fd6c60658
BLAKE2b-256 9b471e09e2717f14415c50d60670ac4186392de256e1d2dc1253034b41b0ddfd

See more details on using hashes here.

Provenance

The following attestation bundles were made for dodoai-0.1.3.tar.gz:

Publisher: publish.yml on steve-z-wang/dodo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dodoai-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: dodoai-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 27.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for dodoai-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 aac4ce6cadf12ba86782582981311d7e91a65e0d9c8015290a51e42a4cf8d72a
MD5 8205dd8835cc9691d39a9d43ba27830e
BLAKE2b-256 4bea08f9516aada99d19c20b70f6402681200fa427298257c939f15fe2c2b89a

See more details on using hashes here.

Provenance

The following attestation bundles were made for dodoai-0.1.3-py3-none-any.whl:

Publisher: publish.yml on steve-z-wang/dodo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page