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.ModelClaudeOpus4_8,
})
if err != nil {
panic(err.Error())
}
fmt.Printf("%+v\n", message.Content)
}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]、マップ、スライス、構造体、または文字列enumには`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を使用して正しい再シリアライズのために生のバイトを添付します。
// パラメータをシリアライズ(例:保存や転送のため)
b, err := json.Marshal(original)
if err != nil {
panic(err)
}
// 後で、保存されたJSONからパラメータを再構築
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.ModelClaudeOpus4_8,
})
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.ModelClaudeOpus4_8,
},
option.WithMaxRetries(5),
)非ストリーミングのMessagesリクエストは、デフォルトで10分後にタイムアウトします。その他のリクエストにはデフォルトのタイムアウトはありません。リクエストのライフサイクルにタイムアウトを設定するには、コンテキストを使用します。
リクエストがリトライされた場合、コンテキストのタイムアウトは最初からやり直されないことに注意してください。リトライごとのタイムアウトを設定するには、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.ModelClaudeOpus4_8,
},
// これはリトライごとのタイムアウトを設定します
option.WithRequestTimeout(20*time.Second),
)長時間実行されるリクエストには、ストリーミングMessages APIの使用を検討してください。
ストリーミングを使用せずに大きなMaxTokens値を設定することは避けてください。一部のネットワークでは、一定時間経過後にアイドル接続がドロップされる可能性があり、Anthropicからレスポンスを受信せずにリクエストが失敗したりタイムアウトしたりする原因となります。
このSDKは、非ストリーミングリクエストが約10分を超えると予想される場合にもエラーを返します。.Messages.NewStreaming()を呼び出すか、カスタムタイムアウトを設定することで、このエラーを無効化できます。
マルチパートリクエストでのファイルアップロードに対応するリクエストパラメータは、io.Readerとして型付けされています。io.Readerの内容は、デフォルトでファイル名「anonymous_file」、content-type「application/octet-stream」のマルチパートフォームパートとして送信されます。そのため、推奨されるアプローチは、任意のio.Readerを適切なファイル名とcontent-typeでラップするanthropic.File(reader io.Reader, filename string, contentType string)ヘルパーを使用してカスタムcontent-typeを指定することです。
// ファイルシステムからのファイル
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/bedrock"。Messages-API Bedrockエンドポイント(SSE経由でストリーミング)にはbedrock.NewMantleClientを使用するか、bedrock.WithLoadDefaultConfig(ctx) / bedrock.WithConfig(cfg)(bedrock-runtimeパス)を使用します。bedrockパッケージをインポートすると、(パッケージのinit()を通じて)application/vnd.amazon.eventstream用のデコーダーがSDKのストリーミングレイヤーにグローバルに登録されます。これは、bedrock-runtimeのWithConfig/WithLoadDefaultConfigパスを使用する場合でも、NewMantleClientを使用する場合でも適用されます。import "github.com/anthropics/anthropic-sdk-go/vertex"。vertex.WithGoogleAuth(ctx, region, projectID)またはvertex.WithCredentials(ctx, region, projectID, creds)を使用します。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.ModelClaudeOpus4_8,
},
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?