rony-llm-agent/pkg/llm/README.md

91 lines
2 KiB
Markdown
Raw Normal View History

# 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