Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:

- run:
name: Package app & build docker image
command: ./mvnw package -DskipTests "-Dquarkus.container-image.build=true" "-Dquarkus.container-image.additional-tags=5.5.2-b$CIRCLE_BUILD_NUM,5.5.2,5.5,5"
command: ./mvnw package -DskipTests "-Dquarkus.container-image.build=true" "-Dquarkus.container-image.additional-tags=5.6.0-b$CIRCLE_BUILD_NUM,5.6.0,5.6,5"

## cache the dependencies
- save_cache:
Expand All @@ -58,11 +58,11 @@ jobs:
command: |
if [ "${CIRCLE_BRANCH}" == "main" ]; then
echo "$DOCKER_PASS" | docker login --username $DOCKER_USER --password-stdin
docker push labsai/eddi:5.5.2-b$CIRCLE_BUILD_NUM
docker push labsai/eddi:5.6.0-b$CIRCLE_BUILD_NUM

# docker push labsai/eddi:5.5.2
# docker push labsai/eddi:5.6.0

# docker push labsai/eddi:5.5
# docker push labsai/eddi:5.6

# docker push labsai/eddi:5

Expand Down
21 changes: 3 additions & 18 deletions .mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,18 +1,3 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.7/apache-maven-3.9.7-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
wrapperVersion=3.3.4
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"java.compile.nullAnalysis.mode": "automatic"
}
429 changes: 429 additions & 0 deletions GEMINI.md

Large diffs are not rendered by default.

57 changes: 43 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
![EDDI Banner Image](/screenshots/EDDI-landing-page-image.png)

# E.D.D.I: Prompt & Conversation Management Middleware for Conversational AI APIs
# E.D.D.I: Multi-Agent Orchestration Middleware for Conversational AI

E.D.D.I (Enhanced Dialog Driven Interface) is a middleware to connect and manage LLM API bots
with advanced prompt and conversation management for APIs such as OpenAI ChatGPT, Facebook Hugging Face,
Anthropic Claude, Google Gemini, Ollama and Jlama
E.D.D.I (Enhanced Dialog Driven Interface) is a **multi-agent orchestration middleware** that coordinates between users, AI agents (LLMs), and business systems. It provides intelligent routing, conversation management, and API orchestration for building sophisticated AI-powered applications.

**What EDDI Does:**
- **Orchestrates Multiple AI Agents**: Route conversations to different LLMs (OpenAI, Claude, Gemini, Ollama) based on context and rules
- **Coordinates Business Logic**: Integrate AI agents with your APIs, databases, and services
- **Manages Conversations**: Maintain stateful, context-aware conversations across multiple agents
- **Controls Agent Behavior**: Define when and how agents are invoked through configurable rules

Developed in Java using Quarkus, it is lean, RESTful, scalable, and cloud-native.
It comes as Docker container and can be orchestrated with Kubernetes or Openshift.
Expand All @@ -31,18 +35,43 @@ EDDI Manager:

## Overview

E.D.D.I is a high performance middleware for managing conversations in AI-driven applications.
It is designed to run efficiently in cloud environments such as Docker, Kubernetes, and Openshift.
E.D.D.I offers seamless API integration capabilities, allowing easy connection with various conversational services or
traditional REST APIs with runtime configurations.
It supports the integration of multiple chatbots, even multiple versions of the same bot, for smooth upgrading and transitions.
E.D.D.I is a high performance **middleware orchestration service** for conversational AI. Unlike standalone chatbots or LLMs,
EDDI acts as an intelligent layer between your application and backend AI services (OpenAI, Claude, Gemini, etc.),
providing sophisticated conversation management, configurable behavior rules, and API orchestration.

Built with Java and Quarkus, EDDI is designed for cloud-native environments (Docker, Kubernetes, OpenShift),
offering fast startup times, low memory footprint, and horizontal scalability. It manages conversations through a unique
**Lifecycle Pipeline** architecture, where bot behavior is defined through composable, version-controlled JSON configurations
rather than hard-coded logic.

Key architectural features:

* **Middleware, Not a Chatbot**: EDDI orchestrates between users, business logic, APIs, and LLM services
* **Lifecycle Pipeline**: Configurable, sequential processing pipeline (Input → Parsing → Rules → API/LLM → Output)
* **Composable Bots**: Bots are assembled from reusable packages and extensions
* **Stateful Conversations**: Complete conversation history maintained in `IConversationMemory`
* **Asynchronous Processing**: Non-blocking architecture handles thousands of concurrent conversations

Notable features include:

* Seamless integration with conversational or traditional REST APIs
* Configurable Behavior rules to orchestrate LLM involvement
* Support for multiple chatbots, including multiple versions of the same bot, running concurrently
* Support for Major AI API integrations via langchain4j: OpenAI, Hugging Face (text only), Claude, Gemini, Ollama, Jlama (and more to come)
* **Lifecycle Pipeline Architecture**: Configurable, pluggable task pipeline for processing conversations
* **LLM Orchestration**: Decide when and how to invoke LLMs through behavior rules, not just direct forwarding
* **Seamless integration with conversational or traditional REST APIs**
* **Configurable Behavior Rules**: Complex IF-THEN logic to orchestrate LLM involvement and business logic
* **Composable Bot Model**: Bots assembled from version-controlled packages and extensions (Bot → Package → Extension)
* **Multiple Bot Support**: Run multiple chatbots and versions concurrently with smooth transitions
* **Major AI API integrations** via langchain4j: OpenAI, Hugging Face (text only), Claude, Gemini, Ollama, Jlama

## Documentation

* **[Getting Started Guide](docs/getting-started.md)** - Setup and first steps
* **[Developer Quickstart](docs/developer-quickstart.md)** - Build your first bot in 5 minutes
* **[Architecture Overview](docs/architecture.md)** - Deep dive into EDDI's design and components
* **[Behavior Rules](docs/behavior-rules.md)** - Configuring bot logic
* **[LangChain Integration](docs/langchain.md)** - Connecting to LLM APIs
* **[HTTP Calls](docs/httpcalls.md)** - External API integration
* **[Bot Father Deep Dive](docs/bot-father-deep-dive.md)** - Real-world orchestration example
* **[Complete Documentation](https://docs.labs.ai/)** - Full documentation site

Technical specifications:

Expand Down Expand Up @@ -76,7 +105,7 @@ Technical specifications:

Note: If running locally inside an IDE you need _lombok_ to be enabled \(otherwise you will get compile errors
complaining about missing constructors\). Either download as plugin \(e.g. inside Intellij\) or follow instructions
here [https://projectlombok.org/](https://projectlombok.org/
here [https://projectlombok.org/](https://projectlombok.org/)

## Build App & Docker image

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"expressionsAsActions" : true,
"behaviorGroups" : [ {
"behaviorRules" : [ {
"name" : "Ask for Prompt",
"actions" : [ "ask_for_bot_prompt" ],
"conditions" : [ {
"type" : "actionmatcher",
"configs" : {
"actions" : "ask_for_bot_name",
"occurrence" : "lastStep"
}
} ]
}, {
"name" : "Ask for intro",
"actions" : [ "ask_for_bot_intro" ],
"conditions" : [ {
"type" : "actionmatcher",
"configs" : {
"actions" : "ask_for_bot_prompt",
"occurrence" : "lastStep"
}
} ]
}, {
"name" : "Ask for api key",
"actions" : [ "ask_for_llm_use" ],
"conditions" : [ {
"type" : "actionmatcher",
"configs" : {
"actions" : "ask_for_bot_intro",
"occurrence" : "lastStep"
}
} ]
} ]
} ]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"resource" : "eddi://ai.labs.behavior/behaviorstore/behaviorsets/6740832a2b0f614abcaee79b?version=1",
"createdOn" : 1732281130378,
"lastModifiedOn" : 1764675697996,
"deleted" : false,
"name" : "Create Connector Bot",
"description" : ""
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"resource" : "eddi://ai.labs.property/propertysetterstore/propertysetters/6740832a2b0f614abcaee79c?version=1",
"createdOn" : 1732281130435,
"lastModifiedOn" : 1764675697996,
"deleted" : false,
"name" : "Create Connector Bot",
"description" : ""
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{
"setOnActions" : [ {
"actions" : [ "ask_for_bot_prompt" ],
"setProperties" : [ {
"name" : "botName",
"valueString" : "[[${memory.current.input}]]",
"scope" : "conversation",
"fromObjectPath" : "",
"toObjectPath" : "",
"convertToObject" : false,
"override" : true,
"runOnValidationError" : false
} ]
}, {
"actions" : [ "ask_for_bot_intro" ],
"setProperties" : [ {
"name" : "prompt",
"valueString" : "[[${memory.current.input}]]",
"scope" : "conversation",
"fromObjectPath" : "",
"toObjectPath" : "",
"convertToObject" : false,
"override" : true,
"runOnValidationError" : false
} ]
}, {
"actions" : [ "ask_for_llm_use" ],
"setProperties" : [ {
"name" : "intro",
"valueString" : "[[${memory.current.input}]]",
"scope" : "conversation",
"fromObjectPath" : "",
"toObjectPath" : "",
"convertToObject" : false,
"override" : true,
"runOnValidationError" : false
} ]
} ]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"resource" : "eddi://ai.labs.output/outputstore/outputsets/6740832a2b0f614abcaee79d?version=1",
"createdOn" : 1732281130469,
"lastModifiedOn" : 1764675697996,
"deleted" : false,
"name" : "Create Connector Bot",
"description" : ""
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
{
"outputSet" : [ {
"action" : "CONVERSATION_START",
"timesOccurred" : 0,
"outputs" : [ {
"valueAlternatives" : [ {
"type" : "text",
"text" : "Hello there! I'm the Bot Father, and I'm here to help you create bots that connect to (LLM powered) APIs.",
"delay" : 0
} ]
}, {
"valueAlternatives" : [ {
"type" : "text",
"text" : "Let's get started, shall we?",
"delay" : 0
} ]
} ],
"quickReplies" : [ {
"value" : "Let's get started!",
"expressions" : "ask_for_bot_name"
}, {
"value" : "Not now",
"expressions" : "exit_conversation, CONVERSATION_END"
} ]
}, {
"action" : "ask_for_bot_name",
"timesOccurred" : 0,
"outputs" : [ {
"valueAlternatives" : [ {
"type" : "text",
"text" : "Fantastic! To begin, please provide a name for your LLM connector bot.",
"delay" : 0
} ]
} ],
"quickReplies" : [ ]
}, {
"action" : "ask_for_bot_prompt",
"timesOccurred" : 0,
"outputs" : [ {
"valueAlternatives" : [ {
"type" : "text",
"text" : "Great choice! Now, let's define the (system) prompt for your \"[[${properties.botName}]]\" connector bot",
"delay" : 0
} ]
} ],
"quickReplies" : [ ]
}, {
"action" : "ask_for_bot_intro",
"timesOccurred" : 0,
"outputs" : [ {
"valueAlternatives" : [ {
"type" : "text",
"text" : " Excellent!",
"delay" : 0
} ]
}, {
"valueAlternatives" : [ {
"type" : "text",
"text" : "Now, please provide an intro message for your connector bot to set the tone for the conversation.",
"delay" : 0
} ]
} ],
"quickReplies" : [ ]
}, {
"action" : "ask_for_llm_use",
"timesOccurred" : 0,
"outputs" : [ {
"valueAlternatives" : [ {
"type" : "text",
"text" : " Great!",
"delay" : 0
} ]
}, {
"valueAlternatives" : [ {
"type" : "text",
"text" : " Which LLM API would you like to use for your bot?",
"delay" : 0
} ]
} ],
"quickReplies" : [ {
"value" : "OpenAI",
"expressions" : "create_openai_bot"
}, {
"value" : "Hugging Face",
"expressions" : "create_huggingface_bot"
}, {
"value" : "Anthropic",
"expressions" : "create_anthropic_bot"
}, {
"value" : "Gemini",
"expressions" : "create_gemini_bot"
}, {
"value" : "Gemini Vertex",
"expressions" : "create_gemini_vertex_bot"
}, {
"value" : "Ollama",
"expressions" : "create_ollama_bot"
}, {
"value" : "Jlama",
"expressions" : "create_jlama_bot"
} ]
} ]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"resource" : "eddi://ai.labs.package/packagestore/packages/6740832a2b0f614abcaee79e?version=1",
"createdOn" : 1732281130506,
"lastModifiedOn" : 1764675697996,
"deleted" : false,
"name" : "Create Connector Bot",
"description" : ""
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"packageExtensions" : [ {
"type" : "eddi://ai.labs.parser",
"extensions" : {
"dictionaries" : [ ]
},
"config" : { }
}, {
"type" : "eddi://ai.labs.behavior",
"extensions" : { },
"config" : {
"uri" : "eddi://ai.labs.behavior/behaviorstore/behaviorsets/6740832a2b0f614abcaee79b?version=1"
}
}, {
"type" : "eddi://ai.labs.property",
"extensions" : { },
"config" : {
"uri" : "eddi://ai.labs.property/propertysetterstore/propertysetters/6740832a2b0f614abcaee79c?version=1"
}
}, {
"type" : "eddi://ai.labs.output",
"extensions" : { },
"config" : {
"uri" : "eddi://ai.labs.output/outputstore/outputsets/6740832a2b0f614abcaee79d?version=1"
}
} ]
}
Loading