Files
iasysadmin/internal/llm/types.go
T
2026-09-27 16:04:02 -06:00

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
}