企业级
AI编排器
用于部署受治理多代理AI系统的开源平台:自托管、配置驱动、合规就绪。现已推出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
问题
企业级AI编排碎片化且痛苦。团队陷入一个破碎的生命周期中:
原型陷阱
团队使用Python/Flowise/n8n制作原型,然后在生产环境中从头重写所有代码。可视化原型被完全抛弃。
样板代码疲劳
使用Spring AI或LangChain4j意味着从头构建REST控制器、认证层和状态管理。每次提示词调整都需要重新编译。
BPMN摩擦
将非确定性AI代理强制放入Camunda/Temporal确定性工作流中会造成严重的阻抗失配和脆弱的架构。
解决方案
EDDI是一个可部署的AI编排平台,不是库。可视化管理、配置即代码和企业级安全,开箱即用:
配置即代码
代理逻辑、管道和工具定义都是JSON配置,而非编译的代码。提示词工程师通过React UI或REST API即时迭代,无需重新部署。
89个MCP工具
EDDI通过模型上下文协议暴露其功能,支持Claude Desktop交互。代理还可以消费外部MCP工具。
安全优先
无eval(),无逃逸。密钥库集成、URL验证和加密审计跟踪是架构基础。
可观测性
每个管道步骤都记录在不可变的审计跟踪中,令牌、成本、耗时、工具调用。完整的CQRS遥测账本。
企业级并发
基于企业级运行时的数百万轻量级线程处理IO密集型LLM工作负载。无事件循环阻塞,无单线程瓶颈。
多代理编排
基于意图的代理发现、托管对话和群组协作:代理以七种样式进行讨论、投票、共同编辑共享工作成果,并让人类在讨论中占有一席之地。
配置与界面,并排对照
智能体的行为是一组可以阅读、比对和做版本管理的 JSON 文档。Manager 编辑的是同样的文档。
{
"behaviorGroups": [
{
"name": "",
"behaviorRules": [
{
"name": "Ask for City",
"actions": [
"ask_for_city"
],
"conditions": [
{
"type": "inputmatcher",
"configs": {
"expressions": "trigger(current_weather)"
},
"conditions": []
}
]
}
]
}
]
}
Behavior Rule 就是普通的 JSON:当解析后的输入匹配 trigger(current_weather) 时,发出动作 ask_for_city。task 和 output 监听这个动作。Manager 展示智能体以及运行其规则的 workflow。
{
"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"
}
}
]
}
LLM task 同样是 JSON:提供商类型、用 vault 引用代替明文 API 密钥、模型和系统消息。Manager 编辑的是同一份文档。
{
"behaviorGroups": [
{
"name": "",
"behaviorRules": [
{
"name": "Refund needs approval",
"actions": [
"PAUSE_CONVERSATION"
],
"conditions": [
{
"type": "inputmatcher",
"configs": {
"expressions": "trigger(refund_request)"
},
"conditions": []
}
]
}
]
}
]
}AWAITING_HUMAN对话被以下规则暂停
Refund needs approval
每个决定都会作为 hitl.approval 条目写入审计 ledger。
要等待人工,规则会发出 PAUSE_CONVERSATION。对话保持在 AWAITING_HUMAN 状态,直到所有者、eddi-admin 或 eddi-approver 在 Manager 或 Slack 中做出决定。工具调用和群组阶段也可以用同样的方式管控。
"引擎严格,AI才能自由创造。"Project Philosophy
一次对话回合如何流转
选择一个阶段,查看它做什么、如何配置以及写入什么。
Input
这一阶段发生什么
消息从聊天、Slack、API 或 MCP 客户端到达。原始文本成为 Conversation memory 中新一步的第一个条目。此时还没有 task 运行,所以这一阶段展示的是内存步骤,而不是审计条目。
仅为说明用的示例值
{
"key": "input",
"value": "What is the weather?"
}Parser
这一阶段发生什么
parser 对文本做规范化,并在智能体的词典中查找,把词和短语转换为 trigger(current_weather) 这样的语义表达式。这是查表而不是调用模型,所以相同的文本总是得到相同的表达式。
流水线中的每个 task 写入一条条目:HMAC 签名、仅追加、带序列检查。
仅为说明用的示例值
{
"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
这一阶段发生什么
Behavior Rules 是针对表达式和 Conversation memory 的 IF-THEN 条件。每条匹配的规则都会发出动作。路由由配置而非代码决定,因此相同的输入每次都走相同的路径。
流水线中的每个 task 写入一条条目:HMAC 签名、仅追加、带序列检查。
仅为说明用的示例值
{
"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
这一阶段发生什么
task 监听动作:LLM 调用、HTTP 调用、MCP 工具或知识库检索。每个 task 写入一条带签名的审计条目,记录它读取了什么、产出了什么,以及模型和工具的细节。
流水线中的每个 task 写入一条条目:HMAC 签名、仅追加、带序列检查。
仅为说明用的示例值
{
"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
这一阶段发生什么
Output 模板把发出的动作转换为回复:文本和快捷回复。回复保存到内存,并返回给消息来源的渠道。
仅为说明用的示例值
{
"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
这一阶段发生什么
无论来源如何,每次工具调用都要经过同一道边界。匹配 toolApprovals 模式的调用会暂停,等待人工决定,决定会作为 hitl.approval 条目写入 ledger。凭据以 ${vault:keyName} 引用的形式从 vault 获取。
流水线中的每个 task 写入一条条目:HMAC 签名、仅追加、带序列检查。
仅为说明用的示例值
{
"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
这一阶段发生什么
Conversation memory 保存每一步(input、expressions、actions、output),以及作用域为步骤、对话或用户(longTerm)的属性。对话状态(READY、IN_PROGRESS、ENDED、AWAITING_HUMAN 或 ERROR)也一并保存。
仅为说明用的示例值
{
"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"
}
}UNIDO 工业 AI 信赖合作伙伴
LABS.AI 被联合国工业发展组织(UNIDO)选为全球南方工业 AI 信赖合作伙伴。
了解更多合作详情 →值得信赖且经过认证
基于成熟技术构建
后续步骤
常见问题
什么是EDDI?
EDDI是一个开源的企业级AI编排平台。它使团队能够使用JSON配置而非编译代码来构建、配置和部署AI代理。EDDI提供了一个完整的平台,包括生产就绪的React管理界面(EDDI管理器)、内置REST API、对话状态管理、安全性(OIDC/Keycloak)、不可变审计跟踪和89个MCP工具,所有这些都可通过Docker或Kubernetes部署。
EDDI与AI库和框架有什么不同?
Spring AI和LangChain4j是优秀的库,EDDI实际上在内部使用了LangChain4j。关键区别在于EDDI是一个可部署的中间件平台,而不是库。使用Spring AI,您仍然需要自己构建REST控制器、认证、对话状态管理、审计日志和管理界面。EDDI开箱即提供所有这些。
EDDI是否可以在生产环境中用于企业?
是的。EDDI基于企业级运行时构建,利用轻量级虚拟线程实现IO密集型操作的大规模并发。支持MongoDB和PostgreSQL,内置OIDC/Keycloak认证以及支持资源共享的按用户工作空间,提供不可变的加密审计跟踪以确保合规(包括欧盟AI法案),并通过NATS JetStream实现水平扩展。
什么是模型上下文协议(MCP)?
模型上下文协议(MCP)是一个开放标准,允许Claude Desktop、IDE插件和自定义客户端等AI助手以编程方式与外部工具交互。EDDI公开了89个MCP工具,涵盖对话管理、代理管理、群组讨论、人工审批、设置自动化、调度管理和诊断。
EDDI能否替代Flowise或n8n用于生产工作负载?
EDDI服务于类似的可视化构建目的,但具有企业级架构。与Flowise和n8n不同,EDDI不使用eval()或代码块,运行数百万轻量级虚拟线程以实现企业级并发,支持OIDC/Keycloak认证,并将数据存储在MongoDB或PostgreSQL中。它专为受监管行业设计。
EDDI是否与“Eddie AI”或名为“Eddy”的其他产品有关联?
不。EDDI(由LABS.AI开发)是一个自托管的企业AI代理编排平台,基于Java/Quarkus构建。它与消费者视频剪辑工具、HR软件、聊天机器人生成器或其他同名产品无关。
与AWS Bedrock或Azure AI Studio等云端AI平台相比,EDDI如何?
云AI平台提供托管基础设施,但会造成供应商锁定。EDDI可在任何运行Docker的地方运行:本地部署、任意云或气隙环境。它支持19个LLM提供商及任何OpenAI兼容端点,提供完整的模型可移植性和数据主权。查看我们的详细比较。
EDDI能否与Open WebUI及其他OpenAI兼容客户端配合使用?
可以。EDDI内置OpenAI兼容的/v1 API,将已部署的代理以模型形式提供,因此Open WebUI、openai SDK、LangChain和LiteLLM可以直接与它们对话。该API支持流式输出和令牌用量报告,每个聊天都保存在各自独立的对话中,代理的审批关卡依然生效。该API默认关闭,并使用独立的API密钥认证。
多个用户和团队能否共享同一个EDDI部署?
可以。按用户工作空间为每个代理和每项配置指定所有者,以及映射到Keycloak群组的个人或团队空间,并支持按使用、查看、编辑或拥有级别显式共享。您可以从已登录用户目录中按姓名与他人共享,对方会收到通知;任何人通过链接访问自己无权打开的内容时,都可以向所有者申请访问权限。Connections让代理可以通过组织级密钥、服务账户或每个用户自己的OAuth账户调用外部系统,从而将代理限定在其使用者被允许的操作范围内。工作空间为可选功能,启用时会为现有资源自动补齐归属信息,因此不会有任何资源消失。
EDDI可以使用哪些LLM?
EDDI可连接19个LLM提供商:OpenAI、Anthropic、Google Gemini、Mistral、Azure OpenAI、Amazon Bedrock、Oracle GenAI、Google Vertex AI、Ollama、Hugging Face和Jlama,并为xAI Grok、DeepSeek、Moonshot Kimi、Alibaba Qwen、Z.ai GLM、MiniMax、OpenRouter和Groq提供一流支持。任何其他OpenAI兼容端点都可以通过base URL接入。模型目录介绍了每个模型的擅长领域,并给出在EDDI中运行它的确切配置。