Skip to main content

Simultaneous SDK

Python SDK for Simultaneous - run agents across multiple providers with a unified API.

Features

  • Provider-agnostic API: Run agents on Browserbase and more providers
  • Browser automation SDK: Use Stagehand (or Playwright) inside your agent code
  • Flexible runtime configuration: Browser, Desktop, and Sandbox runtimes
  • Agent packaging: Define agents with sim.yaml and package automatically
  • Parallel execution: Run agents across multiple shards
  • Workflow chaining: Chain multiple agents together
  • Backwards compatible: Use existing Stagehand/Playwright scripts

Installation

Install from PyPI (Recommended)

pip install simultaneous

Install from source (Development)

# Install from source with all dependencies
pip install -e ".[dev]"

# Or install production dependencies only
pip install -e .

Verify Installation

# Test imports
python -c "from simultaneous import SimClient, Browser, BrowserClient; print('✅ SDK installed')"

# Or run the quick test script
python simultaneous/QUICK_TEST.py

See INSTALL.md for detailed installation instructions.

Quick Start

Simple Mode (Provider-agnostic)

from simultaneous import SimClient, Browser, BrowserClient

client = SimClient(api_key="SIM_...")  # Optional for MVP

@client.agent(name="scrape-jobs", runtime=Browser(provider="browserbase"))
async def scrape_jobs(query: str) -> list[dict]:
    """Scrape job listings using BrowserClient."""
    # Use BrowserClient inside your agent code for browser automation
    browser = BrowserClient(session_url="wss://...")
    page = await browser.new_page()
    await page.goto(f"https://example.com/search?q={query}")
    # ... automation code
    return []

# Run with parallel shards
run_id = await client.run(
    "scrape-jobs",
    params={"query": "sap payroll"},
    parallel=50
)

# Stream logs
await client.logs.stream(run_id)

# Wait for completion
result = await client.runs.wait(run_id)
print(f"Status: {result['state']}")

Advanced Mode (Explicit Provider)

from simultaneous import Browser

bb = Browser(
    provider="browserbase",
    region="sfo",
    project="proj_123"
)

run_id = await client.run(
    "scrape-jobs",
    params={"query": "sap"},
    runtime=bb,
    parallel=10
)

Minimal Workflow (Linear Chaining)

pipe = client.workflow.chain("scrape-jobs", "normalize")
run_id = await client.workflow.run(
    pipe,
    params={"query": "sap"}
)

Agent Specification (sim.yaml)

Create a sim.yaml file to define your agent:

name: scrape-jobs
version: 1.0.0
description: Scrape job listings
runtime:
  type: browser           # browser | desktop | sandbox
  provider: auto          # auto | browserbase | self
  region: auto
entrypoint:
  command: ["python", "main.py"]
inputs:
  - name: query
    type: string
    description: Search query
outputs:
  - name: rows
    type: json
secrets: []
permissions:
  network: ["*"]
timeouts:
  hard_seconds: 900

Environment Variables

Simultaneous API

  • SIMULTANEOUS_API_KEY: Your Simultaneous API key (optional for MVP)
  • SIMULTANEOUS_API_URL: Simultaneous API base URL (defaults to https://api.simultaneous.live)
  • SIMULTANEOUS_PROJECT_ID: Simultaneous project ID (UUID) - required when using providers

Browserbase (via Simultaneous API)

  • BROWSERBASE_REGION: Browserbase region (default: "sfo")

Note: The SDK now uses the Simultaneous API (https://api.simultaneous.live) to create Browserbase sessions. The provider adapter calls the Simultaneous API, which then creates a Browserbase session and returns a session URL. This session URL is then used with the BrowserClient browser automation client.

Example Agent

See examples/scrape_minimal/ for a complete example:

cd examples/scrape_minimal
# Run with SDK
python -m simultaneous.run main.py --query "test"

Development

Setup

# Install with dev dependencies
pip install -e ".[dev]"

# Run quick test
python simultaneous/QUICK_TEST.py

# Run all tests
pytest -q

# Run specific test file
pytest tests/test_router.py -v

# Type checking
mypy simultaneous

# Linting
ruff check simultaneous

See TESTING.md for detailed testing instructions.

Project Structure

simultaneous/
  __init__.py
  client/          # Client APIs
    sim_client.py  # Main client
    browser.py     # Browser automation clients (BrowserClient)
    runs.py        # Run management
    logs.py        # Log streaming
    workflows.py   # Workflow chaining
  agent/           # Agent specification
    spec.py        # sim.yaml models
    pack.py        # Agent packaging
    local.py       # Local runner
  runtime/         # Runtime abstractions
    base.py        # Base runtime protocol
    browser.py     # Browser runtime
    desktop.py     # Desktop runtime (placeholder)
    sandbox.py     # Sandbox runtime (placeholder)
  providers/       # Provider adapters (infrastructure)
    base.py        # Provider protocol
    router.py      # Adapter selection
    browserbase.py # Browserbase adapter (infrastructure provider)
  utils/           # Utilities
    ids.py         # ID generation
    env.py         # Environment helpers
    sse.py         # SSE parsing
    json.py        # JSON utilities

Using BrowserClient in Your Agents

BrowserClient is a browser automation client wrapper that you can use inside your agent code. The provider (e.g., Browserbase) provides the infrastructure where your agent runs.

Using BrowserClient in Agent Code

from simultaneous import SimClient, Browser, BrowserClient

client = SimClient(api_key="SIM_...")

@client.agent(name="scrape", runtime=Browser(provider="browserbase"))
async def scrape(query: str):
    # The provider (Browserbase) creates a session via Simultaneous API
    # and returns a session URL. BrowserClient connects to this URL.
    browser = BrowserClient(session_url="wss://...")  # URL from provider
    page = await browser.new_page()
    await page.goto(f"https://example.com/search?q={query}")
    # ... your automation code
    return results

Architecture

Flow:

  1. SDK Client → Calls Simultaneous API (https://api.simultaneous.live)
  2. Simultaneous API → Creates Browserbase session via Browserbase adapter
  3. Provider Adapter → Returns session URL (WebSocket endpoint)
  4. Browser Client (BrowserClient) → Connects to session URL and exposes browser automation primitives

Components:

  • Provider (Browserbase via Simultaneous API): Creates browser sessions and returns session URLs
  • Browser Client (BrowserClient): Connects to session URL and provides browser automation primitives

Using Existing Playwright Scripts

# Package existing Playwright script
from simultaneous.agent import pack_agent

bundle_path = pack_agent("./my-playwright-script")
# Now run with Simultaneous SDK

Roadmap

  • Complete BrowserClient browser automation integration
  • Desktop and Sandbox runtime support
  • Additional infrastructure providers (beyond Browserbase)
  • Remote control-plane mode
  • Secrets broker integration
  • Multi-provider single-agent execution
  • Shared auth profiles and context
  • TypeScript/Node SDK parity

License

MIT

Metadata

Release files for simultaneous 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for simultaneous 0.1.1
File Size Uploaded
simultaneous-0.1.1.tar.gz 58.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for simultaneous 0.1.1
File Interpreter ABI Platform
simultaneous-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 127.5 kB

Release files / simultaneous-0.1.1.tar.gz

Download URL simultaneous-0.1.1.tar.gz
Size 58.8 kB
Tags Source
SHA-256 checksum
How to use checksums
534eeecdbb00c9edbc2ac4c71afa110eca9a85b6ced30a14afb8b0ae95c4a05d
BLAKE2b-256 checksum
How to use checksums
53988ca9a8aeccce24273800b0af1125a72b6afcf33f469af141fcb200b49991
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.6

Release files / simultaneous-0.1.1-py3-none-any.whl

Download URL simultaneous-0.1.1-py3-none-any.whl
Size 68.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4e21b1cb516fd1520358fb92097ce0cb628467c60d25473890bbd8ce9d7188bd
BLAKE2b-256 checksum
How to use checksums
c6c2cc4a69b75fc1a2542464974e19f47f906a6d911239d4f4604695028ac7a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.12.6

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page