Authenticated API
Voice AI endpoints require a valid JWT Bearer token with staff roles. Accessible via the API gateway at /v1/voice-ai/* and /v1/speech/*.
NLU & Intent (Hey Maximus)
Natural Language Understanding engine powering Voice AI intent parsing, multi-language support, semantic menu search, and safety features.
Intent Types
Standard Intents
| Intent | Description | Example |
|---|---|---|
add_item | Add item to cart | "I'll have a burger" |
remove_item | Remove item from cart | "Remove the fries" |
modify_item | Change existing item | "Make that a large" |
confirm_order | Confirm current order | "That's correct" |
cancel_order | Cancel entire order | "Never mind, cancel" |
check_price | Ask about pricing | "How much is that?" |
ask_recommendation | Request suggestions | "What do you recommend?" |
ask_ingredients | Ingredient questions | "What's on the burger?" |
ask_allergen | Allergen inquiries | "Does that have nuts?" |
checkout | Ready to pay | "That's all" |
greeting | Customer greeting | "Hi there" |
thanks | Customer thanks | "Thank you" |
human_request | Request human help | "Can I speak to a person?" |
unclear | Unclear intent | - |
Drive-Thru Specific Intents
| Intent | Description | Example |
|---|---|---|
repeat_order | Repeat the order | "Can you read that back?" |
accept_upsell | Accept upsell | "Sure, add that" |
decline_upsell | Decline upsell | "No thanks" |
ask_total | Ask for total | "What's my total?" |
pull_forward | Ready to pull forward | "Okay, pulling up" |
next_window | Directed to next window | - |
Multi-Language NLU
Voice AI supports 6 languages with language-specific intent, quantity, and modifier patterns.
Supported Languages
| Code | Language | Example Greeting |
|---|---|---|
en | English | "I'd like a burger" |
es | Spanish | "Quisiera una hamburguesa" |
fr | French | "Je voudrais un burger" |
de | German | "Ich möchte einen Burger" |
pt | Portuguese | "Eu quero um hambúrguer" |
zh | Chinese | "我要一个汉堡" |
Set Session Language
POST /api/v1/voice/sessions
Authorization: Bearer {access_token}
Content-Type: application/json
{
"location_id": "loc-xyz789",
"channel": "drive_thru",
"lane": 1,
"language": "es"
}
Language-Specific Patterns
Quantity Detection:
| Language | Words Detected |
|---|---|
| English | one, two, three, four, five |
| Spanish | uno, dos, tres, cuatro, cinco |
| French | un, deux, trois, quatre, cinq |
| German | ein, zwei, drei, vier, fünf |
| Portuguese | um, dois, três, quatro, cinco |
| Chinese | 一, 两, 三, 四, 五 |
Modifier Patterns:
| Type | English | Spanish | French |
|---|---|---|---|
| Remove | "no onions", "without" | "sin cebolla" | "sans oignon" |
| Add | "extra cheese", "add" | "extra queso", "con" | "extra fromage", "avec" |
| Side | "on the side" | "a parte" | "à côté" |
| Size | "small/medium/large" | "pequeño/mediano/grande" | "petit/moyen/grand" |
Menu RAG Search
Semantic menu search using Cloudflare Vectorize for natural language item matching.
How It Works
Customer: "I want a big pepperoni with lots of cheese"
↓
Vector Embedding
↓
Vectorize Query
↓
Match: "Large Pepperoni Pizza" (score: 0.94)
Modifiers: ["extra cheese"]
Search Menu Items
POST /api/v1/voice/menu/search
Authorization: Bearer {access_token}
Content-Type: application/json
{
"query": "pepperoni pizza with extra cheese",
"location_id": "loc-xyz789",
"top_k": 5,
"category": "pizza",
"exclude_allergens": ["peanut", "tree nut"]
}
Response
{
"matches": [
{
"item_id": "pizza-01",
"name": "Pepperoni Pizza",
"category": "pizza",
"price": 14.99,
"score": 0.94,
"description": "Classic pepperoni with mozzarella",
"modifiers": ["extra cheese", "extra pepperoni", "thin crust"],
"allergens": ["wheat", "dairy"]
}
],
"query_time_ms": 45.2,
"search_method": "semantic"
}
Sync Menu for Location
POST /api/v1/voice/menu/sync
Authorization: Bearer {access_token}
Content-Type: application/json
{
"tenant_id": "tenant-abc",
"location_id": "loc-xyz789",
"force": true
}
Response
{
"items_indexed": 156,
"categories": ["burgers", "pizza", "sides", "drinks", "combos"],
"sync_time_ms": 1250,
"last_sync": "2026-01-23T15:30:00Z"
}
Modifier Types
| Type | Code | Description | Examples |
|---|---|---|---|
| Add | add | Add ingredient | "extra cheese", "add bacon" |
| Remove | remove | Remove ingredient | "no onions", "hold the pickles" |
| Substitute | substitute | Replace ingredient | "sub fries for salad" |
| Quantity | quantity | Amount modifier | "light mayo", "extra sauce" |
| Preparation | preparation | Cooking style | "well done", "grilled" |
| Size | size | Size selection | "large", "medium" |
| Side | side | On the side | "dressing on the side" |
Noise Preprocessing
Drive-thru audio preprocessing for noisy environments.
Handled Noise Patterns
| Pattern | Example | Handling |
|---|---|---|
| Noise markers | [background noise] | Removed |
| Hesitations | "uh", "um", "er", "like" | Removed |
| Repeated words | "I I want" | Deduplicated |
| Leading ellipses | "...and a coke" | Trimmed |
Enable Noise Preprocessing
Noise preprocessing is automatically enabled for drive-thru sessions. For other channels:
{
"text": "[noise] I'd uh like um a burger",
"is_drive_thru": true
}
After preprocessing: "I'd like a burger"
Allergen Detection
Voice AI automatically detects allergen-related queries.
Detected Allergens
| Allergen | Detected Phrases |
|---|---|
| Peanut | "peanut allergy", "no peanuts" |
| Tree Nut | "tree nut", "nut-free" |
| Dairy/Milk | "dairy-free", "lactose", "no cheese" |
| Egg | "egg allergy", "no eggs" |
| Wheat/Gluten | "gluten-free", "celiac" |
| Soy | "soy allergy" |
| Fish | "fish allergy" |
| Shellfish | "shellfish", "no shrimp" |
| Sesame | "sesame allergy" |
Response with Allergen Detection
{
"intent": {
"name": "ask_allergen",
"confidence": 0.95
},
"detected_allergens": ["peanut", "tree nut"],
"response": {
"text": "I see you mentioned a nut allergy. Let me check which items are safe for you.",
"audio_url": "https://audio.olympuscloud.ai/tts/allergen-001.mp3"
}
}
Related Pages
- Voice Sessions - Session lifecycle management
- Drive-Thru - Drive-thru specific features
- Streaming & Configuration - Audio streaming and config
- Offline Queue - Offline command queuing