This guide shows how all of EDDI's components work together to create a complete, functional bot. We'll build a real-world example step-by-step, explaining how each piece connects.
The Big Picture
EDDI bots 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 bots.
Real-World Example: Hotel Booking Bot
Let's build a bot 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 Bot! 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 Bot! 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