ตัวจัดการ
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
ปัญหา
Enterprise Java ขาด Visual AI Orchestration Middleware ทีมติดอยู่ในวงจรที่เจ็บปวดและกระจัดกระจาย:
กับดักโปรโตไทป์
ทีมสร้างโปรโตไทป์ด้วย Python/Flowise/n8n แล้วเขียนทุกอย่างใหม่ใน Java ตั้งแต่ศูนย์สำหรับ Production
ความเหนื่อยล้าจาก Boilerplate
การใช้ Spring AI หรือ LangChain4j หมายถึงการสร้าง REST controllers, auth layers, state management ตั้งแต่ศูนย์
แรงเสียดทาน BPMN
การบังคับ AI agents ที่ไม่ deterministic เข้าสู่ Camunda/Temporal workflow สร้างปัญหา impedance mismatch อย่างมาก
โซลูชัน
EDDI เป็นแพลตฟอร์มที่พร้อมสำหรับการผลิต รองรับการปฏิบัติตามข้อกำหนด พร้อม Visual Management UI:
Configuration-as-Code
Agent logic, pipelines และ tool definitions เป็น JSON configurations ไม่ใช่ compiled Java
89 MCP tools
EDDI เปิดเผยความสามารถผ่าน Model Context Protocol เปิดใช้งานการโต้ตอบกับ Claude Desktop
ความปลอดภัยก่อน
ไม่มี eval() ไม่มี escape Vault integration, URL validation และ cryptographic audit trails เป็นรากฐานสถาปัตยกรรม
Observability
ทุกขั้นตอน pipeline ถูกบันทึกใน immutable audit trail tokens, costs, timing, tool calls
Enterprise Concurrency
Java 25 Virtual Threads บน Quarkus ล้านๆ lightweight threads สำหรับ I/O-bound LLM workloads
Multi-Agent Orchestration
Intent-based agent discovery, managed conversations และการทำงานร่วมกันแบบกลุ่ม: เอเจนต์ปรึกษาหารือใน 7 รูปแบบ ลงคะแนน ร่วมกันแก้ไขผลงานที่ใช้ร่วมกัน และเปิดที่นั่งให้มนุษย์ร่วมวง
คอนฟิกและ UI เทียบกันให้เห็น
สิ่งที่เอเจนต์ทำคือเอกสาร 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
ทุกการตัดสินใจถูกบันทึกลง audit ledger เป็นรายการ hitl.approval
เพื่อหยุดรอมนุษย์ กฎจะส่ง PAUSE_CONVERSATION การสนทนาจะรออยู่ในสถานะ AWAITING_HUMAN จนกว่าเจ้าของ eddi-admin หรือ eddi-approver จะตัดสินใจใน Manager หรือใน Slack การเรียกเครื่องมือและเฟสของกลุ่มก็ควบคุมได้แบบเดียวกัน
"เอ็นจินเข้มงวดเพื่อให้ AI สร้างสรรค์ได้อย่างอิสระ"Project Philosophy
หนึ่งเทิร์นของบทสนทนาทำงานอย่างไร
เลือกขั้นตอนเพื่อดูว่าทำอะไร ตั้งค่าอย่างไร และเขียนอะไรลงไป
Input
สิ่งที่เกิดขึ้นที่นี่
ข้อความเข้ามาจากแชต Slack, API หรือไคลเอนต์ MCP ข้อความดิบกลายเป็นรายการแรกของสเต็ปใหม่ใน Conversation memory ตอนนี้ยังไม่มี task ใดทำงาน ขั้นตอนนี้จึงแสดงสเต็ปในหน่วยความจำแทนรายการ audit
ค่าตัวอย่างเพื่อประกอบคำอธิบาย
{
"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 คือเงื่อนไข IF-THEN บนนิพจน์และ Conversation memory กฎที่ตรงเงื่อนไขทุกข้อจะส่งแอ็กชันออกมา การกำหนดเส้นทางเป็นการตั้งค่า ไม่ใช่โค้ด อินพุตเดิมจึงไปตามเส้นทางเดิมทุกครั้ง
แต่ละ 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 เขียนรายการ audit ที่ลงนามแล้วหนึ่งรายการ ระบุสิ่งที่อ่าน สิ่งที่สร้าง และรายละเอียดของโมเดลและเครื่องมือ
แต่ละ 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 แปลงแอ็กชันที่ส่งออกมาเป็นคำตอบ ทั้งข้อความและ quick reply คำตอบถูกเก็บในหน่วยความจำและส่งกลับไปยังช่องทางที่ข้อความมา
ค่าตัวอย่างเพื่อประกอบคำอธิบาย
{
"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 จะหยุดรอจนกว่ามนุษย์จะตัดสิน และการตัดสินจะถูกบันทึกลง ledger เป็นรายการ hitl.approval ข้อมูลรับรองมาจาก vault ในรูปแบบอ้างอิง ${vault:keyName}
แต่ละ 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) และ property ที่มีขอบเขตระดับสเต็ป การสนทนา หรือผู้ใช้ (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 เป็น open-source, Enterprise AI Orchestration Platform สร้างด้วย Quarkus และ Java 25 ช่วยให้ทีมองค์กรสร้าง, กำหนดค่า และ deploy AI agents โดยใช้ JSON configuration แทนโค้ดที่ต้องคอมไพล์ EDDI ให้แพลตฟอร์มสมบูรณ์ พร้อม Production-Ready React Management UI (EDDI Manager), REST APIs, การจัดการสถานะสนทนา, ความปลอดภัย (OIDC/Keycloak), immutable audit trails และ 89 MCP tools deploy ได้ผ่าน Docker หรือ Kubernetes
EDDI แตกต่างจากไลบรารีและเฟรมเวิร์ก AI อย่างไร?
ไลบรารี AI อย่าง LangChain, Spring AI และ LangChain4j ให้องค์ประกอบพื้นฐาน แต่คุณยังต้องสร้าง REST controllers, ระบบยืนยันตัวตน, การจัดการสถานะสนทนา, การบันทึกตรวจสอบ และ UI จัดการด้วยตัวเอง EDDI เป็นแพลตฟอร์มมิดเดิลแวร์ที่พร้อม Deploy ไม่ใช่ไลบรารี ทุกอย่างนี้มีให้พร้อมใช้งานทันที และ Deploy ได้ผ่าน Docker
EDDI พร้อมสำหรับ enterprise production หรือไม่?
ใช่ EDDI ทำงานบน Java 25 กับ Quarkus ใช้ Virtual Threads สำหรับ I/O-bound concurrency รองรับ MongoDB และ PostgreSQL มี OIDC/Keycloak authentication และพื้นที่ทำงานรายผู้ใช้พร้อมการแชร์ทรัพยากรในตัว ให้ immutable cryptographic audit trails สำหรับ compliance (รวมถึง EU AI Act) และ scale แนวนอนผ่าน NATS JetStream
Model Context Protocol (MCP) คืออะไร?
Model Context Protocol (MCP) เป็น open standard ที่ให้ AI assistants เช่น Claude Desktop, IDE plugins และ custom clients โต้ตอบกับ external tools ด้วยโปรแกรม EDDI เปิดเผย 89 MCP tools ครอบคลุมการจัดการสนทนา, จัดการเอเจนต์, การสนทนากลุ่ม, การอนุมัติโดยมนุษย์, setup automation, schedule management และ diagnostics
EDDI สามารถแทนที่ Flowise หรือ n8n สำหรับ production workloads ได้หรือไม่?
EDDI ทำหน้าที่ visual building บน JVM แทน Node.js ต่างจาก Flowise และ n8n ตรงที่ EDDI ไม่ใช้ eval() หรือ code blocks ทำงานด้วย Java 25 Virtual Threads สำหรับ enterprise-grade concurrency รองรับ OIDC/Keycloak authentication และเก็บข้อมูลใน MongoDB หรือ PostgreSQL ออกแบบสำหรับอุตสาหกรรมที่มีการกำกับดูแล
EDDI เกี่ยวข้องกับ "Eddie AI" หรือผลิตภัณฑ์อื่นที่ชื่อ "Eddy" หรือไม่?
ไม่ EDDI (โดย LABS.AI) เป็นแพลตฟอร์มการจัดการ AI Agent ระดับองค์กรแบบโฮสต์เอง ที่สร้างบน Java/Quarkus ไม่เกี่ยวข้องกับเครื่องมือตัดต่อวิดีโอสำหรับผู้บริโภค ซอฟต์แวร์ HR เครื่องมือสร้างแชทบอท หรือผลิตภัณฑ์อื่น ๆ ที่มีชื่อคล้ายกัน
EDDI เทียบกับแพลตฟอร์ม AI บนคลาวด์อย่าง AWS Bedrock หรือ Azure AI Studio อย่างไร?
แพลตฟอร์ม AI บนคลาวด์มีโครงสร้างพื้นฐานที่จัดการให้ แต่สร้างการผูกขาดกับผู้ขาย EDDI ทำงานได้ทุกที่ที่ Docker ทำงานได้ on-premises, คลาวด์ใดก็ได้ หรือสภาพแวดล้อม air-gapped รองรับผู้ให้บริการ LLM 19 ราย และ endpoint ที่เข้ากันได้กับ OpenAI ใดก็ได้ ให้ความสามารถในการย้ายโมเดลและอธิปไตยข้อมูลอย่างเต็มที่ ดูการเปรียบเทียบโดยละเอียดของเรา
EDDI ใช้งานร่วมกับ Open WebUI และไคลเอนต์อื่นที่เข้ากันได้กับ OpenAI ได้หรือไม่?
ได้ EDDI มี API /v1 ที่เข้ากันได้กับ OpenAI ซึ่งแสดงเอเจนต์ที่ deploy แล้วเป็นโมเดล ทำให้ Open WebUI, openai SDK, LangChain และ LiteLLM คุยกับเอเจนต์ได้โดยตรง API นี้รองรับการสตรีมและการรายงานการใช้โทเค็น แยกแต่ละแชทไว้ในบทสนทนาของตัวเอง และจุดอนุมัติของเอเจนต์ยังคงมีผลเช่นเดิม API นี้ปิดไว้โดยค่าเริ่มต้น และมีการยืนยันตัวตนด้วย API key แยกต่างหาก
ผู้ใช้หลายคนและหลายทีมใช้งาน EDDI ที่ deploy ไว้ชุดเดียวกันร่วมกันได้หรือไม่?
ได้ พื้นที่ทำงานรายผู้ใช้ทำให้ทุกเอเจนต์และทุกการกำหนดค่ามีเจ้าของ มีพื้นที่ส่วนตัวหรือพื้นที่ทีมที่แมปกับกลุ่มใน Keycloak และมีการแชร์อย่างชัดเจนในระดับใช้งาน ดู แก้ไข หรือเป็นเจ้าของ คุณแชร์ให้บุคคลได้ด้วยชื่อจากไดเรกทอรีของผู้ใช้ที่ลงชื่อเข้าใช้แล้ว ผู้รับจะได้รับการแจ้งเตือน และใครก็ตามที่เปิดลิงก์ไปยังสิ่งที่ตนเปิดไม่ได้ สามารถขอสิทธิ์เข้าถึงจากเจ้าของได้ ส่วน Connections ช่วยให้เอเจนต์เรียกระบบภายนอกด้วยคีย์ระดับองค์กร บัญชีบริการ หรือบัญชี OAuth ของผู้ใช้แต่ละคน จึงจำกัดเอเจนต์ให้ทำได้เฉพาะสิ่งที่ผู้ที่ใช้งานเอเจนต์นั้นมีสิทธิ์ทำ พื้นที่ทำงานเป็นฟีเจอร์ที่เลือกเปิดใช้ได้ และทรัพยากรที่มีอยู่เดิมจะได้รับการกำหนดเจ้าของและพื้นที่ย้อนหลังโดยอัตโนมัติ จึงไม่มีสิ่งใดหายไปเมื่อคุณเปิดใช้งาน
ใช้ LLM ตัวไหนกับ EDDI ได้บ้าง?
EDDI เชื่อมต่อกับผู้ให้บริการ LLM 19 ราย ได้แก่ 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 ส่วน endpoint อื่นที่เข้ากันได้กับ OpenAI ใช้งานได้ผ่าน base URL แคตตาล็อกโมเดลอธิบายว่าแต่ละโมเดลเก่งด้านใด และแสดงการกำหนดค่าที่แน่นอนสำหรับรันใน EDDI