Documentación técnica · DrivErp IA

Bajo el capó: cómo funciona el asistente de DrivErp.

Router multi-agente, MCP server-side, capas de prompts inmutables y control de acceso multi-capa — explicado con el nivel de detalle que tu equipo técnico necesita para evaluar la solución.

Módulo: ia_tools Versión: 1.0.3 Odoo: 16.0
163
Herramientas MCP con label en español
5
Capas de control de acceso por consulta
<2s
Con prompt cache activo (vs ~12s en cold)
3
Reintentos automáticos con abandono inteligente
Arquitectura

Cinco componentes, un flujo predecible.

Cada consulta atraviesa la misma secuencia: interfaz OWL → orquestador Python → API Claude → MCP server-side → ORM Odoo con el usuario real.

Frontend

OWL 2

Chat flotante, timeline de progreso, modal de detalles, multimodal upload.

ChatApp.js
Backend

ia_tools

Controllers HTTP, AgentRouter, ClaudeAIService, watchdog, retry inteligente.

/ia_tools/chat/*
Modelo IA

Claude API

Anthropic SDK con betas mcp-client y prompt-caching activas.

Opus · Sonnet · Haiku
Protocolo

MCP Servers

Endpoints HTTP nativos en Odoo. 16 dominios, 163 tools, JSON-RPC 2.0.

/mcp/
Datos

ORM Odoo

Ejecución como usuario real. ACLs, record rules y triggers nativos aplicados.

env(uid)
Router multi-agente

Haiku 4.5 elige el agente correcto en menos de un segundo.

El usuario nunca selecciona agente. Un router Claude Haiku 4.5 analiza la pregunta y enruta a 1..3 agentes especializados con fallback determinístico si el modelo no responde a tiempo.

Por qué Haiku 4.5

Más rápido y económico que Sonnet/Opus, y suficiente para clasificación. El modelo se configura vía ICP ia_tools.router_model — cambiable sin redeploy.

Decisión < 8 segundos

Read timeout agresivo en agent_router.py. Si Claude no responde, fallback determinístico al session.agent_id previo o al primer agente por sequence.

Hasta 3 agentes por consulta

Cuando la pregunta cruza dominios ("¿cuánto me debe el cliente X y dónde está su última orden?"), el router activa múltiples agentes que responden en paralelo y se fusionan en un mensaje único.

Catálogo cacheado por usuario

@ormcache('uid') en _router_catalog_for_uid(). Invalidación automática en write/create/unlink de agentes accesibles, sin polling.

MCP server-side

El protocolo abierto que conecta IA con tu ERP.

Model Context Protocol (MCP) es un estándar abierto. Nuestro mcp_connector lo implementa como controller HTTP nativo de Odoo — sin proxies, sin sidecars, sin infraestructura adicional.

/mcp/accounting /mcp/sales /mcp/inventory /mcp/payroll /mcp/purchase /mcp/crm /mcp/expense /mcp/docs /mcp/issues /mcp/projects /mcp/portfolio /mcp/requirements /mcp/source /mcp/testing /mcp/admin +1 más
Beta mcp-client-2025-11-20 Anthropic ejecuta las tools server-side. Sin agentic loop local.
Token firmado por usuario Bearer :. Cada request crea env con effective_uid real.
Cache de tools server-side cache_control: ephemeral en el último tool. ~12s → 0s consecutivo.
163 tools con label en español "Obteniendo orden de venta…", "Buscando tickets…" — feedback humano.
Prompt engineering

Cinco capas que blindan el comportamiento del modelo.

La función _build_full_system_prompt() en ia_consultor.py ensambla cinco capas con niveles de mutabilidad distintos. Las tres primeras son inmutables desde la base de datos — solo cambian con un deploy.

1
Capa 1 Inmutable · Python

Rol de dominio especializado

_PROMPTS[code] hardcodeado por consultor. Define expertise, alcance temático y reglas anti-alucinación específicas del dominio (nómina, ventas, contabilidad, etc.).

2
Capa 2 Inmutable · Python

Reglas de comportamiento

_BEHAVIOR_RULES globales: respuestas directas (sin "déjame buscar"), política codemap-first, verificación obligatoria vía herramientas antes de afirmar datos.

3
Capa 3 Inmutable · Python

Reglas de seguridad

_SECURITY_RULES bloquea exposición de código fuente completo (máx 20 líneas), credenciales y tokens. Búsquedas de términos sensibles rechazadas por defecto.

4
Capa 4 Dinámica · Disco

Documentación del dominio

overview.md, models.md, workflows.md cargados desde disco con _load_overview(). Editables externamente pero siempre desde archivo, no DB.

5
Capa 5 Configurable · DB

Instrucciones del cliente

Única capa editable desde la interfaz. Campo ia.consultor.custom_instructions. Permite ajustes específicos sin tocar las capas inmutables.

Inmutable (Python) Dinámica (disco) Configurable (DB)
Control de acceso

Cinco verificaciones antes de ejecutar.

Desde la sesión del usuario hasta la herramienta MCP que toca la DB, cada paso valida permisos, cuotas y parámetros. Si una capa rechaza, la consulta no avanza.

Usuario Sesión Odoo autenticada
ACL Odoo ir.model.access + record rules
Agente.group_ids Filtra catálogo del router
MCP tool.group_ids + params_restrict
Token quota Paquete cíclico o one-time
Ejecución env(uid) = usuario real
ACL Odoo ir.model.access sobre ia.chat.message, ia.agent, ia.mcp.tool. Sin overrides en código — patrón estándar Odoo.
Agente.group_ids is_accessible_by_user() filtra catálogo del router. Vacío = acceso universal; con grupos = solo miembros autorizados.
MCP tool.group_ids get_user_blocked_tools() excluye tools prohibidas. Aplica también params_restrict: domain locked, fields_allowed, max_records.
Token quota ia.token.assignment con paquetes cíclicos (diario/semanal/mensual) o one-time. Consumo FIFO con SELECT FOR UPDATE para concurrencia.
Performance & resiliencia

Diseño paranoico ante timeouts y rate limits.

El stream de Anthropic puede bloquearse durante minutos en sesiones con MCP. Las decisiones de timeout, watchdog y retry están pensadas para que la UI nunca quede colgada.

Prompt caching ephemeral

cache_control: ephemeral en system prompt y último tool. Beta prompt-caching-2024-07-31. Reduce input tokens y latencia ~10×.

Watchdog dual

ThreadPoolExecutor sin context manager — shutdown(wait=False) evita rebloqueo. Inactivity monitor 30s + hard limit 240s.

httpx Timeout obligatorio

read=180s por defecto. Sube a 120s+ con MCP o imágenes para tolerar gaps entre eventos del stream. Sin esto, el SDK no impone read timeout.

3 reintentos inteligentes

MAX_ATTEMPTS=3. Notifica al usuario por bus.bus en cada reintento. Abandono si el inactivity monitor captura el bloqueo, sin esperar el read timeout.

Historial limitado

HISTORY_WINDOW=20 mensajes, MAX_MSG_CHARS=1500. El router solo lee últimos 4 turnos para clasificar. Evita cap de contexto y costo desbocado.

Progress sin DB writes

Eventos de progreso van por bus.bus, no escriben en ia.chat.message. Evita conflictos 40001 con isolation REPEATABLE READ.

Observabilidad

Cada consulta es un registro auditable.

Toda la telemetría se persiste en ia.chat.message al cerrar la consulta. Durante el procesamiento, los eventos se transmiten por bus.bus sin tocar la DB.

Telemetría persistida

  • tokens_used · model_used · is_cached · consumo y estrategia del cache
  • agent_ids (M2M) · qué agentes respondieron al mensaje
  • tool_executions_json · cada tool con name, server, duration_ms, success, error
  • routing_confidence · routing_reasoning · decisión del router en lenguaje natural
  • retry_count · error_message · reintentos y causa del último fallo
  • image_analysis_* · campos para vision multimodal cuando se adjuntan imágenes

Eventos en tiempo real

  • ia_tools/chat_progress · progreso general del mensaje en curso
  • ia_tools/tool_started · tool MCP comenzó a ejecutarse
  • ia_tools/tool_completed · tool terminó (éxito o error)
  • ia_tools/retry · se inició un reintento, con número de intento
  • Transporte: bus.bus de Odoo (longpolling o websocket).
  • Persistencia: cero writes durante el stream; todo va al cierre.
Stack

Tecnología abierta, sin lock-in propietario.

Cero dependencias propietarias salvo Anthropic como modelo. El protocolo MCP es estándar abierto; el backend es Odoo y PostgreSQL.

Python 3.10+ Backend & servicios
Odoo 16 Framework & ORM
Anthropic SDK Opus · Sonnet · Haiku
MCP Protocol beta mcp-client-2025-11-20
OWL 2 Frontend reactivo
PostgreSQL REPEATABLE READ
JSON-RPC 2.0 Transporte MCP
bus.bus Longpolling Odoo

¿Listo para una revisión técnica con nuestro equipo?

Te conectamos con un ingeniero DrivErp para revisar la implementación en tu ambiente, responder dudas de arquitectura y planificar la puesta en marcha de los primeros agentes.