> ## 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_id` | string | 以 `sess_` 为前缀的 Session ID |

## Query 参数

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

## 请求头

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

## 示例请求

```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"
```

同时请求两种 event delta 类型：

```bash theme={null}
curl -N -G "https://api.qoder.com/api/v1/cloud/sessions/sess_019e392c0d1e74e095d21ea4c6b41def/events/stream" \
  -H "Authorization: Bearer $QODER_PAT" \
  -H "Accept: text/event-stream" \
  --data-urlencode "event_deltas[]=agent.message" \
  --data-urlencode "event_deltas[]=agent.thinking"
```

## 响应

响应类型为 `text/event-stream`。每个 `data:` payload 为以下结构之一：

* 完整的公开 [Event 对象](/zh/cloud-agents/api/sessions/schemas#event-对象)（下文称为 **buffered 事件**），会写入 Session 事件历史，并包含可用于续传的 SSE `id:`；
* stream-only [event delta 帧](/zh/cloud-agents/api/sessions/schemas#event-delta-stream-帧)，其 SSE `id:` 为正在增量输出的事件 ID。

buffered 输出中的模型请求边界遵循 [Model request span 事件结构](/zh/cloud-agents/api/sessions/schemas#model-request-span-事件)。

## 流格式

每个事件都按标准 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` 注释行以保持连接活跃。

### Event delta 帧

`agent.message` 的增量输出包含一个 `event_start`，随后输出一个或多个 `event_delta`。`agent.thinking` 的增量输出只包含 `event_start`。

```text theme={null}
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 不包含顶层 `id` 或 `processed_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](/zh/cloud-agents/api/sessions/events-stream#event-delta-期间重连)。

## 错误码

| HTTP | 类型                      | 触发条件                                                   |
| ---- | ----------------------- | ------------------------------------------------------ |
| 400  | `invalid_request_error` | `Last-Event-ID` 指向已归档或非公开事件，或 `event_deltas[]` 包含不支持的值 |
| 401  | `authentication_error`  | PAT 无效或过期                                              |
| 404  | `not_found_error`       | Session 或 `Last-Event-ID` 引用的事件不存在                     |

### 示例：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)。
