Voice agents
Voice agents in de thuiszorg: een Wkkgz-veilige lijn live
Een voice agent die dagelijks 220 medicatiecontroles afhandelt onder de Wkkgz, en rode vlaggen direct in de Nedap Ons-sessie van de wijkverpleegkundige laat landen.

Het telefoontje van 7:15
Het is 7:15 op dinsdagochtend. De dienstdoende wijkverpleegkundige zit aan de keukentafel bij een cliënt, tablet open in Nedap Ons, ze vinkt het ochtendbezoek af. Haar werktelefoon trilt. Drie straten verderop heeft de voice agent net een medicatiecontrole gedaan. De cliënt viel negen seconden stil bij de vraag over haar insuline, en zei toen: "Ik denk dat ik 'm al heb gehad." In dezelfde Ons-sessie die de verpleegkundige al open had, verschijnt een handoff-kaart. Ze schakelt niet van app. Ze pakt geen papieren lijstje. Ze tikt door naar het cliëntdossier en belt terug.
Dat moment, de handoff binnen de Ons-sessie, is de reden dat dit project überhaupt live ging. Al het andere (het model, de prompts, de call routing, de Nederlandse ASR) was oplosbaar. Het lastige probleem was dat je een verpleegkundige op een scooter tussen twee bezoeken niet kunt vragen om drie apps te onthouden.
We bouwden deze voice agent voor een middelgrote Nederlandse thuiszorgaanbieder die in twee regio's zo'n 220 medicatiecontroles per dag draait. De agent belt de cliënt, stelt vier vragen, luistert, en markeert de call als schoon of escaleert een rode vlag naar een specifieke verpleegkundige die dienst heeft. Alles valt onder de zorgplicht uit de Wkkgz, wat betekent dat het audittrail een IGJ-bezoek moet overleven en elke escalatie binnen de werkminuut bij een mens moet landen.
Hierna volgt het draaiboek, in de volgorde waarin we het bouwden.
De Wkkgz-randvoorwaarde
De Wkkgz (Wet kwaliteit, klachten en geschillen zorg) is geen checklist. Het is een plicht om "goede zorg" te leveren, en de aangewezen zorgverlener blijft verantwoordelijk voor wat een systeem namens hem of haar doet. Voor een voice agent zijn drie dingen relevant.
Ten eerste: de agent mag geen medisch advies geven. Hij mag vragen, luisteren, loggen en escaleren. Op het moment dat hij stuurt op een klinische beslissing (nu innemen, dosis overslaan, dubbel pakken) overschrijd je een grens die de inspectie bij een audit zal trekken. We hebben dit in de system prompt als harde weigering vastgelegd, en in de post-hoc classifier als alarm.
Ten tweede: elke interactie moet een leesbaar spoor achterlaten in een systeem dat de aanbieder al gebruikt. Geen parallel dashboard. Geen CSV in S3. Het bestaande cliëntdossier van de verpleegkundige. Voor deze aanbieder betekende dat Nedap Ons, het dominante ECD in de Nederlandse thuiszorg.
Ten derde: een escalatie is geen notificatie. Het is een gerichte overdracht. "Hier moet iemand naar kijken" is niet Wkkgz-veilig. "Marieke heeft dienst tot 10:00, dit staat in haar wachtrij, hier is het transcript" wel.
Als je voice agent stilletjes in een leegte kan falen, is het geen zorg-agent. Het is een aansprakelijkheid. Bouw het escalatiepad voordat je het model bouwt.
Intentiemodel, geen scriptboom
De eerste versie die we scopeten was een beslisboom. Vraag één splitst in A of B, vraag twee in C of D, de agent loopt de boom af. We hebben hem na twee dagen pilotgesprekken weggegooid.
Oudere cliënten antwoorden niet in takken. Ze antwoorden in verhalen. "Nou, de pillen lagen op het aanrecht, maar mijn dochter kwam langs en ik denk dat ze ze heeft verplaatst, en toen had ik mijn koffie, en ja de oranje heb ik volgens mij wel gehad." Een boom kan daar niets mee. Een intentiemodel wel.
We kwamen uit op vijf intenties die de agent na elke beurt classificeert:
- confirmed: de cliënt heeft de medicatie duidelijk op tijd ingenomen
- refused: de cliënt kiest er bewust voor om hem niet te nemen
- uncertain: de cliënt weet het niet meer of spreekt zichzelf tegen
- side-effect: de cliënt noemt een symptoom (misselijk, duizelig, gevallen)
- distress: kortademigheid, verwardheid, pijn, "ik voel me niet goed"
Confirmed en refused sluiten de call. De andere drie escaleren, met verschillende urgentie.
type Intent =
| "confirmed"
| "refused"
| "uncertain"
| "side-effect"
| "distress";
interface TurnResult {
intent: Intent;
confidence: number; // 0..1
evidence: string; // verbatim quote from transcript
red_flags: string[]; // e.g. ["mentions_fall", "slurred_speech"]
escalate: boolean;
urgency: "none" | "minutes" | "now";
}
Het model geeft dit na elke beurt van de cliënt terug, niet alleen aan het einde. Springt urgency midden in een call op now, dan stopt de agent met het script, zegt één rustige zin ("Ik laat een verpleegkundige u zo terugbellen, blijft u alstublieft aan de lijn als dat lukt"), en triggert de handoff. Hij probeert de vragenlijst niet af te maken.
De Nedap Ons-handoff
Hier struikelen de meeste voice-agent-projecten in de Nederlandse zorg. De agent kan perfect zijn. Als het resultaat in een apart dashboard staat waar de verpleegkundige op in moet loggen, is de workflow dood bij aankomst.
Nedap Ons heeft een API en een webhook-oppervlak voor partners. De vorm: cliënt geïdentificeerd via een BSN-afgeleide hash, een gestructureerde notitie naar het cliëntdossier met een getypeerde categorie, en een taak toegewezen aan de dienstdoende verpleegkundige met een deep link naar het transcript. De handoff-payload ziet er ongeveer zo uit:
{
"client_ref": "ons:client/8f3a...",
"event_type": "medication_check.escalation",
"urgency": "minutes",
"summary": "Cliënt weet niet zeker of insuline is ingenomen. Pauze van 9 sec, antwoord tegenstrijdig.",
"transcript_url": "https://agent.zorg.example/calls/2026-06-09T07-15-12Z",
"intent": "uncertain",
"evidence": "Ik denk dat ik 'm al heb gehad",
"assigned_to": {
"kind": "on_call_role",
"role": "wijkverpleegkundige_oost",
"fallback_after_minutes": 4
},
"agent_version": "voice-2026.06.02"
}
Drie details verdienen hun plek.
De samenvatting is Nederlandstalig en leest alsof een verpleegkundige hem geschreven heeft. Engelstalige samenvattingen hebben we getest, ze werden genegeerd. De dienstdoende verpleegkundige ziet dit op een scherm van 6,1 inch tussen twee bezoeken in. Het moet in twee seconden binnenkomen.
De fallback-timer is geen extraatje. Heeft de toegewezen verpleegkundige de taak na vier minuten niet geopend, dan escaleert hij naar de teamleider. Vier minuten kwam uit de werkelijke responstijdverdeling die we in de pilot zagen. De jouwe wordt anders.
De agent_version zit in de payload omdat een IGJ-audit uiteindelijk zal vragen welke versie van de agent een bepaalde beslissing nam. Bak het er vanaf dag één in.
Keuzes in de voice-stack
De voice-stack zelf is het saaie deel. Een SIP-trunk in een telefonielaag die audio bidirectioneel streamt, een op Nederlands afgestemde ASR, een model in het midden voor intentieclassificatie en respons, en een Nederlandse TTS die niet klinkt als een tomtom uit 2012.
Een paar dingen leerden we op de harde manier.
Nederlandse ASR op oudere stemmen, via een 4G-mobielverbinding, met een grasparkiet op de achtergrond, is niet hetzelfde probleem als de demo op de marketingpagina van de vendor. We hebben barge-in standaard uitgezet (laat de cliënt uitpraten), de drempel voor stiltedetectie naar 1,8 seconde gezet, en een klein eigen vocabulaire gebouwd voor merknamen van medicatie (Metformine, Sintrom, Furosemide en consorten). Alleen al dat vocabulaire bracht de misherkenningen flink omlaag in onze interne evaluatieset. Het percentage publiceren we niet, want die set is klein en niet van jou.
Voorbij een bepaalde drempel telt latency zwaarder dan modelkwaliteit. Een respons van 400ms voelt als een gesprek. Een respons van 1100ms voelt alsof de lijn wegvalt. De cliënt hangt op. We kozen een kleiner, sneller model voor de intentieclassificatie per beurt, en een groter model voor de offline samenvatting na het gesprek die in Ons landt.
Getallen en tijdstippen zijn het faalpunt waar niemand je voor waarschuwt. "Half acht" parseert prima. "Tegen achten" niet. Bouw de testset op echte opnames voordat je een model gelooft dat een getal extraheert.
De rode-vlag-taxonomie
De rode vlaggen zijn niet willekeurig. Het klinische team is eigenaar van deze lijst. Wij faciliteerden, zij beslisten. Na drie workshops zag de productie-taxonomie er zo uit:
- Direct (urgency: now): pijn op de borst, kortademigheid, verwardheid, melding van een val in het afgelopen uur, brijige spraak, "ik voel me niet goed" zonder verdere context.
- Binnen enkele minuten (urgency: minutes): twijfel over een antistollings- of insulinedosis, geweigerde dosis zonder uitleg, melding van misselijkheid of duizeligheid, melding van een val langer dan een uur geleden.
- Binnen het bezoek (urgency: none, wel gemarkeerd): dragelijke bijwerkingen, signalen rond stemming, hints op sociaal isolement.
Het werk van het model is classificeren in een van deze. Het werk van de verpleegkundige is bepalen wat ze ermee doet. We laten de agent nooit de actie voorstellen.
Audittrail voor de IGJ
Elke call wordt vastgelegd met de geluidsopname, het streamende transcript, de intentieclassificaties per beurt met confidence, de uiteindelijke samenvatting, eventueel de handoff-payload, en de gebruikte modelversies. Opslag staat in EU-region buckets met 7 jaar retentie, conform de bewaartermijn van het medisch dossier. Toegang loopt via dezelfde SSO die de aanbieder al voor Ons gebruikt.
We bieden een read-only auditorweergave waarmee een kwaliteitsfunctionaris elke call kan oproepen, de hele keten kan zien en een PDF kan exporteren. We hebben bij deze klant nog geen IGJ-bezoek gehad, maar we hebben de export gebouwd tegen de openbaar gepubliceerde inspectiekaders voor digitale zorg van de IGJ.
Failure modes waar we op anticipeerden
De zorg is niet de plek om te leren dat je agent kan hallucineren. We wisten dat hij dat zou doen. De vraag was: wat laten we hem dan doen?
Drie guardrails zijn cruciaal.
De agent heeft een harde weigerlijst. Elke klinische instructie, elk doseringsadvies, elk "ja ik denk dat u 'm beter kunt overslaan" wordt door een classifier na de generatie afgevangen en vervangen door de rustige escalatieregel. We loggen de weigering zodat we de prompt kunnen bijstellen.
De agent heeft een maximumaantal beurten. Zes beurten en de call eindigt, escalatie of niet. Dat beschermt tegen loops waarin een verwarde cliënt en een verward model elkaar omlaag trekken.
De agent heeft geen tool-toegang buiten loggen en de handoff. Hij kan de apotheek niet bellen. Hij kan geen bezoek verzetten. Hij kan geen sms versturen. De afgelopen maand stonden er gestaag voorpaginaverhalen over agents die op hol slaan in developer-omgevingen, en parallel een discussie over hoeveel retentie redelijk is voor de aanbieders erachter. Niets daarvan verandert een zorgbriefing. Je gaat ervan uit dat het model fout zal gaan. Je bouwt een systeem waar het ergste wat hij kan is een transcript loggen en een verpleegkundige bellen.
Een voice agent in de zorg verdient zijn bestaan bij de handoff, niet in het gesprek. Optimaliseer de seconde waarop de mens overneemt, niet de negentig seconden daarvoor.
Wat er na week twee veranderde
Twee weken in de pilot hebben we drie vragen uit de vragenlijst geschrapt. Ze waren technisch zinvol, klinisch interessant, en maakten het gesprek dertig seconden langer. Die dertig seconden waren het verschil tussen een completion rate van 85% en eentje van 71%. We hielden de vier vragen die de dienstdoende verpleegkundige daadwerkelijk gebruikte, en zetten de rest in het bezoekformulier dat een verpleegkundige toch al invult.
We pasten ook de openingszin aan. De eerste versie begon met: "Goedemorgen, ik bel namens [aanbieder] voor uw medicatiecontrole." Cliënten hingen op. Ze dachten dat het een enquête was. De tweede versie zei: "Goedemorgen mevrouw De Vries, ik bel even kort om te controleren of de ochtendmedicatie goed is gegaan." Cliënten bleven aan de lijn. Specifiek wint van een script, ook in een robotstem.
Het kleinste dat je vandaag kunt doen
Draai je een operatie met terugkerende uitgaande gesprekken onder enige vorm van zorgplicht? Loop dan één dienst mee met degene die de escalaties oppakt. Kijk welke app die persoon de hele dag open heeft. Daar moet jouw handoff landen. Niet in jouw dashboard. In dat van hen.
Toen we deze voice agent voor de thuiszorgaanbieder bouwden, kwamen we steeds terug op hetzelfde: het model was het makkelijke deel. De Nedap Ons-handoff en het Wkkgz-audittrail maakten het project pas leverbaar. Zo gaat het meestal.
Kern
Een voice agent in de zorg verdient zijn bestaan bij de handoff, niet in het gesprek. Optimaliseer de seconde waarop de mens overneemt, niet de negentig seconden daarvoor.
FAQ
Mag een voice agent onder de Wkkgz medicatieadvies geven?
Nee. De zorgplicht uit de Wkkgz ligt bij de aangewezen zorgverlener. Een voice agent mag vragen, luisteren, loggen en escaleren. Alles wat als klinisch advies leest, moet worden afgevangen en naar een mens worden gerouteerd.
Waarom routeren naar Nedap Ons in plaats van een apart dashboard?
Verpleegkundigen werken tijdens hun dienst al in Ons. Een parallel dashboard betekent één app extra om te openen en één ding extra om te vergeten. Een handoff binnen Ons landt in de workflow waar de verpleegkundige al in zit.
Hoe snel moet de escalatie-handoff zijn?
Bij urgency 'now' wil je dat een specifieke verpleegkundige de kaart binnen de werkminuut ziet. Wij gebruiken een fallback van vier minuten naar een teamleider, afgestemd op de werkelijke responstijdverdeling uit de pilot.
Wat gebeurt er als de cliënt niet opneemt?
Twee pogingen opnieuw, vijftien minuten uit elkaar. Na de derde gemiste poging wordt de call in Ons gemarkeerd als 'geen contact', zodat de dienstdoende verpleegkundige kan beslissen of ze persoonlijk langsgaat.
Is een opname van het gesprek nodig voor het audittrail?
Ja, naast het transcript, de classificaties per beurt, de uiteindelijke samenvatting en de modelversies. Opslaan in EU-region met 7 jaar retentie, conform de bewaartermijn van het medisch dossier.