
人工智能AI 技能AI 评测【免费下载链接】skillsPublic repository for Agent Skills项目地址https://gitcode.com/GitHub_Trending/skills3/skills点击查看免费下载导读本文以当前仓库 skills/claude-api/go/claude-api/streaming.md 为核心骨架系统讲解如何在 Go 中通过anthropic-sdk-go消费 Claude Messages API 的流式响应从client.Messages.NewStreaming建立流、用stream.Next()/stream.Current()驱动事件循环、按事件类型分发content_block_delta增量到借助message.Accumulate(stream.Current())在流上原地累积出完整回复。读完本文你将掌握一个可直接复制运行的 Go 流式对话最小实现、事件驱动的类型断言写法、流式场景下的错误处理与最佳实践并理解它与非流式调用、Tool Runner 流式变体的关系。一、为什么选择流式Go SDK 中的消息发送方式在anthropic-sdk-go中向 Claude 发送消息有两条主要路径参见 go/claude-api/README.md 的 Basic Message Request一次性请求client.Messages.New(ctx, anthropic.MessageNewParams{...})同步返回完整的*anthropic.Message响应结束后response.Content中才是全部内容块。流式请求client.Messages.NewStreaming(ctx, anthropic.MessageNewParams{...})返回一个流对象你可以一边生成一边逐 token 消费。流式的主要收益有两点首 token 延迟TTFT更低——用户无需等待整段生成完毕即可看到输出内存占用更可控——超长输出例如MaxTokens: 64000不必一次性落盘。此外部分大输出场景在非流式下容易遇到连接超时Python SDK 文档中明确提示不流式的大max_tokens请求可能因空闲连接断开而失败见 python/claude-api/streaming.md流式是生成型应用的默认选择。流式调用的参数结构与普通调用完全一致核心依旧是Model、MaxTokens、Messages三要素stream : client.Messages.NewStreaming(context.Background(), anthropic.MessageNewParams{ Model: anthropic.ModelClaudeOpus4_8, // 类型化模型常量 MaxTokens: 64000, Messages: []anthropic.MessageParam{ anthropic.NewUserMessage(anthropic.NewTextBlock(Write a haiku)), }, })关于模型常量Go SDK 提供类型化常量anthropic.ModelClaudeFable5、anthropic.ModelClaudeOpus4_8、anthropic.ModelClaudeOpus4_7、anthropic.ModelClaudeSonnet4_6、anthropic.ModelClaudeHaiku4_5_20251001等anthropic.Model本质上是string的别名因此尚未有类型化常量的模型可直接传字符串 ID例如Model: claude-opus-5。完整模型别名解析见 shared/models.md。二、事件驱动循环Next / Current / ErrNewStreaming返回的流对象采用经典的迭代器设计核心 API 是三个方法方法作用stream.Next() bool推进迭代器有下一个事件返回true流耗尽或出错返回falsestream.Current() anthropic.MessageStreamEvent获取当前事件配合AsAny()做类型断言stream.Err() error流结束后检查是否发生错误是判断成败的最终依据驱动循环的标准写法如下原文档示例for stream.Next() { event : stream.Current() switch eventVariant : event.AsAny().(type) { case anthropic.ContentBlockDeltaEvent: switch deltaVariant : eventVariant.Delta.AsAny().(type) { case anthropic.TextDelta: fmt.Print(deltaVariant.Text) } } } if err : stream.Err(); err ! nil { log.Fatal(err) }这段代码的精髓在于 Go 的双重类型断言第一层event.AsAny().(type)把流事件的联合类型收窄到具体事件变体这里只关心ContentBlockDeltaEvent内容块增量事件第二层eventVariant.Delta.AsAny().(type)把增量字段Delta进一步收窄到TextDelta文本增量取出deltaVariant.Text直接打印。于是每段生成的文本会随着事件到达被逐个fmt.Print输出形成真正的“打字机”效果。需要说明的是这是从流事件中取文本的最小路径如果只想无脑拿全部文本增量也可以借助流对象上的辅助接口累积见下文第三节。流事件全景你会收到什么anthropic-sdk-go的流事件由MessageStreamEvent联合体承载各语言 SDK 的事件集合一致。以 Python 版文档的事件表为参照python/claude-api/streaming.md一次流式会话大致会按序触发事件触发时机message_start流开始携带消息元数据content_block_start某个内容块text / thinking / tool_use开始content_block_delta每个 token / 增量片段content_block_stop内容块结束message_delta消息级更新携带stop_reason与 usage 统计message_stop消息结束在 Go 中这些事件分别对应MessageStartEvent、ContentBlockStartEvent、ContentBlockDeltaEvent、ContentBlockStopEvent、MessageDeltaEvent、MessageStopEvent等类型。实际业务中你通常只需关心ContentBlockDeltaEvent拿文本增量与MessageDeltaEvent拿用量、停止原因其余事件可以忽略——这正是上面示例只 switch 一个分支的原因。增量内容的类型多样性ContentBlockDeltaEvent的Delta字段本身也是联合体常见变体包括TextDelta—— 普通文本增量携带TextThinkingDelta—— 思维链增量携带Thinking启用 thinking 时出现InputJSONDelta—— 工具调用参数input的 JSON 增量。因此如果你在流中同时处理 thinking 与工具调用可以把第二层断言扩展为多个case。thinking 的开启方式与模型相关Claude 4.6 推荐adaptive自适应思考在MessageNewParams中设置Thinking: anthropic.ThinkingConfigParamUnion{OfAdaptive: adaptive}旧模型使用anthropic.ThinkingConfigParamOfEnabled(N)N必须小于MaxTokens最小 1024。相关细节见 go/claude-api/README.md 的 Thinking 一节。三、累积最终消息Message.Accumulate模式Python SDK 的messages.stream()辅助器内置get_final_message()Go 流的 MessageStream 上没有GetFinalMessage()原文档明确标注了这一点。Go 的等价做法是在迭代循环中用Message.Accumulate原地累积stream : client.Messages.NewStreaming(ctx, params) message : anthropic.Message{} for stream.Next() { message.Accumulate(stream.Current()) } if err : stream.Err(); err ! nil { log.Fatal(err) } // message.Content now has the complete responseAccumulate(stream.Current())会把每一个流事件“折叠”进一个anthropic.Message结构文本增量被追加进对应的TextBlockthinking 增量进入ThinkingBlock工具调用增量拼装成完整的ToolUseBlockusage 与 stop 信息在message_delta阶段被合并。循环结束后message.Content就是与一次性Messages.New返回等价但经过流式增量重建的完整内容块切片你可以按block.AsAny().(type)统一消费for _, block : range message.Content { switch variant : block.AsAny().(type) { case anthropic.TextBlock: fmt.Println(variant.Text) case anthropic.ThinkingBlock: fmt.Println([thinking], variant.Thinking) } }这条模式的价值在于既享受流式的低延迟与低内存又不丢失完整消息结构。它特别适合两类场景边显示边保存循环内同时fmt.Print增量实时展示并Accumulate最终落库流式 工具调用累积完成后检查message.StopReason若为StopReasonToolUse则解析ToolUseBlock执行工具再把结果作为新的一轮消息继续流式请求。与一次性响应的关系.ToParam()往返无论走Messages.New还是流式累积得到的*anthropic.Message都可以用resp.ToParam()一键转换为MessageParam追加进对话历史多轮工具循环的标准做法见 go/claude-api/tool-use.md。流式累积出的 message 同样支持该往返保证多轮流式对话的历史一致性。四、流式场景的进阶能力工具调用与提示词缓存4.1 流式与工具调用Tool RunnerGo SDK 的推荐路径是 Beta 版BetaToolRunnertoolrunner包它自动完成“请求 → 检测 tool_use → 执行你的函数 → 回填 tool_result → 再次请求”的闭环。其流式变体通过NewToolRunnerStreaming()创建配合AllStreaming()逐条消费会话消息适合在工具循环中保持流式输出体验。手动实现工具循环时流式请求同样可用——每次迭代累积出的 message 若StopReason anthropic.StopReasonToolUse则提取ToolUseBlock执行并回填。相关 API 与完整手动循环示例见 go/claude-api/tool-use.md循环设计与pause_turn等停止原因语义见 shared/tool-use-concepts.md。4.2 流式与提示词缓存提示词缓存与流式天然兼容。在MessageNewParams的System[]TextBlockParam最后一个块上设置CacheControl即可把工具定义与系统提示一起缓存渲染顺序为tools→system→messagesSystem: []anthropic.TextBlockParam{{ Text: longSystemPrompt, CacheControl: anthropic.NewCacheControlEphemeralParam(), // 默认 5 分钟 TTL }},需要 1 小时 TTL 时用anthropic.CacheControlEphemeralParam{TTL: anthropic.CacheControlEphemeralTTLTTL1h}MessageNewParams上还有顶层CacheControl会自动放置在最后一个可缓存块上。验证缓存是否命中读流式累积出或一次性返回的 message 的Usage字段resp.Usage.CacheCreationInputTokens—— 本次写入缓存被计费的 token 数resp.Usage.CacheReadInputTokens—— 本次从缓存读出的 token 数。若重复请求中CacheReadInputTokens长期为零说明前缀被静默改写时间戳、非确定性序列化等需要对照 shared/prompt-caching.md 的“silent invalidators”清单排查。缓存最小可缓存前缀随模型而异如 Claude Opus 5 为 512 tokenOpus 4.8 为 1024前缀过短时即使打了标记也不会产生缓存命中。五、流式错误处理Go 的errors.As分支模式流式循环结束后必须检查stream.Err()——但注意Err()只反映传输层/迭代层面的失败。当 API 返回非 2xx 状态码时NewStreaming建立的流在迭代中会以错误终止此时需要按 shared/error-codes.md 中 Go 专用模式处理Go SDK 对全部非 2xx 响应统一返回*anthropic.Error用errors.As解包后按StatusCode分支_, err : client.Messages.New(ctx, params) if err ! nil { var apierr *anthropic.Error if errors.As(err, apierr) { switch apierr.StatusCode { case 404: // 模型 ID 错误等 case 429: // 限流退避重试 default: // apierr.StatusCode / apierr.RequestID } } else { // 传输层错误*url.Error 包装 *net.OpError 等 } }流式代码中把这一检查放在stream.Err()之上同样适用Err()捕获迭代期错误errors.As分支用于区分可重试429、5xx、网络错误与不可重试4xx类别。常见 400 成因包括max_tokens超限、budget_tokens max_tokens旧模型 extended thinking、模型 ID 拼写错误导致 404 等完整对照表见 shared/error-codes.md。六、实战最佳实践结合原文档、README 与仓库其他语言文档总结 Go 流式调用的六条实践建议优先流式即便不需要实时输出也可以“流式 累积”代替一次性请求以获得超时保护——message.Accumulate让最终结果与一次性返回等价。始终检查stream.Err()迭代Next()返回false不必然意味着成功错误判断的唯一权威是Err()。用类型断言而非字符串匹配事件与内容块均通过AsAny().(type)收窄避免解析 JSON 文本这也让 thinking / tool_use 等新块类型的扩展只需新增case。必要时同时消费增量与累积循环体内fmt.Print(deltaVariant.Text)做实时渲染message.Accumulate(stream.Current())做最终归档。流式与工具循环结合时注意停止原因StopReasonToolUse触发工具执行pause_turn服务端工具循环超过 10 次迭代需要重发上一轮内容继续详见 shared/tool-use-concepts.md。为长对话启用提示词缓存并验证命中把CacheControl打在最后一个 system 块上用Usage.CacheReadInputTokens持续验证详见 shared/prompt-caching.md。七、延伸阅读安装、客户端初始化、模型常量与完整参数说明go/claude-api/README.md工具调用Tool Runner 与手动循环go/claude-api/tool-use.md文件上传Files APIclient.Beta.Files.Uploadgo/claude-api/files-api.md错误码对照表与 Go 分支模式shared/error-codes.md提示词缓存设计与放置模式shared/prompt-caching.md模型目录与别名解析shared/models.md其他语言对照实现python/claude-api/streaming.md、csharp/claude-api/streaming.md、typescript/claude-api/streaming.md赞分享人工智能AI 技能AI 评测【免费下载链接】skillsPublic repository for Agent Skills项目地址https://gitcode.com/GitHub_Trending/skills3/skills点击查看免费下载相关推荐Claude PHP SDK 批量消息实战Message Batches API 完整指南Claude PHP SDK 批量消息实战Message Batches API 完整指南 Message Batches API 是 Claude Mess人工智能AI 技能AI 评测基于 Anthropic Java SDK 的 Claude API 流式响应从 createStreaming 到逐 Token 渲染的完整实现指南基于 Anthropic Java SDK 的 Claude API 流式响应从 createStreaming 到逐 Token 渲染的完整实现指南 本文以人工智能大模型AI 应用移动开发交互助手基于 Claude API PHP SDK 的流式响应实战createStream 事件循环与逐 token 输出基于 Claude API PHP SDK 的流式响应实战createStream 事件循环与逐 token 输出 本篇技术指南围绕当前仓库 .agents/人工智能大模型AI 应用移动开发交互助手上一篇ComfyUI完全指南5步掌握节点式AI图像生成工作流下一篇Cocos Creator 屏幕震动实现实战基于引擎原语推导的 3 种做法与调参区间创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考