Skip to content

Latest commit

 

History

History

README.md

llm-sdk for Go

A Go library that provides a unified API to access the LLM APIs of various providers.

Installation

go get github.com/hoangvvo/llm-sdk/sdk-go

Usage

All 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)
}

Examples

Find examples in the examples folder to learn how to:

go run ./examples/generate-text

Migration

To 0.4.0

  • Replace Tool{Name, Description, Parameters} literals with NewFunctionTool(...).
  • ToolResultPart.IsError has been replaced with the required Status field (ToolResultStatusCompleted, ToolResultStatusFailed, or ToolResultStatusCancelled).

To 0.2.0

  • ImageData and AudioData have been renamed to just Data in ImagePart and AudioPart.

Testing

go test ./sdk-go/...

License

MIT