4 ready-to-build workflows

AI agent workflows for Public transport & fleet mobility

Answer commuters in their own language, draft disruption advisories for a controller to approve, and turn lost property, shift swaps and accessibility requests into tracked work — with your own thresholds encoded as SpEL tools and every service and safety decision human-owned.

Each recipe below is expressed only in VegaDūta's real workflow building blocks — Trigger, Agent, Knowledge, Condition, Approval, Output, Tool (MCP), Voice, Device, Loop, Code and Parallel — so it maps 1:1 to something you can assemble in the Workflow designer. Consequential actions always pass a human Approval step.

1. Route disruption → multilingual commuter advisory, controller-approved

Today: a vehicle fails on the corridor, the driver phones the depot, the depot phones the control room. The duty controller — already on two phones — types a notice into a WhatsApp broadcast group, then asks whoever is around whether they can put it into Kannada and Hindi. Someone walks a printed sheet to the terminus notice board. Commuters at the twelve stops in between find out by standing there. By the time the third language goes out the diversion has already changed, and nobody remembers to send the all-clear.

Trigger: Webhook (AVL/telematics threshold or control-room incident raise)

How the workflow runs

  1. Trigger

    Disruption is raised. A Webhook trigger fires from the AVL/GPS telematics platform or from the control room's own incident form — route, direction, affected stops, cause, expected duration. Telematics has no first-party connector; it reaches the workflow via Webhook and is read back through a Tool (MCP) node.

  2. Tool (MCP)

    Pull the live service picture. A Tool (MCP) node reads the affected route's current vehicle positions, headway and the published timetable so the draft is grounded in what is actually running, not in a guess.

  3. Code

    Your own severity rule decides the channel. A user-defined SpEL tool the operations team wrote themselves — `disruption_tier` — grades the incident from the delay minutes and the number of affected stops. It is a formula, not a script: the ops team can raise the public-advisory threshold for a monsoon week without a developer or a deployment.

  4. Agent

    Draft the advisory. An Agent node writes a short, factual commuter advisory — what is affected, from which stop to which stop, the alternative (a documented parallel route or interchange from a scoped Knowledge collection), and how long the information is valid for. It writes a draft only.

  5. Parallel

    Translate for the corridor. A Parallel node fans the draft across the languages that corridor actually needs, using Sarvam for Indian languages, keeping the facts identical across every version.

  6. Approval

    Controller approves before anything is published. An Approval node holds the whole bundle — English plus every translation — for the duty controller. Publishing a public advisory, and any statement about cancelling or diverting a service, is a human decision; the agent never publishes.

  7. Output

    Push to commuter channels. On approval an Output node sends the exact approved text on WhatsApp and SMS to commuters subscribed to that route, plus Telegram for the public channel — one advisory, one approved wording, several channels.

Channels & connectors

  • Webhook
  • WhatsApp
  • SMS / Twilio
  • Telegram
  • Sarvam (Indian languages)
  • Tool (MCP → AVL/telematics + timetable)
  • Approval / HITL

Outcome

Within minutes of an incident being raised, the duty controller has a grounded advisory in every language the corridor needs, tiered by the operator's own threshold rule, ready to approve and push — instead of typing it into a broadcast group while running the incident.

Why it helps

The mechanism is preparation, not automation: the drafting, the timetable lookup and the translation all happen before the controller looks at it, so the human spends their attention on whether the message is right rather than on producing it. The severity threshold lives in a SpEL tool the ops team owns, so 'what counts as advisory-worthy' is a setting they change for a monsoon week, not a ticket they raise. Nothing reaches a commuter that a controller has not read and approved.

Build spec

2 agents1 drafting agent (once per incident) + 1 translation agent invoked once per target language through the Parallel node. The AVL lookup, the severity formula, the controller approval and the channel push are workflow nodes and tools, not agents. · Pattern: Ground → tier by the operator's own SpEL rule → draft → parallel translate → human approves the whole bundle → publish

System prompt (paste-ready)

You draft commuter service advisories for {{operator}}. From an incident {route, direction, affected_stops[], cause, expected_duration} plus the live AVL/timetable data supplied to you, write a factual advisory of at most 60 words: what is affected, between which stops, the documented alternative from Knowledge, and a validity time. Use ONLY the supplied facts and the published network information in Knowledge — never invent a stop, a replacement service, a restoration time or a cause. Do NOT write reassurance, apology framing beyond one plain line, or any safety instruction. If the incident report is missing route or affected stops, return {draft: null, missing[]} instead of guessing. This is a DRAFT for the duty controller; never state that a service is cancelled or diverted as fact unless the incident record says so.

Agent roles & model tiers

  • Advisory drafter (once per incident) Standard tier — this is the hard step: it must stay strictly inside the supplied facts under time pressure. Configure a fallback model on a second provider, because an incident is exactly when you cannot afford the primary provider to be having an outage.

    Turn the incident record plus live AVL/timetable data into a ≤60-word factual advisory with a documented alternative and a validity time. No invented stops, causes or restoration times. Draft only — never assert a cancellation the record does not contain.
  • Translator (once per target language, via Parallel) Economy tier — routes Indian languages through Sarvam; runs N times per incident, so it is the cost multiplier

    Translate the controller-bound draft into the target language with the facts, stop names, route numbers and times byte-identical. Do not localise a stop name that has an official published form in Knowledge. Add nothing; drop nothing.

MCP connectors

  • AVL / GPS telematics — via Tool (MCP): read live vehicle positions and current headway for the affected route; incident itself arrives inbound via Webhook
  • Timetable / scheduling system — via Tool (MCP): read the published trips, parallel routes and interchange points for the affected stop pair
  • Passenger-subscription list — via Tool (MCP): resolve which commuters are subscribed to this route and in which language
  • WhatsApp / SMS / Telegram — first-party commuter channels for the approved advisory

Built-in tools

  • user-defined tool `disruption_tier` (SpEL): input.delayMinutes > 45 ? 'PUBLIC_ADVISORY' : (input.delayMinutes > 15 ? 'ROUTE_NOTICE' : 'LOG_ONLY') — the ops team's own threshold, editable for a monsoon week without a developer or a redeploy
  • user-defined tool `advisory_headline` (SpEL): 'Route ' + input.route + ': ' + input.fromStop + ' → ' + input.toStop + ' affected until ' + input.validUntil — the operator's exact house format, so every language version opens identically
  • knowledge_search (published network map, parallel routes, interchange rules, advisory style guide — a scoped collection, not the whole corpus)
  • http_request (read live vehicle positions and the timetable for the affected route)

Guardrails

  • The agent never publishes — the duty controller approves the English text AND every translation at the Approval node before a single message leaves
  • No agent ever declares a service cancelled, diverted, suspended or safe to board on its own; it restates only what the incident record and timetable say, and anything beyond that is escalated to the controller
  • Advisory content is grounded in the incident record, the live AVL read and the published network data in the scoped Knowledge collection — invented stops, replacement services or restoration times are prohibited by prompt and caught in review
  • Severity tiering is a deterministic SpEL formula owned by the operator, not a model judgement — the model never decides how widely a message is broadcast
  • Translations are fact-locked: route numbers, stop names, times and the validity window must match the approved English exactly, so approving one bundle really does approve all of it
  • Idempotent per incident id — a telematics system that re-fires the same incident does not produce a second advisory blast

Cost strategy

Cost is one standard-tier draft plus L economy-tier translations per incident, where L is the number of languages that corridor actually needs — so translation, not drafting, is what scales. Keep translation on the economy tier (it is a constrained, fact-locked rewrite, not reasoning) and spend the reasoning budget on the single drafting call, which is where an error would actually reach commuters. The `disruption_tier` SpEL tool costs nothing at all and removes the cheapest-to-get-wrong decision from the model entirely. Run translations through the Parallel node for wall-clock speed; that does not change per-language cost.

Output & delivery

Webhook incident → Tool (MCP) reads live AVL and timetable → the `disruption_tier` SpEL tool grades it against the operator's own threshold → the drafting agent produces a grounded ≤60-word advisory → a Parallel node fans translation across the corridor's languages via Sarvam → the duty controller approves the entire bundle at the Approval node → an Output node pushes the exact approved wording to route subscribers on WhatsApp and SMS and to the public Telegram channel.

2. Lost-property intake and matching across depots

Today: a passenger leaves a bag on a bus and rings the terminus. The clerk there opens a hardbound register, runs a finger down the column, and says try tomorrow. The bag is actually at the far depot where that vehicle ended its shift, written into a different register in a different hand — 'blue bag, ladies' — with no route, no time. The two halves meet only if someone bothers to ring around three depots, and most never do. Anyone who does not speak the clerk's language is asked to call back with a relative.

Trigger: WhatsApp / Voice (passenger report) + Webhook (crew hand-in)

How the workflow runs

  1. Trigger

    Both halves arrive. A passenger reports a loss on WhatsApp or by Voice/Call; separately, a Webhook from the depot hand-in form (or a crew WhatsApp message) records found property. Two independent streams, one workflow.

  2. Voice

    Take the report by phone too. A Voice node handles callers who will not use a form: ElevenLabs for natural speech, Sarvam so the passenger can describe the item in their own language, transcribed into the same structured fields as the WhatsApp path — no calling back with a relative.

  3. Agent

    Normalise into a comparable record. An Agent node turns either stream into one schema — item category, colour, distinguishing marks, route/vehicle, direction, approximate time, boarding and alighting stop, contact — so a lost record and a found record can actually be compared.

  4. Code

    Retention clock from your own policy. A user-defined SpEL tool, `retention_days`, sets the hold period per item category straight from the operator's published policy — a formula the property office edits itself when the policy changes, not a constant buried in code.

  5. Agent

    Propose matches. A matching agent scores open found-property records against the new loss report (or vice versa) on route, vehicle, time window and item description, and returns ranked candidates with the reasons for each — it proposes, it never confirms a match.

  6. Approval

    Depot staff confirm the match and the release. An Approval node holds every proposed match: handing someone else's property to the wrong person is not recoverable, so a depot officer confirms identity and authorises release. The agent's ranking is advice.

  7. Sub-workflow

    Tell the passenger, in their language. A shared Sub-workflow — the same multilingual notify block the accessibility and advisory recipes reuse — messages the passenger in the language they reported in: which depot holds the item, its counter hours, and what proof of ownership to bring.

Channels & connectors

  • WhatsApp
  • Voice / Call
  • ElevenLabs (voice)
  • Sarvam (Indian languages)
  • Webhook
  • Tool (MCP → depot property register)
  • Approval / HITL

Outcome

Loss reports and depot hand-ins land in one comparable register searchable across every depot, candidate matches are surfaced with their reasons, and a depot officer confirms every release.

Why it helps

The mechanism is a common schema plus a search that runs across all depots instead of one register at one counter: today the two halves of a match sit in different books in different formats, so they meet only if a human happens to ring around. Ranking candidates does not decide anything — the release stays a staffed, identity-checked decision.

Build spec

2 agents1 intake/normalisation agent (runs once per report, from either stream) + 1 matching agent (runs once per new record against the open register). The voice capture, the retention formula, the register read/write and the release approval are workflow nodes and tools. · Pattern: Two-stream intake → shared schema → candidate ranking → human confirms identity and release → shared multilingual notify Sub-workflow

System prompt (paste-ready)

(Intake) You take lost-property reports for {{operator}}. From a passenger message, a voice transcript or a depot hand-in form, extract strict JSON {stream (LOST|FOUND), item_category, colour, brand, distinguishing_marks[], contents_claimed[], route, vehicle_no, direction, time_window, boarding_stop, alighting_stop, reporter_contact, language}. Use null for anything not stated — NEVER infer a brand, a colour or a route the reporter did not give. Do not ask for identity documents or any government ID number, and do not record card, bank or ID numbers even if the passenger volunteers them; note only 'documents claimed inside' as a category.

Agent roles & model tiers

  • Intake / normaliser (per report) Economy tier — high volume, and the work is structured extraction from a short message or transcript; a fallback model on a second provider keeps the helpline answering during an outage

    Extract one lost- or found-property report into the shared strict JSON schema. Null for anything unstated. Never infer route, brand or colour. Never record card, bank or government ID numbers — record only that documents were claimed.
  • Matcher (per new record) Standard tier — this is the hard step: weighing partial, differently-worded descriptions across route and time

    Score open counterpart records against the new one on route, vehicle, time window and description overlap. Return ranked candidates with an explicit reason per candidate and a confidence. Never declare a match; if nothing scores well, return an empty list rather than a weak guess.

MCP connectors

  • Depot lost-property register — via Tool (MCP): query open counterpart records across ALL depots by route + time window, write the new intake record, stamp a release
  • Fleet/duty records — via Tool (MCP): resolve which vehicle and crew worked that route and time, so a vague report still lands on the right depot
  • Depot hand-in form — inbound via Webhook: crew hand-ins enter the same register as passenger reports
  • WhatsApp / Voice — first-party passenger channels for intake and the release message

Built-in tools

  • user-defined tool `retention_days` (SpEL): input.category == 'DOCUMENTS' ? 90 : (input.category == 'ELECTRONICS' ? 60 : 30) — the property office's own published hold policy, edited by them when the policy changes
  • user-defined tool `claim_reference` (SpEL): input.depotCode + '-' + input.route + '-' + input.reportId — one readable reference the passenger can quote at the counter, in the operator's own format
  • knowledge_search (depot counter hours, proof-of-ownership policy, retention and disposal rules)
  • http_request (query the property register across depots; write the intake record; stamp a release)

Guardrails

  • The agent never releases property — a depot officer confirms the claimant's identity and authorises the handover at the Approval node; the ranking is advice only
  • No match is ever stated to a passenger as found until it is confirmed; the passenger message goes out only after the approval
  • The intake agent is prohibited from capturing or storing card, bank-account or government ID numbers even when a passenger volunteers them — contents are recorded only at category level
  • Retention and disposal timing comes from the operator's own SpEL policy tool, never from the model's idea of a reasonable hold period
  • Contact details are used only to return the item and are not reused for marketing or broadcast lists
  • Register writes are keyed to the report id, so a passenger who reports twice does not create a duplicate open case

Cost strategy

Intake runs on every report from both streams and is by far the higher-volume step, so it must sit on the economy tier — that single choice dominates the bill. Matching runs once per new record and is the genuinely hard reasoning (partial descriptions, fuzzy times), which is where the standard tier earns its cost. Cap the candidate set the matcher sees, using the SpEL-derived route/time window rather than the whole register, so the expensive call stays a fixed size as the register grows.

Output & delivery

WhatsApp, Voice (ElevenLabs + Sarvam) or the depot Webhook feeds the intake agent → one shared record is written to the property register via a Tool (MCP) node with a `claim_reference` and a `retention_days` clock → the matcher ranks counterpart records with reasons → a depot officer confirms identity and authorises release at the Approval node → the shared notify Sub-workflow tells the passenger, in their own language, which depot holds the item, its counter hours and what proof to bring.

3. Crew shift-swap and leave requests → roster proposal for the depot manager

Today: a conductor wants Thursday off, so he catches the roster clerk at the window between duties and writes it on a slip that goes under a paperweight. A driver calls in sick at 05:10 and the depot clerk starts phoning down a handwritten list of who might be free — badge by badge, most phones ringing out — while checking a wall chart for who is out of rest hours and whose route endorsement has lapsed. Half the swap slips surface after the roster is already published, and the ones that do get done are remembered rather than recorded.

Trigger: WhatsApp (crew request) / Webhook (depot kiosk form)

How the workflow runs

  1. Trigger

    Crew asks for a swap or leave. A WhatsApp message from the crew member (or a Webhook from the depot kiosk form) starts the request — in whatever language they type, and at whatever hour their shift ends, instead of a slip under a paperweight.

  2. Agent

    Structure the request. An Agent node extracts the request into fields: requester, badge/duty id, dates, the duty being given up, the proposed counterpart if there is one, reason category, and whether it is a swap, a leave or a cover request.

  3. Tool (MCP)

    Check it against the roster. A Tool (MCP) node reads the depot roster and crew-records system — is the counterpart free, is their licence and route endorsement valid for that duty, what is the actual gap since their last duty ended?

  4. Code

    Rest-hour rule the depot owns. A user-defined SpEL tool, `rest_gap_band`, turns the returned gap into BREACH / REVIEW / OK against the depot's own rule. It is arithmetic and a ternary — no loops, no code execution — which is exactly right for a rule that must be deterministic and that the depot changes when the rule changes.

  5. Condition

    Rule breach or clean?. A Condition node splits the two cases: a request that would breach a rest-hour, licence-validity or duty-hour rule is flagged as non-compliant with the specific rule named; a clean one goes forward as a proposal.

  6. Approval

    Depot manager decides. An Approval node holds every roster change. A swap commits a person to a safety-critical duty, so the manager approves — the agent has only structured the request and the workflow has only checked the rules.

  7. Output

    Confirm both crew members and the roster. On approval a Tool (MCP) node writes the change to the roster and an Output node confirms on WhatsApp to both crew members with the new duty details; a rejection goes back with the named reason, not silence.

Channels & connectors

  • WhatsApp
  • Webhook
  • Sarvam (Indian languages)
  • Tool (MCP → depot roster + crew records)
  • Approval / HITL

Outcome

Swap, leave and sick-cover requests arrive in one queue already checked against licence validity, rest hours and coverage, so the manager approves or rejects a decision rather than assembling one from a wall chart at 05:10.

Why it helps

The mechanism is moving the rule-checking to the moment of the request instead of the moment the clerk gets to it: the rest-hour and licence checks are deterministic lookups plus a SpEL formula, which is what makes a request that arrives at 23:40 actionable at 05:10. The rule itself stays the depot's — written as an expression they can edit — and the commitment of a person to a safety-critical duty stays entirely with the depot manager.

Build spec

1 agent1 request-structuring agent per request. The roster and licence checks are Tool (MCP) lookups, the rest-hour band is a SpEL tool, the compliance split is a Condition node, and the roster write happens only after the manager's Approval — none of those are agents.

System prompt (paste-ready)

You structure crew roster requests for {{depot}}. From a crew member's message in any language, extract strict JSON {type (SWAP|LEAVE|COVER), requester_badge, duty_id, dates[], counterpart_badge (null if none proposed), reason_category (MEDICAL|FAMILY|PERSONAL|OTHER), free_text_note, language}. Use null for anything not stated and never infer a badge number or a duty id. Do not record medical details beyond the category MEDICAL — the specific condition is not needed and must not be stored. You do NOT evaluate whether the swap is allowed and you never tell the crew member it is approved; the workflow checks the rules and the depot manager decides.

Agent roles & model tiers

  • Request structurer (per request) Economy tier — short, multilingual, high-volume extraction with a fixed schema; Sarvam handles the Indian-language input, and a fallback model keeps the 05:10 sick-call path alive during a provider outage

    Extract one swap/leave/cover request into the strict schema in the crew member's own language. Null for unstated fields, never infer a badge or duty id, never store a medical detail beyond the category. Never state or imply that the request is approved.

MCP connectors

  • Depot roster / duty-scheduling system — via Tool (MCP): read the duty being given up and who is genuinely free that day; write the approved swap back
  • Crew records — via Tool (MCP): read licence validity, route endorsement and the exact end time of the member's previous duty for the rest-hour calculation
  • Depot kiosk form — inbound via Webhook: the same queue as the WhatsApp path, for crew who prefer the counter
  • WhatsApp — first-party crew channel for the request and the confirmed duty details

Built-in tools

  • user-defined tool `rest_gap_band` (SpEL): input.restHours < 9 ? 'BREACH' : (input.restHours < 11 ? 'REVIEW' : 'OK') — the depot's own rest rule as an editable formula, so tightening it for a festival period is a settings change, not a release
  • user-defined tool `duty_label` (SpEL): input.dutyId + ' (' + input.signOn + '–' + input.signOff + ', ' + input.route + ')' — one unambiguous duty string reused in the manager's approval card and both crew confirmations
  • knowledge_search (rest-hour rules, maximum consecutive duties, swap eligibility and leave policy as published by the depot)
  • http_request (read roster and crew records; write the approved roster change)

Guardrails

  • No roster change is written without the depot manager's Approval — the agent structures the request and the workflow checks rules, but a person is never committed to a safety-critical duty by an agent
  • Licence validity, route endorsement and rest-hour compliance are deterministic Tool (MCP) lookups plus a SpEL formula, not something the model is asked to judge or recall
  • A request that breaches a rest-hour, duty-hour or licence rule is surfaced to the manager with the specific rule named — the workflow never quietly suppresses it and never auto-rejects a safety-relevant case without a human seeing it
  • Medical reasons are stored only as a category; free-text medical detail is not extracted or retained
  • The agent never tells a crew member their request is approved — only the post-Approval Output node does

Cost strategy

This is a genuinely cheap workflow: one economy-tier extraction per request, and the expensive-looking part (rest hours, licence validity, coverage) is a deterministic lookup plus a zero-cost SpEL formula — do not pay a premium model to reason about rules the roster system can answer exactly. The only reason to move up a tier would be very messy free-text requests; even then, prefer tightening the prompt over upgrading the model.

Output & delivery

WhatsApp or kiosk Webhook → the economy-tier agent structures the request → a Tool (MCP) node reads the roster, licence validity and previous duty end time → the `rest_gap_band` SpEL tool bands it BREACH/REVIEW/OK against the depot's own rule → the Condition node splits compliant from rule-breaching → the depot manager approves or rejects at the Approval node → on approval a Tool (MCP) node writes the roster change and an Output node confirms the `duty_label` to both crew members on WhatsApp in their own language.

4. Accessibility assistance booking, by voice and in any language

Today: a passenger who uses a wheelchair wants to travel on Friday. She calls the general enquiry number, is transferred twice, and is finally told to 'ask the conductor on the day'. There is no record anywhere — not at the boarding stop, not with the crew, not at the interchange where she will need help changing. On Friday the vehicle that arrives has no working ramp and the conductor has never heard of her. Meanwhile the station staff who would gladly have helped had no advance notice at all.

Trigger: Voice / Call (assistance line) / WhatsApp / SMS

How the workflow runs

  1. Trigger

    Passenger asks for assistance. A Voice/Call trigger on the assistance line, or a WhatsApp/SMS message — the request comes in whatever way the passenger can actually use, including a plain phone call to a number that answers.

  2. Voice

    A voice interface that actually works. A Voice node with ElevenLabs for clear, unhurried speech and Sarvam for Indian languages takes the request conversationally: which journey, which stops, what assistance, any mobility aid to be accommodated.

  3. Knowledge

    Check what the network can actually offer. A scoped Knowledge collection holds the operator's published accessibility information — which stops are step-free, which vehicle types have ramps, which interchanges are staffed and when — so the passenger is told the truth, not a hope.

  4. Agent

    Assemble the assistance request. An Agent node turns the conversation into a structured assistance booking against a specific service and stop pair, and flags anything the published information says cannot be provided on that journey.

  5. Code

    Route it by the operator's own notice rule. A user-defined SpEL tool, `assistance_lead_band`, classifies the request by hours to departure — the operator's own published notice policy as a formula, so a request made two hours out is routed as short notice rather than dropped into the same queue as one made a week ahead.

  6. Approval

    Station or depot staff commit the assistance. An Approval node routes the request to the staff who would actually perform it. Allocating a person and equipment to a time and place is a commitment, so a human accepts it — and can offer an alternative service instead of a silent decline.

  7. Output

    Confirm, and brief the crew. On acceptance a shared multilingual notify Sub-workflow confirms to the passenger in her own language, and a Tool (MCP) node posts the assistance note to the duty/crew system so the crew on that service knows before it arrives.

Channels & connectors

  • Voice / Call
  • ElevenLabs (voice)
  • Sarvam (Indian languages)
  • WhatsApp
  • SMS / Twilio
  • Knowledge base
  • Tool (MCP → duty/crew notes)
  • Approval / HITL

Outcome

A passenger can arrange assistance by simply phoning, in her own language, and the crew and station staff have the request in hand before the vehicle arrives — instead of 'ask the conductor on the day'.

Why it helps

The mechanism is meeting the passenger on the channel she can actually use — a phone call in her own language — and then grounding the answer in the operator's own published accessibility data, so a request is either genuinely accepted by the staff who will perform it or honestly declined with an alternative. It replaces a transfer and a hope with a commitment someone has accepted and the crew has been told about.

Build spec

1 agent1 conversational assistance agent handling the whole call or chat. The voice layer, the accessibility Knowledge grounding, the lead-time formula, the staff acceptance and the crew note are workflow nodes and tools. · Pattern: Voice-first multilingual intake → grounded feasibility check → staff accept the commitment → crew briefed in advance

System prompt (paste-ready)

You take accessibility assistance requests for {{operator}} by phone and message, in the passenger's own language. Collect {journey_date, service_or_route, boarding_stop, alighting_stop, assistance_type[] (RAMP|RESERVED_SEAT|BOARDING_HELP|INTERCHANGE_ESCORT|OTHER), mobility_aid, companion (yes/no), contact}. Answer questions about step-free access, ramp-equipped vehicles and staffed interchanges ONLY from the published accessibility information in Knowledge — if it is not published, say you do not have that confirmed and pass it to staff. NEVER promise that assistance will be provided; you are collecting a request that station or depot staff must accept. Do not ask for or record any disability certificate number, medical detail or government ID. Be direct and unhurried; if the passenger asks for a human, hand off immediately.

Agent roles & model tiers

  • Assistance intake agent (per request) Standard tier — a real-time voice conversation with a passenger who may need patience and repetition is the wrong place to economise; pair it with a fallback model so the assistance line does not simply stop answering during a provider outage

    Hold a calm multilingual conversation, collect the structured assistance request, answer feasibility questions strictly from published accessibility Knowledge, never promise the assistance, never collect medical or ID details, and hand off to a human the moment it is asked for.

MCP connectors

  • Duty / crew-notes system — via Tool (MCP): post the accepted assistance note against the specific service and duty, so the crew sees it at sign-on
  • Station staffing roster — via Tool (MCP): read who is on duty at the boarding stop and the interchange at that hour, so the approval goes to the person who would actually perform it
  • Fleet register — via Tool (MCP): read which vehicle type is allocated to that trip, to check ramp availability against published data
  • Voice / WhatsApp / SMS — first-party passenger channels, including a plain phone call

Built-in tools

  • user-defined tool `assistance_lead_band` (SpEL): input.hoursToDeparture >= 12 ? 'STANDARD' : (input.hoursToDeparture >= 2 ? 'SHORT_NOTICE' : 'AT_STATION') — the operator's own published notice policy, editable by the accessibility desk without a release
  • user-defined tool `crew_note_line` (SpEL): input.assistanceType + ' at ' + input.boardingStop + ' for ' + input.serviceOrRoute + (input.mobilityAid != null ? ' — aid: ' + input.mobilityAid : '') — one consistent line in the crew's own note format
  • knowledge_search (published step-free stop list, ramp-equipped vehicle types, staffed-interchange hours, assistance policy — a scoped collection so nothing unpublished can leak into an answer)
  • http_request (post the accepted assistance note to the duty/crew system)

Guardrails

  • The agent never confirms that assistance will be provided — station or depot staff accept the commitment at the Approval node, and only then is the passenger told it is arranged
  • Feasibility answers come only from the operator's published accessibility information in the scoped Knowledge collection; where the data is not published the agent says so plainly and escalates rather than guessing whether a stop is step-free
  • The agent never makes a boarding-safety or vehicle-suitability judgement — whether a particular mobility aid can be safely carried on a particular vehicle is surfaced to staff, never decided in the conversation
  • No disability certificate number, medical detail or government ID is requested or stored; assistance type and mobility-aid type are enough
  • An explicit request for a human ends the automated conversation immediately and transfers, with the partial request preserved so nothing has to be repeated

Cost strategy

This is the one place in this pack to deliberately not economise: a low-volume, high-stakes real-time voice conversation, so a standard-tier model plus ElevenLabs/Sarvam is the right spend — a cheap model that mishears a stop name or rushes a passenger costs far more than the token difference. Volume is naturally bounded by the number of journeys needing assistance, so there is no per-item multiplier; keep the Knowledge collection scoped so each turn stays a short grounded lookup, and let the zero-cost SpEL lead-time band do the routing.

Output & delivery

Voice, WhatsApp or SMS → the standard-tier agent converses in the passenger's language via ElevenLabs and Sarvam → a scoped Knowledge collection grounds every feasibility answer in published accessibility data → `assistance_lead_band` routes it by the operator's own notice policy → the staff who would perform it accept at the Approval node → the shared notify Sub-workflow confirms to the passenger in her own language and a Tool (MCP) node posts the `crew_note_line` to the duty system so the crew is briefed before the service arrives.

Related industries

Build one of these in minutes

The sandbox gives you a live agent workspace — no account, no card. Or head back to the full catalogue and compare patterns across every industry.

See how VegaDūta compares to n8n, Dify and BotpressWhy VegaDūta's architectureEstimate your WhatsApp API costs