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

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