ai/README.md
The ai package provides simple, high-level interfaces for AI model providers. It supports text generation (Model), image generation (ImageModel), and video generation (VideoModel).
The Model interface follows the same patterns as other go-micro packages (Registry, Client, Broker):
type Model interface {
Init(...Option) error
Options() Options
Generate(ctx context.Context, req *Request, opts ...GenerateOption) (*Response, error)
Stream(ctx context.Context, req *Request, opts ...GenerateOption) (Stream, error)
String() string
}
import (
"context"
"go-micro.dev/v5/ai"
_ "go-micro.dev/v5/ai/anthropic"
_ "go-micro.dev/v5/ai/openai"
)
// Create a model
m := ai.New("openai",
ai.WithAPIKey("your-api-key"),
ai.WithModel("gpt-4o"),
)
// Generate a response
req := &ai.Request{
Prompt: "What is Go?",
SystemPrompt: "You are a helpful programming assistant",
}
resp, err := m.Generate(context.Background(), req)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.Reply)
type ImageModel interface {
GenerateImage(ctx context.Context, req *ImageRequest, opts ...GenerateOption) (*ImageResponse, error)
String() string
}
import (
"go-micro.dev/v5/ai"
_ "go-micro.dev/v5/ai/atlascloud"
)
ig := ai.NewImage("atlascloud",
ai.WithAPIKey("your-api-key"),
)
resp, err := ig.GenerateImage(context.Background(), &ai.ImageRequest{
Prompt: "A Go gopher in space",
Size: "1024x1024",
})
fmt.Println(resp.Images[0].URL)
Providers that support image generation: Atlas Cloud, OpenAI.
type VideoModel interface {
GenerateVideo(ctx context.Context, req *VideoRequest, opts ...GenerateOption) (*VideoResponse, error)
String() string
}
import (
"go-micro.dev/v5/ai"
_ "go-micro.dev/v5/ai/atlascloud"
)
vg := ai.NewVideo("atlascloud",
ai.WithAPIKey("your-api-key"),
)
resp, err := vg.GenerateVideo(context.Background(), &ai.VideoRequest{
Prompt: "Microservices nodes animating with data flowing between them",
Images: []string{"https://example.com/diagram.png"}, // optional: image-to-video
Duration: 6,
})
fmt.Println(resp.URL)
Providers that support video generation: Atlas Cloud.
Configure the model using functional options:
m := ai.New("anthropic",
ai.WithAPIKey("your-key"), // Required
ai.WithModel("claude-sonnet-4-20250514"), // Optional, uses provider default
ai.WithBaseURL("https://api.anthropic.com"), // Optional, uses provider default
)
You can also update options after creation:
m.Init(
ai.WithModel("gpt-4o-mini"),
ai.WithAPIKey("new-key"),
)
The model can automatically execute tool calls when provided with a tool handler:
// Define a tool handler
toolHandler := func(name string, input map[string]any) (result any, content string) {
// Execute the tool and return results
switch name {
case "get_weather":
return map[string]string{"temp": "72F"}, `{"temp": "72F"}`
default:
return nil, `{"error": "unknown tool"}`
}
}
// Create model with tool handler
m := ai.New("openai",
ai.WithAPIKey("your-key"),
ai.WithToolHandler(toolHandler),
)
// Provide tools in the request
req := &ai.Request{
Prompt: "What's the weather?",
SystemPrompt: "You are a helpful assistant",
Tools: []ai.Tool{
{
Name: "get_weather",
Description: "Get current weather",
Properties: map[string]any{
"location": map[string]any{
"type": "string",
"description": "City name",
},
},
},
},
}
// Generate will automatically call tools and return final answer
resp, err := m.Generate(context.Background(), req)
fmt.Println(resp.Answer) // Final answer after tool execution
type Response struct {
Reply string // Initial reply from model
ToolCalls []ToolCall // Tools the model wants to call
Answer string // Final answer (after tool execution if handler provided)
}
Reply: The model's first responseToolCalls: List of tools the model requested (if any)Answer: The final answer after tools are executed (only set if ToolHandler is provided)m := ai.New("anthropic",
ai.WithAPIKey("sk-ant-..."),
ai.WithModel("claude-sonnet-4-20250514"), // default
)
Default model: claude-sonnet-4-20250514
Default base URL: https://api.anthropic.com
m := ai.New("openai",
ai.WithAPIKey("sk-..."),
ai.WithModel("gpt-4o"), // default
)
Default model: gpt-4o
Default base URL: https://api.openai.com
m := ai.New("gemini",
ai.WithAPIKey("your-key"),
ai.WithModel("gemini-2.5-flash"), // default
)
Default model: gemini-2.5-flash
Default base URL: https://generativelanguage.googleapis.com
Google Gemini uses its own API format with system_instruction, contents (not messages), and functionDeclarations for tool calling. The provider handles the translation automatically.
m := ai.New("groq",
ai.WithAPIKey("your-key"),
ai.WithModel("llama-3.3-70b-versatile"), // default
)
Default model: llama-3.3-70b-versatile
Default base URL: https://api.groq.com/openai
Groq provides ultra-fast inference for open-weight models via an OpenAI-compatible endpoint.
m := ai.New("mistral",
ai.WithAPIKey("your-key"),
ai.WithModel("mistral-large-latest"), // default
)
Default model: mistral-large-latest
Default base URL: https://api.mistral.ai
Mistral AI is a European AI company offering high-performance models via an OpenAI-compatible endpoint.
m := ai.New("together",
ai.WithAPIKey("your-key"),
ai.WithModel("meta-llama/Llama-3.3-70B-Instruct-Turbo"), // default
)
Default model: meta-llama/Llama-3.3-70B-Instruct-Turbo
Default base URL: https://api.together.xyz
Together AI provides fast inference for open-weight models via an OpenAI-compatible endpoint.
m := ai.New("atlascloud",
ai.WithAPIKey("your-key"),
ai.WithModel("llama-3.3-70b"), // default
)
Default model: llama-3.3-70b
Default base URL: https://api.atlascloud.ai
Atlas Cloud is an enterprise AI infrastructure platform offering high-performance LLM APIs. It exposes an OpenAI-compatible chat completions endpoint with tool calling support.
Use AutoDetectProvider() to detect the provider from a base URL:
provider := ai.AutoDetectProvider("https://api.anthropic.com")
// Returns "anthropic"
m := ai.New(provider, ai.WithAPIKey("..."))
See the full AI Provider Integration Guide for a step-by-step walkthrough, checklist, and design notes.
Quick summary:
ai/yourprovider/yourprovider.go implementing ai.Model.ai.Register("yourprovider", ...) in init().ai/yourprovider/yourprovider_test.go.import _ "go-micro.dev/v5/ai/yourprovider"
We welcome contributions and sponsorships from AI infrastructure companies — see the guide for details.
The ai package follows the same patterns as other go-micro packages:
Registry:
r := registry.NewRegistry(registry.Addrs("..."))
r.Register(service)
Client:
c := client.NewClient(client.Retries(3))
c.Call(ctx, req, rsp)
AI:
m := ai.New("openai", ai.WithAPIKey("..."))
m.Generate(ctx, req)
All use:
Init() to update optionsOptions() to get current optionsString() to get the implementation namego test ./ai/...
See the server implementation for a complete example of using the ai package with tool execution.