Bitácora ODIN
Documento interno de seguimiento del proyecto. Acceso restringido.
ODIN – Bitácora del Proyecto
- Poder Judicial reconstruido en el relay: búsqueda, análisis rápido/profundo y descarga de PDF vuelven a funcionar (la ruta
/pj-buscarnunca había existido en el script del relay). - Indecopi (nuevo): pestaña en ODIN Corporativo con Protección al Consumidor, Tribunal y Propiedad Intelectual; búsqueda, análisis rápido/profundo y descarga de PDF. Workflow de n8n propio e independiente; usa el relay.
- Barra de análisis en la cabecera de la lista de resultados (SPIJ, PJ e Indecopi), con botones desactivados hasta seleccionar documentos.
- Medición de consumo de IA y tráfico en análisis, predicción, búsquedas e indexación, más la pestaña Consumo ODIN en Admin (base para fijar la renta de los clientes Corporativos).
- Túnel del relay con llave SSH restringida y reconexión automática (antes dependía de teclear la contraseña).
- Tono: textos de las interfaces en español neutro (tú) en lugar de voseo.
- Documentos de trabajo en
Ayudas memoria comerciales/(rentabilidad y estrategia comercial). - Correcciones del 2026-09-21: (1) Poder Judicial devolvía 0 resultados si el texto llevaba tilde o ñ; se corrigió en el relay (
spij_relay.py, versión nueva instalada en el celular). (2) En Indecopi, el Análisis Profundo y la descarga de PDF fallaban en ~1 de cada 5 resoluciones porque el número de resolución no sirve siempre como texto de búsqueda; ahora se repite la búsqueda original del usuario (la pantalla y el flujo envían ese texto). (3) La caché de búsquedas del PJ ya no guarda búsquedas sin resultados, que provocaban respuestas vacías durante 24 horas. (4) Reintentos automáticos en las llamadas al relay (PJ e Indecopi) por los errores intermitentes de esos sitios. (5) Aviso en Indecopi cuando la sumilla publicada es solo una etiqueta.
1. Qué es ODIN
ODIN (Ergo Systems.com) es una plataforma de iA legal para el mercado peruano, con un backend compartido (un workflow principal de n8n (hoy 451 nodos) más workflows independientes para las funcionalidades nuevas, y una base Postgres/PGVector multi-tenant) y tres interfaces de consumo distintas según el público:
2. Estado por producto
Huginn Publicado (web + APK de prueba)
URL: https://ergosystemsperu.com/odin/huginn/ (WordPress post 108, plantilla blank sin header/footer del sitio).
- Identidad anónima por
device_id/teléfono, sin login obligatorio. Registro opcional habilita adjuntar documento/foto, historial, publicar caso. - Pantalla de inicio por categorías (tránsito, embargos, alimentos, civil, penal, laboral) con íconos emoji, enruta a Consulta con área y texto precargados.
- Visión por imágenes (Gemini multimodal) para fotos de documentos/papeletas.
- Tono del agente ajustado: coloquial pero sin evadir técnicismos — nombra la figura legal exacta y la explica en el mismo párrafo.
- Texto a voz (síntesis del navegador, heurística de voz masculina) para la respuesta; sección «Acerca de Huginn» con reproductor de audio real (MP3 subido) en vez de TTS.
- Menú adicional: «Acerca de Huginn», «ODIN para abogados independientes» (con video de YouTube incrustado) y «ODIN para estudios/empresas/inst. públicas» (con video MP4 propio).
- Empaquetado como TWA (Trusted Web Activity) vía Bubblewrap — APK de prueba generado y probado. Falta llave de firma definitiva (la actual es de prueba) y cuenta de Play Console real antes de publicar en producción.
- Cada consulta registra automáticamente IP + geolocalización (sin tocar el frontend) para el monitoreo de conexiones del panel Admin.
Muninn Publicado, en pruebas de terceros
URL: https://ergosystemsperu.com/odin/mininn/ (post 99).
- Login real con email + contraseña (bcrypt vía pgcrypto), migración automática de contraseña en el primer ingreso.
- Sistema de temas (Bosque/Marino/Nocturno, variables CSS) y elección de posición de menú (arriba/izquierda), con persistencia en
localStorage. - Pestañas: Consulta, Historial, Bandeja de Entrada (prospectos de Huginn), Saldo/Recarga (Yape manual), Jurisprudencia SPIJ y Poder Judicial (búsqueda + análisis con IA + descarga), Mi Perfil.
- Facturación real: fórmula por transacción fija + tráfico en KB, niveles de tarifa configurables desde el panel Admin.
- Auto-logout por inactividad (45 min); registro de sesiones con IP/ciudad/país.
- Consultas continuables (nuevo, 2026-09-05): Consulta pasó de una sola pregunta/respuesta a un hilo de chat real. El AI Agent ya tenía memoria de conversación (Postgres Chat Memory, últimos 10 mensajes) pero indexada por un
id_sesionúnico por navegador reusado para siempre — se cambió a unid_sesionnuevo por hilo de conversación. El Historial ahora agrupa por conversación (título = primera pregunta, fecha, N° de mensajes) con botón «Continuar esta consulta» que recarga el hilo completo como chat y sigue enviando el mismoid_sesion, preservando el contexto real del caso. Botón «+ Nueva consulta» para iniciar un hilo aislado. - Ajuste de tono (2026-09-20): los mensajes de la interfaz pasaron de voseo a español neutro (tú); el texto del cuadro de análisis quedó como «¿Qué deseas que haga ODIN con estos documentos? (comparar, analizar, encontrar contradicciones, similitudes, redactar un escrito, etc.)». Aplica también a Corporativo, Huginn y Admin.
ODIN Corporativo En construcción activa
URL: https://ergosystemsperu.com/odin/corporativo/ (post 234). Primer cliente: Estudio Arbizu & Gamarra (cuenta demo).
- Mismo diseño/temas que Muninn, login real con email+contraseña, endpoint propio para cambiar email/contraseña.
- Consulta con casilla «usar documento adjunto como plantilla/formato» (el agente sigue la estructura al pie de la letra y marca datos faltantes con
…). - Predicción de probabilidad de fallo por magistrado: busca en vivo las sentencias del Drive del cliente (
Predicciones/{juez}/{tipo_caso}/sentencias/), exige mínimo 2 sentencias, responde con rango porcentual y descargo legal. - Jurisprudencia SPIJ/PJ idéntica a Muninn (siempre visible, no depende de tipo de suscripción).
- Gestión de Expedientes: cada expediente pertenece a un Litigante (entidad propia, no atada a un solo caso — un litigante puede tener varios expedientes), abogado asignado, estados (abierto/en_proceso/en_abandono/cerrado), y Plazos (plazo/vencimiento/audiencia/comparecencia) responsabilidad del abogado a cargo.
- Gestión de Abogados del estudio (alta simple, sin cuentas de login individuales todavía).
- Consultas continuables (nuevo, 2026-09-18): mismo mecanismo que Muninn — Historial agrupado por conversación con botón «Continuar esta consulta» y código+fecha visibles.
- Documento adjunto en el chat = uso único (cambio de diseño, 2026-09-18): el archivo que se sube desde la Consulta (Muninn o Corporativo) ya NO se vectoriza ni se guarda — se usa solo para responder esa consulta puntual. Confirmado por Martín: el Drive de cada cliente Odin sigue siendo la única fuente de conocimiento persistente/reutilizable; cuando se inscriba un nuevo cliente Corporativo debe usar su propio Drive con sus propias carpetas.
- Pestaña «Documentos» (nuevo, 2026-09-18): gestión directa del Drive del cliente desde la interfaz — navegar carpetas, crear subcarpetas, subir PDFs (límite 20MB c/u) y botón VECTORIZAR para indexarlos de forma permanente (asincrónico, con aviso inmediato). Reutiliza la misma credencial de Drive compartida ya conectada (cuenta
volumen1.es.ia@gmail.com, autorizada en el proyecto Google CloudDriveN8NiA1— ojo: la app OAuth está en modo «Prueba», solo esa cuenta yergosystems.com@gmail.compueden reconectarla si el token vence de nuevo). El paso de vectorizar no usa el nodo nativo de LangChain de n8n (tiene un bug reproducible, «Document loader is not initialized») — se implementó llamando directo a la API de embeddings de Gemini e insertando a Postgres con SQL. - Jurisprudencia PJ reconstruida (2026-09-19): la búsqueda y la descarga volvieron a funcionar tras reescribir el relay. El sitio del PJ (JSF) exige reproducir el formulario con cabeceras completas y corregir un redirect que apunta a
http://; cada resolución expone un UUID que sirve para descargar el PDF sin sesión. - Pestaña «Indecopi» (nuevo, 2026-09-19): áreas Protección al Consumidor (Comisiones de Lima y Provincias, Órganos Sumarísimos de Lima y Provincias), Tribunal del Indecopi (5 Salas) y Propiedad Intelectual (Derecho de Autor, Signos distintivos, Invenciones y Nuevas Tecnologías), con filtro por año y texto libre. Muestra las primeras 25 resoluciones del total encontrado. Selección múltiple con Análisis Rápido (sobre la sumilla) y Análisis Profundo (lee el PDF completo: máximo 3 documentos y 15 000 caracteres por documento) y descarga del PDF de cada resolución. Implementado en un workflow de n8n propio; usa el relay, porque el sitio de Indecopi bloquea la IP del VPS (403).
- Barra de análisis en la cabecera (2026-09-20): en SPIJ, PJ e Indecopi los botones de análisis aparecen arriba de la lista de resultados, desactivados por defecto, con el mensaje «Seleccione uno o más documentos que quiera analizar»; se activan al marcar documentos. El cuadro de criterio y el resultado se muestran debajo de la barra.
- Menú: las pestañas pasan a una segunda fila cuando no caben, para que ninguna quede fuera de pantalla.
Admin Publicado
URL: https://ergosystemsperu.com/odin/admin/ (post 103). Panel Tailwind, password compartida (no hay usuarios individuales).
- Recargas Yape pendientes (confirmación manual).
- Niveles de tarifa (Muninn y Odin) y asignación por cuenta.
- Cuentas Muninn registradas.
- Conexiones (Muninn): conectados ahora + historial de sesiones con IP/ubicación.
- Conexiones Huginn (nuevo): rango de fechas, conectados ahora, resumen diario (consultas/visitantes únicos), detalle por usuario (condición anónimo/registrado, IP, ubicación, último tema consultado, veces conectado, si buscó abogado).
- Consumo ODIN (nuevo, 2026-09-20): vista de los clientes Corporativos por rango de fechas: sesiones, días conectados y minutos; consultas, análisis rápidos/profundos, predicciones, búsquedas externas e indexaciones; tokens estimados, tráfico en MB, costo en US$ y en S/ (tipo de cambio editable), proyección a 30 días, desglose por tipo de operación e historial mensual. Botón Descargar CSV para armar el análisis de rentabilidad. Endpoint en un workflow propio («ODIN – Admin Consumo Corporativo»).
3. Modelo de datos (Postgres, base base_vectores_n8n)
Todo corre sobre un único Postgres/PGVector multi-tenant. Tablas principales:
| Tabla | Propósito |
|---|---|
clientes / tipo_cliente | El cliente de ODIN (HUGINN/MUNINN/ODIN), no confundir con el litigante del estudio. |
cuentas / tipo_cuenta | FREE, FREE_REGISTRADO, PREPAGO, SUSCRIPCION_MENSUAL/ANUAL, CORPORATIVA. |
n8n_vectors2 | Embeddings (Gemini), columna + JSONB cliente_id para aislar el RAG por tenant. Corregido 2026-09-18: Huginn/Muninn solo buscaban en la categoría «Documentos base» (3 archivos) en vez de las ∼36,800 filas ya indexadas en Civil/Penal/Laboral/Administrativo/Consumidor — se agregó la etiqueta ambito_publico:true a esas categorías y se amplió el filtro de búsqueda de Huginn/Muninn a esa etiqueta (los documentos propios de cada cliente Odin, ligados por cliente_id, siguen aislados y no se mezclan). |
historial_consultas | Una fila por consulta real, todos los tiers; base para el reporte de conexiones Huginn. Columna id_sesion (agregada 2026-09-05) agrupa mensajes de un mismo hilo de conversación en Muninn. |
consumo_uso / movimientos_cuenta | Costeo interno (USD) y ledger de ingresos (soles), separados a propósito. Desde 2026-09-19 todas las operaciones registran tokens (estimados: caracteres ÷ 4), costo y tráfico en KB mediante la función registrar_consumo_est; los registros anteriores de análisis, predicción y búsquedas tienen 0 tokens. El campo tipo_operacion tiene un CHECK con 10 valores permitidos: hay que ampliarlo antes de agregar un tipo nuevo. |
precios_modelo | Precio por millón de tokens (entrada/salida) de cada modelo de Gemini usado en el costeo. Editable; tarifa de embeddings pendiente de confirmar. |
sesiones_usuario | IP, ciudad, país, inicio/fin — generado genérico, alimentado hoy por Muninn (login) y Huginn (cada consulta). |
expedientes | Caso/expediente ODIN (1:1 en la práctica) — litigante_id, abogado_asignado_id, estado. |
litigantes | Cliente del estudio, independiente del expediente (renombrada desde contactos_caso). |
plazos_expediente | Plazos/vencimientos/audiencias/comparecencias por expediente, responsable = abogado. |
usuarios_abogado | Abogados de un estudio ODIN; google_calendar_id opcional (integración de calendario aún no construida). |
jurisprudencia_busquedas | Caché de búsquedas SPIJ/PJ por cliente+criterio+fechas. |
prospectos_casos / mensajes_caso / calificaciones | Flujo Huginn→Muninn de «buscar abogado», mensajería y rating. |
Nota: las migraciones numéradas en el repo local (db/migrations/001–013) no reflejan el estado real de la base — varios cambios posteriores (litigantes, plazos, columnas de sesiones, checks de estado) se aplicaron directo por SSH sin generar el archivo .sql correspondiente. Ver sección 8 para cómo actuar sobre esto.
4. Reglas de negocio vigentes
- Muninn: S/.50/mes suscripción, o S/.20 prepago hasta agotar saldo. Deducción real: S/.0.50 (prepago) / S/.0.25 (mensual) fijo por consulta + S/.0.50 por cada 100KB de tráfico estimado (tokens×4/1024).
- Odin Corporativo: cuota mensual fija (no hay flujo de facturación automático aún) — el consumo se registra para información/límites, no se cobra por evento.
- Huginn: gratis, 3 consultas/hora (registrado o no), 1 documento si está registrado.
- Marca de agua obligatoria en toda respuesta, distinta por tier (Huginn/Muninn/Odin), inyectada server-side, no depende del prompt del LLM.
- Jurisprudencia SPIJ/Poder Judicial disponible para Odin y para Muninn con suscripción (no prepago).
- Renta de Odin Corporativo (en definición, 2026-09-20): se evalúa renta fija con cuota suave en operaciones que el cliente entiende (análisis profundos, documentos indexados) en vez de un tope en tokens. Los datos de costo y las opciones están en las ayudas memoria; con la medición actual el costo variable de IA es bajo y el peso está en costos fijos y soporte.
5. Integraciones externas
- Google Gemini — modelo de lenguaje + embeddings + visión.
- Google Drive — repositorio documental por cliente Odin (ingesta automática programada).
- SPIJ (normas), Poder Judicial (jurisprudencia) e Indecopi (resoluciones): los tres sitios bloquean la IP de datacenter del VPS, así que el scraping pasa por un relay residencial: un celular con Termux que corre
spij_relay.py(rutas/buscar,/pj-buscar,/pj-documento,/indecopi-buscare/indecopi-documento) y un túnel SSH inverso hasta el VPS (puentesocaten172.19.0.1:9000). El túnel entra con una llave ed25519 restringida (solo puede abrir el puerto 9000, sin terminal ni otros reenvíos) y se reconecta solo. Indecopi usa tokens de documento atados a la sesión, por lo que la descarga repite la búsqueda en una sesión nueva. Depende de que el relay del celular esté activo (punto único de falla). - WhatsApp Business (litigantes de estudios Odin) — Diseñado, no construido. Arquitectura confirmada: un solo número central para todos los estudios (el litigante elige su estudio al inicio), Meta Cloud API directo, calendario institucional por estudio. Pendiente: alta de un número nuevo en Meta (no se puede reusar el de Cerveza Chalaca), teléfono de alerta por estudio, y plantillas de mensaje aprobadas por Meta (obligatorias para cualquier recordatorio que ODIN inicie fuera de la ventana de 24h).
6. Infraestructura
- Un VPS (Dokploy/Docker/Traefik) aloja todo: Postgres+PGVector (RAG), n8n (con su propio Postgres interno), WordPress de ODIN y de Cerveza Chalaca (cada uno con su MySQL), Chatwoot, Mailu (correo propio), pgAdmin.
- Certificados HTTPS vía Traefik/Let’s Encrypt — ambos dominios principales tuvieron el mismo bug (falta de certificado para la variante
www) corregido agregando el host a la regla de Traefik. - Workflows de n8n: principal
290626 RAG Legal V2(451 nodos),ODIN - Jurisprudencia IndecopiyODIN - Admin Consumo Corporativo. Criterio: las funcionalidades nuevas van en workflows independientes; el principal no se sigue ampliando. - Capacidad actual del VPS: 2 vCPU, 7,8 GB de RAM y 96 GB de disco (30 GB usados). La base de vectores ocupa 640 MB (37 782 fragmentos). La búsqueda vectorial no usa índice (vectores de 3 072 dimensiones): el tiempo crece con el total de fragmentos de todos los clientes.
- Con los conectores MCP de n8n caídos, los cambios se hacen por la API REST de n8n (con respaldo previo del workflow) y las páginas de WordPress con
wp post update --skip-plugins; el plugin Gutenverse falla en wp-cli si no se omiten los plugins. - Ver sección 8 para ubicaciones exactas de archivos/backups.
7. Pendientes / próximos pasos
- WhatsApp para litigantes de estudios Odin (citas, estado de expediente, alertas de calendario) — ver sección 5.
- Creación automática de subcarpeta en Drive por área del derecho al crear un expediente (discutido, no implementado).
- Cuentas de login individuales por abogado dentro de un estudio Odin (hoy es una sola cuenta compartida).
- Llave de firma definitiva + Play Console real para publicar Huginn en producción.
- Dashboard de administrador del estudio Odin (casos por abogado, productividad, alertas) — anunciado, no iniciado.
- Poner al día las migraciones
.sqllocales con los cambios de esquema aplicados directo en producción (litigantes, plazos_expediente, estado en_abandono, etc.). - Sacar del workflow principal los patrones repetidos (verificación de cuenta y acceso, marca de agua + Markdown + respuesta) a sub-workflows reutilizables.
- Medición de costos: incluir el contexto RAG en los tokens de las consultas al chat, confirmar la tarifa de embeddings y probar en vivo el registro de consumo de la indexación de documentos (agregado, no ejecutado de punta a punta).
- Definir la renta fija y la cuota suave de Odin Corporativo; decidir si los análisis de Muninn (jurisprudencia, predicción) deben descontar saldo, hoy solo lo hace el chat.
- Dar redundancia al relay (segundo equipo o proxy residencial) y no comprometer disponibilidad mientras dependa de un solo celular.
- Mover la contraseña de Admin, hoy escrita en nodos del workflow, a una credencial o variable de entorno.
- Alta de nuevos clientes Corporativos: la app OAuth de Google está en modo Prueba, así que cada cliente exige registrar su cuenta como usuario de prueba o verificar la aplicación.
- Indecopi: faltan las áreas Defensa de la Competencia, Sentencias del Poder Judicial y Laudos del buscador. La pestaña SPIJ mantiene un solo botón, «Analizar con IA».
- Los prompts internos de n8n aún están redactados con voseo; no afecta a las respuestas (salen en español neutro).
- El sitio del Poder Judicial responde de forma intermitente (errores 500 y demoras de 5 a 25 s); el flujo reintenta hasta 3 veces, pero conviene que el relay reintente también en el propio celular.
8. Accesos, archivos y backups
Dónde vive cada parte del proyecto
| Componente | Ubicación |
|---|---|
| Código de las páginas (Huginn, Muninn, Corporativo, Admin, esta Bitácora) | Contenido de posts de WordPress en ergosystemsperu.com (base MySQL wordpress, contenedor www-wordpress-xotvuy-wp_db-1). No existen como archivos sueltos en ningún repositorio — viven únicamente en la base de datos de WordPress. |
| Lógica de negocio / IA | Workflow principal de n8n («290626 RAG Legal V2») y dos workflows independientes («ODIN – Jurisprudencia Indecopi» y «ODIN – Admin Consumo Corporativo») en https://n8n.ergosystemsperu.com, guardado en el Postgres interno de n8n (contenedor n8n-ergo-server-n8nwithpostgres-wpj3gr-postgres-1). |
| Datos de negocio (clientes, expedientes, historial, vectores) | Postgres base_vectores_n8n en el contenedor postgres-ia-db del VPS. |
| Archivos subidos (imágenes, PDFs, audio, QR) | Volumen Docker www-wordpress-xotvuy_wp_app (carpeta wp-content/uploads). |
| Documentos de los clientes Odin (para el RAG por cliente) | Google Drive de cada estudio — fuera del VPS, ya redundado por Google. |
| Migraciones SQL versionadas (parcial, desactualizado) | Carpeta local Documents/2026 Ergo Systems/Proyecto iA/ODIN/RAG iA/db/migrations/ en tu Mac. |
| Material de referencia (presentaciones, kits de diseño, videos, audios) | Carpeta local Documents/2026 Ergo Systems/Proyecto iA/ODIN/RAG iA/web-ergosystems/. |
| Script del relay (SPIJ, PJ, Indecopi) | Carpeta local del proyecto (spij_relay.py) y en el celular (Termux), en la carpeta Descargas. |
| Documentos comerciales (rentabilidad y estrategia comercial) | Carpeta local del proyecto: Ayudas memoria comerciales/ (Word, PDF y HTML). |
| Respaldos de cambios recientes | Carpeta local del proyecto: backups/ (workflow principal antes de la medición de consumo y copias de las páginas antes de cada ajuste). |
Backup realizado el 2026-08-26
Se generó un respaldo completo (~1 GB comprimido) con:
- Volcado completo de
base_vectores_n8n(Postgres, formatopg_dump -Fc). - Volcado completo del Postgres interno de n8n (workflows + credenciales cifradas + historial de ejecuciones).
- Volcado MySQL de los dos WordPress (ergosystemsperu.com y cerveza-chalaca.com).
- Archivos subidos de ambos WordPress (carpetas
wp-content/uploadscompletas).
Guardado en dos ubicaciones:
/root/backups/odin_backup_2026-08-26.tar.gzen el VPS.- Copia local descargada en
Documents/2026 Ergo Systems/Proyecto iA/ODIN/backups/odin_backup_2026-08-26.tar.gz— checksum SHA-256 verificado idéntico entre ambas copias.
Importante: para restaurar las credenciales guardadas dentro de n8n hace falta además el valor de N8N_ENCRYPTION_KEY vigente al momento del backup — no se guarda dentro del paquete de respaldo por seguridad; consultarlo directamente en el servidor si se necesita un restore completo.
Respaldos de cambios (2026-09-19 y 2026-09-20)
- Antes de modificar el workflow principal se guardó su JSON completo en
backups/; las páginas de WordPress (Corporativo, Muninn, Huginn, Admin y esta Bitácora) se copiaron antes del ajuste de tono y de esta actualización. - Nota: el respaldo completo del 2026-08-26 no incluye estos cambios (workflows nuevos, función y tabla de costeo, nuevas pestañas). Conviene programar uno nuevo.
