feat: Deploy IA context tables to architect and corp servers

Desplegadas tablas de contexto IA en architect (69.62.126.110) y corp (92.112.181.188).

Cambios:
- Schema completo con 5 tablas: ia_contexts, ia_messages, ia_embeddings, ia_tool_calls, ia_context_metrics
- Vista ia_context_summary para consultas agregadas
- 2 funciones PL/pgSQL y triggers para actualización automática
- 13 índices optimizados para consultas frecuentes
- Script de despliegue automatizado
- Documentación completa del deployment

Tests:
-  architect: Tablas funcionando, triggers activos
-  corp: Tablas funcionando, triggers activos
- ⚠️  deck: Servidor no disponible (pendiente)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
ARCHITECT
2025-12-24 00:08:26 +00:00
parent 0e09ef9f47
commit 03ef4696f3
3 changed files with 433 additions and 0 deletions

View File

@@ -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@<servidor> "sudo -u postgres psql -c '\dt ia_*'"
```
### Ver resumen de contextos
```bash
ssh root@<servidor> "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

128
scripts/deploy_ia_tables.sh Executable file
View File

@@ -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

View File

@@ -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