# pkg/llm > Abstracción multi-provider para modelos de lenguaje. ## Responsabilidad Definir una interfaz común (`LLMClient`) y adapters para los principales providers. ## API pública ```go type LLMClient interface { Generate(ctx context.Context, req CompletionRequest) (CompletionResponse, error) Stream(ctx context.Context, req CompletionRequest) iter.Seq2[StreamChunk, error] Name() string Capabilities() ProviderCapabilities } type CompletionRequest struct { Messages []Message Tools []tools.Tool ToolChoice ToolChoice Model string Temperature *float32 MaxTokens *int } type CompletionResponse struct { Content string ToolCalls []tools.Call Usage TokenUsage StopReason string } type ProviderCapabilities struct { SupportsTools bool SupportsVision bool MaxContextWindow int } ``` ## Providers incluidos | Provider | Paquete | Soporte tools | |---|---|---| | OpenAI | `providers/openai` | ✅ | | Anthropic | `providers/anthropic` | ✅ | | Ollama | `providers/ollama` | ✅ (modelos que lo soporten) | | llama.cpp | `providers/llamacpp` | ✅ (con grammar) | ## Uso ```go import "github.com/VictorVargas/go-llm-agent/pkg/llm/providers/anthropic" client, err := anthropic.New(anthropic.Config{ APIKey: os.Getenv("ANTHROPIC_API_KEY"), Model: "claude-sonnet-4.5", }) resp, err := client.Generate(ctx, llm.CompletionRequest{ Messages: []llm.Message{ {Role: llm.RoleUser, Content: "Hola"}, }, }) ``` ## Streaming ```go for chunk, err := range client.Stream(ctx, req) { if err != nil { return err } fmt.Print(chunk.Delta) } ``` ## Mock para tests ```go import "github.com/VictorVargas/go-llm-agent/pkg/llm/mock" mockClient := mock.New(mock.Responses{ {Match: "hola", Response: "¡Hola! ¿Cómo estás?"}, {Match: "*", Response: "default"}, }) ``` ## Ver también - [pkg/agent](../agent/README.md) — Usa `LLMClient` - [pkg/tools](../tools/README.md) — Las `Tool` definitions