The execution layer for agents

Your agent generates code. We run it safely—with full access to your tools. Every await becomes a tool call back to your system.

agent_task.py
# Every await = tool call back to your system
user = await get_user(id=123)        # tool: get_user
orders = await fetch_orders(user.id)  # tool: fetch_orders

total = sum(o.amount for o in orders)   # pure compute
if total > 1000:
    await send_discount(user.email)    # tool: send_discount

Built for agent workloads

Your LLM generates code with tool calls. We execute it—each await routes back to your system.

Data Analysis

# Tool call: query_db
data = await query_db("SELECT * FROM sales")

# Pure computation (no tool)
avg = sum(d.revenue for d in data) / len(data)
trend = "up" if data[-1].revenue > avg else "down"

# Tool call: send_slack
await send_slack("#analytics", f"Trending {trend}")

Multi-Tool Chains

# Parallel tool calls with asyncio.gather
weather, calendar = await asyncio.gather(
    get_weather("London"),
    get_calendar("today")
)
if weather.rain_chance > 0.7:
    for event in calendar.outdoor_events:
        await notify(event.organizer, "Rain!")

Self-Testing Code

# Tool call: get_task
spec = await get_task(42)

# Pure computation: generate + test
code = generate(spec.requirements)
for t in spec.tests:
    assert eval(code)(t.input) == t.expected

# Tool call: submit
await submit_code(42, code)

Why eryx.run

Sub-5ms Cold Start

WASM-based sandboxing boots instantly. No VM spinup, no container pulls. Your agent never waits.

Native Async Callbacks

Python code can await host-provided functions. Build agents that call your tools mid-execution.

Deterministic Billing

Pay for compute units, not wall-clock time. Same code = same cost. No charges while waiting on callbacks.

Secure by Default

WebAssembly sandbox isolates untrusted code. No filesystem, no network, unless you explicitly allow it.

await = tool call

1

Agent generates code

Your LLM writes Python with await tool_name()

2

Code hits await

Sandbox pauses, sends callback request to you

3

You respond

Your system handles the callback, returns data

4

Execution resumes

Sandbox continues with your response

WebSocket Protocol
// You send agent-generated code
{"type": "execute", "code": "user = await get_user(id=5)"}

// eryx.run pauses and asks for data
{"type": "callback", "call_id": "abc", "name": "get_user", "args": {"id": 5}}

// You fetch from your database and respond
{"type": "callback_response", "call_id": "abc", "result": {"name": "Alice"}}

// Execution completes
{"type": "completed", "stdout": "Hello Alice\n", "compute_units": 1842}

Simple, predictable pricing

Pay for what you use. No charge while waiting on your callbacks.

Free

$0/mo
  • 100k compute units/mo
  • 1 concurrent session
  • 5 second timeout
  • Community support
Get Started

Starter

$9/mo
  • 1M compute units/mo
  • 10 concurrent sessions
  • 30 second timeout
  • Email support
  • $0.10/100k overage
Get Started

Team

$79/mo
  • 100M compute units/mo
  • 1000 concurrent sessions
  • 120 second timeout
  • Dedicated support
  • $0.05/100k overage
Get Started

Get early access

Join the waitlist to be notified when we launch. Early users get extended free tier benefits.

No spam. We'll only email you when we're ready.