Elizon Docs
Guides & WalkthroughsDemo Package walkthroughs

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 choiceWhy
Workflow entry pointThe first step is always the same: establish the request. A fixed sequence is a Workflow.
Team for the second stepWhich specialist acts depends on the call, so a lead decides at run time.
A Skill for urgencyThe banding rules ("band on what's happening, not on tone of voice") are reusable and testable.
A Knowledge Base for the policyWho's on call and what can't wait belong to the operator, not the author.
Three LLM SlotsJudgment (reasoning), cheap read-backs (routine), and embeddings (embedding).

The Workflow

workflows/triage-flow.yaml
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

teams/after-hours-desk.yaml (excerpt)
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:

SlotTypeBind it to
reasoningllmThe model the Team lead, intake and escalation think with
routinellmA cheaper model for the scheduling turn
embeddingllmThe model that indexes the escalation policy (changing it later invalidates the index)
calendar-accesscredential (oauth2)The practice's own calendar account
escalation-policy-documentsknowledge-sourceYour escalation policy: who's on call, what's urgent
speech-insttYour speech-to-text account
speech-outttsYour text-to-speech account
phone-linesip-trunkThe trunk your after-hours number rings on

calendar-access is OAuth, so this Package is installed through the Studio wizard.

Triggers

  • inbound-call on phone-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

  1. The wizard's inbound test rings: call the bound number and the wizard confirms it arrived.
  2. The evaluation passes against your bindings.
  3. 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.