Skip to main content

概述

Shannon 通过 Server-Sent Events (SSE) 和 WebSocket 协议提供实时事件流传输。使用流式传输来监控任务执行、显示进度并在生成时接收结果。
认证:流式端点与其他 API 使用相同的认证请求头。 浏览器 EventSource 无法携带自定义请求头。
  • 开发环境:设置 GATEWAY_SKIP_AUTH=1
  • 生产环境:通过后端代理转发 SSE,并注入 X-API-Key 或 Bearer 头。 SSE 端点支持 api_key 查询参数作为回退(如 ?api_key=sk_...)。其他端点请通过请求头传递密钥。
流式传输限制
  • 超时:流在 5 分钟无活动后自动关闭
  • 缓冲区大小:每个连接最大 1MB 缓冲数据
  • 使用元数据:现在所有 LLM 提供商(OpenAI、Anthropic、Google、Groq、xAI)都可获取 token 计数和成本

端点

统一提交 + 流式传输(推荐)

POST /api/v1/tasks/stream

提交任务并立即开始流式传输其事件的最简单方法。此端点在一次调用中结合了任务提交和流式设置。
最适合前端应用:此端点非常适合需要在提交任务后立即显示进度的实时 UI。

认证

必需:是
或:

请求体

响应

状态201 Created 响应体

响应字段

示例:JavaScript/TypeScript

示例:React Hook

示例:Vue 3 Composition API

示例:Python

为什么使用此端点? 统一端点确保您在提交后立即开始流式传输,防止在分别提交和连接时可能错过的任何事件。

Server-Sent Events (SSE)

GET /api/v1/stream/sse

使用 Server-Sent Events 进行实时事件流传输。

认证

必需:是

查询参数

事件格式

每个事件遵循 SSE 规范:

示例请求

示例响应

事件 ID 格式id 字段使用 Redis Stream ID(如 1719000000000-0),而不是简单整数。重连时必须使用这些精确的 ID 作为 last_event_id 参数。参见下方重连部分。

WebSocket

GET /api/v1/stream/ws

通过 WebSocket 进行双向流式传输。

认证

网关通过仅使用请求头(X-API-KeyAuthorization)来对 WebSocket 连接进行认证。浏览器在 WebSocket 握手期间无法设置自定义请求头。对于浏览器使用:
  • GATEWAY_SKIP_AUTH=1 本地运行,或
  • 使用反向代理在转发到网关之前注入请求头。
服务器环境中基于请求头的示例: Node (ws):
Python (websockets):
不支持通过查询字符串传递 API 密钥或通过网关的连接后”auth”消息。

消息类型

客户端 → 服务器
服务器 → 客户端

OpenAI 兼容流式传输

Shannon 还在 /v1/chat/completions 提供 OpenAI 兼容的流式传输端点,将 Shannon 事件转换为标准 OpenAI chat.completion.chunk 格式。这允许您直接使用 OpenAI SDK 与 Shannon 交互。 有关 OpenAI 兼容 API 的完整文档,包括请求/响应模式、可用模型、Shannon 特有扩展(shannon_events)以及 SDK 使用示例,请参阅 OpenAI 兼容 API 参考

事件类型

核心事件

智能体事件

工具事件

LLM 事件

对于大多数集成场景,建议监听 thread.message.delta(流式文本)和 thread.message.completed(包含使用量元数据的最终结果),而不是 LLM_PARTIAL/LLM_OUTPUT

进度与系统事件

流生命周期事件

在 SSE 中,STREAM_END 生命周期事件通过名为 done 的 SSE 事件发送,数据为纯文本 [DONE](不是 JSON)。在 WebSocket 中,它会以普通 JSON 事件的形式出现,字段为 "type": "STREAM_END"

团队与审批

代码示例

Python with httpx (SSE)

Python - 流式传输带事件筛选

JavaScript/Node.js (SSE)

JavaScript/Node.js - WebSocket (ws)

Go (SSE)

Bash/curl (SSE)

用例

1. 实时进度显示

2. 将所有事件记录到文件

3. 收集工具使用指标

4. React UI 集成

深度研究流式传输

深度研究任务通常需要 2-10 分钟。通过 Task API 使用 context.force_research 触发深度研究:
通过 context.research_strategy 控制研究深度:
Chat API vs Task API 深度研究:Chat API(/v1/chat/completions 配合 model: "shannon-deep-research")也可以触发深度研究,但其流式格式不包含 SSE 事件 ID——因此无法重连。如果您的平台有连接时间限制(如 Vercel 5 分钟限制)或需要在页面刷新后恢复,请使用 Task API

心跳

服务器每 10 秒发送一次 : ping SSE 注释以保持连接在代理和负载均衡器之间存活:
这是一条 SSE 注释(不是 JSON 消息)。如果您停止接收 ping,说明连接已断开——请立即重连。

重连

SSE 连接可能因网络问题、代理超时或平台限制(如 Vercel 免费版:5 分钟连接限制)而断开。Shannon 支持从断点处恢复。 工作原理:
  1. 追踪每个接收到的 SSE 事件的 id 字段
  2. 断连后,使用 last_event_id 参数重新连接
  3. 服务器会重放该 ID 之后的所有事件(缓冲约 256 个事件,24 小时 TTL)

主动重连(推荐)

对于有连接时间限制的平台,建议在达到限制前主动断开:

页面刷新 / 回退方案

如果用户刷新了页面,且你仍保留 workflow_id
  1. 检查任务状态:GET /api/v1/tasks/{workflow_id}
  2. 如果是 TASK_STATUS_RUNNING → 重新连接 SSE
  3. 如果是 TASK_STATUS_COMPLETED → 直接显示响应中的结果
  4. 如果是 TASK_STATUS_FAILED → 显示错误信息

Python 重连示例

最佳实践

2. 实施超时

3. 客户端过滤事件

4. 从最后一个事件恢复

说明:last_event_id 支持 Redis Stream ID(如 1700000000000-0)或数字序号(如 42)。当为数字时,重放规则为 seq > last_event_id

比较:SSE vs WebSocket vs 轮询

何时使用每个

  • SSE:大多数用例、实时监控、进度显示
  • WebSocket:交互式应用、需要双向通信
  • 轮询(GET /api/v1/tasks/):传统系统、无流式传输支持

相关端点

提交任务

POST /api/v1/tasks

获取状态

GET /api/v1/tasks/

Python SDK

使用 client.stream()

注意

事件保留
  • Redis:所有事件存储 24 小时(实时流式传输)
  • PostgreSQL:关键事件存储 90 天(历史查询)
  • 如果连接断开,使用 last_event_id 恢复流式传输
连接限制
  • 每个 API 密钥最多 100 个并发流式传输连接
  • 5 分钟无活动超时(自动关闭连接)
  • 每个连接 1MB 缓冲区大小限制
  • 考虑在单个 WebSocket 上多路复用多个工作流