L'orchestrateur
d'IA d'entreprise
La plateforme open-source pour déployer des systèmes IA multi-agents gouvernés : auto-hébergée, pilotée par la configuration et prête pour la conformité. Maintenant 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
Le Problème
L'orchestration d'IA d'entreprise est fragmentée et douloureuse. Les équipes sont bloquées dans un cycle de développement brisé :
Le piège du prototype
Les équipes conçoivent des prototypes avec Flowise, n8n ou des scripts, puis réécrivent tout à partir de zéro pour la production. Les prototypes visuels sont purement et simplement jetés.
La fatigue du boilerplate
L'utilisation de bibliothèques d'IA implique de créer des contrôleurs REST, des couches d'authentification et la gestion d'état partant de zéro. Chaque modification de prompt entraîne un redéploiement.
La friction BPMN
L'intégration forcée d'agents d'IA non déterministes dans des workflows Camunda/Temporal déterministes génère de graves incohérences et une architecture très fragile.
La Solution
EDDI est une plateforme d'orchestration d'IA déployable, pas une bibliothèque. Gestion visuelle, config-as-code et sécurité d'entreprise, clé en main :
Configuration-as-Code
La logique de l'agent, les pipelines et les définitions d'outils sont des configurations JSON, et non du code compilé. Les Prompt Engineers itèrent instantanément via l'UI React ou l'API REST, sans redéploiement.
89 Outils MCP
EDDI expose ses capacités via le Model Context Protocol (permettant aux interfaces externes comme Claude Desktop d'interagir). Les agents peuvent également consommer des outils MCP externes.
Sécurité en priorité
Aucun eval(), et aucune évasion. L'intégration de Vault, la validation d'URL et les pistes d'audit cryptographiques sont des fondements architecturaux.
Observabilité
Chaque étape du pipeline est enregistrée avec une traçabilité d'audit immuable : tokens, coûts, délais et appels d'outils. Télémétrie CQRS complète intégrée.
Concurrence pour les entreprises
Construit sur un runtime d'entreprise avec des millions de threads ultra-légers pour vos charges de travail LLM limitées par les E/S. Pas de blocage et pas de goulets d'étranglement single-threading.
Orchestration Multi-Agents
Découverte d'agents basée sur les intentions, conversations gérées et collaboration de groupe : les agents délibèrent selon sept styles, votent, coéditent des livrables partagés et donnent aux humains une place à la table.
Configuration et interface, côte à côte
Ce que fait un agent tient dans des documents JSON que vous pouvez lire, comparer et versionner. Le Manager modifie ces mêmes documents.
{
"behaviorGroups": [
{
"name": "",
"behaviorRules": [
{
"name": "Ask for City",
"actions": [
"ask_for_city"
],
"conditions": [
{
"type": "inputmatcher",
"configs": {
"expressions": "trigger(current_weather)"
},
"conditions": []
}
]
}
]
}
]
}
Une Behavior Rule est du JSON simple : quand l'entrée analysée correspond à trigger(current_weather), elle émet l'action ask_for_city. Les tasks et l'output écoutent cette action. Le Manager montre un agent et le workflow qui exécute ses règles.
{
"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 LLM est lui aussi du JSON : le type de fournisseur, une référence au vault plutôt qu'une clé d'API en clair, le modèle et le message système. Le Manager modifie le même document.
{
"behaviorGroups": [
{
"name": "",
"behaviorRules": [
{
"name": "Refund needs approval",
"actions": [
"PAUSE_CONVERSATION"
],
"conditions": [
{
"type": "inputmatcher",
"configs": {
"expressions": "trigger(refund_request)"
},
"conditions": []
}
]
}
]
}
]
}AWAITING_HUMANConversation suspendue par la règle
Refund needs approval
Chaque décision est écrite dans le ledger d'audit sous forme d'entrée hitl.approval.
Pour attendre un humain, une règle émet PAUSE_CONVERSATION. La conversation reste à l'état AWAITING_HUMAN jusqu'à la décision du propriétaire, d'un eddi-admin ou d'un eddi-approver, dans le Manager ou dans Slack. Les appels d'outils et les phases de groupe peuvent être contrôlés de la même façon.
"Le moteur est strict pour que l'IA puisse être créative."Project Philosophy
Le déroulement d'un tour de conversation
Sélectionnez une étape pour voir ce qu'elle fait, sa configuration et ce qu'elle écrit.
Input
Ce qui se passe ici
Un message arrive depuis le chat, Slack, l'API ou un client MCP. Le texte brut devient la première entrée d'une nouvelle étape dans la Conversation memory. Aucun task n'a encore été exécuté : cette étape montre donc l'étape de mémoire et non une entrée d'audit.
Valeurs d'exemple à titre d'illustration
{
"key": "input",
"value": "What is the weather?"
}Parser
Ce qui se passe ici
Le parser normalise le texte et le cherche dans les dictionnaires de l'agent, transformant mots et phrases en expressions sémantiques comme trigger(current_weather). C'est une recherche, pas un appel à un modèle : le même texte donne toujours les mêmes expressions.
Chaque task du pipeline écrit une entrée : signée par HMAC, en ajout seul, avec contrôle de séquence.
Valeurs d'exemple à titre d'illustration
{
"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
Ce qui se passe ici
Les Behavior Rules sont des conditions SI-ALORS portant sur les expressions et la Conversation memory. Chaque règle qui correspond émet des actions. Le routage relève de la configuration et non du code : la même entrée suit donc toujours le même chemin.
Chaque task du pipeline écrit une entrée : signée par HMAC, en ajout seul, avec contrôle de séquence.
Valeurs d'exemple à titre d'illustration
{
"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
Ce qui se passe ici
Les tasks écoutent les actions : un appel à un LLM, un appel HTTP, un outil MCP ou une recherche dans une base de connaissances. Chaque task écrit une entrée d'audit signée avec ce qu'il a lu, ce qu'il a produit, ainsi que les détails du modèle et des outils.
Chaque task du pipeline écrit une entrée : signée par HMAC, en ajout seul, avec contrôle de séquence.
Valeurs d'exemple à titre d'illustration
{
"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
Ce qui se passe ici
Les modèles d'Output transforment les actions émises en réponse : texte et quick replies. La réponse est stockée en mémoire et renvoyée au canal d'où venait le message.
Valeurs d'exemple à titre d'illustration
{
"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
Ce qui se passe ici
Tout appel d'outil, quelle que soit sa source, franchit la même frontière. Les appels qui correspondent à un motif de toolApprovals sont mis en pause jusqu'à la décision d'un humain, et cette décision est écrite dans le ledger sous forme d'entrée hitl.approval. Les identifiants viennent du vault sous forme de références ${vault:keyName}.
Chaque task du pipeline écrit une entrée : signée par HMAC, en ajout seul, avec contrôle de séquence.
Valeurs d'exemple à titre d'illustration
{
"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
Ce qui se passe ici
La Conversation memory conserve chaque étape (input, expressions, actions, output) et des propriétés limitées à l'étape, à la conversation ou à l'utilisateur (longTerm). L'état de la conversation (READY, IN_PROGRESS, ENDED, AWAITING_HUMAN ou ERROR) y est enregistré.
Valeurs d'exemple à titre d'illustration
{
"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"
}
}Partenaire de Confiance UNIDO pour l'IA Industrielle
LABS.AI a été sélectionné par l'Organisation des Nations Unies pour le Développement Industriel (UNIDO) comme Partenaire de Confiance pour l'IA Industrielle pour le Sud Global.
En savoir plus sur le partenariat →Certification et Confiance
Construit sur des Technologies Éprouvées
Prochaines étapes
Questions fréquentes (FAQ)
Qu'est-ce qu'EDDI ?
EDDI est une plateforme d'orchestration d'IA d'entreprise open-source. Elle permet aux équipes de créer, configurer et déployer des agents IA via une configuration JSON, sans code compilé. EDDI fournit une interface d'administration React prête pour la production (l'EDDI Manager), des APIs REST intégrées, la gestion des conversations, la sécurité (OIDC/Keycloak), des pistes d'audit immuables et 89 outils MCP, le tout déployable via Docker ou Kubernetes.
Quelle est la différence entre EDDI et les bibliothèques et frameworks d'IA ?
Les bibliothèques d'IA comme LangChain, Spring AI et LangChain4j fournissent des briques de construction, mais vous devez encore construire les contrôleurs REST, l'authentification, la gestion des conversations, la journalisation d'audit et les interfaces d'administration vous-même. EDDI est une plateforme middleware déployable, pas une bibliothèque. Il fournit tout cela clé en main, prêt à déployer via Docker.
EDDI est-il prêt pour une utilisation en production à l'échelle de l'entreprise ?
Oui. EDDI est construit sur un runtime d'entreprise avec des threads virtuels légers pour une concurrence massive liée aux E/S. Il supporte MongoDB et PostgreSQL, intègre l'authentification OIDC/Keycloak et des espaces de travail par utilisateur avec partage des ressources, fournit des pistes d'audit cryptographiques immuables pour la conformité réglementaire (y compris le Règlement européen sur l'IA) et évolue horizontalement via NATS JetStream.
Qu'est-ce que le Model Context Protocol (MCP) ?
Le Model Context Protocol (MCP) est un standard ouvert qui permet aux assistants IA comme Claude Desktop, aux plugins d'IDE et aux clients personnalisés d'interagir avec des outils externes de manière programmatisée. EDDI expose 89 outils MCP couvrant la gestion des conversations, l'administration des agents, les discussions de groupe, les approbations humaines, l'automatisation de la configuration, la planification des tâches et le diagnostic.
EDDI peut-il remplacer Flowise ou n8n pour des charges de production ?
EDDI remplit un rôle similaire de construction visuelle, mais avec une architecture de niveau entreprise. Contrairement à Flowise et n8n, EDDI n'utilise aucun eval() ni bloc d'exécution de code, exécute des millions de threads virtuels légers pour une concurrence de niveau entreprise, supporte l'authentification OIDC/Keycloak et stocke les données dans MongoDB ou PostgreSQL. Il est conçu pour les industries réglementées.
EDDI est-il lié à "Eddie AI" ou à d'autres produits nommés "Eddy" ?
Non. EDDI (par LABS.AI) est une plateforme d'orchestration d'agents IA d'entreprise auto-hébergée construite sur Java/Quarkus. Il n'est pas lié aux outils de montage vidéo, logiciels RH, constructeurs de chatbots ou autres produits portant des noms similaires.
Comment EDDI se compare-t-il aux plateformes IA cloud comme AWS Bedrock ou Azure AI Studio ?
Les plateformes IA cloud offrent une infrastructure gérée mais créent un verrouillage fournisseur. EDDI fonctionne partout où Docker fonctionne : sur site, dans n'importe quel cloud ou en environnement isolé. Il prend en charge 19 fournisseurs LLM et tout endpoint compatible OpenAI, garantissant une portabilité totale des modèles et une pleine souveraineté des données. Voir notre comparaison détaillée.
EDDI fonctionne-t-il avec Open WebUI et d'autres clients compatibles OpenAI ?
Oui. EDDI inclut une API /v1 compatible OpenAI qui présente les agents déployés comme des modèles, afin qu'Open WebUI, le SDK openai, LangChain et LiteLLM puissent dialoguer directement avec eux. Elle prend en charge le streaming et le suivi de la consommation de tokens, conserve chaque chat dans sa propre conversation, et les points d'approbation de l'agent continuent de s'appliquer. L'API est désactivée par défaut et dispose de sa propre authentification par clé API.
Plusieurs utilisateurs et équipes peuvent-ils partager un même déploiement EDDI ?
Oui. Les espaces de travail par utilisateur attribuent à chaque agent et à chaque configuration un propriétaire, un espace personnel ou d'équipe associé aux groupes Keycloak, ainsi qu'un partage explicite au niveau utilisation, lecture, modification ou propriété. Vous partagez avec des personnes nommément, à partir d'un annuaire des utilisateurs connectés, elles sont notifiées, et toute personne qui suit un lien vers une ressource qu'elle ne peut pas ouvrir peut demander l'accès au propriétaire. Les Connections permettent aux agents d'appeler des systèmes externes avec une clé valable pour toute l'organisation, un compte de service ou le compte OAuth personnel de chaque utilisateur, de sorte qu'un agent peut être limité à ce que la personne qui l'utilise a le droit de faire. Les espaces de travail sont optionnels (opt-in), et les ressources existantes leur sont rattachées rétroactivement : rien ne disparaît lorsque vous les activez.
Quels LLM puis-je utiliser avec EDDI ?
EDDI se connecte à 19 fournisseurs LLM : OpenAI, Anthropic, Google Gemini, Mistral, Azure OpenAI, Amazon Bedrock, Oracle GenAI, Google Vertex AI, Ollama, Hugging Face et Jlama, ainsi qu'une prise en charge native de xAI Grok, DeepSeek, Moonshot Kimi, Alibaba Qwen, Z.ai GLM, MiniMax, OpenRouter et Groq. Tout autre endpoint compatible OpenAI fonctionne via une URL de base. Le catalogue de modèles explique les points forts de chaque modèle et montre la configuration exacte pour l'exécuter dans EDDI.