← Blog

Voice agents

Voice agents in de zorg: een Wkkgz-proof escalatieplan

Op een dinsdag om 17:48 klokt de laatste receptioniste uit. De voicemail telt nog 38 berichten. Woensdagochtend is de orthopedisch chirurg iemand een callback schuldig.

Jacob Molkenboer· Oprichter · A Brand New Company· 20 jun 2026· 9 min
Crèmekleurige Bakelieten telefoonhoorn op groen vilt, ivoren agenda met groen lint, koperen bel, rood lakzegel.

Op een dinsdag om 17:48 klokt de laatste receptioniste uit bij een orthopedische kliniek in Maastricht met 24 medewerkers. De voicemail telt nog 38 berichten. De meeste stellen niks voor: patiënten die vragen of ze al onder de douche mogen over het litteken, of de nieuwe fysiotherapeut-slot van 09:20 in het Tongersestraat- of het Brusselseweg-pand zit. Statistisch zit er één tussen met 39,1 °C zes dagen na een totale knieprothese. De volgende ochtend is dat gesprek twaalf uur oud en heeft de Wkkgz-incidentmeldingsplicht al die tijd doorgetikt op zijn 24-uursklok.

De kliniek schakelde ons eind 2025 in om dat scenario onmogelijk te maken. Hieronder de playbook — elke draad, elke prompt, elk regelgevingsrandje — zodat je kunt overnemen wat werkte en de week kunt overslaan die wij verbrandden.

De randvoorwaarde die het systeem ontwerpt

De Wkkgz (Wet kwaliteit, klachten en geschillen zorg) verplicht zorgaanbieders om een calamiteit met schade voor de patiënt binnen 24 uur te melden bij de IGJ. Voor een postoperatieve orthopedische kliniek valt onder "iedere calamiteit" ook een gemist signaal van een diepe infectie — en de jurisprudentie is al jaren helder: een voicemail waar niemand naar luisterde is geen verweer.

Die ene zin bepaalde elke volgende keuze. De voice agent is geen arbeidsbesparing. Het is een toezichthouder-gericht systeem met als eerste taak nooit stilletjes een melding inslikken. Dat de receptioniste elf uur per week overhoudt, is een neveneffect.

Volume en vorm

De kliniek krijgt ruwweg 1.420 inkomende gesprekken per week, het grootste deel tussen 07:30 en 09:30 en tussen 16:00 en 18:30. Driekwart is routine: afspraken verschuiven, parkeervragen, fysiotherapeut-afspraken. Zo'n 18% zijn klinische vragen die een verpleegkundige in twee minuten beantwoordt. Ongeveer 6%, tachtig tot negentig gesprekken per week, zijn postoperatieve check-ins voor een knie- of heupprothese uit de afgelopen 90 dagen. Daarvan bevat een handvol per week een signaal — koorts, zwelling of wondvocht — dat juridisch binnen uren getrieerd moet worden, niet binnen dagen.

Dit los je niet op met een chatbot op de website. De patiëntengroep is 58 tot 84 jaar oud. Die belt.

Stack zoals 'ie is, niet zoals je 'm wilt

Het EPD is ChipSoft HiX, twaalf jaar diep ingebakken in de eigen tenancy van de kliniek. Afspraken, OK-verslagen en ontslaginstructies staan daar. Er is geen gedocumenteerde publieke REST API. Er is een HL7v2-koppellaag die de leverancier op verzoek aanzet, en een SOAP-service achter een VPN. Daarmee moesten we het doen.

Het fysiotherapeut-rooster zit in een zelfgebouwde kalender op Exchange Server 2016 — ja, de versie waarop Microsoft in oktober 2025 de support stopte. Migreren stond niet in de scope en niet in het budget. We moesten ermee praten zoals 'ie was, over EWS, en doen alsof 'ie er volgend jaar nog steeds zou staan. Bouw je in 2026 tegen een Exchange 2016 aan, dan schrijf je code op een lont; reken de migratie mee in dezelfde opdrachtbrief, of accepteer dat één van je twee systemen één CVE verwijderd is van een gedwongen omschakeling.

Architectuur in één diagram

Het belpad is met opzet kort. Elke hop is een plek waar een voor de toezichthouder relevant signaal kan sterven.

  PSTN
   |  (Voys, NL geographic numbers)
   v
 SIP gateway --> Voice agent (LLM + ASR/TTS, NL-only)
                     |
                     +--> HiX adapter (HL7v2 / SOAP over VPN)
                     |      - patient lookup by BSN-hash + DOB
                     |      - recent surgery (<= 90 days?)
                     |      - write back: contact note + escalation flag
                     |
                     +--> Exchange 2016 adapter (EWS, NTLM)
                     |      - find / move fysiotherapeut slot
                     |      - write iCal invite
                     |
                     +--> Triage router
                            - score >= T   --> Surgeon queue       (SLA: 40s)
                            - score mid    --> Verpleegkundige     (SLA: 30m)
                            - score low    --> Async callback      (SLA: 4h)

Alles wordt twee keer gelogd: één keer in HiX als contactnotitie, één keer in een append-only audit-store die de Functionaris Gegevensbescherming van de kliniek aan de IGJ kan overhandigen zonder dat wij ertussen zitten. Die audit-store is het artefact waarop we slapen.

De gespreksgraaf, niet de prompt

Wie nog nooit een voice agent live heeft gezet, grijpt naar één prompt. Wie er wel één live heeft staan, grijpt naar een graaf. Een graaf overleeft onderbrekingen, dialect, gehoorapparaten, wachtmuziek die op de lijn terugbleedt, en de patiënt die de eerste vraag beantwoordt met een verhaal over haar kleinzoon.

Onze top-level-graaf heeft elf nodes. De node die zichzelf terugverdient is postop_screen, die afgaat zodra HiX een OK uit de afgelopen 90 dagen teruggeeft:

node: postop_screen
guards:
  - patient.last_surgery.days_since <= 90
say: |
  Voor we verder gaan - hoe gaat het met de wond?
  Heeft u koorts gemeten vandaag? En zo ja, hoeveel graden?
extract:
  - field: temperature_c
    type: number
    range: [34.0, 42.5]
    on_missing: ask_once_then_skip
  - field: wound_drainage
    type: enum
    values: [geen, helder, troebel, bloederig, pus]
  - field: pain_increase_24h
    type: boolean
route:
  - when: temperature_c >= 38.5 OR wound_drainage in [troebel, pus]
    to: escalate_surgeon
  - when: temperature_c >= 37.8 OR pain_increase_24h == true
    to: escalate_verpleegkundige
  - else: continue

Twee dingen die je mag overnemen. Eén: het temperatuurbereik is afgebakend — we hebben agents "honderdvijftig graden" als 150 zien accepteren en als kritiek routeren. Twee: ask_once_then_skip betekent dat we een patiënt nooit vasthouden in een lus voor één ontbrekend antwoord. Weet ze haar temperatuur niet meer, dan escaleert de agent alsnog. Stil overslaan is erger dan te veel escaleren.

De 40-seconden-SLA, mechanisch

"Binnen 40 seconden" is geen marketinggetal. Het is de tijd tussen de escalatiebeslissing van de agent en een mensenstem op de lijn. We hebben elk onderdeel op dag één gemeten en achterstevoren begroot:

  • Triagebeslissing (LLM + regels): 1,4 s p95
  • HiX-schrijfactie van de escalatievlag: 2,1 s p95
  • Queue-melding naar de dienstdoende chirurg: 0,8 s
  • Chirurg-toestel rinkelt + opnemen (3 toestellen, parallel): 28 s p95
  • Bridge en contextoverdracht (TTS leest de gestructureerde notitie in NL voor): 6 s

Daarmee houden we ongeveer twee seconden speling over. De harde lijn is parallel bellen: bureautelefoon, DECT en een mobiel via Voys, alle drie tegelijk. Sequentieel bellen sloopt de SLA elke keer en daar leveren we er geen één meer van uit.

Neemt geen enkele chirurg binnen de SLA op, dan paginat het systeem een tweede laag (chef de clinique plus dienstdoende internist) en stempelt het auditlog een missed-SLA-marker. In productie hebben we de tweede laag nog niet hoeven gebruiken, maar de testsuite raakt 'm elke nacht aan.

HiX-integratie zonder echte API

Het HL7v2-pad is broos. Berichten komen soms in de verkeerde volgorde aan, ACKs verlopen wel eens, en de SOAP-endpoint dropt stilletjes een veld als de patiëntnaam een apostrof bevat (ja — we hebben dit gelogd en de leverancier weet ervan). Wij behandelen HiX als eventually-consistent en idempotent aan onze kant: elke schrijfactie krijgt een deterministische message ID en we sturen opnieuw bij een uitblijvende ACK met backoff. Eerst schrijven we de contactnotitie, dan de escalatievlag. Faalt die tweede schrijfactie, dan heeft de chirurg via de notitie alsnog de context.

We hebben overwogen om HiX via de desktopclient te scrapen. We hebben besloten van niet. RPA op een EPD is het soort beslissing dat er in week zes slim uitziet en bij de eerste audit nalatig.

Het Exchange 2016-probleem

EWS werkt nog. NTLM werkt nog. Wat niet werkt is throughput: meer dan zo'n acht gelijktijdige EWS-sessies en de RPC-laag van de server begint stilletjes te throttlen — er komt verouderde agenda-data terug, zonder foutmelding. Fysiotherapeut-slots waren vrij in de mond van de agent en een uur later dubbel geboekt.

De fix was een single-writer queue vóór EWS. Elke slot-read en elke slot-write loopt via één proces, geserialiseerd, met een cache van één seconde. Throughput is geen probleem omdat het belvolume human-scale is. De patiënt merkt er niks van. De receptioniste kreeg binnen een week geen dubbelboeking-belletjes meer.

Taal, accent en de medeklinkers die ertoe doen

Limburgse patiënten spreken niet altijd standaardnederlands. Onze ASR-baseline miste "knie" als "nie" in zo'n 4% van de gevallen, wat geen probleem is, en miste "koorts" als "korst" in zo'n 1,2%, wat dat wél is. We hebben de recogniser fine-tuned op zo'n 40 uur opgenomen intake-gesprekken (met toestemming, geanonimiseerd, getekend door de FG), waarna de koorts-verwarring onder 0,2% zakte. De les: de woorden die je niet kunt verliezen, zijn een klein lijstje. Stop de moeite daarin, niet in een generiek accentmodel.

We hielden de agent met opzet eentalig Nederlands. Een patiënt die halverwege overschakelt naar Engels triggert een overdracht naar een mens. De prijs van een verkeerde escalatie in het Engels is hoger dan die van één extra overdracht.

Wat de toezichthouder écht wil zien

Voor zover wij weten heeft de IGJ nog geen voice agent in een Nederlandse kliniek geaudit. De norm die ze zullen toepassen is dezelfde als bij elk ander klinisch triagesysteem: was het protocol expliciet, is het gevolgd, en is de beslissing gelogd op een manier die een derde partij kan reconstrueren?

De audit-store beantwoordt alle drie. Elk gesprek levert een JSON-record op met het transcript, de geëxtraheerde velden, de routingbeslissing, de regel die afging, de versie van de promptgraaf, en de timestamp op elke hop. Hij wordt zeven jaar bewaard, zoals de Wkkgz verwacht. Het is het saaie artefact dat de rest van het systeem verdedigbaar maakt.

Kort gezegd

Een voice agent in de zorg is geen keuzemenu met een LLM eraan vastgeschroefd. Het is een gereguleerd triagesysteem waarvan de zwaarste eis is het gesprek aan een mens te verliezen binnen een deadline die je niet mag missen.

Wat we anders zouden doen

Drie dingen. We zouden de audit-store eerder bouwen dan de gespreksgraaf, niet later. We zouden de Exchange-migratie al in week één van het project meebegroten, ook als de klant tegensputtert. En we zouden de eerste productiecohort niet 90 dagen aan patiënten in één keer laten zijn. De eerste twee weken draaiden we op 20% verkeer met een receptioniste die de queue dubbel meeluisterde, en dat ving het koorts/korst-issue net op tijd op.

De bredere les is niet specifiek voor klinieken. Elke voice agent die een gereguleerde beslissing raakt, ontwerp je rond de overdracht eerst en het gesprek tweede. Het chatten is tegenwoordig het makkelijke deel. Het auditlog, de SLA en het faalgedrag wanneer het model fout zit — daar zit het echte werk.

Toen we de voice agent bouwden voor deze Maastrichtse kliniek, bleven we onderschatten hoeveel van het project leefde in de naden tussen twee oude systemen waar niemand meer eigenaar van was. We schreven uiteindelijk meer lijm dan agent, en dat was de juiste verhouding.

Wil je je eigen setup vandaag stresstesten: meet de tijd tussen "jouw systeem besluit dat dit gesprek een mens nodig heeft" en "een mens zegt hallo". Zit je boven de 60 seconden, dan heb je een ontwerpprobleem, geen bezettingsprobleem.

Kern

Kan je voice agent het gesprek niet binnen 40 seconden aan een mens overdragen, dan past 'ie niet op een Wkkgz-gereguleerde triagelijn — ontwerp de overdracht eerst, het gesprek tweede.

FAQ

Waarom een voice agent en geen chatbot voor postoperatieve nazorg?

De patiëntengroep is 58 tot 84 jaar oud en pakt overwegend de telefoon. Een webchatbot mist de gesprekken die ertoe doen — de postop-koorts om 18:30 van iemand die het patiëntenportaal niet gebruikt.

Hoe integreer je met ChipSoft HiX als er geen publieke REST API is?

Vraag de leverancier om de HL7v2-koppellaag en de SOAP-service over VPN aan te zetten. Behandel alle schrijfacties als idempotent met deterministische message IDs, en stuur opnieuw bij een uitblijvende ACK met backoff.

Is integreren tegen Exchange 2016 veilig in 2026?

Nee. Mainstream- en extended support eindigden op 14 oktober 2025. EWS functioneert nog, maar je begroot in dezelfde opdrachtbrief een migratie naar Exchange Online of een andere agenda-backend.

Wat vereist de Wkkgz van een AI-triagesysteem?

Een expliciet protocol, bewijs dat het protocol gevolgd is, en een log die een derde kan reconstrueren. Calamiteiten met schade voor de patiënt moeten binnen 24 uur bij de IGJ gemeld worden.

Hoe garandeer je een overdracht naar een mens binnen 40 seconden?

Bel parallel drie toestellen (bureau, DECT, mobiel) op het moment dat de triagebeslissing afgaat, schrijf de gestructureerde context vooraf naar HiX, en pagineer automatisch een tweede laag als niemand binnen de SLA opneemt.

voice agentsai agentsintegrationsoperationscase studyworkflow

Iets bouwen?

Start een project