Skip to content

Run & Streaming

Stateless run

For one-off requests without session persistence:

http
POST /run
Content-Type: application/json

{
  "goal": "What files are in the current directory?",
  "system_prompt": "You are a helpful assistant.",
  "max_steps": 10
}

Response (JSON):

json
{
  "status": "finished",
  "finish_reason": "NoMoreToolCalls",
  "messages": [...],
  "usage": { "total_steps": 2, "total_tokens": 640 }
}

Session run (SSE streaming)

Send a message to an existing session and subscribe to Server-Sent Events on the /sessions/:id/events endpoint:

http
POST /sessions/:id/run
Content-Type: application/json

{ "goal": "List the files in src/" }

Then consume the SSE stream on /sessions/:id/events:

event: tool_call
data: {"name":"list_dir","step":1}

event: tool_result
data: {"name":"list_dir","success":true}

event: message
data: {"role":"assistant","content":[{"type":"text","text":"The src/ directory contains..."}]}

event: done
data: {"finish_reason":"NoMoreToolCalls","total_steps":1}

SSE event types

EventData fields
message{ role, content: ContentBlock[] }
partial_message{ text, step } — streaming text delta
tool_call{ name, step }
tool_result{ name, success }
done{ finish_reason, total_steps }
error{ message }
plan_proposed{ plan } — agent awaiting plan approval

Consuming SSE in JavaScript

javascript
// First POST to trigger the run
await fetch('/sessions/abc123/run', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ goal: 'list files' }),
});

// Then subscribe to events
const evtSource = new EventSource('/sessions/abc123/events');

evtSource.addEventListener('tool_call', (e) => {
  const data = JSON.parse(e.data);
  console.log(`[tool] ${data.name}`);
});

evtSource.addEventListener('message', (e) => {
  const data = JSON.parse(e.data);
  for (const block of data.content) {
    if (block.type === 'text') console.log(block.text);
  }
});

evtSource.addEventListener('done', (e) => {
  const data = JSON.parse(e.data);
  console.log('Done:', data.finish_reason);
  evtSource.close();
});

Consuming SSE in Python

python
import json, sseclient, requests

# Trigger the run
requests.post(
    'http://localhost:3000/sessions/abc123/run',
    json={'goal': 'list files'},
)

# Subscribe to events
resp = requests.get(
    'http://localhost:3000/sessions/abc123/events',
    stream=True,
)
client = sseclient.SSEClient(resp)
for event in client.events():
    data = json.loads(event.data)
    if event.event == 'message':
        for block in data.get('content', []):
            if block.get('type') == 'text':
                print(block['text'])
    elif event.event == 'done':
        print('Done:', data['finish_reason'])
        break

Released under the MIT License.