Dobby

Python SDK

pip install dobby-ai-sdk — Python 3.9+, sync & async, type-safe.

Requires a Dobby Gateway API key. Get one from your Gateway dashboard.

Installation

pip install dobby-ai-sdk

Basic Usage — LLM Completions

from dobby_sdk import DobbyClient

client = DobbyClient(
    api_key="gk_user_...",
    org_id="org_...",
    tenant_id="tenant_...",
)

# LLM Completions (OpenAI-compatible)
response = client.chat.completions.create(
    model="claude-sonnet-4-20250514",
    messages=[{"role": "user", "content": "Explain AI agents in 3 sentences"}],
    max_tokens=200,
)
print(response.choices[0].message.content)

Streaming

# Streaming
stream = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "Write a haiku about agents"}],
    stream=True,
)
for chunk in stream:
    content = chunk.choices[0].delta.content or ""
    print(content, end="")

Task Management

# Create a task
task = client.tasks.create(
    title="Fix authentication bug",
    description="Login fails for SSO users",
    priority="high",
    agent_name="dobby-backend-agent",
)
print(f"Task created: {task['id']}")

# List pending tasks
pending = client.tasks.list(status="pending")
for t in pending.get("tasks", []):
    print(f"  - {t['title']} ({t['status']})")

# Update task status
client.tasks.update(task["id"], status="in_progress")

Approvals (Human-in-the-Loop)

# List pending approvals
pending = client.approvals.list(status="pending")

# Approve
client.approvals.approve("task_abc123", comment="LGTM, ship it!")

# Reject with reason
client.approvals.reject("task_def456", reason="Needs more test coverage")

Agent Fleet Management

# List fleet agents
agents = client.agents.list()

# Register an external agent
agent = client.agents.register(
    display_name="Research Agent",
    framework="crewai",
    protocol="a2a",
    endpoint_url="https://my-agent.example.com",
    capabilities=["research", "summarization"],
)
print(f"Agent registered: {agent['agent_id']}")
print(f"Gateway key: {agent['gateway_key_secret']}")

# Pause/resume
client.agents.pause(agent["agent_id"])
client.agents.resume(agent["agent_id"])

External Agent Triggers & Schedules

# Trigger an external agent immediately
result = client.agents.trigger("ext_abc123", payload={"topic": "AI governance"})
print(f"Trigger: {result['trigger_id']} — {result['status']}")

# Create a recurring schedule
client.agents.create_schedule("ext_abc123",
    name="Daily Blog Writer",
    schedule_config={"frequency": "daily", "time": "09:00"},
    trigger_payload={"topic": "AI governance"},
)

# Get trigger history with stats
history = client.agents.triggers("ext_abc123", include_stats=True)
print(f"Completed: {history['stats']['completed']}")

# Retry a failed trigger
client.agents.retry_trigger("ext_abc123", "trig_failed_id")

# Manage schedule
client.agents.update_schedule("ext_abc123", paused=True)
client.agents.delete_schedule("ext_abc123")

Cost Tracking (FinOps)

# Organization cost summary
summary = client.costs.summary(period="30d")
print(f"Total cost: ${summary.get('total_cost_usd', 0):.2f}")

# Per-agent breakdown
agents = client.costs.by_agent(period="7d")
for a in agents.get("agents", []):
    print(f"  {a['agent_name']}: ${a['cost_usd']:.4f}")

# Single agent deep-dive
profile = client.costs.agent_profile("ext_abc123")

Error Handling

from dobby_sdk import (
    DobbyAuthError,
    DobbyRateLimitError,
    DobbyBudgetExceededError,
    DobbyNotFoundError,
)

try:
    response = client.chat.completions.create(
        model="claude-sonnet-4-20250514",
        messages=[{"role": "user", "content": "Hello"}],
    )
except DobbyAuthError:
    print("Invalid or expired API key")
except DobbyRateLimitError as e:
    print(f"Rate limited. Retry after: {e.retry_after}s")
except DobbyBudgetExceededError:
    print("Budget limit reached — contact your admin")
except DobbyNotFoundError:
    print("Resource not found")

Async Support

from dobby_sdk import AsyncDobbyClient
import asyncio

async def main():
    async with AsyncDobbyClient(api_key="gk_user_...") as client:
        # Async chat completion
        response = await client.chat.completions.create(
            model="claude-sonnet-4-20250514",
            messages=[{"role": "user", "content": "Hello async!"}],
        )
        print(response.choices[0].message.content)

        # Async task creation
        task = await client.tasks.create(title="Async task")
        print(f"Created: {task['id']}")

asyncio.run(main())

Environment Variables

# Environment variables (alternative to constructor params)
export DOBBY_API_KEY="gk_user_..."
export DOBBY_BASE_URL="https://dobby-ai.com"
export DOBBY_ORG_ID="org_..."
export DOBBY_TENANT_ID="tenant_..."

# Then just:
client = DobbyClient()  # Auto-reads from env