エンタープライズ
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オーケストレーションは断片化され、困難です。チームは壊れたライフサイクルに陥っています:
プロトタイプの罠
チームはFlowise、n8n、またはスクリプトでプロトタイプを作り、本番環境ではすべてをゼロから書き直す必要があります。ビジュアルプロトタイプは完全に破棄されます。
ボイラープレート疲れ
Spring AIやLangChain4jを使用すると、RESTコントローラー、認証レイヤー、状態管理をゼロから構築する必要があります。プロンプトの微調整ごとに再コンパイルが必要です。
BPMNの摩擦
非決定論的なAIエージェントをCamunda/Temporalの決定論的ワークフローに押し込むと、深刻なインピーダンスミスマッチと脆弱なアーキテクチャが生まれます。
ソリューション
EDDIはデプロイ可能なAIオーケストレーションプラットフォームです、ライブラリではありません。ビジュアル管理、Config-as-Code、エンタープライズセキュリティ、すべてが箱から出して使えます:
Configuration-as-Code
エージェントロジック、パイプライン、ツール定義はJSON設定です、コンパイルされたコードではありません。プロンプトエンジニアはReact UIまたはREST APIで即座にイテレーションでき、Javaコードに触れる必要はありません。
89のMCPツール
EDDIはModel Context Protocolを通じてその機能を公開し、Claude Desktopとの対話を可能にします。エージェントは外部MCPツールを消費することもできます。
セキュリティファースト
eval()なし、エスケープなし。Vault統合、URL検証、暗号化監査証跡はアーキテクチャの基盤です。
オブザーバビリティ
すべてのパイプラインステップは不変の監査証跡に記録されます、トークン、コスト、タイミング、ツール呼び出し。完全なCQRSテレメトリ台帳。
エンタープライズ並行性
エンタープライズランタイム上に構築された数百万の軽量スレッド、I/OバウンドなLLMワークロード向け。イベントループのブロッキングなし、シングルスレッドのボトルネックなし。
マルチエージェントオーケストレーション
インテントベースのエージェントディスカバリー、マネージド会話、そしてグループコラボレーション:エージェントが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 です。プロバイダーの種類、生の API キーの代わりの vault 参照、モデル、システムメッセージを指定します。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 を発行します。会話は、オーナー、eddi-admin、または eddi-approver が Manager か Slack で判断するまで AWAITING_HUMAN 状態で待機します。ツール呼び出しやグループのフェーズも同じ方法で制御できます。
"エンジンが厳格だからこそ、AIは創造的になれる。"Project Philosophy
会話ターンの流れ
ステージを選ぶと、その処理内容、設定、書き込む内容が表示されます。
Input
ここで起きること
チャット、Slack、API、MCP クライアントからメッセージが届きます。元のテキストは Conversation memory の新しいステップの最初のエントリになります。まだ task は実行されていないため、このステージでは監査エントリではなくメモリのステップを示します。
説明用のサンプル値
{
"key": "input",
"value": "What is the weather?"
}Parser
ここで起きること
parser はテキストを正規化し、エージェントの辞書で照合して、単語やフレーズを trigger(current_weather) のような意味表現に変換します。モデル呼び出しではなく辞書の照合なので、同じテキストからは常に同じ表現が得られます。
パイプラインの各 task は 1 件のエントリを書き込みます。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 は 1 件のエントリを書き込みます。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 は、読み取った内容、生成した内容、モデルとツールの詳細を含む署名付き監査エントリを 1 件書き込みます。
パイプラインの各 task は 1 件のエントリを書き込みます。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 は 1 件のエントリを書き込みます。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管理UI(EDDIマネージャー)、組み込みREST API、会話状態管理、セキュリティ(OIDC/Keycloak)、不変の監査証跡、89のMCPツールを備えた完全なプラットフォームを提供します、すべてDockerまたはKubernetesでデプロイ可能。
EDDIはAIライブラリやフレームワークとどう違いますか?
LangChain、Spring AI、LangChain4jのようなAIライブラリはビルディングブロックを提供しますが、RESTコントローラー、認証、会話状態管理、監査ログ、管理UIは依然として自分で構築する必要があります。EDDIはライブラリではなくデプロイ可能なミドルウェアプラットフォームです。これらすべてをすぐに使える形で提供し、Dockerで即座にデプロイできます。
EDDIはエンタープライズの本番利用に対応していますか?
はい。EDDIは軽量仮想スレッドを備えたエンタープライズランタイム上に構築され、I/Oバウンド並行性のために大規模並列処理を実現します。MongoDBとPostgreSQLをサポートし、組み込みのOIDC/Keycloak認証とリソース共有機能付きのユーザーごとのワークスペースを含み、コンプライアンス(EU AI規制法を含む)のための不変の暗号化監査証跡を提供し、NATS JetStreamで水平スケーリングします。
Model Context Protocol(MCP)とは?
Model Context Protocol(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による)は、Java/Quarkus上に構築されたセルフホスト型のエンタープライズAIエージェントオーケストレーションプラットフォームです。ビデオ編集ツール、HRソフトウェア、チャットボットビルダーなど、似た名前の他製品とは無関係です。
EDDIは、AWS BedrockやAzure AI StudioなどのクラウドAIプラットフォームとどう違いますか?
クラウドAIプラットフォームはマネージドインフラを提供しますが、ベンダーロックインを生じさせます。EDDIはDockerが動く場所ならどこでも動作します、オンプレミス、任意のクラウド、エアギャップ環境。19のLLMプロバイダーと任意のOpenAI互換エンドポイントをサポートし、完全なモデルポータビリティとデータ主権を提供します。詳細な比較をご覧ください。
EDDIはOpen WebUIなどのOpenAI互換クライアントで利用できますか?
はい。EDDIには、デプロイされたエージェントをモデルとして提供するOpenAI互換の/v1 APIが含まれているため、Open WebUI、openai SDK、LangChain、LiteLLMからエージェントと直接対話できます。ストリーミングとトークン使用量のレポートに対応し、チャットごとに個別の会話が保たれ、エージェントの承認ゲートも引き続き適用されます。このAPIはデフォルトで無効になっており、専用のAPIキー認証を備えています。
複数のユーザーやチームで1つの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互換エンドポイントもベースURLで利用できます。モデルカタログでは、各モデルの得意分野と、EDDIで実行するための正確な設定を紹介しています。