# OrbiQuant LLM Agent - Deployment Guide

## Overview

El servicio LLM Agent proporciona un copiloto de trading inteligente que se ejecuta localmente en GPU usando Ollama, con soporte para modelos como Llama 3 y Mistral.

## Tabla de Contenidos

1. [Requisitos del Sistema](#requisitos-del-sistema)
2. [Instalación de Ollama](#instalación-de-ollama)
3. [Configuración del Servicio](#configuración-del-servicio)
4. [Instalación de Dependencias](#instalación-de-dependencias)
5. [Iniciar el Servicio](#iniciar-el-servicio)
6. [Verificación](#verificación)
7. [Troubleshooting](#troubleshooting)

---

## Requisitos del Sistema

### Hardware Recomendado
- **GPU:** NVIDIA RTX 5060 Ti (16GB VRAM) o superior
- **RAM:** Mínimo 16GB, recomendado 32GB
- **Storage:** 20GB libres para modelos

### Software
- **OS:** Linux (Ubuntu 20.04+) o WSL2
- **GPU Drivers:** NVIDIA drivers 525.60.13+
- **Docker:** 20.10+ con NVIDIA Container Toolkit
- **Python:** 3.11+
- **Conda:** Miniconda o Anaconda

---

## Instalación de Ollama

### Opción 1: Docker (Recomendado)

```bash
# Navegar al directorio del servicio
cd /home/isem/workspace/projects/trading-platform/apps/llm-agent

# Iniciar Ollama con GPU
docker-compose -f docker-compose.ollama.yml up -d

# Verificar que Ollama está corriendo
curl http://localhost:11434/api/tags

# Pull del modelo Llama 3 8B (recomendado para 16GB VRAM)
docker exec orbiquant-ollama ollama pull llama3:8b

# Alternativas según tu VRAM:
# docker exec orbiquant-ollama ollama pull mistral:7b        # Más rápido
# docker exec orbiquant-ollama ollama pull llama3:70b       # Requiere 40GB+ VRAM
# docker exec orbiquant-ollama ollama pull mixtral:8x7b     # Requiere 32GB+ VRAM
```

**Nota:** La primera descarga del modelo puede tomar 10-30 minutos dependiendo de tu conexión.

### Opción 2: Instalación Nativa

```bash
# Linux
curl -fsSL https://ollama.com/install.sh | sh

# Iniciar Ollama
ollama serve &

# Pull del modelo
ollama pull llama3:8b
```

### Verificar GPU

```bash
# Verificar que Ollama detecta tu GPU
docker exec orbiquant-ollama nvidia-smi

# O en instalación nativa:
nvidia-smi

# Deberías ver tu RTX 5060 Ti listada
```

---

## Configuración del Servicio

### 1. Configurar Variables de Entorno

```bash
cd /home/isem/workspace/projects/trading-platform/apps/llm-agent

# Copiar archivo de ejemplo
cp .env.example .env

# Editar configuración
nano .env
```

Configuración mínima para Ollama:

```bash
# LLM Provider
LLM_PROVIDER=ollama
OLLAMA_BASE_URL=http://localhost:11434
LLM_MODEL=llama3:8b

# Service URLs (ajustar según tu deployment)
BACKEND_URL=http://localhost:8000
DATA_SERVICE_URL=http://localhost:8001
ML_ENGINE_URL=http://localhost:8002

# Database (usar la misma que el backend)
DATABASE_URL=postgresql://orbiquant:orbiquant123@localhost:5432/orbiquant

# Redis
REDIS_URL=redis://localhost:6379/0
```

### 2. Modelos Disponibles

| Modelo | VRAM Requerida | Velocidad | Calidad | Uso Recomendado |
|--------|---------------|-----------|---------|-----------------|
| `llama3:8b` | 8GB | Rápido | Excelente | **Recomendado para RTX 5060 Ti** |
| `mistral:7b` | 6GB | Muy rápido | Buena | Desarrollo/pruebas rápidas |
| `llama3:70b` | 40GB+ | Lento | Excepcional | Servidores de alta gama |
| `mixtral:8x7b` | 32GB+ | Medio | Excelente | GPUs grandes |
| `codellama:7b` | 6GB | Rápido | Buena | Code generation |

---

## Instalación de Dependencias

### Crear Entorno Conda

```bash
cd /home/isem/workspace/projects/trading-platform/apps/llm-agent

# Crear entorno
conda env create -f environment.yml

# Activar entorno
conda activate orbiquant-llm-agent

# O instalar con pip en el entorno
pip install -r requirements.txt
```

### Dependencias Principales

```
fastapi>=0.104.0          # API framework
uvicorn[standard]>=0.24.0 # ASGI server
sse-starlette>=1.6.5      # Streaming support
aiohttp>=3.9.0            # Async HTTP client
loguru>=0.7.0             # Logging
pydantic>=2.0.0           # Data validation
```

---

## Iniciar el Servicio

### Opción 1: Desarrollo (con hot-reload)

```bash
cd /home/isem/workspace/projects/trading-platform/apps/llm-agent

# Activar entorno
conda activate orbiquant-llm-agent

# Iniciar servicio
uvicorn src.main:app --reload --host 0.0.0.0 --port 8003

# El servicio estará disponible en:
# - API: http://localhost:8003
# - Docs: http://localhost:8003/docs
# - Health: http://localhost:8003/api/v1/health
```

### Opción 2: Producción

```bash
# Con más workers (1 por CPU core)
uvicorn src.main:app --host 0.0.0.0 --port 8003 --workers 4

# O usando gunicorn
gunicorn src.main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8003
```

### Opción 3: Docker (futuro)

```bash
# TODO: Crear Dockerfile para el servicio
docker-compose up llm-agent
```

---

## Verificación

### 1. Health Check

```bash
# Check básico
curl http://localhost:8003/

# Health detallado
curl http://localhost:8003/api/v1/health

# Expected response:
{
  "status": "healthy",
  "llm_provider": "ollama",
  "llm_available": true,
  "active_contexts": 0,
  "available_tools": 12
}
```

### 2. Listar Modelos

```bash
curl http://localhost:8003/api/v1/models

# Expected response:
{
  "models": ["llama3:8b"],
  "current": "llama3:8b"
}
```

### 3. Listar Tools

```bash
curl "http://localhost:8003/api/v1/tools?user_plan=pro"

# Expected response:
{
  "plan": "pro",
  "tools": [
    "get_signal",
    "get_analysis",
    "get_news",
    "check_portfolio",
    "get_positions",
    "execute_trade",
    ...
  ],
  "count": 12
}
```

### 4. Test Chat (básico)

```bash
curl -X POST http://localhost:8003/api/v1/chat \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": "test-user",
    "conversation_id": "test-conv",
    "message": "¿Qué es el RSI?",
    "user_plan": "free",
    "stream": false
  }'
```

### 5. Test Análisis

```bash
curl -X POST http://localhost:8003/api/v1/analyze \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": "test-user",
    "symbol": "AAPL",
    "user_plan": "pro"
  }'
```

### 6. Interactive API Docs

Abre en tu navegador: http://localhost:8003/docs

Aquí puedes probar todos los endpoints interactivamente.

---

## Troubleshooting

### Ollama no arranca

**Síntoma:** `Connection refused` al hacer curl a Ollama

**Solución:**
```bash
# Verificar que el container está corriendo
docker ps | grep ollama

# Ver logs
docker logs orbiquant-ollama

# Reiniciar container
docker restart orbiquant-ollama
```

### GPU no detectada

**Síntoma:** Modelo corre muy lento, CPU usage al 100%

**Solución:**
```bash
# Verificar NVIDIA Container Toolkit
docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi

# Reinstalar nvidia-container-toolkit
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
```

### Out of Memory (OOM)

**Síntoma:** `CUDA out of memory` o el modelo no carga

**Solución:**
1. Usar un modelo más pequeño:
   ```bash
   docker exec orbiquant-ollama ollama pull mistral:7b
   ```
2. Cerrar otras aplicaciones que usen GPU
3. Configurar `.env`:
   ```
   LLM_MODEL=mistral:7b
   ```

### Modelo muy lento

**Optimizaciones:**

1. **Reducir max_tokens:**
   ```
   MAX_TOKENS=1024  # En lugar de 2048
   ```

2. **Usar modelo más pequeño:**
   ```
   LLM_MODEL=mistral:7b
   ```

3. **Verificar que usa GPU:**
   ```bash
   # Durante inferencia, debería mostrar GPU usage
   watch -n 0.5 nvidia-smi
   ```

### Herramientas no funcionan

**Síntoma:** Tools retornan errores de conexión

**Solución:**
```bash
# Verificar que otros servicios están corriendo
curl http://localhost:8000/health  # Backend
curl http://localhost:8001/health  # Data Service
curl http://localhost:8002/health  # ML Engine

# Ajustar URLs en .env si es necesario
```

### Import Errors

**Síntoma:** `ModuleNotFoundError` al iniciar

**Solución:**
```bash
# Asegurarse de estar en el entorno correcto
conda activate orbiquant-llm-agent

# Reinstalar dependencias
pip install -r requirements.txt

# Verificar instalación
python -c "import fastapi; import aiohttp; print('OK')"
```

---

## Monitoreo

### Logs del Servicio

```bash
# Los logs se muestran en la consola
# Usar loguru levels: DEBUG, INFO, WARNING, ERROR

# Cambiar nivel en .env:
LOG_LEVEL=DEBUG
```

### Monitoreo de GPU

```bash
# Uso en tiempo real
watch -n 1 nvidia-smi

# Solo memoria
nvidia-smi --query-gpu=memory.used,memory.total --format=csv

# Temperatura
nvidia-smi --query-gpu=temperature.gpu --format=csv
```

### Ollama Web UI (Opcional)

Si levantaste Ollama con docker-compose, tendrás una UI web en:

http://localhost:3000

Desde ahí puedes:
- Chatear directamente con los modelos
- Gestionar modelos instalados
- Ver logs y métricas

---

## Performance Tips

### 1. Optimizar Temperatura

```python
# En .env, ajustar según el caso de uso:
TEMPERATURE=0.3  # Para análisis técnico (más determinista)
TEMPERATURE=0.7  # Para conversación general (más creativo)
TEMPERATURE=0.9  # Para brainstorming (muy creativo)
```

### 2. Context Window

Los modelos tienen límites de contexto:
- Llama 3 8B: 8K tokens (~6K palabras)
- Mistral 7B: 32K tokens (~24K palabras)

El sistema automáticamente limita el historial a `max_history=20` mensajes.

### 3. Batch Requests

Para múltiples análisis, usa requests paralelos:

```python
import asyncio
import aiohttp

async def analyze_multiple(symbols):
    async with aiohttp.ClientSession() as session:
        tasks = [
            session.post('http://localhost:8003/api/v1/analyze', json={
                'user_id': 'user-1',
                'symbol': symbol,
                'user_plan': 'pro'
            })
            for symbol in symbols
        ]
        results = await asyncio.gather(*tasks)
        return results

# Uso
symbols = ['AAPL', 'GOOGL', 'MSFT']
results = await analyze_multiple(symbols)
```

---

## Siguientes Pasos

1. Integrar con el frontend (WebSocket para streaming)
2. Implementar persistencia de conversaciones en PostgreSQL
3. Añadir RAG con ChromaDB para documentación de trading
4. Implementar rate limiting por usuario
5. Añadir métricas y telemetría

---

## Recursos

- **Ollama Docs:** https://github.com/ollama/ollama
- **Llama 3 Info:** https://ai.meta.com/llama/
- **FastAPI Docs:** https://fastapi.tiangolo.com/
- **Trading Tools API:** Ver `/docs/02-definicion-modulos/OQI-007-llm-agent/`

---

**Estado:** ✅ COMPLETADO
**Versión:** 1.0.0
**Última actualización:** 2025-12-07
