El orquestador de IA
para empresas
La plataforma de código abierto para desplegar sistemas de IA multi-agente gobernados: autoalojada, basada en configuración y lista para el cumplimiento normativo. Ahora en v6.
curl -fsSL https://raw.githubusercontent.com/labsai/EDDI/main/install.sh | bashInvoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/labsai/EDDI/main/install.ps1" -OutFile "install.ps1"
Unblock-File .\install.ps1
.\install.ps1
El problema
La orquestación empresarial de IA está fragmentada y es dolorosa. Los equipos están atrapados en un ciclo de vida roto:
La trampa de los prototipos
Los equipos hacen prototipos con Flowise, n8n o scripts; luego se reescribe todo desde cero para producción. Los prototipos visuales se descartan.
Fatiga de código base
Usar bibliotecas de IA significa construir controladores REST, capas de autenticación y gestión de estado desde cero. Cada cambio de prompt requiere redespliegue.
Fricción en BPMN
Forzar a los agentes de IA no deterministas para que encajen en workflows deterministas de Camunda/Temporal crea graves conflictos de estructura y arquitecturas muy frágiles.
La solución
EDDI es una plataforma de orquestación de IA desplegable: no una biblioteca. Gestión visual, config-as-code y seguridad empresarial, listos para usar:
Configuración como código
La lógica, pipelines y herramientas del agente son configuraciones JSON, no código compilado. Los ingenieros de prompts iteran instantáneamente usando la interfaz en React o la API REST, sin necesidad de redespliegue.
89 Herramientas MCP
EDDI expone sus capacidades a través del Model Context Protocol (permitiendo que Claude Desktop y otros clientes interactúen). Los agentes también pueden consumir herramientas MCP externas.
La seguridad es lo primero
No hay eval(), ni escapes. Integración con Vault, validación de URL y trazabilidad criptográfica son fundamentos de la arquitectura.
Observabilidad
Cada paso del pipeline se registra con una traza de auditoría inmutable: uso de tokens, coste, tiempo y uso de herramientas. Registro telemétrico CQRS.
Concurrencia empresarial
Construido sobre un runtime de nivel empresarial con millones de hilos ligeros para cargas de LLM dependientes de E/S. Sin bloqueos en el bucle de eventos, sin los cuellos de botella del nodo único.
Orquestación de múltiples agentes
Descubrimiento de agentes basado en intención, conversaciones administradas y colaboración en grupo: los agentes deliberan en siete estilos, votan, coeditan productos de trabajo compartidos y dan a las personas un lugar en la mesa.
Configuración e interfaz, lado a lado
Lo que hace un agente son documentos JSON que puede leer, comparar y versionar. El Manager edita esos mismos documentos.
{
"behaviorGroups": [
{
"name": "",
"behaviorRules": [
{
"name": "Ask for City",
"actions": [
"ask_for_city"
],
"conditions": [
{
"type": "inputmatcher",
"configs": {
"expressions": "trigger(current_weather)"
},
"conditions": []
}
]
}
]
}
]
}
Una Behavior Rule es JSON sencillo: cuando la entrada analizada coincide con trigger(current_weather), emite la acción ask_for_city. Los tasks y el output escuchan esa acción. El Manager muestra un agente y el workflow que ejecuta sus reglas.
{
"tasks": [
{
"actions": [
"send_message"
],
"id": "simpleChat",
"type": "openai",
"description": "Simple chat interaction",
"parameters": {
"apiKey": "${vault:openai-key}",
"modelName": "gpt-4o",
"systemMessage": "You are a helpful assistant",
"addToOutput": "true"
}
}
]
}
Un task de LLM también es JSON: el tipo de proveedor, una referencia al vault en lugar de una clave de API en claro, el modelo y el mensaje de sistema. El Manager edita el mismo documento.
{
"behaviorGroups": [
{
"name": "",
"behaviorRules": [
{
"name": "Refund needs approval",
"actions": [
"PAUSE_CONVERSATION"
],
"conditions": [
{
"type": "inputmatcher",
"configs": {
"expressions": "trigger(refund_request)"
},
"conditions": []
}
]
}
]
}
]
}AWAITING_HUMANConversación en pausa por la regla
Refund needs approval
Cada decisión se escribe en el ledger de auditoría como una entrada hitl.approval.
Para pausar a la espera de una persona, una regla emite PAUSE_CONVERSATION. La conversación espera en el estado AWAITING_HUMAN hasta que el propietario, un eddi-admin o un eddi-approver decide, en el Manager o en Slack. Las llamadas a herramientas y las fases de grupo se pueden controlar igual.
"El motor es estricto para que la IA pueda ser creativa."Project Philosophy
Cómo fluye un turno de conversación
Seleccione una etapa para ver qué hace, su configuración y qué escribe.
Input
Qué ocurre aquí
Llega un mensaje desde el chat, Slack, la API o un cliente MCP. El texto original pasa a ser la primera entrada de un nuevo paso en la Conversation memory. Aún no se ha ejecutado ningún task, así que esta etapa muestra el paso de memoria y no una entrada de auditoría.
Valores de ejemplo ilustrativos
{
"key": "input",
"value": "What is the weather?"
}Parser
Qué ocurre aquí
El parser normaliza el texto y lo busca en los diccionarios del agente, convirtiendo palabras y frases en expresiones semánticas como trigger(current_weather). Es una búsqueda, no una llamada a un modelo: el mismo texto produce siempre las mismas expresiones.
Cada task del pipeline escribe una entrada: firmada con HMAC, solo de adición y con comprobación de secuencia.
Valores de ejemplo ilustrativos
{
"words": [
{
"word": "weather",
"expressions": "trigger(current_weather)",
"frequency": 0
}
],
"phrases": [
{
"phrase": "what is the weather",
"expressions": "trigger(current_weather)"
}
]
}{
"id": "0b5e9a0c-6f3d-4b1e-9d57-2c1f8a7e4d10",
"conversationId": "6650f1c2a7b94e0012ab34cd",
"agentId": "support-agent",
"agentVersion": 1,
"userId": "user-4711",
"environment": "production",
"stepIndex": 0,
"taskId": "ai.labs.parser",
"taskType": "expressions",
"taskIndex": 0,
"durationMs": 3,
"input": {
"input": "What is the weather?"
},
"output": {
"expressions": [
"trigger(current_weather)"
]
},
"actions": [],
"cost": 0,
"timestamp": "2026-10-14T09:12:41.208Z",
"hmac": "v4:a3f1c09e5b7d2468a3f1c09e5b7d2468a3f1c09e5b7d2468a3f1c09e5b7d2468",
"agentSignature": "MEUCIQDk3x…9fQ==",
"sequence": 0
}Behavior Rules
Qué ocurre aquí
Las Behavior Rules son condiciones SI-ENTONCES sobre las expresiones y la Conversation memory. Cada regla que coincide emite acciones. El enrutamiento es configuración y no código, así que la misma entrada sigue siempre el mismo camino.
Cada task del pipeline escribe una entrada: firmada con HMAC, solo de adición y con comprobación de secuencia.
Valores de ejemplo ilustrativos
{
"behaviorGroups": [
{
"name": "",
"behaviorRules": [
{
"name": "Ask for City",
"actions": [
"ask_for_city"
],
"conditions": [
{
"type": "inputmatcher",
"configs": {
"expressions": "trigger(current_weather)"
},
"conditions": []
}
]
}
]
}
]
}{
"id": "0b5e9a0c-6f3d-4b1e-9d57-2c1f8a7e4d10",
"conversationId": "6650f1c2a7b94e0012ab34cd",
"agentId": "support-agent",
"agentVersion": 1,
"userId": "user-4711",
"environment": "production",
"stepIndex": 0,
"taskId": "ai.labs.behavior",
"taskType": "behavior_rules",
"taskIndex": 1,
"durationMs": 1,
"input": {
"expressions": [
"trigger(current_weather)"
]
},
"output": {
"behavior_rules:success": [
"Ask for City"
]
},
"actions": [
"ask_for_city"
],
"cost": 0,
"timestamp": "2026-10-14T09:12:41.208Z",
"hmac": "v4:a3f1c09e5b7d2468a3f1c09e5b7d2468a3f1c09e5b7d2468a3f1c09e5b7d2468",
"agentSignature": "MEUCIQDk3x…9fQ==",
"sequence": 1
}Tasks
Qué ocurre aquí
Los tasks escuchan acciones: una llamada a un LLM, una llamada HTTP, una herramienta MCP o una consulta a una base de conocimiento. Cada task escribe una entrada de auditoría firmada con lo que leyó, lo que produjo y los detalles del modelo y de las herramientas.
Cada task del pipeline escribe una entrada: firmada con HMAC, solo de adición y con comprobación de secuencia.
Valores de ejemplo ilustrativos
{
"tasks": [
{
"actions": [
"send_message"
],
"id": "simpleChat",
"type": "anthropic",
"description": "Answers weather questions",
"parameters": {
"apiKey": "${vault:anthropic-key}",
"modelName": "claude-sonnet-5-5",
"systemMessage": "You are a helpful assistant",
"addToOutput": "true"
}
}
]
}{
"id": "0b5e9a0c-6f3d-4b1e-9d57-2c1f8a7e4d10",
"conversationId": "6650f1c2a7b94e0012ab34cd",
"agentId": "support-agent",
"agentVersion": 1,
"userId": "user-4711",
"environment": "production",
"stepIndex": 0,
"taskId": "ai.labs.llm",
"taskType": "langchain",
"taskIndex": 2,
"durationMs": 1840,
"input": {
"input": "What is the weather in Vienna?",
"actions": [
"send_message"
]
},
"output": {
"text": "Vienna: 14 °C, light rain."
},
"llmDetail": {
"modelName": "claude-sonnet-5-5",
"inputTokens": 412,
"outputTokens": 18
},
"toolCalls": {
"name": "get_weather",
"args": {
"city": "Vienna"
},
"result": "14 °C, light rain"
},
"actions": [
"send_message"
],
"cost": 0.0016,
"timestamp": "2026-10-14T09:12:41.208Z",
"hmac": "v4:a3f1c09e5b7d2468a3f1c09e5b7d2468a3f1c09e5b7d2468a3f1c09e5b7d2468",
"agentSignature": "MEUCIQDk3x…9fQ==",
"sequence": 2
}Output
Qué ocurre aquí
Las plantillas de Output convierten las acciones emitidas en la respuesta: texto y quick replies. La respuesta se guarda en la memoria y se devuelve al canal del que llegó el mensaje.
Valores de ejemplo ilustrativos
{
"outputSet": [
{
"action": "ask_for_city",
"timesOccurred": 0,
"outputs": [
{
"valueAlternatives": [
{
"type": "text",
"text": "Which city would you like to know the weather of?"
}
]
}
],
"quickReplies": []
}
]
}{
"key": "output",
"value": [
"Which city would you like to know the weather of?"
]
}Tool boundary
Qué ocurre aquí
Toda llamada a una herramienta, sea cual sea su origen, cruza el mismo límite. Las llamadas que coinciden con un patrón de toolApprovals se pausan hasta que una persona decide, y la decisión se escribe en el ledger como una entrada hitl.approval. Las credenciales llegan del vault como referencias ${vault:keyName}.
Cada task del pipeline escribe una entrada: firmada con HMAC, solo de adición y con comprobación de secuencia.
Valores de ejemplo ilustrativos
{
"hitlConfig": {
"toolApprovals": {
"requireApproval": [
"mcp:*",
"delete_*",
"transfer_funds"
],
"exempt": [
"mcp:read_*"
],
"approvalTimeout": "PT30M",
"timeoutPolicy": "AUTO_REJECT",
"pauseReason": "Approval required for {toolNames}"
}
}
}{
"id": "0b5e9a0c-6f3d-4b1e-9d57-2c1f8a7e4d10",
"conversationId": "6650f1c2a7b94e0012ab34cd",
"agentId": "support-agent",
"agentVersion": 1,
"userId": "user-4711",
"environment": "production",
"stepIndex": -1,
"taskId": "hitl.approval",
"taskType": "hitl",
"taskIndex": -1,
"durationMs": 0,
"input": {},
"output": {
"verdict": "APPROVED",
"decidedBy": "slack:U04EXAMPLE",
"automated": false,
"pauseType": "TOOL_CALL",
"toolDecisions": [
{
"callId": "call_01",
"toolName": "transfer_funds",
"verdict": "APPROVED",
"amended": false,
"argsDigest": "sha256:9c1d…e407"
}
]
},
"actions": [],
"cost": 0,
"timestamp": "2026-10-14T09:12:41.208Z",
"hmac": "v4:a3f1c09e5b7d2468a3f1c09e5b7d2468a3f1c09e5b7d2468a3f1c09e5b7d2468",
"agentSignature": "MEUCIQDk3x…9fQ==",
"sequence": 3
}Conversation memory
Qué ocurre aquí
La Conversation memory conserva cada paso (input, expressions, actions, output) y propiedades con ámbito de paso, conversación o usuario (longTerm). El estado de la conversación (READY, IN_PROGRESS, ENDED, AWAITING_HUMAN o ERROR) se guarda con ella.
Valores de ejemplo ilustrativos
{
"conversationState": "READY",
"conversationSteps": [
{
"data": [
{
"key": "input",
"value": "What is the weather?"
},
{
"key": "expressions",
"value": [
"trigger(current_weather)"
]
},
{
"key": "actions",
"value": [
"ask_for_city"
]
},
{
"key": "output",
"value": [
"Which city would you like to know the weather of?"
]
}
]
}
],
"conversationProperties": {
"chosenCity": "Vienna"
}
}Socio de Confianza de UNIDO para IA Industrial
LABS.AI ha sido seleccionado por la Organización de las Naciones Unidas para el Desarrollo Industrial (UNIDO) como Socio de Confianza para IA Industrial para el Sur Global.
Más información sobre la asociación →Confiable y certificado
Construido sobre tecnología probada
Siguientes pasos
Preguntas frecuentes
¿Qué es EDDI?
EDDI es una plataforma de orquestación de IA empresarial de código abierto. Permite a los equipos crear, configurar y desplegar agentes de IA mediante configuración JSON, sin necesidad de código compilado. Incluye una interfaz de administración en React lista para producción (el EDDI Manager), APIs REST integradas, gestión de conversaciones, seguridad (OIDC/Keycloak), trazas de auditoría inmutables y 89 herramientas MCP, todo desplegable a través de Docker o Kubernetes.
¿Cuál es la diferencia entre EDDI y las bibliotecas y frameworks de IA?
Las bibliotecas de IA como LangChain, Spring AI y LangChain4j proporcionan bloques de construcción, pero usted aún debe construir los controladores REST, la autenticación, la gestión de conversaciones, el registro de auditoría y la interfaz de administración por su cuenta. EDDI es una plataforma middleware desplegable, no una biblioteca. Proporciona todo esto listo para usar, desplegable vía Docker.
¿Está EDDI listo para producción a escala empresarial?
Sí. EDDI está construido sobre un runtime empresarial con hilos virtuales ligeros para una concurrencia masiva en operaciones de E/S. Soporta MongoDB y PostgreSQL, incluye autenticación OIDC/Keycloak integrada y espacios de trabajo por usuario con compartición de recursos, proporciona trazas de auditoría criptográficas inmutables para el cumplimiento normativo (incluido el Reglamento Europeo de IA) y escala horizontalmente mediante NATS JetStream.
¿Qué es el Model Context Protocol (MCP)?
El Model Context Protocol (MCP) es un estándar abierto que permite a los asistentes de IA como Claude Desktop, los plugins de IDE y los clientes personalizados interactuar con herramientas externas de forma programática. EDDI expone 89 herramientas MCP que abarcan la gestión de conversaciones, la administración de agentes, las discusiones grupales, las aprobaciones humanas, la automatización de configuración, la planificación de tareas y el diagnóstico.
¿Puede EDDI sustituir a Flowise o n8n en entornos de producción?
EDDI cumple un propósito similar de construcción visual, pero con una arquitectura de nivel empresarial. A diferencia de Flowise y n8n, EDDI no utiliza eval() ni bloques de ejecución de código, ejecuta millones de hilos virtuales ligeros para concurrencia de nivel empresarial, soporta autenticación OIDC/Keycloak y almacena datos en MongoDB o PostgreSQL. Está diseñado para industrias reguladas.
¿Está EDDI relacionado con "Eddie AI" u otros productos llamados "Eddy"?
No. EDDI (de LABS.AI) es una plataforma de orquestación de agentes de IA empresarial autoalojada construida sobre Java/Quarkus. No está relacionado con herramientas de edición de video, software de RRHH, constructores de chatbots u otros productos con nombres similares.
¿Cómo se compara EDDI con plataformas de IA en la nube como AWS Bedrock o Azure AI Studio?
Las plataformas de IA en la nube ofrecen infraestructura gestionada, pero crean dependencia del proveedor. EDDI funciona en cualquier lugar donde funcione Docker: on-premises, en cualquier nube o en entornos aislados. Soporta 19 proveedores LLM y cualquier endpoint compatible con OpenAI, con plena portabilidad de modelos y soberanía de datos. Consulte nuestra comparación detallada.
¿Funciona EDDI con Open WebUI y otros clientes compatibles con OpenAI?
Sí. EDDI incluye una API /v1 compatible con OpenAI que presenta los agentes desplegados como modelos, de modo que Open WebUI, el SDK openai, LangChain y LiteLLM pueden comunicarse con ellos directamente. Admite streaming y el informe de uso de tokens, mantiene cada chat en su propia conversación, y las puertas de aprobación del agente siguen aplicándose. La API está desactivada por defecto y tiene su propia autenticación mediante clave de API.
¿Pueden varios usuarios y equipos compartir un mismo despliegue de EDDI?
Sí. Los espacios de trabajo por usuario asignan a cada agente y configuración un propietario, un espacio personal o de equipo vinculado a grupos de Keycloak y una compartición explícita a nivel de uso, lectura, edición o propiedad. Usted comparte con personas por su nombre desde un directorio de usuarios que han iniciado sesión, estas reciben una notificación, y cualquiera que siga un enlace a algo que no puede abrir puede solicitar acceso al propietario. Con Connections, los agentes llaman a sistemas externos con una clave para toda la organización, una cuenta de servicio o la propia cuenta OAuth de cada usuario, de modo que un agente puede limitarse a lo que la persona que lo usa tiene permitido hacer. Los espacios de trabajo son opcionales y los recursos existentes se asignan retroactivamente, así que nada desaparece al activarlos.
¿Qué LLM puedo usar con EDDI?
EDDI se conecta a 19 proveedores LLM: OpenAI, Anthropic, Google Gemini, Mistral, Azure OpenAI, Amazon Bedrock, Oracle GenAI, Google Vertex AI, Ollama, Hugging Face y Jlama, además de soporte de primera clase para xAI Grok, DeepSeek, Moonshot Kimi, Alibaba Qwen, Z.ai GLM, MiniMax, OpenRouter y Groq. Cualquier otro endpoint compatible con OpenAI funciona mediante una URL base. El catálogo de modelos explica para qué sirve mejor cada modelo y muestra la configuración exacta para ejecutarlo en EDDI.