Imported from quarkiverse/quarkus-eddi (
AGENTS.md). Install upstream withnpx skills add quarkiverse/quarkus-eddi. Copyright stays with the author.
Quarkus EDDI Extension — AI Agent Instructions
This file is automatically loaded by AI coding assistants. Follow ALL rules below.
1. Project Context
quarkus-eddi is a Quarkiverse extension that provides a Quarkus-native SDK for the EDDI conversational AI platform.
Ecosystem
| Repo | Tech | Purpose |
|---|---|---|
| EDDI | Java 25, Quarkus, MongoDB | Backend engine, REST API, lifecycle pipeline |
| quarkus-eddi (this repo) | Java 21, Quarkus Extension | Quarkus SDK for consuming EDDI |
| EDDI-Manager | React 19, Vite | Admin dashboard |
| eddi-chat-ui | React, TypeScript | Chat widget |
Architecture — The Four Pillars
- Dev Services — Auto-start EDDI + MongoDB via Testcontainers in dev/test mode
- Typesafe Client — Hand-crafted REST client interfaces with Mutiny
Uni<T>/Multi<T>return types - @EddiAgent — Build-time annotation scanning generates JAX-RS endpoints that proxy to EDDI agents
- @EddiTool (MCP Bridge) — Expose CDI methods as MCP tools via annotation transformation to
quarkus-mcp-server-http
Key Design Decisions
- No OpenAPI codegen: EDDI's server uses
AsyncResponse/SseEventSinkwhich codegen can't handle. Client interfaces are hand-crafted for clean Mutiny types. - Client paths mirror EDDI's v6 API: All under
/agents(conversations),/administration(deploy),/groups/{groupId}/conversations(group discussions). - MCP dependency matches EDDI: Uses
quarkus-mcp-server-http:1.11.0(same artifact EDDI uses).
2. Module Structure
quarkus-eddi/
├── .github/
│ ├── workflows/build.yml → CI: matrix build (JDK 21, Ubuntu + Windows)
│ ├── workflows/release.yml → Quarkiverse release pipeline
│ └── project.yml → Release version metadata
│
├── runtime/ → Maven artifact: quarkus-eddi
│ └── io.quarkiverse.eddi/
│ ├── EddiClient.java → Main CDI facade (@ApplicationScoped)
│ ├── Conversation.java → Conversation lifecycle wrapper (pkg-private constructor)
│ ├── ManagedConversation.java → Intent-based conversation (no ID mgmt)
│ ├── EddiDefaults.java → Shared constants (DEFAULT_TIMEOUT, MAX_CONVERSATIONS)
│ ├── EddiHealthCheck.java → Async readiness probe (uses REST client)
│ ├── StreamListener.java → SSE callback interface
│ ├── annotations/ → @EddiAgent, @OnMessage, @OnResponse, @EddiTool, @ToolArg
│ ├── client/ → 8 @RegisterRestClient interfaces + API key filter
│ ├── config/ → EddiConfig (@ConfigMapping quarkus.eddi.*)
│ ├── model/ → ConversationResult, StreamToken, InputData, etc.
│ └── resources/META-INF/quarkus-extension.yaml → Extension catalog metadata
│
└── deployment/ → Maven artifact: quarkus-eddi-deployment
└── io.quarkiverse.eddi.deployment/
├── EddiProcessor.java → Feature registration
├── EddiDevServicesBuildTimeConfig.java → Build-time Dev Services config (canonical)
├── EddiDevServicesProcessor.java → Docker container management
├── EddiAgentAnnotationProcessor.java → @EddiAgent build-time scan (bounded map, @PreDestroy)
└── EddiMcpBridgeProcessor.java → @EddiTool → @Tool annotation transformer
3. Development Guidelines
Building
mvn compile -DskipTests # Compile check
mvn test # Run tests
mvn verify # Full verification including integration tests
REST Client Interfaces
The 8 REST client interfaces under client/ map to EDDI's actual JAX-RS interfaces:
| SDK Interface | EDDI Interface | Base Path |
|---|---|---|
EddiAgentRestClient |
IRestAgentEngine |
/agents |
EddiSetupRestClient |
IRestAgentSetup |
/administration/agents |
EddiGroupRestClient |
IRestGroupConversation |
/groups |
EddiAdminRestClient |
IRestAgentAdministration |
/administration |
EddiStreamingRestClient |
IRestAgentEngine (SSE) |
/agents |
EddiManagedRestClient |
IRestManagedConversation |
/managed |
EddiLogRestClient |
IRestLogAdministration |
/administration/logs |
EddiCoordinatorRestClient |
IRestCoordinatorAdministration |
/administration/coordinator |
Additionally, EddiApiKeyFilter is a @Provider that auto-injects quarkus.eddi.api-key as a Bearer token on all client requests.
When EDDI's API changes, update these interfaces accordingly.
Conventions
- Quarkiverse parent: Root POM inherits
io.quarkiverse:quarkiverse-parent - Group ID:
io.quarkiverse.eddi - Config prefix:
quarkus.eddi.* - Feature name:
eddi(registered inEddiProcessor) - REST client config key:
eddi(all 8 interfaces share this key) - Java version: 21 (extension consumer minimum)
Commit Conventions
feat(runtime): add streaming support
fix(devservices): correct MongoDB connection string
chore(deployment): update Quarkus BOM version
test(it): add WireMock conversation test
docs: update configuration reference
Adding a New REST Endpoint
- Check EDDI's JAX-RS interface for exact path, params, and return type
- Add method to the appropriate
*RestClient.javainterface - Use
Uni<T>return types (not blocking) - Add a facade method in
EddiClient.javaif it improves DX - Update the CI OpenAPI sync check if applicable
4. Key Files
| File | Purpose |
|---|---|
runtime/pom.xml |
Runtime dependencies (REST client, SSE, MCP) |
deployment/pom.xml |
Build-time dependencies (Testcontainers, MCP deployment, core-deployment) |
EddiConfig.java |
All quarkus.eddi.* runtime configuration |
EddiClient.java |
Main fluent API facade (chat auto-ends conversations) |
EddiDefaults.java |
Shared constants (DEFAULT_TIMEOUT, MAX_CONVERSATIONS_PER_AGENT) |
EddiHealthCheck.java |
Async readiness probe using REST client |
EddiDevServicesProcessor.java |
Docker container lifecycle |
EddiDevServicesBuildTimeConfig.java |
Build-time config for Dev Services (canonical source) |
EddiAgentAnnotationProcessor.java |
@EddiAgent endpoint generation (bounded map, @PreDestroy) |
EddiMcpBridgeProcessor.java |
@EddiTool → @Tool annotation transformation bridge |
CHANGELOG.md |
Release notes |
.github/workflows/build.yml |
CI — matrix build (JDK 21, Ubuntu + Windows) |
.github/workflows/release.yml |
Quarkiverse release pipeline |
.github/project.yml |
Release version metadata |
