Everything You Need to Orchestrate AI
EDDI provides a complete, production-ready platform for building, deploying, and managing AI agents, without writing boilerplate.

How a Conversation Turn Flows
Select a stage to see what it does, its config and what it writes.
Input
What happens here
A message arrives from chat, Slack, the API or an MCP client. The raw text becomes the first entry of a new step in conversation memory. No task has run yet, so this stage shows the memory step rather than an audit entry.
Illustrative example values
{
"key": "input",
"value": "What is the weather?"
}Parser
What happens here
The parser normalizes the text and looks it up in the agent's dictionaries, turning words and phrases into semantic expressions such as trigger(current_weather). It is a lookup, not a model call, so the same text always yields the same expressions.
Each pipeline task writes one entry: HMAC-signed, append-only, sequence-checked.
Illustrative example values
{
"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
What happens here
Behavior Rules are IF-THEN conditions over the expressions and the conversation memory. Every matching rule emits actions. Routing is configuration rather than code, so the same input takes the same path every time.
Each pipeline task writes one entry: HMAC-signed, append-only, sequence-checked.
Illustrative example values
{
"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
What happens here
Tasks listen for actions: an LLM call, an HTTP call, an MCP tool or a knowledge-base lookup. Each task writes one signed audit entry with what it read, what it produced, and any model and tool details.
Each pipeline task writes one entry: HMAC-signed, append-only, sequence-checked.
Illustrative example values
{
"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
What happens here
Output templates turn the emitted actions into the reply: text and quick replies. The reply is stored in memory and returned to the channel the message came from.
Illustrative example values
{
"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
What happens here
Every tool call, whatever its source, crosses the same boundary. Calls that match a toolApprovals pattern pause until a human decides, and the decision is written to the ledger as a hitl.approval entry. Credentials come from the vault as ${vault:keyName} references.
Each pipeline task writes one entry: HMAC-signed, append-only, sequence-checked.
Illustrative example values
{
"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
What happens here
Conversation memory keeps every step (input, expressions, actions, output) and properties scoped to the step, the conversation or the user (longTerm). The conversation state (READY, IN_PROGRESS, ENDED, AWAITING_HUMAN or ERROR) is stored with it.
Illustrative example values
{
"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"
}
}Core Platform
The essential capabilities that make EDDI a complete AI orchestration platform.
🖥️ EDDI Manager
A production-ready React UI for building, deploying, and monitoring agents visually, with 11-locale i18n, live chat debugging, and audit dashboards.
⚙️ Config-as-Code
Agent logic is JSON configuration, not compiled code. Prompt engineers iterate instantly, no redeployment needed.
🔌 MCP Server (89 Tools)
Full AI-native control via the Model Context Protocol. Claude Desktop, Cursor, VS Code, Windsurf, Antigravity, and custom clients manage agents programmatically.
🔐 Security-First
No eval(), vault integration, path traversal protection, OIDC/Keycloak, per-user workspaces, cryptographic audit trails.
✋ Human-in-the-Loop
Pause a turn, gate a single tool call, or require sign-off on a discussion phase. Approval workflows with timeout policies, Slack cards, and crash-safe state.
🚀 Performance
Enterprise-grade runtime with millions of lightweight threads for I/O-bound LLM workloads.
🤖 Multi-Agent
Intent-based discovery, managed conversations, and group collaboration with voting, shared artifacts, and humans as members.
AI Capabilities
Advanced AI features that make EDDI agents smarter, faster, and more cost-efficient.
🧠 Memory & Context
Persistent memory, dream consolidation, rolling summaries, and token-aware windowing. Agents that remember.
📚 Knowledge & RAG
Crawl a website or upload PDF, Word, Excel and PowerPoint files into a knowledge base, refreshed on a schedule. 8 embedding providers, 6 vector stores. Enterprise knowledge retrieval out of the box.
📈 Model Cascading
Cost-optimized multi-model routing with confidence strategies. Published deployments of the pattern report 31 to 58% lower inference cost at held quality (evidence).
🧭 19 LLM Providers
Claude, GPT, Gemini, Grok, DeepSeek, Kimi, Qwen, GLM, Mistral, Llama and more, hosted or local. The model catalog shows what each is good at and how to run it.
⏰ Scheduling & Heartbeats
Cron triggers, heartbeat wake-ups, dream cycles. Proactive agents that act on their own.
Built-In Agent Tools
EDDI ships with 12 ready-to-use tools that agents can call during conversations, no external setup required.
Config & Portability
Agent configurations are portable, composable, and sync-ready, move agents between environments without friction.
📤 Import / Export
Agents portable as ZIP files with automatic secret scrubbing. Import merges or overwrites, no version conflicts.
🔄 Agent Sync
Live instance-to-instance sync with structural matching, content diffing, and selective resource picking.
📝 Prompt Snippets
Reusable, versioned system prompt building blocks. Reference as {{snippets.safety_rules}}.
Engineering Excellence
📊 Observability
Every pipeline step logged with immutable audit trails: tokens, cost, timing, and tool calls.
🧪 Code Quality
20,000+ tests, green on every merge. >90% instruction and >80% branch coverage enforced. CodeQL, Checkstyle and formatter gates in CI.
🧩 AI-Ready
89 MCP tools, an OpenAI-compatible API, predictable CRUD patterns, self-documenting APIs. Built for coding agents to work with.