602 lines
14 KiB
Markdown
602 lines
14 KiB
Markdown
# Requerimientos Funcionales - Local LLM Agent
|
|
|
|
**Version:** 1.0.0
|
|
**Fecha:** 2026-01-20
|
|
**Proyecto:** local-llm-agent
|
|
**Prioridad:** P1 (Infraestructura)
|
|
**Status:** En desarrollo
|
|
|
|
---
|
|
|
|
## 1. VISION GENERAL
|
|
|
|
### 1.1 Proposito del Sistema
|
|
|
|
Local LLM Agent es un gateway de LLM local que permite a los agentes del workspace (Claude Code, Trae, Gemini) delegar tareas simples para optimizar el uso de contexto y tokens en los modelos principales de pago.
|
|
|
|
### 1.2 Objetivos de Negocio
|
|
|
|
| ID | Objetivo | Metrica de Exito |
|
|
|----|----------|------------------|
|
|
| OBJ-001 | Reducir consumo de tokens en modelos de pago | 30% reduccion en tareas delegables |
|
|
| OBJ-002 | Mantener latencia aceptable para tareas simples | < 2s para tier small, < 5s para tier main |
|
|
| OBJ-003 | Proveer API compatible con estandar OpenAI | 100% compatibilidad con endpoints basicos |
|
|
| OBJ-004 | Soportar herramientas MCP especializadas | 4 herramientas base implementadas |
|
|
|
|
### 1.3 Stakeholders
|
|
|
|
| Stakeholder | Rol | Interes |
|
|
|-------------|-----|---------|
|
|
| Agentes AI (Claude, Gemini, Trae) | Consumidores principales | API confiable y rapida |
|
|
| Desarrolladores workspace | Usuarios indirectos | Integracion transparente |
|
|
| Administrador de sistema | Operador | Monitoreo y mantenimiento |
|
|
|
|
---
|
|
|
|
## 2. REQUERIMIENTOS FUNCIONALES
|
|
|
|
### 2.1 Modulo: API Gateway (NestJS)
|
|
|
|
#### RF-GW-001: Endpoint de Chat Completion OpenAI-Compatible
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-GW-001 |
|
|
| Nombre | Chat Completion API |
|
|
| Prioridad | MUST HAVE |
|
|
| Complejidad | Media |
|
|
| Dependencias | RF-IE-001 |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE proveer un endpoint POST `/v1/chat/completions` que acepte requests en formato OpenAI y retorne respuestas en el mismo formato.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Endpoint acepta Content-Type: application/json
|
|
- [ ] Request body compatible con esquema OpenAI ChatCompletion
|
|
- [ ] Response body compatible con esquema OpenAI ChatCompletionResponse
|
|
- [ ] Soporta parametros: model, messages, max_tokens, temperature, top_p
|
|
- [ ] Retorna usage con prompt_tokens, completion_tokens, total_tokens
|
|
- [ ] Maneja errores con formato OpenAI error response
|
|
|
|
**Request Schema:**
|
|
```typescript
|
|
interface ChatCompletionRequest {
|
|
model: string; // Ej: "gpt-oss-20b"
|
|
messages: Array<{
|
|
role: "system" | "user" | "assistant";
|
|
content: string;
|
|
}>;
|
|
max_tokens?: number; // Default: 512
|
|
temperature?: number; // Default: 0.7
|
|
top_p?: number; // Default: 0.9
|
|
stream?: boolean; // Default: false (Fase 2)
|
|
}
|
|
```
|
|
|
|
**Response Schema:**
|
|
```typescript
|
|
interface ChatCompletionResponse {
|
|
id: string; // Ej: "chatcmpl-abc123"
|
|
object: "chat.completion";
|
|
created: number; // Unix timestamp
|
|
model: string;
|
|
choices: Array<{
|
|
index: number;
|
|
message: {
|
|
role: "assistant";
|
|
content: string;
|
|
};
|
|
finish_reason: "stop" | "length";
|
|
}>;
|
|
usage: {
|
|
prompt_tokens: number;
|
|
completion_tokens: number;
|
|
total_tokens: number;
|
|
};
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### RF-GW-002: Endpoint de Lista de Modelos
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-GW-002 |
|
|
| Nombre | List Models API |
|
|
| Prioridad | MUST HAVE |
|
|
| Complejidad | Baja |
|
|
| Dependencias | RF-IE-002 |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE proveer un endpoint GET `/v1/models` que retorne la lista de modelos disponibles.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Endpoint retorna lista de modelos en formato OpenAI
|
|
- [ ] Incluye metadata: id, object, created, owned_by
|
|
- [ ] Lista refleja modelos realmente disponibles en backend
|
|
- [ ] Response cacheable por 60 segundos
|
|
|
|
**Response Schema:**
|
|
```typescript
|
|
interface ModelsResponse {
|
|
object: "list";
|
|
data: Array<{
|
|
id: string;
|
|
object: "model";
|
|
created: number;
|
|
owned_by: string;
|
|
}>;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### RF-GW-003: Endpoint de Health Check
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-GW-003 |
|
|
| Nombre | Health Check API |
|
|
| Prioridad | MUST HAVE |
|
|
| Complejidad | Baja |
|
|
| Dependencias | - |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE proveer un endpoint GET `/health` que indique el estado del servicio.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Retorna 200 OK cuando servicio esta saludable
|
|
- [ ] Incluye estado de dependencias (inference-engine, ollama)
|
|
- [ ] Retorna 503 si alguna dependencia critica no esta disponible
|
|
- [ ] Tiempo de respuesta < 500ms
|
|
|
|
**Response Schema:**
|
|
```typescript
|
|
interface HealthResponse {
|
|
status: "healthy" | "degraded" | "unhealthy";
|
|
timestamp: string;
|
|
version: string;
|
|
dependencies: {
|
|
inference_engine: "up" | "down";
|
|
ollama: "up" | "down";
|
|
};
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### RF-GW-004: Router Service - Clasificacion de Tier
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-GW-004 |
|
|
| Nombre | Tier Classification |
|
|
| Prioridad | SHOULD HAVE |
|
|
| Complejidad | Media |
|
|
| Dependencias | RF-GW-001 |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE clasificar cada request en un tier (small/main) basado en la complejidad estimada.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Clasifica request como "small" si tokens estimados < 4096
|
|
- [ ] Clasifica request como "main" si tokens estimados >= 4096
|
|
- [ ] Respeta header `X-Tier` si se proporciona
|
|
- [ ] Aplica limites de max_tokens segun tier
|
|
- [ ] Registra clasificacion en logs para analisis
|
|
|
|
**Logica de Clasificacion:**
|
|
```typescript
|
|
interface TierConfig {
|
|
small: {
|
|
max_context: 4096;
|
|
max_tokens: 512;
|
|
latency_target_ms: 500;
|
|
};
|
|
main: {
|
|
max_context: 16384;
|
|
max_tokens: 2048;
|
|
latency_target_ms: 2000;
|
|
};
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 2.2 Modulo: MCP Tools
|
|
|
|
#### RF-MCP-001: Endpoint de Lista de Herramientas
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-MCP-001 |
|
|
| Nombre | List MCP Tools |
|
|
| Prioridad | SHOULD HAVE |
|
|
| Complejidad | Baja |
|
|
| Dependencias | - |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE proveer un endpoint GET `/mcp/tools` que liste las herramientas MCP disponibles.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Retorna lista de herramientas con nombre, descripcion, parametros
|
|
- [ ] Cada herramienta incluye schema JSON de parametros
|
|
- [ ] Lista refleja herramientas realmente implementadas
|
|
|
|
**Response Schema:**
|
|
```typescript
|
|
interface MCPToolsResponse {
|
|
tools: Array<{
|
|
name: string;
|
|
description: string;
|
|
parameters: JSONSchema;
|
|
}>;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### RF-MCP-002: Herramienta Classify
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-MCP-002 |
|
|
| Nombre | MCP Tool: Classify |
|
|
| Prioridad | SHOULD HAVE |
|
|
| Complejidad | Media |
|
|
| Dependencias | RF-GW-001 |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE proveer una herramienta MCP para clasificar texto en categorias predefinidas.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Acepta texto y lista de categorias posibles
|
|
- [ ] Retorna categoria seleccionada con confidence score
|
|
- [ ] Usa tier "small" automaticamente
|
|
- [ ] Latencia < 1s para textos < 500 caracteres
|
|
|
|
**Request Schema:**
|
|
```typescript
|
|
interface ClassifyRequest {
|
|
text: string;
|
|
categories: string[];
|
|
context?: string;
|
|
}
|
|
```
|
|
|
|
**Response Schema:**
|
|
```typescript
|
|
interface ClassifyResponse {
|
|
category: string;
|
|
confidence: number; // 0.0 - 1.0
|
|
reasoning?: string;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### RF-MCP-003: Herramienta Extract
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-MCP-003 |
|
|
| Nombre | MCP Tool: Extract |
|
|
| Prioridad | SHOULD HAVE |
|
|
| Complejidad | Media |
|
|
| Dependencias | RF-GW-001 |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE proveer una herramienta MCP para extraer datos estructurados de texto.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Acepta texto y schema de datos a extraer
|
|
- [ ] Retorna datos estructurados segun schema
|
|
- [ ] Maneja campos opcionales y requeridos
|
|
- [ ] Retorna null para campos no encontrados
|
|
|
|
**Request Schema:**
|
|
```typescript
|
|
interface ExtractRequest {
|
|
text: string;
|
|
schema: {
|
|
fields: Array<{
|
|
name: string;
|
|
type: "string" | "number" | "date" | "boolean" | "array";
|
|
description: string;
|
|
required?: boolean;
|
|
}>;
|
|
};
|
|
}
|
|
```
|
|
|
|
**Response Schema:**
|
|
```typescript
|
|
interface ExtractResponse {
|
|
data: Record<string, any>;
|
|
confidence: number;
|
|
missing_fields?: string[];
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### RF-MCP-004: Herramienta Summarize
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-MCP-004 |
|
|
| Nombre | MCP Tool: Summarize |
|
|
| Prioridad | SHOULD HAVE |
|
|
| Complejidad | Media |
|
|
| Dependencias | RF-GW-001 |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE proveer una herramienta MCP para resumir texto.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Acepta texto y longitud objetivo del resumen
|
|
- [ ] Retorna resumen respetando longitud especificada
|
|
- [ ] Preserva puntos clave del texto original
|
|
- [ ] Soporta formatos: paragraph, bullets
|
|
|
|
**Request Schema:**
|
|
```typescript
|
|
interface SummarizeRequest {
|
|
text: string;
|
|
max_length?: number; // Default: 200 palabras
|
|
format?: "paragraph" | "bullets";
|
|
}
|
|
```
|
|
|
|
**Response Schema:**
|
|
```typescript
|
|
interface SummarizeResponse {
|
|
summary: string;
|
|
word_count: number;
|
|
key_points?: string[];
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### RF-MCP-005: Herramienta Rewrite
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-MCP-005 |
|
|
| Nombre | MCP Tool: Rewrite |
|
|
| Prioridad | SHOULD HAVE |
|
|
| Complejidad | Media |
|
|
| Dependencias | RF-GW-001 |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE proveer una herramienta MCP para reescribir texto con un estilo especifico.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Acepta texto y estilo objetivo
|
|
- [ ] Soporta estilos: formal, casual, technical, simple
|
|
- [ ] Preserva significado del texto original
|
|
- [ ] Retorna texto reescrito
|
|
|
|
**Request Schema:**
|
|
```typescript
|
|
interface RewriteRequest {
|
|
text: string;
|
|
style: "formal" | "casual" | "technical" | "simple";
|
|
preserve_length?: boolean;
|
|
}
|
|
```
|
|
|
|
**Response Schema:**
|
|
```typescript
|
|
interface RewriteResponse {
|
|
rewritten: string;
|
|
changes_made: number;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 2.3 Modulo: Inference Engine (Python)
|
|
|
|
#### RF-IE-001: Chat Completion Backend
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-IE-001 |
|
|
| Nombre | Inference Chat Completion |
|
|
| Prioridad | MUST HAVE |
|
|
| Complejidad | Alta |
|
|
| Dependencias | Ollama |
|
|
|
|
**Descripcion:**
|
|
El Inference Engine DEBE procesar requests de chat completion contra el backend de inferencia (Ollama/vLLM).
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Recibe requests del Gateway via HTTP
|
|
- [ ] Envia request a Ollama en formato nativo
|
|
- [ ] Transforma respuesta a formato OpenAI
|
|
- [ ] Calcula o estima token usage
|
|
- [ ] Maneja timeouts y errores de backend
|
|
- [ ] Soporta configuracion de modelo via environment
|
|
|
|
**Estados:**
|
|
- READY: Backend disponible y modelo cargado
|
|
- LOADING: Cargando modelo
|
|
- ERROR: Backend no disponible
|
|
- DEGRADED: Backend con alta latencia
|
|
|
|
---
|
|
|
|
#### RF-IE-002: Lista de Modelos Backend
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-IE-002 |
|
|
| Nombre | Backend Models List |
|
|
| Prioridad | MUST HAVE |
|
|
| Complejidad | Baja |
|
|
| Dependencias | Ollama |
|
|
|
|
**Descripcion:**
|
|
El Inference Engine DEBE consultar y retornar la lista de modelos disponibles en el backend.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Consulta Ollama API para lista de modelos
|
|
- [ ] Transforma a formato OpenAI models
|
|
- [ ] Cachea resultado por 60 segundos
|
|
- [ ] Maneja error si backend no disponible
|
|
|
|
---
|
|
|
|
#### RF-IE-003: Backend Abstraction Layer
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-IE-003 |
|
|
| Nombre | Backend Manager |
|
|
| Prioridad | MUST HAVE |
|
|
| Complejidad | Media |
|
|
| Dependencias | - |
|
|
|
|
**Descripcion:**
|
|
El Inference Engine DEBE abstraer el backend de inferencia para soportar multiples implementaciones (Ollama, vLLM).
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Interface comun para todos los backends
|
|
- [ ] Seleccion de backend via environment variable
|
|
- [ ] Fallback a Ollama si backend seleccionado no disponible
|
|
- [ ] Health check por backend
|
|
|
|
**Interface:**
|
|
```python
|
|
class InferenceBackend(ABC):
|
|
@abstractmethod
|
|
async def health_check(self) -> bool: ...
|
|
|
|
@abstractmethod
|
|
async def list_models(self) -> List[Dict]: ...
|
|
|
|
@abstractmethod
|
|
async def chat_completion(
|
|
self, model: str, messages: List[Dict], **kwargs
|
|
) -> Dict: ...
|
|
```
|
|
|
|
---
|
|
|
|
### 2.4 Modulo: Configuracion y Operaciones
|
|
|
|
#### RF-CFG-001: Configuracion via Environment
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-CFG-001 |
|
|
| Nombre | Environment Configuration |
|
|
| Prioridad | MUST HAVE |
|
|
| Complejidad | Baja |
|
|
| Dependencias | - |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE ser configurable via variables de entorno.
|
|
|
|
**Variables Requeridas:**
|
|
```bash
|
|
# Gateway
|
|
GATEWAY_PORT=3160
|
|
INFERENCE_HOST=localhost
|
|
INFERENCE_PORT=3161
|
|
|
|
# Inference Engine
|
|
INFERENCE_PORT=3161
|
|
INFERENCE_BACKEND=ollama # ollama | vllm
|
|
OLLAMA_HOST=http://localhost:11434
|
|
OLLAMA_MODEL=gpt-oss-20b
|
|
|
|
# Opcional
|
|
LOG_LEVEL=info
|
|
REDIS_HOST=localhost
|
|
REDIS_PORT=6379
|
|
REDIS_DB=9
|
|
```
|
|
|
|
---
|
|
|
|
#### RF-CFG-002: Logging Estructurado
|
|
|
|
| Atributo | Valor |
|
|
|----------|-------|
|
|
| ID | RF-CFG-002 |
|
|
| Nombre | Structured Logging |
|
|
| Prioridad | SHOULD HAVE |
|
|
| Complejidad | Baja |
|
|
| Dependencias | - |
|
|
|
|
**Descripcion:**
|
|
El sistema DEBE emitir logs estructurados en formato JSON.
|
|
|
|
**Criterios de Aceptacion:**
|
|
- [ ] Logs en formato JSON
|
|
- [ ] Incluye timestamp, level, message, context
|
|
- [ ] Log level configurable via environment
|
|
- [ ] Incluye request_id para trazabilidad
|
|
|
|
---
|
|
|
|
## 3. MATRIZ DE TRAZABILIDAD
|
|
|
|
### 3.1 Requerimientos por Fase
|
|
|
|
| Fase | Requerimientos | Prioridad |
|
|
|------|----------------|-----------|
|
|
| MVP (Fase 1) | RF-GW-001, RF-GW-002, RF-GW-003, RF-IE-001, RF-IE-002, RF-IE-003, RF-CFG-001 | MUST HAVE |
|
|
| Multi-Tool (Fase 2) | RF-GW-004, RF-MCP-001 a RF-MCP-005, RF-CFG-002 | SHOULD HAVE |
|
|
| Produccion (Fase 3) | vLLM backend, Multi-LoRA, Continuous Batching | NICE TO HAVE |
|
|
|
|
### 3.2 Dependencias entre Requerimientos
|
|
|
|
```
|
|
RF-GW-001 ─────┬───> RF-IE-001
|
|
│
|
|
RF-GW-002 ─────┼───> RF-IE-002
|
|
│
|
|
RF-GW-003 ─────┘
|
|
|
|
RF-GW-004 ────────> RF-GW-001
|
|
|
|
RF-MCP-001 ───────> RF-MCP-002, RF-MCP-003, RF-MCP-004, RF-MCP-005
|
|
|
|
RF-IE-001 ────────> RF-IE-003 ────────> Ollama (external)
|
|
RF-IE-002 ────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## 4. METRICAS DE VERIFICACION
|
|
|
|
| Requerimiento | Metrica | Objetivo |
|
|
|---------------|---------|----------|
|
|
| RF-GW-001 | Latencia p95 | < 2000ms |
|
|
| RF-GW-002 | Latencia p95 | < 100ms |
|
|
| RF-GW-003 | Latencia p95 | < 50ms |
|
|
| RF-GW-004 | Precision clasificacion | > 95% |
|
|
| RF-IE-001 | Throughput | > 10 req/min |
|
|
| RF-MCP-002 | Accuracy | > 90% |
|
|
|
|
---
|
|
|
|
## 5. REFERENCIAS
|
|
|
|
- ADR-001: Runtime Selection
|
|
- ADR-002: Model Selection
|
|
- ARQUITECTURA-LOCAL-LLM.md
|
|
- INVENTARIO.yml
|
|
|
|
---
|
|
|
|
**Documento Controlado**
|
|
- Autor: Requirements-Analyst Agent
|
|
- Revisor: Architecture-Analyst Agent
|
|
- Aprobador: Tech-Leader
|