会话生命周期
创建会话 → 建立 WebSocket → 订阅 → 发送消息 → 接收流式响应 → 取消订阅 → 断开下面以纯 HTTP + Socket.IO 协议描述完整流程,不依赖任何 SDK。
1. 创建会话
Section titled “1. 创建会话”POST /api/sessionsContent-Type: application/jsonAuthorization: Bearer sk-blade-v3-xxx
{ "intent": "帮我分析销售数据"}响应:
{ "session_id": "sess_abc123" }记下 session_id,后续所有操作都需要它。
2. 建立 WebSocket 连接
Section titled “2. 建立 WebSocket 连接”使用 Socket.IO 客户端连接到服务端,握手时传递认证信息:
连接地址: wss://blade.example.com/socket.io/auth: { "token": "sk-blade-v3-xxx" }3. 订阅会话
Section titled “3. 订阅会话”连接建立后,发送 session:subscribe 事件:
事件: session:subscribe数据: { "session_id": "sess_abc123" }订阅成功后,你将收到该会话的所有实时事件。
4. 发送消息
Section titled “4. 发送消息”发送 chat:send 事件触发智能体响应:
事件: chat:send数据: { "session_id": "sess_abc123", "message": "请统计每月销售额"}带附件的消息
Section titled “带附件的消息”事件: chat:send数据: { "session_id": "sess_abc123", "message": [ { "type": "text", "text": "分析这张图片" }, { "type": "image_url", "image_url": { "url": "data:image/png;base64,..." } } ]}5. 接收流式响应
Section titled “5. 接收流式响应”发送消息后,你会依次收到以下事件:
chat:start ← 聊天开始 turn:start ← user turn 开始 turn:end ← user turn 结束 turn:start ← assistant turn 开始(status: streaming) turn:patch ← 文本增量 (patch_type: add_content, text_delta: "你") turn:patch ← 文本增量 (patch_type: add_content, text_delta: "好") turn:patch ← 新增工具调用 (patch_type: add_tool_call) turn:patch ← 工具结果 (patch_type: tool_result) turn:patch ← 更多文本... turn:end ← assistant turn 结束(status: completed) [可能有更多 turn...]chat:end ← 聊天结束一次
chat:send可能触发多轮 turn(智能体循环调用工具时)。
如何渲染流式文本
Section titled “如何渲染流式文本”监听 turn:patch 事件,当 patch_type = "add_content" 且 data.text_delta 存在时,将增量文本追加到显示区域。
如何获取最终完整结果
Section titled “如何获取最终完整结果”chat:end 后,调用 REST 接口拉取完整 Turn 列表:
GET /api/sessions/sess_abc123/messages6. 停止生成
Section titled “6. 停止生成”用户想中断时,发送 chat:stop:
事件: chat:stop数据: { "session_id": "sess_abc123" }使用完毕后:
事件: session:unsubscribe数据: { "session_id": "sess_abc123" }然后断开 Socket.IO 连接。
如不再需要:
DELETE /api/sessions/sess_abc123会话有两种模式:
| 模式 | 说明 |
|---|---|
planning | 智能体先制定结构化计划,不直接执行工具 |
executing | 智能体直接执行动作和工具(默认) |
真实业务任务、工具调用和文件处理,建议显式传 executing,不要只依赖默认值:
事件: chat:send数据: { "session_id": "sess_abc123", "message": "请读取刚上传的 report.md 并总结", "mode": "executing"}使用规划模式
Section titled “使用规划模式”只需要方案、不希望执行工具时,发送消息时覆盖为 planning:
事件: chat:send数据: { "session_id": "sess_abc123", "message": "制定实施计划", "mode": "planning"}检查点与回退
Section titled “检查点与回退”GET /api/sessions/sess_abc123/checkpoints回退到检查点
Section titled “回退到检查点”POST /api/sessions/sess_abc123/rewind{ "checkpoint_id": "cp_xxx" }查看历史状态(不修改)
Section titled “查看历史状态(不修改)”POST /api/sessions/sess_abc123/checkout{ "checkpoint_id": "cp_xxx", "position": "before"}What-If 重跑
Section titled “What-If 重跑”从某一步开始,使用不同的输入重新运行:
事件: chat:send数据: { "session_id": "sess_abc123", "message": "换一种方法实现", "whatif": { "from_step": 3, "quotes": [], "deprecate_entry_ids": ["entry_1", "entry_2"] }}from_step:保留前 N 步,从第 N+1 步开始重跑deprecate_entry_ids:标记为废弃的条目 ID(UI 可过滤不显示)
上下文压缩(Compaction)
Section titled “上下文压缩(Compaction)”对话过长时系统会自动压缩历史。也可手动触发:
事件: chat:compact数据: { "session_id": "sess_abc123" }压缩完成后,Turn 列表中会出现 kind = "compaction" 的条目,包含摘要和压缩比信息。
完整交互时序图
Section titled “完整交互时序图”客户端 服务端 │ │ │── POST /api/sessions ───────────→│ 创建会话 │←── { session_id } ──────────────│ │ │ │══ Socket.IO connect ════════════→│ 建立连接 │── session:subscribe ────────────→│ 订阅 │ │ │── chat:send { message } ────────→│ 发消息 │ │ │←── chat:start ──────────────────│ 聊天开始 │←── turn:start (user) ──────────│ │←── turn:end (user) ────────────│ │←── turn:start (assistant) ─────│ │←── turn:patch (text_delta) ────│ 流式文本 │←── turn:patch (text_delta) ────│ │←── turn:patch (add_tool_call) ─│ 调用工具 │←── turn:patch (tool_result) ───│ 工具结果 │←── turn:patch (text_delta) ────│ 继续输出 │←── turn:end (assistant) ───────│ │←── chat:end ────────────────────│ 聊天结束 │ │ │── GET /api/sessions/{id}/messages→│ 拉取完整历史 │←── [TurnProjection[]] ──────────│ │ │ │── session:unsubscribe ──────────→│ 取消订阅 │══ Socket.IO disconnect ═════════→│ 断开