claude-code-api-streaming
Use when implementing server-side SSE streaming compatibility for a Claude Code Anthropic gateway, including message_start/content_block_delta/message_delta events, tool_use streaming, stream:false fa
SKILL.md.claude/skills/claude-code-api-streaming/SKILL.md
GitHubClaude Code 网关 SSE 流式响应
目标
根据本 skill,实现 /v1/messages 在 stream:true 时的服务端 SSE 响应。你要输出 Anthropic raw stream event,不是写客户端 stream parser。
详细事件字段见 references/stream-events-wire-format.md。
最小事件序列
文本回复必须按顺序输出:
message_start
content_block_start
content_block_delta*
content_block_stop
message_delta
message_stop
服务端用 Content-Type: text/event-stream,每个 SSE frame 同时带 event: 和 JSON data:。
文本流
message_start:创建 assistant message,usage 中output_tokens可先为 0。content_block_start:index:0,content_block:{ "type":"text", "text":"" }。- 多个
content_block_delta:delta:{ "type":"text_delta", "text":"..." }。 content_block_stop:结束该 block。message_delta:写最终stop_reason和 output usage。message_stop:结束流。
工具调用流
当模型需要工具:
content_block_start使用content_block:{ "type":"tool_use", "id":"toolu_...", "name":"Bash", "input":{} }。- 工具参数通过多个
input_json_delta.partial_json分片输出。 message_delta.delta.stop_reason必须是tool_use。- 客户端下一轮会把工具执行结果作为 user message 的
tool_resultblock 发回/v1/messages。
Thinking 与 server tool
- thinking block 使用
thinking_delta和可选signature_delta。 - 不支持 thinking 时不要输出 thinking block。
server_tool_use可用于 advisor 等服务端工具;外部网关通常可以不实现。
非流式 fallback
Claude Code 在这些情况下可能走 stream:false:
- 流式创建 404。
- SSE 无事件、缺少
message_start、缺少完整 stop。 - 中途异常或超时。
- 主动发起非流式后台任务。
网关必须保证 stream:false 返回完整 message JSON,结构与流式聚合后的最终 message 一致。
兼容要求
- 不要只输出纯
data:文本;Claude Code 需要 Anthropic event JSON。 - 不要省略
message_delta;最终 usage 和stop_reason依赖它。 input_json_delta.partial_json可以分片,但最终拼接后必须是合法 JSON。- 0 事件流会被视为坏流。
- 429/529/5xx 中断应返回 HTTP 错误,而不是半截成功 SSE。