diff --git a/docs/IA_CONTEXT_DEPLOYMENT.md b/docs/IA_CONTEXT_DEPLOYMENT.md new file mode 100644 index 0000000..456e6e1 --- /dev/null +++ b/docs/IA_CONTEXT_DEPLOYMENT.md @@ -0,0 +1,152 @@ +# Despliegue de Tablas de Contexto IA - TZZR + +**Fecha:** 2024-12-24 +**Responsable:** ARCHITECT +**Estado:** ✅ Completado (2/3 servidores) + +## Resumen + +Se desplegaron exitosamente las tablas de contexto IA en los servidores **architect** y **corp**. El servidor **deck** no estuvo disponible durante el despliegue (SSH connection refused). + +## Servidores Desplegados + +### ✅ architect (69.62.126.110) +- **PostgreSQL:** v16.11 +- **Estado:** Desplegado exitosamente +- **Tablas creadas:** 5 tablas + 1 vista +- **Triggers:** 2 triggers activos +- **Funciones:** 2 funciones PL/pgSQL +- **Test:** ✅ Funcionando correctamente + +### ✅ corp (92.112.181.188) +- **PostgreSQL:** v16.11 +- **Estado:** Desplegado exitosamente +- **Tablas creadas:** 5 tablas + 1 vista +- **Triggers:** 2 triggers activos +- **Funciones:** 2 funciones PL/pgSQL +- **Test:** ✅ Funcionando correctamente + +### ⚠️ deck (72.62.1.113) +- **Estado:** No disponible +- **Error:** SSH connection refused +- **Acción pendiente:** Verificar conectividad y desplegar cuando esté disponible + +## Estructura de Base de Datos + +### Tablas + +1. **ia_contexts** + - Almacena contextos de conversación de agentes IA + - Campos: context_id (UNIQUE), agent_name, user_id, session_id, metadata, status + - Trigger: Actualiza `updated_at` automáticamente + +2. **ia_messages** + - Mensajes de conversación con agentes IA + - Campos: context_id, role, content, timestamp, token_count, model, metadata + - Trigger: Actualiza métricas de contexto automáticamente + +3. **ia_embeddings** + - Embeddings vectoriales para búsqueda semántica + - Campos: context_id, message_id, embedding_vector, content_hash + +4. **ia_tool_calls** + - Registro de llamadas a herramientas + - Campos: context_id, message_id, tool_name, tool_input, tool_output, execution_time_ms, success + +5. **ia_context_metrics** + - Métricas agregadas por contexto + - Campos: context_id (UNIQUE), total_messages, total_tokens, total_tool_calls, avg_response_time_ms + +### Vista + +- **ia_context_summary** + - JOIN de ia_contexts + ia_context_metrics + - Proporciona resumen completo de cada contexto + +### Índices + +Se crearon 13 índices para optimizar las siguientes consultas: +- Búsqueda por agente +- Búsqueda por sesión +- Ordenamiento por fecha +- Filtrado por estado +- Búsqueda por hash de contenido + +## Funciones y Triggers + +### 1. update_ia_contexts_updated_at() +- **Trigger:** `trigger_update_ia_contexts_updated_at` +- **Evento:** BEFORE UPDATE en ia_contexts +- **Función:** Actualiza automáticamente el campo `updated_at` + +### 2. update_ia_context_metrics() +- **Trigger:** `trigger_update_ia_context_metrics` +- **Evento:** AFTER INSERT en ia_messages +- **Función:** Actualiza automáticamente las métricas (total_messages, total_tokens, last_activity) + +## Tests Realizados + +### architect +```sql +-- Contexto de prueba: test-context-001 +-- Mensajes insertados: 2 +-- Métricas actualizadas: ✅ automáticamente +-- Última actividad: 2025-12-24 00:07:18 +``` + +### corp +```sql +-- Contexto de prueba: test-corp-001 +-- Agente: margaret +-- Mensajes insertados: 1 +-- Métricas actualizadas: ✅ automáticamente +``` + +## Archivos Desplegados + +1. **Schema principal:** `/home/orchestrator/orchestrator/scripts/ia_context_schema.sql` +2. **Script de despliegue:** `/home/orchestrator/orchestrator/scripts/deploy_ia_tables.sh` + +## Correcciones Aplicadas + +Durante el despliegue se identificó y corrigió: +- Faltaba constraint UNIQUE en `context_id` de `ia_context_metrics` +- Se agregó: `ALTER TABLE ia_context_metrics ADD CONSTRAINT ia_context_metrics_context_id_key UNIQUE (context_id);` + +## Próximos Pasos + +1. ✅ Schema actualizado con UNIQUE constraint +2. ⏳ Desplegar en **deck** cuando esté disponible +3. ⏳ Integrar tablas con agentes IA del sistema +4. ⏳ Implementar almacenamiento de embeddings vectoriales +5. ⏳ Crear dashboard de métricas en tiempo real + +## Comandos Útiles + +### Verificar tablas +```bash +# En architect o corp +ssh root@ "sudo -u postgres psql -c '\dt ia_*'" +``` + +### Ver resumen de contextos +```bash +ssh root@ "sudo -u postgres psql -c 'SELECT * FROM ia_context_summary;'" +``` + +### Limpiar datos de prueba +```sql +DELETE FROM ia_contexts WHERE context_id LIKE 'test-%'; +``` + +## Notas + +- Las tablas usan cascadas (ON DELETE CASCADE) para mantener integridad referencial +- Los triggers garantizan que las métricas estén siempre actualizadas +- La vista ia_context_summary simplifica consultas frecuentes +- Los índices están optimizados para las consultas más comunes del sistema + +--- + +**Deployment completado por:** ARCHITECT +**Timestamp:** 2025-12-24 00:07:00 UTC diff --git a/scripts/deploy_ia_tables.sh b/scripts/deploy_ia_tables.sh new file mode 100755 index 0000000..82768e3 --- /dev/null +++ b/scripts/deploy_ia_tables.sh @@ -0,0 +1,128 @@ +#!/bin/bash +# Script de despliegue de tablas de contexto IA +# Para servidores: architect (local), deck, corp +# Fecha: 2024-12-24 + +set -e # Exit on error + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SCHEMA_FILE="${SCRIPT_DIR}/ia_context_schema.sql" +SSH_KEY="$HOME/.ssh/tzzr" + +# Colores para output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +echo "============================================================================" +echo "TZZR - Despliegue de Tablas de Contexto IA" +echo "============================================================================" +echo "" + +# Función para desplegar en un servidor +deploy_to_server() { + local server_name=$1 + local server_host=$2 + local is_local=$3 + + echo -e "${YELLOW}Desplegando en ${server_name} (${server_host})...${NC}" + + if [ "$is_local" = "true" ]; then + # Despliegue local en architect + echo " → Ejecutando SQL en PostgreSQL local..." + if sudo -u postgres psql -f "$SCHEMA_FILE" 2>&1 | tee /tmp/deploy_${server_name}.log; then + echo -e "${GREEN} ✅ ${server_name}: Deployment exitoso${NC}" + return 0 + else + echo -e "${RED} ❌ ${server_name}: Error en deployment${NC}" + cat /tmp/deploy_${server_name}.log + return 1 + fi + else + # Despliegue remoto vía SSH + echo " → Copiando schema al servidor..." + if ! scp -i "$SSH_KEY" -o StrictHostKeyChecking=no "$SCHEMA_FILE" "root@${server_host}:/tmp/ia_context_schema.sql" 2>&1; then + echo -e "${RED} ❌ ${server_name}: Error copiando archivo${NC}" + return 1 + fi + + echo " → Ejecutando SQL en PostgreSQL remoto..." + if ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no "root@${server_host}" \ + "sudo -u postgres psql -f /tmp/ia_context_schema.sql && rm /tmp/ia_context_schema.sql" 2>&1 | tee /tmp/deploy_${server_name}.log; then + echo -e "${GREEN} ✅ ${server_name}: Deployment exitoso${NC}" + return 0 + else + echo -e "${RED} ❌ ${server_name}: Error en deployment${NC}" + cat /tmp/deploy_${server_name}.log + return 1 + fi + fi +} + +# Verificar que el schema existe +if [ ! -f "$SCHEMA_FILE" ]; then + echo -e "${RED}Error: No se encuentra el archivo de schema: ${SCHEMA_FILE}${NC}" + exit 1 +fi + +echo "Schema a desplegar: $SCHEMA_FILE" +echo "" + +# Contadores +total=0 +success=0 +failed=0 + +# Desplegar en architect (local) +total=$((total + 1)) +if deploy_to_server "architect" "localhost" "true"; then + success=$((success + 1)) +else + failed=$((failed + 1)) +fi +echo "" + +# Desplegar en deck (remoto) +total=$((total + 1)) +echo "Verificando conectividad a deck..." +if ssh -i "$SSH_KEY" -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@72.62.1.113 "echo 'OK'" &>/dev/null; then + if deploy_to_server "deck" "72.62.1.113" "false"; then + success=$((success + 1)) + else + failed=$((failed + 1)) + fi +else + echo -e "${YELLOW} ⚠️ deck: Servidor no disponible (SSH connection refused)${NC}" + failed=$((failed + 1)) +fi +echo "" + +# Desplegar en corp (remoto) +total=$((total + 1)) +if deploy_to_server "corp" "92.112.181.188" "false"; then + success=$((success + 1)) +else + failed=$((failed + 1)) +fi +echo "" + +# Resumen +echo "============================================================================" +echo "RESUMEN DE DESPLIEGUE" +echo "============================================================================" +echo "Total servidores: $total" +echo -e "${GREEN}Exitosos: $success${NC}" +echo -e "${RED}Fallidos: $failed${NC}" +echo "" + +if [ $success -eq $total ]; then + echo -e "${GREEN}✅ DEPLOYMENT COMPLETADO EXITOSAMENTE EN TODOS LOS SERVIDORES${NC}" + exit 0 +elif [ $success -gt 0 ]; then + echo -e "${YELLOW}⚠️ DEPLOYMENT COMPLETADO CON ERRORES PARCIALES${NC}" + exit 1 +else + echo -e "${RED}❌ DEPLOYMENT FALLÓ EN TODOS LOS SERVIDORES${NC}" + exit 1 +fi diff --git a/scripts/ia_context_schema.sql b/scripts/ia_context_schema.sql new file mode 100644 index 0000000..c71ef0e --- /dev/null +++ b/scripts/ia_context_schema.sql @@ -0,0 +1,153 @@ +-- Schema de tablas de contexto IA para sistema TZZR +-- Desplegado en: architect, deck, corp +-- Fecha: 2024-12-23 +-- Arquitecto: ARCHITECT + +-- Tabla principal de contextos de conversación +CREATE TABLE IF NOT EXISTS ia_contexts ( + id SERIAL PRIMARY KEY, + context_id VARCHAR(255) UNIQUE NOT NULL, + agent_name VARCHAR(100) NOT NULL, + user_id VARCHAR(100), + session_id VARCHAR(255), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + metadata JSONB DEFAULT '{}', + status VARCHAR(50) DEFAULT 'active', + CONSTRAINT check_status CHECK (status IN ('active', 'archived', 'deleted')) +); + +-- Tabla de mensajes de conversación +CREATE TABLE IF NOT EXISTS ia_messages ( + id SERIAL PRIMARY KEY, + context_id VARCHAR(255) NOT NULL REFERENCES ia_contexts(context_id) ON DELETE CASCADE, + role VARCHAR(50) NOT NULL, + content TEXT NOT NULL, + timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + token_count INTEGER, + model VARCHAR(100), + metadata JSONB DEFAULT '{}', + CONSTRAINT check_role CHECK (role IN ('user', 'assistant', 'system', 'tool')) +); + +-- Tabla de embeddings para búsqueda semántica +CREATE TABLE IF NOT EXISTS ia_embeddings ( + id SERIAL PRIMARY KEY, + context_id VARCHAR(255) NOT NULL REFERENCES ia_contexts(context_id) ON DELETE CASCADE, + message_id INTEGER REFERENCES ia_messages(id) ON DELETE CASCADE, + embedding_vector FLOAT8[], + content_hash VARCHAR(64) UNIQUE, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + metadata JSONB DEFAULT '{}' +); + +-- Tabla de herramientas usadas +CREATE TABLE IF NOT EXISTS ia_tool_calls ( + id SERIAL PRIMARY KEY, + context_id VARCHAR(255) NOT NULL REFERENCES ia_contexts(context_id) ON DELETE CASCADE, + message_id INTEGER REFERENCES ia_messages(id) ON DELETE CASCADE, + tool_name VARCHAR(100) NOT NULL, + tool_input JSONB, + tool_output TEXT, + execution_time_ms INTEGER, + success BOOLEAN DEFAULT true, + error_message TEXT, + timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +-- Tabla de métricas de contexto +CREATE TABLE IF NOT EXISTS ia_context_metrics ( + id SERIAL PRIMARY KEY, + context_id VARCHAR(255) UNIQUE NOT NULL REFERENCES ia_contexts(context_id) ON DELETE CASCADE, + total_messages INTEGER DEFAULT 0, + total_tokens INTEGER DEFAULT 0, + total_tool_calls INTEGER DEFAULT 0, + avg_response_time_ms INTEGER, + last_activity TIMESTAMP, + metadata JSONB DEFAULT '{}' +); + +-- Índices para optimizar consultas +CREATE INDEX IF NOT EXISTS idx_ia_contexts_agent ON ia_contexts(agent_name); +CREATE INDEX IF NOT EXISTS idx_ia_contexts_session ON ia_contexts(session_id); +CREATE INDEX IF NOT EXISTS idx_ia_contexts_created ON ia_contexts(created_at); +CREATE INDEX IF NOT EXISTS idx_ia_contexts_status ON ia_contexts(status); + +CREATE INDEX IF NOT EXISTS idx_ia_messages_context ON ia_messages(context_id); +CREATE INDEX IF NOT EXISTS idx_ia_messages_timestamp ON ia_messages(timestamp); +CREATE INDEX IF NOT EXISTS idx_ia_messages_role ON ia_messages(role); + +CREATE INDEX IF NOT EXISTS idx_ia_embeddings_context ON ia_embeddings(context_id); +CREATE INDEX IF NOT EXISTS idx_ia_embeddings_hash ON ia_embeddings(content_hash); + +CREATE INDEX IF NOT EXISTS idx_ia_tool_calls_context ON ia_tool_calls(context_id); +CREATE INDEX IF NOT EXISTS idx_ia_tool_calls_tool ON ia_tool_calls(tool_name); +CREATE INDEX IF NOT EXISTS idx_ia_tool_calls_timestamp ON ia_tool_calls(timestamp); + +CREATE INDEX IF NOT EXISTS idx_ia_context_metrics_context ON ia_context_metrics(context_id); + +-- Función para actualizar updated_at automáticamente +CREATE OR REPLACE FUNCTION update_ia_contexts_updated_at() +RETURNS TRIGGER AS $$ +BEGIN + NEW.updated_at = CURRENT_TIMESTAMP; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Trigger para updated_at +DROP TRIGGER IF EXISTS trigger_update_ia_contexts_updated_at ON ia_contexts; +CREATE TRIGGER trigger_update_ia_contexts_updated_at + BEFORE UPDATE ON ia_contexts + FOR EACH ROW + EXECUTE FUNCTION update_ia_contexts_updated_at(); + +-- Función para actualizar métricas de contexto +CREATE OR REPLACE FUNCTION update_ia_context_metrics() +RETURNS TRIGGER AS $$ +BEGIN + INSERT INTO ia_context_metrics (context_id, total_messages, last_activity) + VALUES (NEW.context_id, 1, NEW.timestamp) + ON CONFLICT (context_id) DO UPDATE SET + total_messages = ia_context_metrics.total_messages + 1, + total_tokens = COALESCE(ia_context_metrics.total_tokens, 0) + COALESCE(NEW.token_count, 0), + last_activity = NEW.timestamp; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- Trigger para actualizar métricas cuando se agrega un mensaje +DROP TRIGGER IF EXISTS trigger_update_ia_context_metrics ON ia_messages; +CREATE TRIGGER trigger_update_ia_context_metrics + AFTER INSERT ON ia_messages + FOR EACH ROW + EXECUTE FUNCTION update_ia_context_metrics(); + +-- Vistas útiles +CREATE OR REPLACE VIEW ia_context_summary AS +SELECT + c.context_id, + c.agent_name, + c.session_id, + c.created_at, + c.updated_at, + c.status, + COALESCE(m.total_messages, 0) as message_count, + COALESCE(m.total_tokens, 0) as total_tokens, + COALESCE(m.total_tool_calls, 0) as tool_calls, + m.last_activity +FROM ia_contexts c +LEFT JOIN ia_context_metrics m ON c.context_id = m.context_id; + +-- Comentarios en tablas +COMMENT ON TABLE ia_contexts IS 'Contextos de conversación de agentes IA'; +COMMENT ON TABLE ia_messages IS 'Mensajes de conversación con agentes IA'; +COMMENT ON TABLE ia_embeddings IS 'Embeddings vectoriales para búsqueda semántica'; +COMMENT ON TABLE ia_tool_calls IS 'Registro de llamadas a herramientas'; +COMMENT ON TABLE ia_context_metrics IS 'Métricas agregadas por contexto'; + +-- Grant permisos (ajustar según usuarios de cada servidor) +-- En architect: postgres usuario por defecto +-- En deck/corp: usuarios específicos + +-- Fin del schema