Skip to main content
$ modules / voice-agent

AI Technician (answers the phone, works the queue).

AI answers the phone. Opens tickets. Reads status back to callers. 24/7.

phone (SIP)asterisk PBXDGX inference hostdedicated node — RTX PRO 6000 Blackwell + Threadripper · asterisk PBX · API-key authga
// in 60 seconds
  • Client calls your number. AI answers in their language, identifies the caller, opens a ticket.
  • Client calls to check status. AI looks up existing tickets and reads back state, ETA, last action, technician assigned.
  • Off-hours, overflow, or primary line — the voice agent handles all three cases.
// on screen

The actual product.

Screens from a running instance on demonstration data. Softened on purpose — customer records never appear on this site.

Two calls waiting to be picked up, each with the summary the agent wrote and the ticket number it already opened. A request leaves this panel on its own the moment someone takes the ticket.
Two calls waiting to be picked up, each with the summary the agent wrote and the ticket number it already opened. A request leaves this panel on its own the moment someone takes the ticket.
SIMULATED CALL+34 933 08 41 22Poblenou Logistics · Laura Bosch02:41

The bracketed lines are not spoken. The caller gets ordinary intake questions; the brackets are what Ana worked out while asking them, and what she hands to the technician.

  1. Ana

    Good afternoon. I am Ana, the A.I. assistant at MegaMsp. I am still in training, so please bear with me. I will be recording this call so I can understand the language better in future — if you would rather I did not, please hang up now and email us instead. My colleagues are on other calls, so I will take your IT problem myself, or I can record a message for one of them.

    not spoken

    [Introduces herself as an A.I. in the first second, and the recording consent is spoken out loud rather than buried in a terms page. In the background the number has already resolved: Poblenou Logistics, Laura Bosch.]

  2. Ana

    Am I speaking with Laura Bosch, from Poblenou Logistics?

    not spoken

    [A number match is a hypothesis, not proof — it gets confirmed out loud. Had the number mapped to more than one company, the question would have been which company she is calling from.]

  3. Caller

    Yes, that's me.

    not spoken

    [Identity confirmed, so the ticket is pinned to this client and this requester rather than to a guess.]

  4. Ana

    I am listening. Tell me, please, how I can help.

    not spoken

    [A neutral opening: a caller may only want to leave a message for a colleague, so a problem is never assumed.]

  5. Caller

    The label printers in the packing hall have stopped.

    not spoken

    [Intent is an incident. Opens the client's estate — 12 endpoints, one server. Says nothing about it.]

  6. Ana

    I understand. Since when has this been happening?

    not spoken

    [Pins the start time so the log window can be cut precisely.]

  7. Caller

    Since about twenty to ten this morning.

    not spoken

    [Window 09:30 to now. Alerts on BCN-WH-SRV01 in that window: the print service stopped three times since 09:38. Correlation, not diagnosis.]

  8. Ana

    And is it the whole hall, or one station?

    not spoken

    [Scope: a shared component, or a single device.]

  9. Caller

    All of them. The jobs go in and nothing comes out.

    not spoken

    [Every device on the site rather than one, so something they share. Consistent with the alert.]

  10. Ana

    Has anyone tried printing from a different computer?

    not spoken

    [Rules out the workstation — the question that separates her PC from their server.]

  11. Caller

    Yes, from the office as well. Same thing.

    not spoken

    [Server side confirmed. Event log on the host: the spooler is faulting, 47 jobs held in the spool folder.]

  12. Ana

    Thank you. Is this holding anything up right now?

    not spoken

    [Impact. Priority is set from the business consequence, not from how loud the caller is.]

  13. Caller

    Yes — two trucks leave at two and we cannot label the pallets.

    not spoken

    [Dispatch blocked against a hard 14:00 deadline, so this goes up as high priority.]

  14. Ana

    Let me read that back: nothing is printing on any of the label printers in the packing hall — the jobs go in and nothing comes out — since about nine forty this morning, the same from a computer in the office, and it is holding up a dispatch at two. Have I got that right?

    not spoken

    [The read-back is spoken, and the caller's yes is what commits the ticket.]

  15. Caller

    Yes, that is it.

    not spoken

    [Confirmed. Now she looks for a KB article, a runbook and any history before writing the ticket.]

  16. Ana

    Thank you. I am opening a ticket now and a technician will pick it up remotely. There is nothing you need to do at your end — you will get an email with the ticket number.

    not spoken

    [No promised deadline and no diagnosis given to the caller. The finding goes to the technician, not down the phone.]

  17. Caller

    Alright. Thank you.

  18. Ana

    Thank you Laura. Have a good day.

    not spoken

    [Call ends at 2 min 41 s. The recording and the transcript are attached to the ticket.]

to technician

What the technician gets

Caller
Laura Bosch · Poblenou Logistics · +34 933 08 41 22 — identified by number, confirmed on the call
Problem
Every label printer in the packing hall stopped at about 09:40. Dispatch blocked, two trucks leave at 14:00.
From the call
All devices, not one · reproduced from a second computer · hard 14:00 deadline
Queried automatically
BCN-WH-SRV01 — print service stopped 3× since 09:38; event log shows the spooler faulting, 47 jobs held in the spool folder
Knowledge base
“Print Spooler crash loop — clearing the spool queue” — article found and attached
Runbook
Available and automated: clear the queue, restart the service, set the recovery policy. Ana can apply it directly, on approval.
History, this client
Same fault on 14 May, fixed by the same runbook
History, other clients
Three clients this quarter, every one after a driver update — ZDesigner 8.4.2 the common factor
Priority
High · transcript and recording attached
TICKET #972681unassigned until a technician takes it
What the call left behind, half an hour later: the summary the agent wrote, the transcript one click away, assigned, in progress, and the reply that went back to the caller. Nothing here was retyped by a human.
What the call left behind, half an hour later: the summary the agent wrote, the transcript one click away, assigned, in progress, and the reply that went back to the caller. Nothing here was retyped by a human.

Core capabilities.

Inbound call → ticket

Caller number matched to client. Voice captured, transcribed, summarised. Ticket created with caller metadata and audio transcript attached.

Status lookup by phone

Caller asks "what is the status of my case from yesterday?" — agent finds open tickets for the caller, reads summary + last technician note + SLA deadline.

Multi-language

Speaks RO / EN / DE / FR — picks language automatically from greeting, or per-client configuration.

Caller identification

Caller ID matched against client contact list. Falls back to asking for VAT / company code if unknown.

Handoff to human

Caller can ask for a technician at any time. Agent transfers to on-call rotation or warm-transfer to assigned technician.

Call recording + transcript

Every call recorded + transcribed. Attached to the ticket it created or updated. Retention per-client.

Service account auth

Dedicated `voice-agent@mspcorex.com` service account. API-key authenticated (SHA-256 hashed at rest). Pre-auth interceptor in the pipeline.

Rate limiting + IP allowlist

Configurable rate_limit_per_minute (default 30). `allowed_ips` JSON allowlist enforced at auth.

Full audit on every call

Every action the voice agent takes on behalf of a caller produces a normal audit event (voice-agent as actor). Chain-of-reasoning logged.

Per-tenant opt-in

Voice agent is off by default. Enabled per-tenant via `/admin/voice-agent/config`. API keys generated + revocable from the admin UI.

Business-hours routing

Can act as after-hours fallback only, or as primary line. Per-client schedule.

Escalation policies

SLA breach imminent → voice agent proactively calls the on-call technician with ticket brief.

// architecture

Asterisk PBX receives SIP calls (per-tenant DIDs). Asterisk routes to DGX inference server (voice model) via ARI/AGI/WebSocket. DGX authenticates to the MspCoreX API with a hashed API key (`voice_agent_api_keys` table, SHA-256 at rest). The voice agent runs through a dedicated pre-auth interceptor (`voiceAgentAuth.ts`) that sets the service-account identity before the normal pipeline (tenant context, ACL, audit). Every call produces the same audit events as a human technician would.

FAQ.

Does the AI handle every call?+

Per-client config. Options: always, after-hours only, overflow only (when no tech picks up in N seconds), or never.

What if the AI does not understand?+

Escalates to human: transfers to on-call rotation, or schedules a callback, or offers to send an email confirmation to the caller for the technician.

Does the call audio leave your infrastructure?+

No. Speech-to-text, the language model and the speech synthesis all run on the technician’s own GPU, on our own hardware. The recording and the transcript never leave it. Ticket text can reach a fallback provider on other AI features — every one of them is on our sub-processor register.

Privacy of recordings?+

Recording opt-in is enforced before the call starts (voice prompt). Recordings encrypted at rest. Retention per-client. Deletable on demand.

Which telephony provider?+

Any SIP trunk. We integrate through Asterisk PBX that we deploy + maintain (or connect to yours). Tested against major EU telephony providers.

Can it book callbacks instead of talking live?+

Yes — "leave a message" + "schedule a callback for tomorrow morning" flows are built in.

How is the AI instance isolated per-tenant?+

Each tenant has its own voice-agent API key, its own `allowed_ips`, and rate limit. Inference is shared infrastructure in EU but stateless per-call — no cross-tenant context.

Start with AI Technician (answers the phone, works the queue).