A Go library that provides a unified API to access the LLM APIs of various providers.
go get github.com/hoangvvo/llm-sdk/sdk-goAll models implement the LanguageModel interface:
package examples
import (
"fmt"
"os"
llmsdk "github.com/hoangvvo/llm-sdk/sdk-go"
"github.com/hoangvvo/llm-sdk/sdk-go/anthropic"
"github.com/hoangvvo/llm-sdk/sdk-go/google"
"github.com/hoangvvo/llm-sdk/sdk-go/openai"
"github.com/joho/godotenv"
)
func init() {
godotenv.Load("../.env")
}
// GetModel creates and returns a language model based on provider and model ID
func GetModel(provider, modelID string) llmsdk.LanguageModel {
switch provider {
case "openai":
apiKey := os.Getenv("OPENAI_API_KEY")
if apiKey == "" {
panic("OPENAI_API_KEY environment variable is required")
}
return openai.NewOpenAIModel(modelID, openai.OpenAIModelOptions{
APIKey: apiKey,
})
case "openai-chat-completion":
apiKey := os.Getenv("OPENAI_API_KEY")
if apiKey == "" {
panic("OPENAI_API_KEY environment variable is required")
}
return openai.NewOpenAIChatModel(modelID, openai.OpenAIChatModelOptions{
APIKey: apiKey,
})
case "anthropic":
apiKey := os.Getenv("ANTHROPIC_API_KEY")
if apiKey == "" {
panic("ANTHROPIC_API_KEY environment variable is required")
}
return anthropic.NewAnthropicModel(modelID, anthropic.AnthropicModelOptions{
APIKey: apiKey,
})
case "google":
apiKey := os.Getenv("GOOGLE_API_KEY")
if apiKey == "" {
panic("GOOGLE_API_KEY environment variable is required")
}
return google.NewGoogleModel(modelID, google.GoogleModelOptions{
APIKey: apiKey,
})
default:
panic(fmt.Sprintf("Unsupported provider: %s", provider))
}
}Below is an example to generate text:
package main
import (
"context"
"log"
llmsdk "github.com/hoangvvo/llm-sdk/sdk-go"
"github.com/hoangvvo/llm-sdk/sdk-go/examples"
"github.com/sanity-io/litter"
)
func main() {
model := examples.GetModel("openai", "gpt-5.6-terra")
response, err := model.Generate(context.Background(), &llmsdk.LanguageModelInput{
Messages: []llmsdk.Message{
llmsdk.NewUserMessage(
llmsdk.NewTextPart("Tell me a story."),
),
llmsdk.NewAssistantMessage(
llmsdk.NewTextPart("What kind of story would you like to hear?"),
),
llmsdk.NewUserMessage(
llmsdk.NewTextPart("A fairy tale."),
),
},
})
if err != nil {
log.Fatalf("Generation failed: %v", err)
}
litter.Dump(response)
}Find examples in the examples folder to learn how to:
generate-text: Generate textstream-text: Stream textgenerate-audio: Generate audiostream-audio: Stream audiogenerate-image: Generate imagedescribe-image: Describe imagesummarize-audio: Summarize audiotool-use: Function callingweb-search: Web searchstream-web-search: Stream web searchstructured-output: Structured outputgenerate-reasoning: Reasoningstream-reasoning: Stream reasoninggenerate-citations: Generate citationsstream-citations: Stream citations
go run ./examples/generate-text- Replace
Tool{Name, Description, Parameters}literals withNewFunctionTool(...). ToolResultPart.IsErrorhas been replaced with the requiredStatusfield (ToolResultStatusCompleted,ToolResultStatusFailed, orToolResultStatusCancelled).
ImageDataandAudioDatahave been renamed to justDatainImagePartandAudioPart.
go test ./sdk-go/...