This guide shows how all of EDDI's components work together to create a complete, functional agent. We'll build a real-world example step-by-step, explaining how each piece connects.
The Big Picture
EDDI agents are composed of interconnected components that flow through the Lifecycle Pipeline:
Dictionary β Parser β Behavior Rules β Actions β HTTP Calls / LLM β Output β User
β β β β β β
Define Extract Decide what Triggers Fetch data Format Response
words meaning to do execution or call AI response
Each component is a separate configuration that's combined into packages, which are assembled into agents.
Real-World Example: Hotel Booking Agent
Let's build an agent that helps users book hotel rooms. It will:
Greet users
Ask for city and dates
Check availability via API
Show options
Confirm booking via API
Component Overview
We'll need:
Dictionary: Define hotel-related vocabulary
Parser: Extract entities (cities, dates)
Behavior Rules: Conversation flow logic
Properties: Store user inputs
HTTP Calls: Check availability and create bookings
curl -X POST http://localhost:7070/outputstore/outputsets \
-H "Content-Type: application/json" \
-d '{
"outputSet": [
{
"action": "welcome",
"outputs": [
{
"valueAlternatives": [
{
"type": "text",
"text": "Welcome to Hotel Booking Agent! I can help you find and book hotel rooms. Which city are you interested in?"
}
]
}
]
},
{
"action": "httpcall(check-availability)",
"outputs": [
{
"valueAlternatives": [
{
"type": "text",
"text": "Great! I found {memory.current.httpCalls.availableRooms.rooms.size()} available rooms in {context.city}. Here are your options:"
}
]
}
]
},
{
"action": "booking_confirmed",
"outputs": [
{
"valueAlternatives": [
{
"type": "text",
"text": "π Booking confirmed! Your booking ID is {context.bookingId}. Total price: ${context.totalPrice}. We'\''ve sent a confirmation email. Have a great stay!"
}
]
}
]
}
]
}'
{
"conversationId": "CONV_ID",
"conversationOutputs": [
{
"output": [
"Welcome to Hotel Booking Agent! I can help you find and book hotel rooms. Which city are you interested in?"
]
}
]
}
{
"conversationOutputs": [
{
"output": [
"π Booking confirmed! Your booking ID is BK-12345. Total price: $450. We've sent a confirmation email. Have a great stay!"
]
}
]
}
User: "check availability in Paris"
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 1. PARSER (uses Dictionary) β
β Input: "check availability in Paris" β
β Output: ["intent(check_availability)"] β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 2. BEHAVIOR RULES β
β Condition: intent(check_availability) + context.city β
β Match: YES β
β Action: httpcall(check-availability) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 3. HTTP CALLS β
β Name: check-availability β
β URL: GET /availability?city=Paris β
β Response: {rooms: [{id: 101, name: "Deluxe"}, ...]} β
β Stores: memory.current.httpCalls.availableRooms β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 4. QUICK REPLY BUILDER β
β Iterates: availableRooms.rooms β
β Creates: Quick reply buttons for each room β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 5. OUTPUT TEMPLATING β
β Template: "I found {availableRooms.rooms.size()} β
β rooms in {context.city}" β
β Result: "I found 5 rooms in Paris" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
Response to User with output + quick replies