Chat agents
Chat-agent voor dierenartsen op Animana: Nijmeegse case
Een dierenartsenketen in Nijmegen met 22 mensen draait 1.420 boekingen per week via een chat-agent die spoedgevallen in 90 seconden triageert en nooit een euthanasie alleen boekt.

Het is vrijdag, 19:42. De receptioniste van de praktijk in Nijmegen is naar huis. Een hondenbezitter typt in de chat-widget op de homepage: "Mijn hond heeft net iets gegeten van de struik in het park, hij kwijlt extreem en kan niet stilstaan. Kan ik nu langskomen?" De telefoon wordt doorgeschakeld naar een dienst die €38 rekent om het bericht morgenochtend door te geven. De eigenaar wil geen morgenochtend. De hond heeft geen morgenochtend.
Dat moment kostte de keten vroeger drie dingen tegelijk: een verloren klant die naar de spoedkliniek in Arnhem reed, een gemist spoedconsult van €240, en het gezeur van een praktijkmanager die zaterdagochtend aan de telefoon hangt om excuses te maken. Acht weken geleden hebben we een chat-agent live gezet die dat gat dichtloopt. Deze post gaat over wat hij doet, wat we fout deden, en de twee ontwerpkeuzes die voorkomen dat hij een hond doodt.
Waarom een dierenartsenketen het slechtste testterrein is voor een generieke agent
De meeste chat-agent-demo's die je ziet zijn vastgeschroefd aan een SaaS-dashboard of een Shopify-winkel, waar het ergste dat kan gebeuren een verkeerde refund is en een boze mail. Een dierenartsenketen draait dat om. De ondergrens van een fout is een gemiste epileptische aanval. De bovengrens is een euthanasie die geboekt wordt door een overstuur familielid, zonder dat het dossier laat zien waarom de hoofdarts nog niet wilde.
De Nijmeegse keten heeft vier praktijken, 22 medewerkers (zes dierenartsen, de rest assistenten en een kleine balie), en draait alles op IDEXX Animana, een PIMS waar de praktijk sinds 2013 op werkt. Animana is goed in wat het doet. Het stamt ook van vóór het moderne API-tijdperk. Hun publieke endpoints geven toegang tot het patiëntdossier en de afspraakslots, en bijna niets anders wat we voor een triage-workflow zouden willen.
We hadden dus vanaf dag één twee beperkingen: de agent moest met klanten praten op een toon die een praktijkmanager niet voor schut zet, en hij moest in Animana kunnen schrijven zonder de facturatieketen van de praktijk te breken.
Wat de agent in de praktijk afhandelt
In een gemiddelde week pakt de agent 1.420 gesprekken op via drie kanalen: de website-widget, het WhatsApp Business-nummer, en een inbound mailparser. Ongeveer 71% daarvan zijn afspraakvragen (boeken, verzetten, vragen wanneer de praktijk open is op een feestdag), 18% zijn herhaalrecepten, en de resterende 11% verdelen zich over verzekeringsvragen, gedragsvragen ("mijn kat blaast naar de nieuwe baby") en één specifieke categorie die een eigen ontwerp verdient: dierlijke noodgevallen.
De agent antwoordt standaard in het Nederlands, Engels via een toggle. Hij verzint nooit medisch advies. De eerste systeeminstructie die we hebben geschreven, vóór alle orchestratiecode, was dat de agent er altijd vanuit moet gaan dat de mens zijn dier beter kent dan hij.
Een triagescore, geen triagebesluit
Het lastige aan elke veterinaire chat-agent is het verschil lezen tussen "ze eet wat minder" en "ze eet wat minder en haar tandvlees is bleek." Het eerste is een morgen-probleem. Het tweede is een nu-probleem.
We laten het model die afweging niet alleen maken. De agent draait een gestructureerd triage-interview dat uitkomt op een numerieke score van 0 tot 6, gewogen op respiratoire nood, neurologische signalen, trauma, inname en pijnindicatoren. De scoringsmatrix is gebouwd op de publieke AAHA-richtlijnen voor acute presentatie en bijgesteld door de hoofdarts in twee avonden met een stapel oude cases.
Alles wat boven de 4 scoort wordt binnen 90 seconden in een dierenartsen-queue gezet. Dat betekent drie dingen tegelijk: een geel kaartje in het Animana-dashboard met het chattranscript erbij, een push naar de telefoon van de dienstdoende arts, en een automatisch antwoord terug naar de eigenaar dat in begrijpelijk Nederlands zegt:
Een dierenarts kijkt nu naar uw bericht en belt u terug
binnen tien minuten. Als uw dier acuut achteruit gaat,
rijd dan direct naar {dichtstbijzijnde 24/7 kliniek}.
Het dichtstbijzijnde 24/7-adres wordt berekend uit de postcode van de eigenaar tegen een kleine lookuptabel met klinieken die we handmatig bijhouden. Postcode-lookup, geen model-call. We willen niet dat de agent op vrijdagavond een adres verzint.
We hebben de 90-seconden-SLA getoetst tegen 412 escalaties in de eerste twee maanden. In 408 daarvan hielden we het. De vier die hem misten, waren allemaal hetzelfde patroon: een lang openingsbericht van de eigenaar dat het model te lang stond te herlezen. We hebben het opgelost door het triage-interview te beperken tot één vervolgvraag wanneer het eerste bericht meer dan drie van onze hoog-gewogen tokens bevat (kwijlt, krampt, bewusteloos, bloed, ademen, en zo verder).
We laten het model niet triageren. We laten het interviewen. Een scoringsmatrix die de arts kan controleren is wat het systeem verdedigbaar maakt.
De euthanasie-poort
Dit is het stuk van de build waar ik het vaakst aan denk, omdat hier een kleine UX-beslissing een familie ofwel eert ofwel verwondt.
Euthanasie-boekingen liepen vroeger door dezelfde publieke planner als al het andere. Een eigenaar kon in principe op een dinsdagavond op de website klikken en een euthanasie-slot boeken voor woensdagochtend. De keten had er nog nooit een ramp van gehad, maar de hoofdarts had er al jaren stilletjes een ongemakkelijk gevoel bij. Er waren gevallen waarin het dossier een actief behandelplan liet zien waar de boekende eigenaar niets vanaf wist. Er waren gevallen waarin één familielid een beslissing aan het nemen was waarvan een ander familielid nog niet wist dat hij genomen werd.
Dus we hebben de publieke route helemaal weggehaald. De agent praat wel over euthanasie. Hij legt uit wat het consult inhoudt, welke kosten je kunt verwachten, en hoe de praktijk de crematie regelt (in samenwerking met het lokale dierencrematorium). Hij plaatst de boeking niet.
Elk verzoek tot euthanasie triggert een vier-ogen-review. De praktijkmanager opent het dossier in Animana, de hoofdarts van die patiënt bevestigt dat de boeking past bij de behandelgeschiedenis, en pas dan belt de praktijk de eigenaar terug om in te plannen. In acht weken heeft de poort drie boekingen tegengehouden waarvan de hoofdarts, na inzage, eerst met de familie wilde overleggen. Een van die gesprekken leidde tot nog twee weken palliatieve zorg waar de familie achteraf dankbaar voor was.
Bouw je een agent die in een klinisch of juridisch systeem kan schrijven, laat dan elke onomkeerbare actie eerst langs een mens lopen voordat de agent hem mag afronden. De kosten van die extra stap zijn één telefoontje. De kosten van overslaan zijn niet de jouwe om te betalen.
Praten tegen een 12 jaar oude PIMS
Animana heeft een gedocumenteerde REST API voor afspraken, patiëntdossiers en facturatie. Het heeft ook onderdelen die de publieke API niet dekt en waar de praktijk dagelijks op leunt, zoals het prikbord in het dossier waar artsen vrije-tekst-notities voor elkaar achterlaten.
We hebben de integratielaag in twee stukken gebouwd. Het eerste is een dunne Node-service die de Animana API aanspreekt voor de gedocumenteerde routes (boeken, patiënt opzoeken, factuurregels aanmaken). Het tweede is een queue: alles wat in Animana moet landen maar geen API heeft, wordt weggeschreven in een Postgres-tabel met een pending_human flag, en de praktijkmanager werkt die één keer per dag weg.
create table animana_pending (
id bigserial primary key,
kind text not null, -- 'dossier_note' | 'recall' | ...
patient_id text not null,
payload jsonb not null,
source_chat uuid references chats(id),
status text not null default 'pending_human',
created_at timestamptz not null default now(),
resolved_at timestamptz,
resolved_by text
);
create index on animana_pending (status, created_at);
We hebben de neiging weerstaan om de Animana-UI te scrapen om API-toegang na te bootsen waar die niet bestaat. Op andere projecten hebben we dat gedaan en hebben we er elke keer spijt van gekregen zodra de leverancier de UI aanpaste. De queue-tabel is lelijker in het architectuurdiagram. Hij is nog niet één keer kapotgegaan.
Bouw je tegen Animana aan, behandel de gedocumenteerde endpoints dan als waarheidsgetrouw maar traag: reken op zo'n 1,4 seconde per call op de slot-reader. We cachen de open slots van de komende 14 dagen in Redis en revalideren elke 90 seconden. De agent leest uit cache. Writes gaan direct door.
Hoe de cijfers er na twee maanden uitzien
Ik geef je de getallen die voor de praktijkmanager telden.
Geboekte afspraken per week: van een basislijn van 1.180 naar 1.420. Ongeveer twee derde van de stijging is vraag die eerder naar de antwoorddienst liep en daar verdween. Een derde is wrijving rond verzetten die de chat-agent wegneemt (een eigenaar verzet nu op zondag in 30 seconden een afspraak).
Inkomende telefoonminuten: 38% omlaag over de vier praktijken. Het balieteam heeft per week zo'n negen uur teruggewonnen, die ze hebben gebruikt om de recall-workflow weg te werken die altijd achterliep.
Triage-escalaties: 412 in 60 dagen. 27 daarvan waren echte spoedgevallen die sneller binnen waren dan via de telefoonboom. De hoofdarts schat in dat van twee van die gevallen waarschijnlijk de afloop voor het dier veranderde. Ik publiceer geen cijfer dat zichzelf "levens gered door chat-agent" noemt. Ik vertel je wel dat de hoofdarts het op een whiteboard in de praktijk had geschreven.
Euthanasie-boekingen: nul geplaatst door de agent. Drie tegengehouden door de vier-ogen-poort. Totaal aantal uitgevoerde euthanasie-consulten: ongewijzigd ten opzichte van de vorige periode.
Wat we twee keer fout hebben gedaan
Allebei de keren dat we de agent gedragsvragen lieten beantwoorden ("mijn kat haat plots de kattenbak") met een "dit zou de reden kunnen zijn"-patroon, trok de hoofdarts ons terug. De agent beantwoordt gedragsvragen nu met "dit verdient een gedragsconsult, dit kost het, dit zijn twee tijden deze week" en stopt daar. Het model wil graag behulpzaam zijn. De praktijk hoeft niet dat hij diagnoses stelt.
De vorm van een agent die je kunt vertrouwen waar de inzet hoog is
De hoofdarts zei iets in de kickoff waar ik sindsdien op kauw: "Ik hoef niet dat de chat slim is. Ik hoef dat hij voorzichtig is." Voorzichtigheid is een discipline, geen modelparameter. Het is een triage-scoringsmatrix die een auditor kan lezen. Het is een queue-tabel die eerlijk is over wat niet geautomatiseerd kan worden. Het is een onomkeerbare actie die altijd langs een mens loopt.
Toen we de chat-agent bouwden voor de Nijmeegse keten, was het ding waar we tegenaan liepen dat hoe veiliger de agent werd, hoe meer de praktijk hem vertrouwde met aangrenzende workflows die we niet hadden ingepland. In de tweede maand vroegen ze ons om dezelfde triage-ruggengraat in te pluggen in hun intake-formulier voor de wildopvang. Dat is het juiste soort scope creep. Dit werk doen we onder AI-agents, en de integratievorm (queue plus vier ogen plus scoringsmatrix) is portable. Werk je een praktijk op een verouderde PIMS en kun je één workflow beschrijven die voorzichtig moet zijn, dan is dat genoeg om te beginnen.
Het vijf-minuten-ding om vandaag te doen is opschrijven welke ene actie je team uitvoert waarvan je nooit zou willen dat een agent hem alleen neemt. Dat is je vier-ogen-poort. Al het andere kan eromheen.
Kern
We laten het model niet triageren. We laten het interviewen. Een scoringsmatrix die de arts kan controleren is wat het systeem verdedigbaar maakt.
FAQ
Mag een chat-agent in Nederland veterinaire triage uitvoeren?
De agent triageert niet. Hij doet een gestructureerd interview en produceert een score die een geregistreerde dierenarts beoordeelt. Het klinische besluit blijft bij de dierenarts, en dat is wat de Nederlandse beroepsregels vereisen.
Waarom integreren met Animana in plaats van het te vervangen?
Een PIMS vervangen waar twaalf jaar aan patiëntdossiers, facturatiehistorie en laboratoriumkoppelingen in zit, is een meerjarig project. Er een voorzichtige agent-laag omheen bouwen kost weken en laat elke bestaande workflow intact.
Wat houdt de agent ervan tegen om direct een euthanasie-consult te boeken?
Een harde regel in de orchestratielaag. Euthanasie-intenties bereiken nooit het Animana boeking-endpoint. Ze komen in een review-queue die vereist dat zowel de praktijkmanager als de hoofdarts van de patiënt tekenen voordat er ingepland wordt.
Hoe ga je om met spoedgevallen buiten openingstijden die de agent niet kan oplossen?
Elke triagescore boven 4 triggert een fallback-bericht met de dichtstbijzijnde 24/7-kliniek, berekend uit de postcode. De dienstdoende arts krijgt binnen 90 seconden ook een push, maar de eigenaar krijgt te horen dat hij direct moet rijden als het dier achteruitgaat.