After-Hours Triage
A phone-answering Package with a Workflow, a Team, three Agents, a Tool, a Skill, a Knowledge Base, voice and SIP.
elizon-demo/triage · version 1.0.0 · entry point workflows.triage-flow
What it does: answers an after-hours phone line. The intake Agent establishes what the caller needs and how urgent it is. The After-Hours Desk Team then either books a callback slot through the operator's calendar (scheduling) or routes the call to whoever is on call (escalation), following the operator's own written escalation policy.
It's the richest of the three demo Packages, with ten objects installed as one unit, and a good model for any Package that combines a fixed sequence with a judgment call.
How it's put together
inbound call ─▶ workflows.triage-flow
├─ 1. agents.intake (uses skills.urgency-classification)
└─ 2. teams.after-hours-desk
├─ agents.scheduling ─▶ tools.calendar
└─ agents.escalation ─▶ knowledgeBases.escalation-policy| Design choice | Why |
|---|---|
| Workflow entry point | The first step is always the same: establish the request. A fixed sequence is a Workflow. |
| Team for the second step | Which specialist acts depends on the call, so a lead decides at run time. |
| A Skill for urgency | The banding rules ("band on what's happening, not on tone of voice") are reusable and testable. |
| A Knowledge Base for the policy | Who's on call and what can't wait belong to the operator, not the author. |
| Three LLM Slots | Judgment (reasoning), cheap read-backs (routine), and embeddings (embedding). |
The Workflow
name: Triage Flow
graph:
nodes:
- id: start
type: trigger_manual
position: { x: 0, y: 0 }
- id: establish
type: ai_agent
position: { x: 280, y: 0 }
data: { mode: existing, agent: agents.intake, agentName: Intake, inputMappings: [] }
- id: handle
type: team_step
position: { x: 560, y: 0 }
data:
team: teams.after-hours-desk
teamName: After-Hours Desk
inputExpression: '{{ establish.output }}'
edges:
- { id: start-establish, source: start, target: establish }
- { id: establish-handle, source: establish, target: handle }The Team lead's instructions
leadType: managed
leadLlmSlot: reasoning
leadInstructions: |
Send `immediate` to escalation first, always, and do not wait for a calendar lookup before you do.
Send `routine` to scheduling. Send `same-day` to scheduling, and then to escalation as well
if scheduling reports that nothing is free inside the window.What the installer supplies
Eight Slots, all required:
| Slot | Type | Bind it to |
|---|---|---|
reasoning | llm | The model the Team lead, intake and escalation think with |
routine | llm | A cheaper model for the scheduling turn |
embedding | llm | The model that indexes the escalation policy (changing it later invalidates the index) |
calendar-access | credential (oauth2) | The practice's own calendar account |
escalation-policy-documents | knowledge-source | Your escalation policy: who's on call, what's urgent |
speech-in | stt | Your speech-to-text account |
speech-out | tts | Your text-to-speech account |
phone-line | sip-trunk | The trunk your after-hours number rings on |
calendar-access is OAuth, so this Package is installed through the Studio wizard.
Triggers
inbound-callonphone-line: the real path.manual: replay a request from Studio without a call, which is how to test it after installing.
Compliance, as declared
Personal data, EU, conversations kept 30 days, human_in_the_loop, EU AI Act limited risk (the
transparency obligation of a conversational system; every caller is told they're talking to an
automated assistant, and escalation always ends with a person).
Evaluation
Four cases, gate: must-pass: an active machine failure bands immediate, an angry invoice call
stays routine, a caller who says they're unwell is immediate and never just offered a slot, and a
smoke case runs the whole graph through the Team, the Knowledge Base and the models.
What "working" looks like
- The wizard's inbound test rings: call the bound number and the wizard confirms it arrived.
- The evaluation passes against your bindings.
- Call the number: the line says it's an automated assistant, asks what you need, and either offers a callback slot or says it's passing you to the person on call.
If it books a slot for an emergency, or escalates a routine billing question, check the escalation
policy documents you bound, then the model on reasoning.