Anthropic Goライブラリは、Goで書かれたアプリケーションからAnthropic REST APIへの便利なアクセスを提供します。
コード例を含むAPI機能のドキュメントについては、APIリファレンスを参照してください。このページではGo固有のSDK機能と設定について説明します。
import (
"github.com/anthropics/anthropic-sdk-go" // imported as anthropic
)go getでインストールします:
go get github.com/anthropics/anthropic-sdk-goこのライブラリにはGo 1.23以上が必要です。
package main
import (
"context"
"fmt"
"github.com/anthropics/anthropic-sdk-go"
"github.com/anthropics/anthropic-sdk-go/option"
)
func main() {
client := anthropic.NewClient(
option.WithAPIKey("my-anthropic-api-key"), // defaults to os.LookupEnv("ANTHROPIC_API_KEY")
)
message, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{
anthropic.NewUserMessage(anthropic.NewTextBlock("What is a quaternion?")),
},
Model: anthropic.ModelClaudeOpus5,
})
if err != nil {
panic(err.Error())
}
for _, block := range message.Content {
if textBlock, ok := block.AsAny().(anthropic.TextBlock); ok {
fmt.Println(textBlock.Text)
}
}
}Workload Identity Federationを含む認証オプションについては、認証を参照してください。
anthropicライブラリは、リクエストフィールドにGo 1.24以降のencoding/jsonリリースの
omitzeroセマンティクスを使用します。
必須のプリミティブフィールド(int64、stringなど)には`json:"...,required"`タグが付いています。これらの
フィールドは、ゼロ値であっても常にシリアライズされます。
オプションのプリミティブ型はparam.Opt[T]でラップされます。これらのフィールドは、提供されているコンストラクタanthropic.String(string)、anthropic.Int(int64)などで設定できます。
param.Opt[T]、マップ、スライス、構造体、または文字列列挙型には
`json:"...,omitzero"`タグが使用されます。そのゼロ値は省略されたものとみなされます。
param.IsOmitted(any)関数は、任意のomitzeroフィールドの存在を確認できます。
p := anthropic.ExampleParams{
ID: "id_xxx", // required property
Name: anthropic.String("..."), // optional property
Point: anthropic.Point{
X: 0, // required field will serialize as 0
Y: anthropic.Int(1), // optional field will serialize as 1
// ... 省略された必須でないフィールドはシリアライズされません
},
Origin: anthropic.Origin{}, // the zero value of [Origin] is considered omitted
}param.Opt[T]の代わりにnullを送信するには、param.Null[T]()を使用します。
構造体Tの代わりにnullを送信するには、param.NullStruct[T]()を使用します。
p.Name = param.Null[string]() // 'null' instead of string
p.Point = param.NullStruct[Point]() // 'null' instead of struct
param.IsNull(p.Name) // true
param.IsNull(p.Point) // trueリクエスト構造体には.SetExtraFields(map[string]any)メソッドが含まれており、リクエストボディに
準拠していないフィールドを送信できます。追加フィールドは、一致するキーを持つ構造体フィールドを
上書きします。
セキュリティ上の理由から、SetExtraFieldsは信頼できるデータに対してのみ使用してください。
構造体の代わりにカスタム値を送信するには、ジェネリック関数param.Overrideを使用します(例:param.Override[anthropic.FooParams](12))。
// APIで特定の型が指定されているものの、
// 別のものを送信したい場合は、[SetExtraFields]を使用します:
p.SetExtraFields(map[string]any{
"x": 0.01, // send "x" as a float instead of int
})
// オブジェクトの代わりに数値を送信する
custom := param.Override[anthropic.FooParams](12)ユニオンは、各バリアントに対して「Of」というプレフィックスが付いたフィールドを持つ構造体として表現され、 非ゼロにできるフィールドは1つだけです。非ゼロのフィールドがシリアライズされます。
ユニオンのサブプロパティには、ユニオン構造体のメソッドを通じてアクセスできます。 これらのメソッドは、存在する場合、基になるデータへの可変ポインタを返します。
// 非ゼロにできるフィールドは1つだけです。フィールドが設定されているかは param.IsOmitted() で確認します
type AnimalUnionParam struct {
OfCat *Cat `json:",omitzero,inline"`
OfDog *Dog `json:",omitzero,inline"`
}
animal := AnimalUnionParam{
OfCat: &Cat{
Name: "Whiskers",
Owner: PersonParam{
Address: AddressParam{Street: "3333 Coyote Hill Rd", ZipCode: 0},
},
},
}
// フィールドの変更
if address := animal.GetOwner().GetAddress(); address != nil {
address.ZipCode = 94304
}param.SetJSONにはSDK v1.20.0以降が必要です。
パラメータ型(MessageNewParamsやToolUnionParamなど、Paramで終わる型)は、送信リクエスト専用に設計されています。JSONへのマーシャリングは正しく行われますが、ラウンドトリップのデシリアライズは完全にはサポートされていません。生のJSONをパラメータ構造体にアンマーシャルすると、基になるJSONが有効であっても、OfBashTool20250124のような型付きユニオンフィールドはnilになります。
生のJSONからパラメータを再構築する必要がある場合(たとえば、データベース、ミドルウェア、または以前のリクエストから)、UnmarshalJSONを呼び出して非ユニオンフィールドを設定し、次にparam.SetJSONを使用して正しい再シリアライズのために生のバイトを添付します:
// paramsをシリアライズします(例:保存や転送のため)
b, err := json.Marshal(original)
if err != nil {
panic(err)
}
// 後で、保存したJSONからparamsを再構築します
var params anthropic.MessageNewParams
if err := params.UnmarshalJSON(b); err != nil {
panic(err)
}
param.SetJSON(b, ¶ms)
// params.Modelやその他のスカラーフィールドはUnmarshalJSONによって設定されます。
// params.Tools[0].OfBashTool20250124はnilですが(ユニオン型の制限)、
// 生のJSONは保持されます。paramsがAPI呼び出しのために再度
// マーシャルされる際、ツールは正しくシリアライズされます。
b2, _ := json.Marshal(params)
fmt.Println(string(b) == string(b2)) // trueこのユースケースでは、型パラメータを明示的に記述する必要がなく、ラウンドトリップの意図を明確にできるため、より汎用的なparam.Override[T](any)よりもparam.SetJSON(v1.20.0以降で利用可能)が推奨されます。
レスポンス構造体のすべてのフィールドは、通常の値型です(ポインタやラッパーではありません)。
レスポンス構造体には、各プロパティに関するメタデータを含む特別なJSONフィールドも
含まれています。
type Animal struct {
Name string `json:"name,nullable"`
Owners int `json:"owners"`
Age int `json:"age"`
JSON struct {
Name respjson.Field
Owners respjson.Field
Age respjson.Field
ExtraFields map[string]respjson.Field
} `json:"-"`
}オプションのデータを処理するには、JSONフィールドの.Valid()メソッドを使用します。
.Valid()は、フィールドが存在し、nullでなく、正常にアンマーシャルされた場合にtrueを返します。
.Valid()がfalseの場合、対応するフィールドはそのゼロ値になります。
raw := `{"owners": 1, "name": null}`
var res Animal
json.Unmarshal([]byte(raw), &res)
// 通常のフィールドへのアクセス
res.Owners // 1
res.Name // ""
res.Age // 0
// オプションフィールドのチェック
res.JSON.Owners.Valid() // true
res.JSON.Name.Valid() // false
res.JSON.Age.Valid() // false
// 生のJSON値
res.JSON.Owners.Raw() // "1"
res.JSON.Name.Raw() == "null" // true
res.JSON.Name.Raw() == respjson.Null // true
res.JSON.Age.Raw() == "" // true
res.JSON.Age.Raw() == respjson.Omitted // trueこれらの.JSON構造体には、構造体で指定されていないjsonレスポンス内の
プロパティを含むExtraFieldsマップも含まれています。
これは、SDKにまだ存在しないAPI機能に
役立ちます。
body := res.JSON.ExtraFields["my_unexpected_field"].Raw()レスポンスでは、ユニオンは各オブジェクトバリアントのすべての可能なフィールドを含む
フラット化された構造体として表現されます。
バリアントに変換するには、.AsFooVariant()メソッド、または存在する場合は.AsAny()メソッドを使用します。
レスポンス値のユニオンにプリミティブ値が含まれている場合、プリミティブフィールドはプロパティと
並んで配置されますが、Ofというプレフィックスが付き、json:"...,inline"タグが付きます。
type AnimalUnion struct {
// バリアント [Dog]、[Cat] から
Owner Person `json:"owner"`
// バリアント [Dog] から
DogBreed string `json:"dog_breed"`
// バリアント [Cat] から
CatBreed string `json:"cat_breed"`
// ...
JSON struct {
Owner respjson.Field
// ...
} `json:"-"`
}
// animal バリアントの場合
if animal.Owner.Address.ZipCode == "" {
panic("missing zip code")
}
// バリアントで分岐する
switch variant := animal.AsAny().(type) {
case Dog:
case Cat:
default:
panic("unexpected type")
}APIが成功以外のステータスコードを返した場合、SDKは*anthropic.Error型の
エラーを返します。これには、リクエストのStatusCode、*http.Request、
*http.Responseの値と、エラーボディのJSON(SDKの他のレスポンスオブジェクトと
同様)が含まれます。エラーには、レスポンスヘッダーからのRequestIDも含まれており、
Anthropicサポートでのトラブルシューティングに役立ちます。
エラーを処理するには、errors.Asパターンを使用します:
_, err := client.Messages.New(context.TODO(), anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{{
Content: []anthropic.ContentBlockParamUnion{{
OfText: &anthropic.TextBlockParam{
Text: "What is a quaternion?",
},
}},
Role: anthropic.MessageParamRoleUser,
}},
Model: anthropic.ModelClaudeOpus5,
})
if err != nil {
var apierr *anthropic.Error
if errors.As(err, &apierr) {
println("Request ID:", apierr.RequestID)
println(string(apierr.DumpRequest(true))) // Prints the serialized HTTP request
println(string(apierr.DumpResponse(true))) // Prints the serialized HTTP response
}
panic(err.Error()) // POST "/v1/messages": 400 Bad Request (Request-ID: req_xxx) { ... }
}その他のエラーが発生した場合、それらはラップされずに返されます。たとえば、
HTTPトランスポートが失敗した場合、*net.OpErrorをラップした*url.Errorを受け取る可能性があります。
特定のエラーは、デフォルトで短い指数バックオフを伴って2回自動的にリトライされます。 SDKはデフォルトで、すべての接続エラー、408 Request Timeout、409 Conflict、429 Rate Limit、 および500以上のInternalエラーをリトライします。
WithMaxRetriesオプションを使用して、これを設定または無効化できます:
// すべてのリクエストに対するデフォルトを設定します:
client := anthropic.NewClient(
option.WithMaxRetries(0), // default is 2
)
// リクエストごとに上書きします:
client.Messages.New(
context.TODO(),
anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{{
Content: []anthropic.ContentBlockParamUnion{{
OfText: &anthropic.TextBlockParam{
Text: "What is a quaternion?",
},
}},
Role: anthropic.MessageParamRoleUser,
}},
Model: anthropic.ModelClaudeOpus5,
},
option.WithMaxRetries(5),
)非ストリーミングのMessagesリクエストは、デフォルトで10分後にタイムアウトします。その他のリクエストにはデフォルトのタイムアウトはありません。リクエストのライフサイクルにタイムアウトを設定するには、contextを使用します。
リクエストがリトライされた場合、contextのタイムアウトは最初からやり直されないことに注意してください。
リトライごとのタイムアウトを設定するには、option.WithRequestTimeout()を使用します。
// これはすべてのリトライを含むリクエストのタイムアウトを設定します。
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
client.Messages.New(
ctx,
anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{{
Content: []anthropic.ContentBlockParamUnion{{
OfText: &anthropic.TextBlockParam{
Text: "What is a quaternion?",
},
}},
Role: anthropic.MessageParamRoleUser,
}},
Model: anthropic.ModelClaudeOpus5,
},
// これはリトライごとのタイムアウトを設定します
option.WithRequestTimeout(20*time.Second),
)長時間実行されるリクエストには、ストリーミングMessages APIの使用を検討してください。
一部のネットワークは一定時間後にアイドル接続を切断する可能性があるため、ストリーミングを使用せずに大きなMaxTokens値を設定することは避けてください。
これにより、Anthropicからレスポンスを受信せずにリクエストが失敗したり、タイムアウトしたりする可能性があります。
このSDKは、非ストリーミングリクエストが約10分以上かかると予想される場合にもエラーを返します。
.Messages.NewStreaming()を呼び出すか、カスタムタイムアウトを設定することで、このエラーを無効化できます。
マルチパートリクエストでのファイルアップロードに対応するリクエストパラメータは、
io.Readerとして型付けされています。io.Readerの内容は、デフォルトでファイル名「anonymous_file」、
content-type「application/octet-stream」のマルチパートフォームパートとして送信されるため、推奨されるアプローチは、anthropic.File(reader io.Reader, filename string, contentType string)
ヘルパーを使用してカスタムcontent-typeを指定することです。このヘルパーは、任意のio.Readerを適切なファイル名とコンテンツタイプでラップします。
// ファイルシステムからのファイル
file, err := os.Open("/path/to/file.json")
anthropic.BetaFileUploadParams{
File: anthropic.File(file, "custom-name.json", "application/json"),
}
// 文字列からのファイル
anthropic.BetaFileUploadParams{
File: anthropic.File(strings.NewReader("my file contents"), "custom-name.json", "application/json"),
}ファイル名とcontent-typeは、io.Readerの実行時型にName() stringまたはContentType() stringを実装することでもカスタマイズできます。os.FileはName() stringを実装しているため、
os.Openによって返されるファイルはディスク上のファイル名で送信されることに注意してください。
このライブラリは、ページネーションされたリストエンドポイントを操作するための便利な機能を提供します。
.ListAutoPaging()メソッドを使用して、すべてのページにわたってアイテムを反復処理できます:
iter := client.Messages.Batches.ListAutoPaging(context.TODO(), anthropic.MessageBatchListParams{
Limit: anthropic.Int(20),
})
// 必要に応じて自動的に追加のページを取得します。
for iter.Next() {
messageBatch := iter.Current()
fmt.Printf("%+v\n", messageBatch)
}
if err := iter.Err(); err != nil {
panic(err.Error())
}または、シンプルな.List()メソッドを使用して単一のページを取得し、.GetNextPage()などの
追加のヘルパーメソッドを持つ標準のレスポンスオブジェクトを受け取ることもできます:
page, err := client.Messages.Batches.List(context.TODO(), anthropic.MessageBatchListParams{
Limit: anthropic.Int(20),
})
for page != nil {
for _, batch := range page.Data {
fmt.Printf("%+v\n", batch)
}
page, err = page.GetNextPage()
}
if err != nil {
panic(err.Error())
}このライブラリは関数型オプションパターンを使用しています。optionパッケージで定義された
関数はRequestOptionを返します。これはRequestConfigを変更するクロージャです。
これらのオプションは、クライアントまたは個々のリクエストに指定できます。例:
client := anthropic.NewClient(
// クライアントが行うすべてのリクエストにヘッダーを追加します
option.WithHeader("X-Some-Header", "custom_header_info"),
)
client.Messages.New(context.TODO(), // ...,
// ヘッダーを上書きします
option.WithHeader("X-Some-Header", "some_other_custom_header_info"),
// sjson構文を使用して、リクエストボディにドキュメント化されていないフィールドを追加します
option.WithJSONSet("some.json.path", map[string]string{"my": "object"}),
)リクエストオプションoption.WithDebugLog(nil)は、デバッグ時に役立つ場合があります。
リクエストオプションの完全なリストを参照してください。
リクエストミドルウェア(option.WithMiddleware)とデフォルトのhttp.Clientの置き換え(option.WithHTTPClient)については、SDKミドルウェアを参照してください。
コード例を含む詳細なプラットフォームセットアップガイドについては、以下を参照してください:
Go SDKは以下のプラットフォームをサポートしています:
import "github.com/anthropics/anthropic-sdk-go/vertex"。vertex.WithGoogleAuth(ctx, region, projectID)またはvertex.WithCredentials(ctx, region, projectID, creds)を使用します。import "github.com/anthropics/anthropic-sdk-go/bedrock"。Messages-API Bedrockエンドポイント(SSE経由でストリーミング)にはbedrock.NewMantleClientを使用するか、bedrock.WithLoadDefaultConfig(ctx) / bedrock.WithConfig(cfg)(bedrock-runtimeパス)を使用します。bedrockパッケージをインポートすると、(パッケージのinit()を通じて)SDKのストリーミングレイヤーにapplication/vnd.amazon.eventstreamのデコーダーがグローバルに登録されます。これは、bedrock-runtimeのWithConfig/WithLoadDefaultConfigパスを使用する場合でも、NewMantleClientを使用する場合でも適用されます。import anthropicaws "github.com/anthropics/anthropic-sdk-go/aws"。anthropicaws.ClientConfig値を指定してanthropicaws.NewClient(ctx, cfg)を使用してクライアントを構築します。設定でWorkspaceIDを設定するか、ANTHROPIC_AWS_WORKSPACE_ID環境変数を設定します。anthropicawsインポートエイリアスは、両方がインポートされた場合のgithub.com/aws/aws-sdk-go-v2/awsとの名前の衝突を回避します。ベータ版で利用可能です。新しいプロジェクトにはbedrock.NewMantleClientを使用してください。bedrock.WithLoadDefaultConfig/WithConfigは、BedrockのInvokeModel APIを使用する既存のアプリケーション向けに残されています。
option.WithResponseInto()リクエストオプションを使用して、生のHTTPレスポンスデータにアクセスできます。これは、
レスポンスヘッダー、ステータスコード、その他の詳細を確認する必要がある場合に役立ちます。
// HTTPレスポンスを格納する変数を作成します
var response *http.Response
message, err := client.Messages.New(
context.TODO(),
anthropic.MessageNewParams{
MaxTokens: 1024,
Messages: []anthropic.MessageParam{{
Content: []anthropic.ContentBlockParamUnion{{
OfText: &anthropic.TextBlockParam{
Text: "What is a quaternion?",
},
}},
Role: anthropic.MessageParamRoleUser,
}},
Model: anthropic.ModelClaudeOpus5,
},
option.WithResponseInto(&response),
)
if err != nil {
// エラーを処理します
}
fmt.Printf("%+v\n", message)
fmt.Printf("Status Code: %d\n", response.StatusCode)
fmt.Printf("Headers: %+#v\n", response.Header)このライブラリは、ドキュメント化されたAPIへの便利なアクセスのために型付けされています。ドキュメント化されていない エンドポイント、パラメータ、またはレスポンスプロパティにアクセスする必要がある場合でも、このライブラリを使用できます。
ドキュメント化されていないエンドポイントにリクエストを送信するには、client.Get、client.Post、その他のHTTP動詞を使用できます。
これらのリクエストを行う際には、リトライなどのクライアントのRequestOptionsが尊重されます。
var (
// paramsにはio.Reader、[]byte、encoding/jsonでシリアライズ可能なオブジェクト、
// または本ライブラリで定義されている"...Params"構造体を指定できます。
params map[string]any
// resultには[]byte、*http.Response、encoding/jsonでデシリアライズ可能なオブジェクト、
// または本ライブラリで定義されているモデルを指定できます。
result *http.Response
)
err := client.Post(context.Background(), "/unspecified", params, &result)
if err != nil {
// ...
}ドキュメント化されていないパラメータを使用してリクエストを行うには、option.WithQuerySet()
またはoption.WithJSONSet()メソッドのいずれかを使用できます。
params := FooNewParams{
ID: "id_xxxx",
Data: FooNewParamsData{
FirstName: anthropic.String("John"),
},
}
client.Foo.New(context.Background(), params, option.WithJSONSet("data.last_name", "Doe"))ドキュメント化されていないレスポンスプロパティにアクセスするには、result.JSON.RawJSON()でレスポンスの生のJSONに
文字列としてアクセスするか、result.JSON.Foo.Raw()で結果の特定のフィールドの生のJSONを
取得できます。
レスポンス構造体に存在しないフィールドは保存され、map[string]respjson.Fieldであるresult.JSON.ExtraFieldsを通じてアクセスできます。
このパッケージは一般的にSemVerの規約に従いますが、特定の後方互換性のない変更がマイナーバージョンとしてリリースされる場合があります:
スムーズなアップグレード体験を確保できるよう、後方互換性は真剣に考慮されています。
フィードバックを歓迎します。質問、バグ、提案がある場合はissueを開いてください。
Was this page helpful?