92 lines
2.7 KiB
Go
92 lines
2.7 KiB
Go
// Package llm abstrae el acceso al modelo de lenguaje.
|
|
//
|
|
// El resto del programa depende solo de la interfaz Client y de estos tipos,
|
|
// no del proveedor concreto. La implementación incluida habla el dialecto
|
|
// OpenAI (POST /chat/completions), que también implementan llama.cpp, vLLM,
|
|
// Ollama, LM Studio y muchos otros servidores.
|
|
package llm
|
|
|
|
import "context"
|
|
|
|
// Roles de mensaje del protocolo de chat.
|
|
const (
|
|
RoleSystem = "system"
|
|
RoleUser = "user"
|
|
RoleAssistant = "assistant"
|
|
RoleTool = "tool"
|
|
)
|
|
|
|
// Message es un mensaje de la conversación.
|
|
type Message struct {
|
|
Role string `json:"role"`
|
|
Content string `json:"content"`
|
|
Name string `json:"name,omitempty"`
|
|
ToolCalls []ToolCall `json:"tool_calls,omitempty"`
|
|
ToolCallID string `json:"tool_call_id,omitempty"`
|
|
}
|
|
|
|
// ToolCall es una invocación de herramienta propuesta por el modelo.
|
|
// Los argumentos llegan como texto JSON sin validar: el registro de
|
|
// herramientas los decodifica estrictamente antes de ejecutar nada.
|
|
type ToolCall struct {
|
|
ID string `json:"id"`
|
|
Type string `json:"type"`
|
|
Function FunctionCall `json:"function"`
|
|
}
|
|
|
|
// FunctionCall contiene el nombre y los argumentos JSON (sin validar).
|
|
type FunctionCall struct {
|
|
Name string `json:"name"`
|
|
Arguments string `json:"arguments"`
|
|
}
|
|
|
|
// Tool describe una herramienta ofrecida al modelo.
|
|
type Tool struct {
|
|
Type string `json:"type"`
|
|
Function ToolFunction `json:"function"`
|
|
}
|
|
|
|
// ToolFunction es el esquema de una herramienta (JSON Schema en Parameters).
|
|
type ToolFunction struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description,omitempty"`
|
|
Parameters any `json:"parameters,omitempty"`
|
|
}
|
|
|
|
// ChatRequest es una petición independiente del proveedor.
|
|
type ChatRequest struct {
|
|
Messages []Message
|
|
Tools []Tool
|
|
MaxTokens int // 0: el servidor decide
|
|
Temperature *float64 // nil: el servidor decide
|
|
}
|
|
|
|
// Usage es el consumo de tokens reportado por el servidor.
|
|
// Todos los campos son 0 si el servidor no lo reporta.
|
|
type Usage struct {
|
|
PromptTokens int
|
|
CompletionTokens int
|
|
TotalTokens int
|
|
}
|
|
|
|
// ChatResponse es la respuesta del modelo.
|
|
type ChatResponse struct {
|
|
Message Message
|
|
Reasoning string // razonamiento separado, si el servidor lo expone
|
|
FinishReason string
|
|
Usage Usage
|
|
}
|
|
|
|
// Client es la interfaz que usa la lógica del agente.
|
|
type Client interface {
|
|
Chat(ctx context.Context, req ChatRequest) (ChatResponse, error)
|
|
}
|
|
|
|
// ModelInfo es la información que se pudo obtener del servidor sobre el modelo.
|
|
// ContextSize == 0 significa UNKNOWN.
|
|
type ModelInfo struct {
|
|
ID string
|
|
ContextSize int
|
|
Source string // de dónde se obtuvo ContextSize, para mostrarlo con honestidad
|
|
}
|