Skip to content

SSE 流式协议

适用读者:Widget 开发者、API 调用方、代理运维人员
API 前缀:/apis/api.ai-suite.halo.run/v1alpha1

使用 SSE 的接口

接口方法认证说明
/chat/streamPOST匿名访客流式问答
/search/answerPOST匿名搜索页 AI 综合回答
/apis/console.api.ai-suite.halo.run/v1alpha1/writing/assist/streamPOST管理员编辑器写作辅助
/apis/console.api.ai-suite.halo.run/v1alpha1/chat/debug/streamPOST管理员调试问答、Trace 与引用
/apis/console.api.ai-suite.halo.run/v1alpha1/knowledge/reindex/progressGET管理员全量索引进度

公开聊天和搜索使用 fetch 发送 POST JSON,再通过 ReadableStream 解析响应,不使用只能发送 GET 的 EventSource

访客聊天请求

http
POST /apis/api.ai-suite.halo.run/v1alpha1/chat/stream
Content-Type: application/json
Accept: text/event-stream
json
{
  "message": "站内有哪些关于 AI 的文章?",
  "history": [
    { "role": "user", "content": "你好" },
    { "role": "assistant", "content": "你好,有什么可以帮你?" }
  ],
  "reasoningEnabled": true
}

限制:当前消息最多 4000 字符,历史最多 20 项,每项内容最多 4000 字符。

搜索回答请求

http
POST /apis/api.ai-suite.halo.run/v1alpha1/search/answer
Content-Type: application/json
Accept: text/event-stream
json
{
  "keyword": "Halo 插件开发"
}

搜索关键词最多 500 字符。

聊天事件顺序

访客聊天 SSE 事件顺序

citations

text
event:citations
data:[{"title":"文章标题","postId":"post-name","url":"/archives/..."}]

引用事件只在存在引用时发送。客户端不能假设第一帧一定是 citations。

structured_result

命中意图路由且 Pipeline 返回站内文章时,访客聊天会在 token 之前发送结构化结果:

text
event:structured_result
data:{"type":"article-list","variant":"ranking","title":"热门文章","items":[...]}

variant 当前支持 rankinglatesttagcategoryrecommendation。内置 Widget 会把它渲染为可点击文章卡片;自定义客户端应在不识别该事件时安全忽略,并继续处理后续 token。

卡片中的标题、链接、摘要和发布时间直接来自 Halo 文章数据,不从大模型文本反向解析。

token

text
data:{"content":"回答片段"}

token 使用 JSON 包装以保留前后空格和换行。客户端应解析 JSON 后拼接 content,不要直接把整个 data: 内容追加到页面。

reasoning_start / reasoning_delta / reasoning_end

开启深度思考且模型返回推理内容时,服务会把结构化 reasoning 字段或文本中的 <think> / <reasoning> 统一转换为:

text
event:reasoning_start
data:{}

event:reasoning_delta
data:{"content":"推理片段"}

event:reasoning_end
data:{}

推理事件可能出现在普通 token 之前或之间。客户端应把它们放入独立、默认折叠的区域,不能混入最终回答。不支持这些事件的旧客户端可以安全忽略。完整说明见 深度思考与推理过程

logId

text
event:logId
data:550e8400-e29b-41d4-a716-446655440000

logId 用于后续点赞、点踩和 Trace 回溯。搜索回答当前不发送 logId

DONE

text
data:[DONE]

收到 [DONE] 后结束本轮解析并恢复输入状态。网络关闭不能完全替代 DONE,因为错误路径也会尽量发送友好提示和 DONE。

错误行为

公开 SSE 为了让前端保持统一解析,部分业务错误仍可能以 HTTP 200 返回,并在 token 中发送友好错误消息,随后发送 [DONE]

text
data:{"content":"AI 搜索暂不可用"}

data:[DONE]

调用方需要同时处理:

  • 非 2xx HTTP 状态。
  • SSE 中的错误文本或 event:error
  • 连接提前关闭。
  • 长时间没有数据的超时。
  • 正常 [DONE]

客户端解析状态机

SSE 客户端状态机

curl 验证

bash
curl -N -X POST \
  'http://127.0.0.1:8090/apis/api.ai-suite.halo.run/v1alpha1/chat/stream' \
  -H 'Content-Type: application/json' \
  --data '{"message":"介绍一下站内内容","history":[]}'

生产域名和 8090 直连结果的到达节奏不同,通常意味着代理缓冲。配置方法见 生产部署

反馈接口

聊天完成后可使用 logId 提交反馈:

http
POST /apis/api.ai-suite.halo.run/v1alpha1/chat/feedback?logId=...&type=like&comment=...

反馈接口只接受 POST 请求。

完整路由见 API 总览Public APIConsole API

基于 GPL-3.0 许可发布