Puedes ejecutar esta aplicación de dos formas:
# Opción A: Usar imagen del registry
docker pull crretoxmas2024.azurecr.io/ithaka-backend:latest
docker run -p 8000:8000 crretoxmas2024.azurecr.io/ithaka-backend:latest
# Opción B: Construir localmente
docker build -t ithaka-backend .
docker run -p 8000:8000 ithaka-backend
# Opción C: Docker Compose (desarrollo)
docker-compose up- Python 3.12+
- uv (gestor de paquetes compatible con pip)
- PostgreSQL con extensión PGVector
python3 -m venv .venv
source .venv/bin/activateSi no lo tenés instalado, escribí en la terminal:
pip install uvuv pip install -r requirements.txtCopia config/env.example a .env y configura las variables necesarias:
# Base de Datos
DATABASE_URL=postgresql+asyncpg://user:password@host:port/database
# OpenAI (requerido para agentes IA)
OPENAI_API_KEY=sk-your-key-here
OPENAI_MODEL=gpt-4o-mini
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
# Configuración de agentes
EMBEDDING_DIMENSION=1536
MAX_FAQ_RESULTS=5
WIZARD_SESSION_TIMEOUT=3600
# Email y Twilio (existentes)
[email protected]
EMAIL_PASS=your-app-password
TWILIO_ACCOUNT_SID=your-sid
TWILIO_AUTH_TOKEN=your-tokenEl wizard ahora usa el validador DetectJailbreak para bloquear intentos de prompt injection.
- Instalá las dependencias (el
requirements.txtya incluyeguardrails-ai>=0.5.10). - Descargá el recurso desde Guardrails Hub una sola vez:
guardrails hub install hub://guardrails/detect_jailbreak
- Configurá (o dejá por defecto) las variables:
WIZARD_DETECT_JAILBREAK_ENABLED=true WIZARD_DETECT_JAILBREAK_THRESHOLD=0.9
- (Opcional) Para imágenes Docker, pasá el token del Guardrails Hub como build-arg para que el validador quede horneado:
También podés definir
docker compose build --build-arg GUARDRAILS_HUB_TOKEN=tu_token
GUARDRAILS_HUB_TOKENen tu archivo.env(no lo comitees) ydocker composelo inyectará automáticamente gracias abuild.args.
Si el validador no está disponible, el sistema seguirá usando el filtro de patrones, pero se recomienda mantener ambos mecanismos activos.
CREATE USER <USUARIO> WITH PASSWORD '<PASSWORD>';
CREATE DATABASE <NOMBRE_DB> OWNER <USUARIO>;
GRANT ALL PRIVILEGES ON DATABASE <NOMBRE_DB> TO <USUARIO>;CREATE EXTENSION IF NOT EXISTS vector;python -m app.db.config.create_tablespython scripts/populate_faqs.pyPara ejecutarlo ir a la raíz del proyecto y ejecutar:
uvicorn app.main:app --reloadPodes revisar la doc en http://127.0.0.1:8000/docs
- 🎯 Supervisor - Router inteligente que analiza intenciones del usuario
- ❓ FAQ - Responde consultas usando búsqueda vectorial (PGVector)
- ✅ Validator - Detecta correos, teléfonos y cédulas dentro de la conversación, valida su formato y guía al usuario para corregirlos antes de guardarlos.
- 📝 Wizard - Formulario conversacional (próximamente)
URL: ws://localhost:8000/api/v1/ws/
FAQ (Preguntas Frecuentes):
{"content": "¿Qué es el programa Fellows?"}
{"content": "¿Cuánto cuestan los cursos?"}
{"content": "¿Cómo me entero de las convocatorias?"}API REST:
curl -X POST "http://localhost:8000/api/v1/chat" \
-H "Content-Type: application/json" \
-d '{"message": "¿Qué es el programa Fellows?"}'Respuesta típica:
{
"response": "Aquí va la respuesta generada por el agente.",
"agent_used": "faq",
"wizard_session_id": null,
"wizard_state": "INACTIVE",
"current_question": 1,
"wizard_responses": {},
"awaiting_answer": false
}Validator (Validación de datos):
{"message": "Podés validar este email: [email protected]?"}
{"message": "Mi teléfono es +598 9876 5432, confirmá si está correcto."}
{"message": "La cédula 48903345 es válida?"}- LangGraph - Orquestación de agentes
- LangChain - Framework de IA
- OpenAI - LLM y embeddings
- PGVector - Búsqueda semántica de FAQs
- PostgreSQL - Persistencia
- El Supervisor detecta cuando una intención incluye revisar o enviar datos personales (correo, teléfono, cédula) y enrutará el mensaje al agente validator automáticamente.
- El Validator normaliza el dato, ejecuta las reglas de
utils/validators.pyy responde en la misma conversación indicando si es válido. - Ante errores, devuelve el motivo exacto y pide el dato corregido antes de permitir que continúe el flujo (ideal para evitar guardar información inconsistente).
conversations- Conversacionesmessages- Historial de mensajespostulations- Postulaciones completadas
-- FAQs con embeddings vectoriales
CREATE TABLE faq_embeddings (
id SERIAL PRIMARY KEY,
question VARCHAR NOT NULL,
answer TEXT NOT NULL,
embedding VECTOR(1536),
created_at TIMESTAMP DEFAULT NOW()
);
-- Sesiones del wizard (próximamente)
CREATE TABLE wizard_sessions (
id SERIAL PRIMARY KEY,
conv_id INTEGER REFERENCES conversations(id),
current_question INTEGER DEFAULT 1,
responses JSON DEFAULT '{}',
state VARCHAR(50) DEFAULT 'ACTIVE',
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);import logging
logging.basicConfig(level=logging.INFO)# Test FAQ
from app.services.chat_service import chat_service
result = await chat_service.process_message("¿Qué es el programa Fellows?")
print(result)uv pip install -r requirements.txtCREATE EXTENSION vector;export OPENAI_API_KEY="sk-your-key-here"Verificar DATABASE_URL en .env
- Formulario conversacional de 20 preguntas
- Human-in-the-loop para mejoras
- Evaluación IA con rúbrica
- Persistencia de sesiones
- Crear el agente en
app/agents/ - Agregar al workflow en
app/graph/workflow.py - Actualizar supervisor en
app/agents/supervisor.py - Agregar tests y documentación
Asegúrate de tener las dependencias necesarias:
uv pip install -r requirements.txt
Crea un archivo .env en la raíz del proyecto con el siguiente contenido (ajusta los valores según tu entorno):
DATABASE_URL=postgresql+asyncpg://<USUARIO>:<PASSWORD>@<HOST>:<PUERTO>/<NOMBRE_DB>
Solo ejecuta este bloque si el usuario y la base de datos NO existen:
CREATE USER <USUARIO> WITH PASSWORD '<PASSWORD>';
CREATE DATABASE <NOMBRE_DB> OWNER <USUARIO>;
GRANT ALL PRIVILEGES ON DATABASE <NOMBRE_DB> TO <USUARIO>;
Nota: Si el usuario o la base de datos ya existen, puedes omitir estos comandos y solo asegurarte de que el usuario tiene permisos sobre la base de datos.
Ejecuta el siguiente comando desde la raíz del proyecto:
python -m app.db.config.create_tables
Esto creará las tablas conversations, messages, postulations, faq_embeddings y wizard_sessions.
Inicia el servidor de desarrollo:
uvicorn app.main:app --reload
- Analizar el código:
ruff check .
- Trigger: Push a ramas
DevOpsomain - Registry:
crretoxmas2024.azurecr.io/ithaka-backend - Tags: Automático por rama y commit SHA
# Pull de la imagen del registry
docker pull crretoxmas2024.azurecr.io/ithaka-backend:latest
# Ejecutar contenedor
docker run -p 8000:8000 -e DATABASE_URL=sqlite+aiosqlite:///./app.db crretoxmas2024.azurecr.io/ithaka-backend:latestDATABASE_URL=sqlite+aiosqlite:///./app.db # Para desarrollo con SQLite
# O para PostgreSQL:
# DATABASE_URL=postgresql+asyncpg://user:password@host:5432/database- Ingresar a https://console.twilio.com/us1/develop/sms/try-it-out/whatsapp-learn?frameUrl=%2Fconsole%2Fsms%2Fwhatsapp%2Flearn%3Fx-target-region%3Dus1
- Enviar mensaje al número de WhatsApp +14155238886 con el mensaje
join may-steady - Obtener las credenciales y token de Twilio
- Agregar un archivo .env con las credenciales de Twilio