EDDI — CLAUDE.md
Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDP
labsai/EDDI 295
# EDDI Backend — AI Agent Instructions
> **This file is automatically loaded by AI coding assistants. Follow ALL rules below.**
## 1. Project Context
**EDDI** (Enhanced Dialog Driven Interface) is a multi-agent orchestration middleware for conversational AI. This repo is the **Java/Quarkus backend**.
EDDI is a **config-driven engine**, not a monolithic application. Agent behavior lives in JSON configurations; Java code builds the _components_ and _infrastructure_ (the "engine") that reads and executes those configurations.
### Ecosystem
| Repo | Tech | Purpose |
| --------------------------------------------------------------- | -------------------------- | ------------------------------------------------------------ |
| **EDDI** (this repo) | Java 25, Quarkus, MongoDB | Backend engine, REST API, lifecycle pipeline |
| **[quarkus-eddi](https://github.com/quarkiverse/quarkus-eddi)** | Java 21, Quarkus Extension | Quarkus SDK — `@Inject EddiClient`, Dev Services, MCP bridge |
| **EDDI-Manager** | React 19, Vite, Tailwind | Admin dashboard (served from EDDI at `/chat/production`) |
| **eddi-chat-ui** | React, TypeScript | Standalone chat widget |
| **eddi-website** | Astro, Starlight | Marketing site + documentation at eddi.labs.ai |
### Key Architecture
- **Config-driven engine**: Agent logic is JSON configs, Java is the processing engine. When designing a new feature, always ask: "should this be configurable by the agent designer?" If yes, expose it as a config field with sensible defaults — don't hardcode behavior or pick a single "best" approach.
- **Lifecycle pipeline**: Input → Parse → Behavior Rules → Actions → Tasks → Output
- **Stateless tasks, stateful memory**: `ILifecycleTask` implementations are singletons; all state lives in `IConversationMemory`
- **Action-based orchestration**: Tasks emit/listen for string-based actions, never call each other directly
- **Self-contained platform**: EDDI is a closed platform, not a library consumed by third-party code. Internal interfaces (`IUserMemoryStore`, `IResourceStore`, etc.) have no external consumers. Deprecation and replacement of internal APIs is safe — the only backward-compat concern is old JSON configs stored in MongoDB or imported via ZIP.
- **CI/CD**: GitHub Actions (compile → test → Docker build → smoke test → push to Docker Hub). `[skip docker]` in commit message skips image builds. Tag-based releases (`v6.0.0-RC2` → `labsai/eddi:6.0.0-RC2`)
---
## 2. Mandatory Workflow Protocol
### Before Starting Any Work
1. **Read the key docs**:
- [`docs/project-philosophy.md`](docs/project-philosophy.md) — **Supreme directive.** 9 architectural pillars governing all EDDI development
- [`docs/changelog.md`](docs/changelog.md) — **READ FIRST.** Running log of all changes, decisions, and reasoning across ALL repos and sessions
- [`docs/architecture.md`](docs/architecture.md) — Architecture overview, configuration model, pipeline, and DB-agnostic design
- If working on **EDDI-Manager**: also read `EDDI-Manager/AGENTS.md` in the Manager repo
2. **Check git status**: Run `git status` and `git log -5 --oneline` to see current branch state and recent work.
### During Work
3. **Branching**: Check `git branch --show-current` and `git log -5 --oneline` to understand the current branch context. **Do NOT commit directly to `main`.** If unsure which branch to use, ask the user.
4. **Commit often**: Every working unit gets a commit. Use conventional commits:
```
feat(scope): description
fix(scope): description
chore(scope): description
refactor(scope): description
```
5. **Each commit must build**: Run `./mvnw compile` (or `./mvnw test` for backend) before committing. Never commit broken code.
### After Completing Work (or if interrupted/switching sessions)
6. **Update the changelog**: Edit [`docs/changelog.md`](docs/changelog.md) and add an entry with:
- Date and short title
- Repo and branch
- What changed (files + reasoning)
- Design decisions made
- What's in progress / what's next (if interrupted mid-task)
---
## 3. Development Roadmap
Follow this order unless the user explicitly requests something different.
**Backend first, then testing, then frontend. Website last.**
### Completed ✅
| Phase | Area | Highlights |
| ----- | ------------------------ | --------------------------------------------------------------------------------------------------- |
| 0 | Security Quick Wins | CORS lockdown, PathNavigator (replaced OGNL) |
| 1 | Backend Foundation | ConversationService extraction, SSE streaming, typed memory, LlmTask decomposition |
| 2 | Testing Infrastructure | Integration tests migrated to main repo, Testcontainers, API contract tests |
| 3 | Manager UI | Greenfield React 19 + Vite + Tailwind rewrite |
| 4 | Chat-UI | CRA→Vite, SSE streaming, Keycloak auth |
| 5 | NATS JetStream | Event bus abstraction, async processing, coordinator dashboard |
| 6 | DB-Agnostic Architecture | PostgreSQL adapter, MongoDB sync driver, Caffeine cache, Lombok removal, langchain4j core migration |
| 7 | Security & Compliance | Secrets Vault, Audit Ledger (EU AI Act), tenant quota stub |
| 8 | MCP Integration | MCP Server (33 tools), MCP Client, agent discovery, managed conversations |
| 8c | RAG Foundation | Config-driven vector store retrieval, pgvector, httpCall RAG |
| 10 | Group Conversations | Multi-agent debate orchestration, 5 styles, group-of-groups |
| — | A2A Protocol | Agent-to-Agent peer communication, Agent Cards, skill discovery |
| — | Multi-Model Cascading | Sequential model escalation with confidence routing |
| — | LLM Provider Expansion | 7 → 12 providers (Mistral, Azure OpenAI, Bedrock, Oracle GenAI) |
| — | Quarkus 3.34.1 | LTS upgrade, Java 25 module fix |
| 12 | CI/CD | GitHub Actions unified pipeline, Docker Hub push, CircleCI removed |
| 11a | Persistent Memory | IUserMemoryStore, UserMemoryTool, DreamService, McpMemoryTools, Property.Visibility |
| — | Conversation Windows | Token-aware windowing, rolling summary, ConversationRecallTool |
| — | Agentic Improvements 1–5 | Counterweights, MCP governance, capability registry, multimodal attachments, agent signing |
| — | Compliance Hardening | HIPAA, EU AI Act, international privacy docs + ComplianceStartupChecks |
| — | Prompt Snippets | Config-driven system prompt building blocks, Caffeine-cached, REST CRUD |
| — | Agent Sync | Granular export/import, structural matching, live instance-to-instance sync |
| — | GDPR/CCPA Framework | Cascading erasure, data portability, Art. 18 restriction, per-category retention |
| — | Commit Flags | Strict write discipline for memory — uncommit failed task data, error digest injection |
| — | Template Preview | REST endpoint for previewing resolved system prompts with sample/live data |
| — | RC2 Hardening | 2,000+ unit tests, 250+ integration tests, branding overhaul, rules deserialization fix |
### In Progress / Upcoming
| Phase | Area | Description |
| ----- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| — | Memory Architecture | Commit flags, RAG threshold, context selection, auto-compaction, property consolidation (see `docs/planning/memory-architecture-plan.md`) |
| — | Session Forking | State snapshotting, conversation forking (see `docs/planning/agentic-improvements-plan.md` §7) |
| — | Conversation Chaining | Cross-session context carry-over (see `docs/planning/conversation-window-management.md` Strategy 3) |
| 9 | DAG Pipeline | Parallel tasks, circuit breakers, OpenTelemetry tracing |
| 9b | HITL Framework | Human-in-the-loop pause/resume/approve |
| — | Guardrails | Config-driven input/output guardrails in LlmTask (see `docs/planning/guardrails-architecture.md`) |
| 11b | Multi-Channel | Slack, Teams adapters (see `docs/planning/multi-agent-ux-improvements.md`) |
| 13 | Debugging & Visualization | Time-traveling debugger, visual pipeline builder |
| 14 | Website | Astro + Starlight documentation site |
| — | Native Image | GraalVM native compilation (see `docs/planning/native-image-migration.md`) |
---
## 4. Backend Java Guidelines
### 4.1 Golden Rules (Non-Negotiable)
1. **Logic is Configuration, Java is the Engine** — Agent behavior (e.g., "if user says 'hello', call API 'X'") MUST NOT be hard-coded in Java. Agent logic belongs in **JSON configurations** (`behavior.json`, `httpcalls.json`, `langchain.json`). Java code creates the `ILifecycleTask` components that _read and execute_ this configuration. (Note: the config file is still named `langchain.json` but the implementing class is `LlmTask`.)
2. **Stateless Tasks, Stateful Memory** — `ILifecycleTask` implementations MUST be stateless. They are singletons shared by all conversations. All conversational state MUST be read from and written to the `IConversationMemory` object passed into the `execute` method.
3. **Action-Based Orchestration** — Tasks MUST NOT call other tasks directly. The system is event-driven. Tasks are orchestrated by string-based **actions**. A task (like `RulesEvaluationTask`) emits actions, and other tasks (like `OutputGenerationTask` or `ApiCallsTask`) listen for them.
4. **Dependency Injection via Quarkus CDI** — All components (`ILifecycleTask`s, `IResourceStore`s) use `@ApplicationScoped` and `@Inject`. No manual module registration — Quarkus auto-discovers beans.
5. **Thread Safety** — The `ConversationCoordinator` handles concurrency _between_ conversations. Code must be thread-safe and non-blocking. REST endpoints use JAX-RS `AsyncResponse`. Tasks execute synchronously but must not block for extended periods.
### 4.2 Core Architecture
#### The Conversation Lifecycle
The `LifecycleManager` is the heart of EDDI. It processes a conversation turn by running a pipeline of `ILifecycleTask` implementations.
A **new feature** (e.g., "LLM Agents") is implemented as a **new `ILifecycleTask`**:
1. Create the task class implementing `ILifecycleTask`
2. Implement `execute(IConversationMemory memory)`
3. Read from `memory` (e.g., `memory.getCurrentData("input")`)
4. Perform task logic (e.g., call an LLM)
5. Write results back to memory (e.g., `memory.getCurrentStep().addConversationOutput(...)`)
#### The Conversation Memory (`IConversationMemory`)
The **single source of truth** for a conversation:
- **`IConversationMemoryStore`** — loads/saves memory from MongoDB
- **`IConversationMemory`** — the "live" object for a conversation
- **`ConversationStep`** — an entry in the stack, holding `IData` objects for that turn
- **`IData<T>`** — generic wrapper for data in a step. Use `Data<T>` to create new objects
- **Reading**: `currentStep.getLatestData("key")` → check for null → `.getResult()`
- **Writing**: `currentStep.storeData(new Data<>("key", value))`. Set `data.setPublic(true)` for output-visible data
- **`ConversationProperties`** — long-term state (e.g., `agentName`, `userId`). Slot-filling uses `PropertySetterTask`
> **Critical distinction**: Conversation memory has **two audiences**. (1) **Pipeline tasks** (BehaviorRules, PropertySetter, etc.) see the **full memory** — all steps, all data keys. (2) **The LLM** sees only a **windowed view** assembled by `ConversationHistoryBuilder` — last N conversationOutputs converted to ChatMessages. When you think about "conversation too long," these are two different problems: the LLM context window (what the model sees) and the MongoDB document size (storage/load time). Most context management strategies only affect #1.
#### The Configuration-as-Code Model
Agent definitions are versioned MongoDB documents. A "Agent" is a list of "Workflows". A "Workflow" bundles "Workflow Extensions" (JSON configs).
#### Core Workflow Extensions
- **`behavior.json`** → `RulesEvaluationTask` — the **primary orchestrator**. Its `actions` list is the event that triggers other tasks.
- **`httpcalls.json`** → `ApiCallsTask` — **Tool Definitions** with templated API calls.
- **`property.json`** → `PropertySetterTask` — **EDDI's importance extraction mechanism.** Config-driven slot-filling that explicitly selects which data to preserve as `longTerm` properties. These properties survive the LLM context window boundary — they're loaded at conversation init and available in all templates regardless of how many turns have passed. When designing context management or memory fea
... [truncated — full content at source] こちらもおすすめ
Frontend カテゴリの他のルール
もっとルールを探す
CLAUDE.md、.cursorrules、AGENTS.md、Image Prompts の全 227 ルールをチェック。



