Skip to main content
Sessions

事件流

通过 Server-Sent Events 流式读取 Session 公开事件。

GET /api/v1/cloud/sessions/{session_id}/events/stream 以 Server-Sent Events 流式返回 Session 公开事件。

路径参数

参数类型说明
session_idstringsess_ 为前缀的 Session ID

Query 参数

参数类型说明
event_deltas[]string可选,可重复传入。允许值为 agent.messageagent.thinking,用于选择当前连接需要增量输出的事件类型。

请求头

头部必选说明
AuthorizationBearer $QODER_ACCESS_TOKEN
Accept使用 text/event-stream
Last-Event-ID从指定 buffered 事件 ID 之后续传。等于在途 event delta ID 时,会跳过该事件的历史 delta,只发送后续输出。

示例请求

curl -N -X GET "https://api.qoder.com/api/v1/cloud/sessions/sess_019e392c0d1e74e095d21ea4c6b41def/events/stream" \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN" \
  -H "Accept: text/event-stream"
同时请求两种 event delta 类型:
curl -N -G "https://api.qoder.com/api/v1/cloud/sessions/sess_019e392c0d1e74e095d21ea4c6b41def/events/stream" \
  -H "Authorization: Bearer $QODER_ACCESS_TOKEN" \
  -H "Accept: text/event-stream" \
  --data-urlencode "event_deltas[]=agent.message" \
  --data-urlencode "event_deltas[]=agent.thinking"

响应

响应类型为 text/event-stream。每个 data: payload 为以下结构之一:
  • 完整的公开 Event 对象(下文称为 buffered 事件),会写入 Session 事件历史,并包含可用于续传的 SSE id:
  • stream-only event delta 帧,其 SSE id: 为正在增量输出的事件 ID。
buffered 输出中的模型请求边界遵循 Model request span 事件结构

流格式

每个事件都按标准 SSE 字段输出:
id: evt_019e392c0d787cfaa21bda98e06cd913
event: user.message
data: {"id":"evt_019e392c0d787cfaa21bda98e06cd913","type":"user.message","content":[{"type":"text","text":"Hello"}],"processed_at":"2026-05-18T03:40:48.888851795Z"}

id: evt_a1b2c3d4e5f6a7b8
event: agent.message
data: {"id":"evt_a1b2c3d4e5f6a7b8","type":"agent.message","content":[{"type":"text","text":"Hello! How can I help you today?"}],"processed_at":"2026-05-18T03:40:50.123456789Z"}

id: evt_b2c3d4e5f6a7b8c9
event: session.status_idle
data: {"id":"evt_b2c3d4e5f6a7b8c9","type":"session.status_idle","stop_reason":{"type":"end_turn"},"processed_at":"2026-05-18T03:40:50.987654321Z"}
服务端会定期发送 : heartbeat 注释行以保持连接活跃。

Event delta 帧

agent.message 的增量输出包含一个 event_start,随后输出一个或多个 event_deltaagent.thinking 的增量输出只包含 event_start
id: evt_00jjujk9fbnr55q5rtyp
event: event_start
data: {"event":{"id":"evt_00jjujk9fbnr55q5rtyp","type":"agent.thinking"},"type":"event_start"}

id: evt_00jjujk9fbnr4wkj2gh8
event: event_start
data: {"event":{"id":"evt_00jjujk9fbnr4wkj2gh8","type":"agent.message"},"type":"event_start"}

id: evt_00jjujk9fbnr4wkj2gh8
event: event_delta
data: {"delta":{"content":{"text":"你好","type":"text"},"index":0,"type":"content_delta"},"event_id":"evt_00jjujk9fbnr4wkj2gh8","type":"event_delta"}
每个帧的 SSE id: 都是正在增量输出的事件 ID,其 JSON payload 不包含顶层 idprocessed_at 字段。Event delta 帧不会出现在 list/history 响应中。已保留的 delta 仅在事件仍在生成时可用于重连;buffered agent.message 写入后,历史 delta 不再重放。

断线重连

对于普通 buffered 事件,Last-Event-ID 从指定事件之后继续。在途增量事件的 event_start、所有 event_delta 和最终 buffered 事件使用同一个 ID,因此还有以下行为:
  1. 游标位于当前 event_start 之前,并且事件仍在生成时,会重放其 start 和已保留的历史 delta。
  2. 游标等于在途事件 ID 时,会跳过其历史 delta,只接收后续新 delta 和 buffered 最终事件。
  3. 事件完成后,从更早的 buffered 事件重连只返回最终 agent.message,不会返回历史 delta。
如需完整重建在途事件,请从其 event_start 之前最近的 buffered 事件重连,并按照共享事件 ID 重新处理各帧。完整客户端建议见 SSE Event Stream

错误码

HTTP类型触发条件
400invalid_request_errorLast-Event-ID 指向已归档或非公开事件,或 event_deltas[] 包含不支持的值
401authentication_errorPAT 或 SAT 无效或过期
404not_found_errorSession 或 Last-Event-ID 引用的事件不存在

示例:404 Session 不存在

{
  "error": {
    "message": "Session 'sess_doesnotexist_xxxxxxxxxxxxxxxxxxxxxxxx' was not found.",
    "type": "not_found_error"
  },
  "request_id": "b5822072-f264-48da-9d61-6d48ffb07551",
  "type": "error"
}
完整错误信封格式见 错误参考