An open API service indexing awesome lists of open source software.

https://github.com/potproject/claude-sdk-go

Unofficial Go SDK for the Anthropic Claude API.
https://github.com/potproject/claude-sdk-go

anthropic claude claude-api golang

Last synced: 5 months ago
JSON representation

Unofficial Go SDK for the Anthropic Claude API.

Awesome Lists containing this project

README

          

# claude-sdk-go
[![Go Reference](https://pkg.go.dev/badge/github.com/potproject/claude-sdk-go.svg)](https://pkg.go.dev/github.com/potproject/claude-sdk-go)
[![Go Report Card](https://goreportcard.com/badge/github.com/potproject/claude-sdk-go)](https://goreportcard.com/report/github.com/potproject/claude-sdk-go)

This is the unofficial Go SDK for the Anthropic Claude API.

It is designed with reference to the [sashabaranov/go-openai](https://github.com/sashabaranov/go-openai).

Official Docs: https://docs.anthropic.com/claude/

## Supported
* /v1/messages
* Text Message
* Image Message
* Streaming Messages
* Thinking
* Cache Control

## Getting Started
```bash
go get github.com/potproject/claude-sdk-go
```

## Example
### Create a Message
```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)

### Create a Message(Use Cache)
```go
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

### Create a Streaming Message
```go
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

### Create a Message with Image
```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,
ContentTypeImage: []claude.RequestBodyMessagesMessagesContentTypeImage{
{
Source: claude.TypeImageSourceLoadBase64("image/png", "iVBORw0K..."), // Media Type, Base64 String
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)

### Create a Message with Image(Load File)
```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)
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 with Image(Load URL)

### Create a Message with Image(Load URL)
```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,
ContentTypeImage: []claude.RequestBodyMessagesMessagesContentTypeImage{
{
Source: claude.TypeImageSourceLoadUrl("https://github.com/potproject/claude-sdk-go/blob/main/example/messages_image_file/image.png?raw=true"),
},
},
},
},
}
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)

### Create a Message (Use Thinking)
```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: 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)

### Create a Streaming Message (Use Thinking)
```go
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()
}

```

## LICENSE
MIT