SSE 事件与断线续接
消费单轮流事件,避免重复渲染,并正确处理断开、过期与工具截断。
This page has not been translated into English yet. The original Chinese version is shown below.
GET /v1/agents/{id}/runs/{runId}/stream 返回指定 Run 的 Server-Sent Events,不重放其他轮。用它展示实时输出,最终状态仍可用 Get A Run 查询。
curl --request GET \
--url https://api.cursor.com/v1/agents/bc-00000000-0000-0000-0000-000000000001/runs/run-00000000-0000-0000-0000-000000000001/stream \
-u YOUR_API_KEY: \
--header 'Accept: text/event-stream'事件类型
| 事件 | 处理方式 |
|---|---|
status | 读取 runId 和执行状态 |
assistant / thinking | 按 text delta 追加对应文本 |
tool_call | 按 callId 关联调用开始与完成 |
interaction_update | SDK InteractionUpdate 形状的丰富事件 |
heartbeat | 空对象保活 |
result | 最终状态,可带 text、durationMs 和 git |
error | code/message 描述流错误 |
done | 流结束 |
简单事件与 interaction_update 可能同时发出。仅展示文本和工具时处理简单事件;需要 SDK 形状时处理 interaction_update,忽略相应简单事件,避免同一内容显示两遍。
工具参数与截断
tool_call 包含 callId、name、status,status 为 running 或 completed;args、result 是工具特定 JSON。字段过大时可能被省略,同时出现 truncated.args: true 或 truncated.result: true。缺失的工具结果不能按空结果推断。
result 中的 git 同样是 Agent 当前推送分支快照,不限于当前 Run。归因限制见Runs 与状态。
恢复连接
多数事件带 id,将其作为不透明字符串保存,不解析内部格式。断线后在 Last-Event-ID header 中发送最后接收的 ID;ID 必须属于当前请求的 Run,否则返回 400 invalid_last_event_id。
开头的 status 事件不带 id,每次重连都会再次出现。成功恢复后先处理这一状态,再继续恢复范围,不能因为重复 status 就丢掉整个连接。
保留窗口
响应 X-Cursor-Stream-Retention-Seconds 给出流保留时间。过期可能返回 410 stream_expired,此时停止重试流,改查 GET /v1/agents/{id}/runs/{runId} 读取最终状态。不要把断线或流过期当作任务失败。