Skip to content
Docs

OpenRouter LLM Provider

The OpenRouter provider connects Beluga AI to OpenRouter, a unified gateway that routes requests to many different model providers (OpenAI, Anthropic, Google, Meta, Mistral, and more). OpenRouter exposes an OpenAI-compatible API, so this provider supports all standard features including streaming, tool calling, and structured output.

Choose OpenRouter when you want to compare models across providers without managing separate API keys, or when you need access to niche models not available through other providers. OpenRouter’s single API key simplifies billing and model switching during development and evaluation.

Terminal window
go get github.com/lookatitude/beluga-ai/llm/providers/openrouter
FieldRequiredDefaultDescription
ModelYesModel ID (provider/model format)
APIKeyYesOpenRouter API key (sk-or-...)
BaseURLNohttps://openrouter.ai/api/v1Override API endpoint
TimeoutNo30sRequest timeout

Environment variables:

VariableMaps to
OPENROUTER_API_KEYAPIKey
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/lookatitude/beluga-ai/config"
"github.com/lookatitude/beluga-ai/llm"
"github.com/lookatitude/beluga-ai/schema"
_ "github.com/lookatitude/beluga-ai/llm/providers/openrouter"
)
func main() {
model, err := llm.New("openrouter", config.ProviderConfig{
Model: "anthropic/claude-sonnet-4-5-20250929",
APIKey: os.Getenv("OPENROUTER_API_KEY"),
})
if err != nil {
log.Fatal(err)
}
msgs := []schema.Message{
schema.NewSystemMessage("You are a helpful assistant."),
schema.NewHumanMessage("What is the capital of France?"),
}
resp, err := model.Generate(context.Background(), msgs)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Text())
}
for chunk, err := range model.Stream(context.Background(), msgs) {
if err != nil {
log.Fatal(err)
}
fmt.Print(chunk.Delta)
}
fmt.Println()

OpenRouter uses a provider/model naming convention:

// Use Claude via OpenRouter
model, err := llm.New("openrouter", config.ProviderConfig{
Model: "anthropic/claude-sonnet-4-5-20250929",
APIKey: os.Getenv("OPENROUTER_API_KEY"),
})
// Use GPT-4o via OpenRouter
model, err := llm.New("openrouter", config.ProviderConfig{
Model: "openai/gpt-4o",
APIKey: os.Getenv("OPENROUTER_API_KEY"),
})
// Use Llama via OpenRouter
model, err := llm.New("openrouter", config.ProviderConfig{
Model: "meta-llama/llama-3.1-70b-instruct",
APIKey: os.Getenv("OPENROUTER_API_KEY"),
})
modelWithTools := model.BindTools(tools)
resp, err := modelWithTools.Generate(ctx, msgs, llm.WithToolChoice(llm.ToolChoiceAuto))
resp, err := model.Generate(ctx, msgs,
llm.WithResponseFormat(llm.ResponseFormat{Type: "json_object"}),
)
resp, err := model.Generate(ctx, msgs,
llm.WithTemperature(0.7),
llm.WithMaxTokens(2048),
llm.WithTopP(0.9),
)
resp, err := model.Generate(ctx, msgs)
if err != nil {
log.Fatal(err)
}
import "github.com/lookatitude/beluga-ai/llm/providers/openrouter"
model, err := openrouter.New(config.ProviderConfig{
Model: "anthropic/claude-sonnet-4-5-20250929",
APIKey: os.Getenv("OPENROUTER_API_KEY"),
})

OpenRouter provides access to hundreds of models. Some popular options:

Model IDProviderDescription
openai/gpt-4oOpenAIGPT-4o
anthropic/claude-sonnet-4-5-20250929AnthropicClaude Sonnet 4.5
google/gemini-2.5-flashGoogleGemini 2.5 Flash
meta-llama/llama-3.1-70b-instructMetaLlama 3.1 70B

Refer to OpenRouter’s model list for the full catalog.