> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qoder.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 事件流

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

`GET /api/v1/cloud/sessions/{session_id}/events/stream`

以 Server-Sent Events 流式返回 Session 公开事件。

如果 Session 创建时设置了 `incremental_streaming_enabled: true`，该流还会输出 `agent.message_start`、`agent.content_block_delta`、`agent.message_stop` 等增量 agent 事件。是否开启增量事件不通过 stream 请求参数控制，而由 Session 创建字段决定。

## 路径参数

| 参数           | 类型     | 说明                        |
| ------------ | ------ | ------------------------- |
| `session_id` | string | 以 `sess_` 为前缀的 Session ID |

## 请求头

| 头部              | 必选 | 说明                                                 |
| --------------- | -- | -------------------------------------------------- |
| `Authorization` | 是  | `Bearer $QODER_PAT`                                |
| `Accept`        | 否  | 使用 `text/event-stream`                             |
| `Last-Event-ID` | 否  | 提供后从该事件 ID 之后续传。事件 ID 不存在、已被归档，或指向非公开内部事件时返回 `400` |

## 示例请求

```bash theme={null}
curl -N -X GET "https://api.qoder.com/api/v1/cloud/sessions/sess_019e392c0d1e74e095d21ea4c6b41def/events/stream" \
  -H "Authorization: Bearer $QODER_PAT" \
  -H "Accept: text/event-stream"
```

## 流格式

每个事件都按标准 SSE 字段输出：

```text theme={null}
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` 注释行以保持连接活跃。

## 增量事件

增量事件也是普通 SSE 消息：SSE 的 `event:` 字段和 JSON `data.type` 字段都会使用公开事件类型。

```text theme={null}
id: evt_019efd3b90007c9b88be2a4e6d8c52a0
event: agent.content_block_delta
data: {"id":"evt_019efd3b90007c9b88be2a4e6d8c52a0","type":"agent.content_block_delta","message_id":"msg_019efd3b8c0d7d48a970f01dd6117d11","index":0,"delta":{"type":"text_delta","text":"Hello"},"processed_at":"2026-06-25T05:23:31.123Z"}
```

顶层增量事件类型只有 `agent.message_start`、`agent.content_block_start`、`agent.content_block_delta`、`agent.content_block_stop`、`agent.message_delta` 和 `agent.message_stop`。`text_delta`、`thinking_delta`、`input_json_delta` 等 delta 名称只会出现在 `agent.content_block_delta.delta.type` 中，不是顶层事件类型。详见 [Session 数据结构](/zh/cloud-agents/api/sessions/schemas#增量流式事件类型)。

## 错误码

| HTTP | 类型                      | 触发条件                                                          |
| ---- | ----------------------- | ------------------------------------------------------------- |
| 400  | `invalid_request_error` | `Last-Event-ID` 未能识别该 Session 中的有效公开事件（事件不存在、已被归档，或指向非公开内部事件） |
| 401  | `authentication_error`  | PAT 无效或过期                                                     |
| 404  | `not_found_error`       | Session 不存在                                                   |

### 示例：404 Session 不存在

```json theme={null}
{
  "error": {
    "message": "Session 'sess_doesnotexist_xxxxxxxxxxxxxxxxxxxxxxxx' was not found.",
    "type": "not_found_error"
  },
  "request_id": "b5822072-f264-48da-9d61-6d48ffb07551",
  "type": "error"
}
```

完整错误信封格式见 [错误参考](/zh/cloud-agents/api/conventions/errors)。

## 相关

<CardGroup cols={2}>
  <Card title="Session 事件流" icon="wave-pulse" href="/zh/cloud-agents/events-stream">
    通过 SSE 实时获取 Agent 的思考、消息、工具调用与状态。
  </Card>
</CardGroup>
