This is the unofficial Go SDK for the Anthropic Claude API.
It is designed with reference to the sashabaranov/go-openai.
Official Docs: https://docs.anthropic.com/claude/
- /v1/messages
- Text Message
- Image Message
- Streaming Messages
- Thinking
- Cache Control
go get github.com/potproject/claude-sdk-go
package main
import (
"context"
"fmt"
"os"
claude "github.com/potproject/claude-sdk-go"
)
func main() {
apiKey := os.Getenv("API_KEY")
c := claude.NewClient(apiKey)
m := claude.RequestBodyMessages{
Model: "claude-3-7-sonnet-20250219",
MaxTokens: 1024,
Messages: []claude.RequestBodyMessagesMessages{
{
Role: claude.MessagesRoleUser,
Content: "Hello, world!",
// Alternatively, you can use ContentTypeText
//
// ContentTypeText: []claude.RequestBodyMessagesMessagesContentTypeText{
// {
// Text: "Hello, world!",
// },
// },
},
},
}
ctx := context.Background()
res, err := c.CreateMessages(ctx, m)
if err != nil {
panic(err)
}
fmt.Println(res.Content[0].Text)
// Output:
// Hello! How can I assist you today?
}
Create a Message(Use Cache)
apiKey := os.Getenv("API_KEY")
c := claude.NewClient(apiKey)
m := claude.RequestBodyMessages{
Model: "claude-3-7-sonnet-20250219",
MaxTokens: 1024,
SystemTypeText: []claude.RequestBodySystemTypeText{
claude.UseSystemCacheEphemeral("Please speak in Japanese."),
},
Messages: []claude.RequestBodyMessagesMessages{
{
Role: claude.MessagesRoleUser,
ContentTypeText: []claude.RequestBodyMessagesMessagesContentTypeText{
{
Text: "Hello!",
CacheControl: claude.UseCacheEphemeral(),
},
},
},
},
}
ctx := context.Background()
res, err := c.CreateMessages(ctx, m)
if err != nil {
panic(err)
}
fmt.Println(res.Content[0].Text)
// Output:
// こんにちは!日本語でお話しましょう。
Create a Streaming Message
package main
import (
"context"
"errors"
"fmt"
"io"
"os"
claude "github.com/potproject/claude-sdk-go"
)
func main() {
apiKey := os.Getenv("API_KEY")
c := claude.NewClient(apiKey)
m := claude.RequestBodyMessages{
Model: "claude-3-7-sonnet-20250219",
MaxTokens: 1024,
Messages: []claude.RequestBodyMessagesMessages{
{
Role: claude.MessagesRoleUser,
Content: "Hello, world!",
},
},
}
ctx := context.Background()
stream, err := c.CreateMessagesStream(ctx, m)
if err != nil {
panic(err)
}
defer stream.Close()
for {
res, err := stream.Recv()
if errors.Is(err, io.EOF) {
break
}
if err != nil {
panic(err)
}
fmt.Printf("%s", res.Content[0].Text)
}
fmt.Println()
// Output:
// Hello! How can I assist you today?
//
}
Create a Message with Image
package main
import (
"context"
"fmt"
"os"
claude "github.com/potproject/claude-sdk-go"
)
func main() {
apiKey := os.Getenv("API_KEY")
c := claude.NewClient(apiKey)
m := claude.RequestBodyMessages{
Model: "claude-3.7-sonnet-20250219",
MaxTokens: 1024,
Messages: []claude.RequestBodyMessagesMessages{
{
Role: claude.MessagesRoleUser,
ContentTypeImage: []claude.RequestBodyMessagesMessagesContentTypeImage{
{
Source: claude.RequestBodyMessagesMessagesContentTypeImageSource{
Type: "base64",
MediaType: "image/png",
Data: "iVBORw0KG...",
},
CacheControl: claude.UseCacheEphemeral(), // Use Propmt Caching. optional
},
},
},
},
}
ctx := context.Background()
res, err := c.CreateMessages(ctx, m)
if err != nil {
panic(err)
}
fmt.Println(res.Content[0].Text)
}
Create a Message with Image(Load File)
package main
import (
"context"
"fmt"
"os"
claude "github.com/potproject/claude-sdk-go"
)
func main() {
apiKey := os.Getenv("API_KEY")
c := claude.NewClient(apiKey)
source, err := claude.TypeImageSourceLoadFile("image.png")
if err != nil {
panic(err)
}
m := claude.RequestBodyMessages{
Model: "claude-3-7-sonnet-20250219",
MaxTokens: 1024,
Messages: []claude.RequestBodyMessagesMessages{
{
Role: claude.MessagesRoleUser,
ContentTypeImage: []claude.RequestBodyMessagesMessagesContentTypeImage{
{
Source: source,
},
},
},
},
}
ctx := context.Background()
res, err := c.CreateMessages(ctx, m)
if err != nil {
panic(err)
}
fmt.Println(res.Content[0].Text)
}
Create a Message (Use Thinking)
package main
import (
"context"
"fmt"
"os"
claude "github.com/potproject/claude-sdk-go"
)
func main() {
apiKey := os.Getenv("API_KEY")
c := claude.NewClient(apiKey)
m := claude.RequestBodyMessages{
Model: "claude-3-7-sonnet-20250219",
MaxTokens: 8192,
Thinking: claude.UseThinking(4096),
Messages: []claude.RequestBodyMessagesMessages{
{
Role: claude.MessagesRoleUser,
Content: "Hello, world!",
},
},
}
ctx := context.Background()
res, err := c.CreateMessages(ctx, m)
if err != nil {
panic(err)
}
// Output:
// [thinking] This is a simple "Hello, world!" greeting from the user. It's a common first phrase in programming and also a standard greeting in conversations with AI assistants. I should respond in a friendly and welcoming manner.
// [text] Hi there! It's nice to meet you. "Hello, world!" is such a classic greeting - it brings back memories of first programming lessons for many! How are you doing today? Is there something specific I can help you with?
for _, v := range res.Content {
if v.Type == claude.ResponseBodyMessagesContentTypeThinking {
fmt.Println("[thinking]", v.Thinking)
}
if v.Type == claude.ResponseBodyMessagesContentTypeText {
fmt.Println("[text]", v.Text)
}
}
}
Create a Streaming Message (Use Thinking)
package main
import (
"context"
"errors"
"fmt"
"io"
"os"
claude "github.com/potproject/claude-sdk-go"
)
func main() {
apiKey := os.Getenv("API_KEY")
c := claude.NewClient(apiKey)
m := claude.RequestBodyMessages{
Model: "claude-3-7-sonnet-20250219",
MaxTokens: 8192,
Thinking: claude.UseThinking(4096),
Messages: []claude.RequestBodyMessagesMessages{
{
Role: claude.MessagesRoleUser,
Content: "Guess the Earth's population in 2100",
},
},
}
ctx := context.Background()
stream, err := c.CreateMessagesStream(ctx, m)
if err != nil {
panic(err)
}
defer stream.Close()
streamType := ""
for {
res, err := stream.Recv()
if errors.Is(err, io.EOF) {
break
}
if err != nil {
panic(err)
}
if res.Content[0].Type == claude.ResponseBodyMessagesContentTypeThinking && streamType != claude.ResponseBodyMessagesContentTypeThinking {
fmt.Println("[thinking]")
streamType = claude.ResponseBodyMessagesContentTypeThinking
}
if res.Content[0].Type == claude.ResponseBodyMessagesContentTypeText && streamType != claude.ResponseBodyMessagesContentTypeText {
fmt.Println()
fmt.Println("[text]")
streamType = claude.ResponseBodyMessagesContentTypeText
}
fmt.Printf("%s", res.Content[0].Thinking)
fmt.Printf("%s", res.Content[0].Text)
}
fmt.Println()
}
MIT