Scenario A: Multi-Agent Coordination
Supervisor Orchestration
User asks a complex question requiring multiple specialist agents. The Supervisor coordinates Travel, Weather, and Calendar agents to provide a comprehensive response.
You
💬
User Message
Natural language
→
🧠
Supervisor
Orchestrate agents
✈
Travel Agent
Flight details
🌦
Weather Agent
Rome forecast
📅
Calendar Agent
Your schedule
Intent Detection
Multi-domain request identified
MULTI_AGENT
Intent Type
coordination
Category
travel, weather, calendar
Domains Detected
0.97
Confidence
🔀
Coordinating Specialists
Travel Agent
0.95
Relevance
Weather Agent
0.92
Relevance
Calendar Agent
0.89
Relevance
Umber
Side Effects
Travel Agent: Retrieved flight FCO-123 from calendar
Complete
Weather Agent: Fetched 7-day Rome forecast
Complete
Calendar Agent: Checked Tuesday schedule for conflicts
Complete
Memory: Trip to Rome noted for future context
Queued
💡
Pattern: Multi-Agent Coordination
Complex requests spanning multiple domains trigger the Supervisor to coordinate specialist agents. Each agent contributes its expertise (Travel for flight info, Weather for forecast, Calendar for schedule), and the Supervisor synthesizes their responses into one cohesive answer. This "Ask the Expert" pattern ensures accurate, domain-specific information.
Scenario B: Card Action Response
Sidecar Action
User taps an action button on a sidecar card. The action is dispatched to the appropriate handler without going through full intent classification.
Amazon Order Confirmation
orders@amazon.com • 2 hours ago
Your order #112-4567890 has shipped and will arrive Thursday...
👆
Tap Action
"Archive" button
→
⚡
ActionDispatcher
Route by action type
→
📥
archive_email
Execute handler
Direct Action Dispatch
No intent classification needed
CARD_ACTION
Dispatch Type
archive_email
Handler
email-triage
Source Card
direct
Route Method
// HeyUmberActionDispatcher.ts async dispatchAction(action: CardAction): Promise<void> { const handler = this.handlers.get(action.type); // No LLM call - direct handler execution await handler.execute({ actionType: 'archive_email', payload: { emailId: 'msg-12345', cardId: 'card-triage-001' } }); }
Umber
Actions Taken
Email moved to archive
Complete
Card dismissed from sidecar
Complete
Triage feedback recorded for learning
Complete
💡
Pattern: Direct Dispatch
Card actions bypass intent classification entirely. The action type maps directly to a handler function, making the response instant. This is how the system achieves sub-100ms response times for button taps.
45ms
Response Time
0
LLM Calls
$0
Token Cost
Scenario C: Decomposition Chat
Task Intake
User expresses a goal. The system detects decomposition intent and routes through the task intake pipeline, potentially asking clarifying questions.
You
💬
User Message
Goal expression
→
🧠
DecompositionDetector
Identify goal intent
→
🔍
TaskScopeClassifier
Determine scope
→
📝
MediumTaskHandler
Create epic
Decomposition Detection
Goal identified for task intake
DECOMPOSE
Intent
MEDIUM
Scope
learning
Domain
0.89
Confidence
Umber
You
Generated Learning Plan
Epic
Learn Piano Fundamentals
Feature
Basic Technique
Story
Learn proper hand position
Story
Practice C major scale
Story
Learn basic finger exercises
Feature
First Pop Song
Story
Learn C-G-Am-F chord progression
Story
Practice "Someone Like You" intro
Umber
💡
Pattern: Conversational Decomposition
The DecompositionChatHandler identifies goal expressions and gathers context through conversation before creating a structured task hierarchy. This produces better plans than single-shot decomposition.
Scenario D: Memory Recall
Preference Storage
User explicitly shares a preference. The system stores it in memory for future personalization without breaking conversational flow.
You
💬
User Message
Explicit memory
→
🧠
RecallIntentDetector
Identify storage cue
→
💾
MemoryAgent
Extract & store
Memory Intent Detection
Explicit storage request identified
REMEMBER
Intent
explicit
Trigger Type
health/food
Category
0.98
Confidence
Memory Extracted
Stored for personalization
Preference
User does not eat seafood
High
Fact
User has seafood allergy
High
Umber
Later that week...
You
Umber
💡
Pattern: Memory-Aware Responses
Stored memories are injected into agent context automatically. When GeneralAgent processes the dinner question, it sees the seafood allergy fact and adjusts recommendations without the user needing to repeat themselves.
2
Facts Stored
forever
Retention
100%
Recall Rate
Scenario E: Domain Expert Route
Ask the Expert
User asks about a specific domain. The primary agent recognizes it needs expert knowledge and delegates to a specialist agent.
You
💬
User Message
Multi-domain query
→
🧠
AgentRouter
Primary: Travel
→
✈
TravelAgent
Trip context
Ask the Expert Chain
Travel Agent
Primary handler
Weather Agent
Domain expert
Travel Agent
Response synthesis
🔀
Agents Involved
Travel Agent
Primary
Handler
Weather Agent
Expert
Consultant
Calendar Agent
N/A
Not needed
Umber
💡
Pattern: Ask the Expert
TravelAgent doesn't call weather APIs directly. Instead, it asks WeatherAgent for an assessment. WeatherAgent has domain knowledge about what weather means for activities and packing. This separation keeps each agent focused on their expertise.
// TravelAgent.ts - Ask the Expert pattern const weatherAssessment = await this.requestFromAgent( 'weather-agent', { type: 'TRIP_WEATHER_ASSESSMENT', payload: { destination: 'Rome, Italy', dates: ['2024-03-15', '2024-03-18'], activities: ['sightseeing', 'walking tours'] } } ); // Weather Agent returns interpreted data, not raw forecast // { packingAdvice, activityImpact, alerts }
2
Agents Used
1
Expert Calls
~800ms
Total Time