Anthropic SDK Go 版(anthropic sdk go):安装、首个请求、流式与错误处理(2026)
Anthropic SDK Go 版是 Claude API 的官方 Go 客户端,发布在 github.com/anthropics/anthropic-sdk-go。它用带类型的请求和响应结构体封装了 Messages API,内置重试与流式处理,还能把请求指向任意兼容的 Base URL。本文讲清安装、第一个请求、流式输出、错误处理,以及生产环境里真正要关心的客户端选项。
Anthropic SDK Go 版能帮你做什么
用 net/http 直接调 Claude API 当然可以,但 SDK 帮你省掉了那些最容易写错的部分:
- 带类型的参数与响应:字段拼错在编译期就会报错,而不是线上返回 400。
- 自动重试:遇到连接错误和 429、5xx 这类可重试状态码时自动退避重试。
- 流式辅助:读取服务端事件流(SSE),并可把事件累积成完整消息。
- 客户端选项:统一配置 API Key、Base URL、超时与重试次数。
如果你同时用其他语言,同样的概念也出现在 Anthropic SDK Python 版和 Anthropic SDK TypeScript 版里。
安装 Anthropic SDK Go 版
在 Go module 里添加依赖:
go get github.com/anthropics/anthropic-sdk-goSDK 遵循语义化版本。跨大版本升级前先看仓库的 Release 说明,因为大版本之间类型名和辅助函数可能会变。生产服务请在 go.mod 里锁定版本。
用 Go 客户端发第一个请求
客户端默认读取环境变量 ANTHROPIC_API_KEY,所以最小程序不需要显式传 Key:
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient() // 读取 ANTHROPIC_API_KEY
msg, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
Model: "claude-sonnet-5-5", // 换成你实际使用的模型
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("用两句话解释 Go 的 channel。")),
},
})
if err != nil {
log.Fatal(err)
}
for _, block := range msg.Content {
if block.Type == "text" {
fmt.Println(block.Text)
}
}
}有三点要注意:
MaxTokens是必填项,它限制的是回复长度,不是提示词大小。- 响应的
Content是一组内容块。文本最常见,但工具调用会以单独的块返回,所以要先判断块类型,别默认第一个块就是文本。 msg.Usage会返回输入与输出 token 数,计费就按它来。从第一天起就把它记进日志。
流式输出
聊天界面和长输出建议用流式,让用户边生成边看到文字:
stream := client.Messages.NewStreaming(context.TODO(), anthropic.MessageNewParams{
Model: "claude-sonnet-5-5",
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("写一首关于延迟的俳句。")),
},
})
message := anthropic.Message{}
for stream.Next() {
event := stream.Current()
if err := message.Accumulate(event); err != nil {
log.Fatal(err)
}
// 在这里检查 event,可实时打印文本增量。
}
if err := stream.Err(); err != nil {
log.Fatal(err)
}
// 此时 message 已是完整响应,包含 usage。固定套路是 Next() → Current() → 循环结束后检查 Err()。漏掉最后的 Err() 是最常见的流式 bug:连接中断时循环会悄悄结束,程序把半截答案当成完整结果。事件序列在 HTTP 层面怎么运作,见我们的 Claude API 流式输出指南。
错误、重试与超时处理
API 错误以 *anthropic.Error 返回,里面带有 HTTP 状态码:
import "errors"
_, err := client.Messages.New(ctx, params)
var apiErr *anthropic.Error
if errors.As(err, &apiErr) {
log.Printf("status %d", apiErr.StatusCode)
}常见状态码的处理方式:
|
状态码 |
含义 |
怎么处理 |
|---|---|---|
|
400 |
请求无效(缺字段、参数错误) |
修正请求;重试没有用 |
|
401 / 403 |
Key 缺失、无效或无权限 |
确认进程实际加载的是哪个 Key |
|
429 |
触发速率限制 |
SDK 会重试;持续出现就降低并发或提升限额 |
|
500 / 529 |
服务端错误或过载 |
会自动重试;面向用户的链路再加一层兜底 |
客户端默认会对可重试错误重试少量次数。调整重试与超时请用选项,而不是在每个调用外面自己包一层:
import (
"time"
"github.com/anthropics/anthropic-sdk-go/option"
)
client := anthropic.NewClient(
option.WithMaxRetries(4),
option.WithRequestTimeout(60*time.Second),
)速率限制按组织和模型设定,加并发之前值得先搞清楚。它的计量方式见 Anthropic API 速率限制。
客户端选项:API Key 与 Base URL
两个选项覆盖了大部分配置需求:
option.WithAPIKey("..."):显式设置 Key,而不是读环境变量。请从密钥管理服务加载,绝不要写死在代码里。option.WithBaseURL("https://..."):把请求发到另一个端点,比如内部网关、区域中转或兼容代理。SDK 会自动拼接 API 路径,所以只传 Base URL 即可。
client := anthropic.NewClient(
option.WithAPIKey(os.Getenv("MY_CLAUDE_KEY")),
option.WithBaseURL(os.Getenv("CLAUDE_BASE_URL")),
)更换 Base URL 后,在切生产流量之前先确认该端点支持你依赖的功能,比如流式和工具调用。要检查哪些项,见 Claude API 代理指南。
常见问题
Anthropic 有官方的 Go SDK 吗?
有。Anthropic 维护 github.com/anthropics/anthropic-sdk-go,覆盖 Messages API、流式输出、工具调用和客户端配置。在 Go module 里用 go get 安装即可。
Go SDK 里怎么设置 API Key?
客户端默认从环境变量读取 ANTHROPIC_API_KEY。要显式设置,就在 anthropic.NewClient 里传入 option.WithAPIKey(...),值从密钥管理服务加载。
Go SDK 能用自定义端点吗?
能。创建客户端时传入 option.WithBaseURL(...)。这样就能经由内部网关或兼容中转发请求,其余代码不用改。
Anthropic Go SDK 会自动重试失败的请求吗?
会。它会对连接错误和 429、5xx 等可重试状态码做几次退避重试。用 option.WithMaxRetries 调整次数,用 option.WithRequestTimeout 设置单次请求超时。
一句话总结
安装 github.com/anthropics/anthropic-sdk-go,创建读取 ANTHROPIC_API_KEY 的客户端,用模型、MaxTokens 和消息调用 client.Messages.New。流式输出用 NewStreaming,循环后务必检查 Err();通过 *anthropic.Error 读取状态码;重试、超时和 Base URL 都用客户端选项配置。