Agents & Tools in detail
Bijlage bij V2 — 7 AI-agents handelen een vergunning af. Hier staat per agent welke knowledge files en tools hij gebruikt, en per tool wat echt opgehaald wordt — met echte voorbeeld-responses uit de live PoC.
Overzicht — welke agent gebruikt welke tools?
| Agent | Model | Tools | Knowledge files (klikbaar) |
|---|---|---|---|
| Intake | Llama 3.3 70B (Groq) + Claude Haiku 4-5 voor classifier | 5 | |
| RO-bot | Llama 3.3 70B (Groq) | 6 | |
| Bbl-toetsing | Claude Opus 4-6 (Anthropic) | 8 | |
| Beschikking | Claude Sonnet 4-6 (Anthropic) | 6 | |
| WKB-controle | Llama 3.3 70B (Groq) | 4 | |
| Meldingen | Llama 3.3 70B (Groq) | 3 | |
| Publicatie | Llama 3.3 70B (Groq) | 4 |
Klik op een knowledge file om de inhoud te zien — of bekijk het volledige overzicht.
De agents in detail
Intake-agent
groq/llama-3.3-70b-versatile + anthropic/claude-haiku-4-5Beoordeelt of aanvraag compleet is. Krijgt vooraf pre-classificatie van elke PDF mee (door Claude Haiku) zodat 'BA-01.pdf' herkend wordt als 'plattegrond + gevelaanzicht + doorsnede in 1 bestand', niet alleen als bestandsnaam.
get_indieningsvereistenget_pdf_infoclassify_document_by_contentextract_drawing_infoclassify_uploads (pre-step)System prompt (kern) →
Je bent de INTAKE-AGENT van een Nederlandse gemeente voor omgevingsvergunningen. WERKWIJZE: 1. Haal wettelijke vereisten op via get_indieningsvereisten. 2. Tel ALLE aanwezige document-types op (geclassificeerd_als + ook_aanwezig per file). 3. Streep vereisten weg tegen die verzamelde types. 4. Alleen wat ECHT ontbreekt = 'ontbrekende_documenten'. Een PDF die heet "BA-01.pdf" maar volgens classifier een 'plattegrond' is met "ook_aanwezig: ['situatietekening', 'gevelaanzicht', 'doorsnede']" bevat, dekt VERSCHILLENDE wettelijke vereisten in 1 bestand.
RO-bot (Ruimtelijke Ordening)
groq/llama-3.3-70b-versatileToetst of activiteit past binnen omgevingsplan, monumentstatus, en natuurwaarden. Combineert 4 live API's met 2 mocks.
pdok_adres_lookupregels_op_kaartlokale_regelgeving_zoekcheck_monumentencheck_natuurwetten_lookupSystem prompt (kern) →
Je bent de RO-BOT (Ruimtelijke Ordening agent). Voor elke aanvraag: 1. Geocodeer het adres (pdok_adres_lookup) → coordinaten + gemeente 2. Haal omgevingsplan-regels op (regels_op_kaart) 3. Zoek decentrale verordeningen (lokale_regelgeving_zoek) 4. Check monumentstatus (check_monumenten) 5. Check natuurwaarden (check_natuur) 6. Raadpleeg landelijke wet indien relevant (wetten_lookup) Geef oordeel: BINNENPLANS / BINNENPLANS_MET_AFWIJKING / BUITENPLANS / STRIJDIG
Bbl-toetsing agent ⭐
anthropic/claude-opus-4-6Doet de zwaarste taak: inhoudelijke toets tegen Bbl Hoofdstuk 4 (nieuwbouw) per aspect, met eis-waarde + werkelijke waarde + bron-PDF + paginanummer. Zwaarste model (Claude Opus) want vereist juridisch én numeriek redeneren over meerdere documenten.
lookup_bbl_eislookup_omgevingsplan_lokaalbereken_achtererfgebiedcheck_eis_tegen_waarderead_pdf_textextract_drawing_infoget_pdf_infoSystem prompt (kern) →
Je bent de BBL-TOETSER. Voor elke aanvraag check je 9 aspecten: 1. Constructieve veiligheid (Bbl 4.11-4.13) 2. Brandveiligheid (4.49-4.91) 3. Ventilatie (4.124-4.135) 4. Daglicht (4.137) 5. Gebruiksoppervlak (4.139) 6. BENG energie (4.149-4.151) 7. Luchtdichtheid (4.155) 8. Isolatie Rc-waarden (4.146) 9. Achtererfgebied + warmtepomp (Bbl Bijlage II + lokaal) Per bevinding lever: - wettelijke_eis (artikel + getal) - werkelijke_waarde (uit PDF, met paginanummer) - voldoet (true/false) - bron (pdf-bestandsnaam + pagina) - ernst bij kritisch (LAAG/MIDDEL/HOOG)
Beschikking-agent
anthropic/claude-sonnet-4-6Stelt Awb-conforme beschikking op (begeleidende brief + omgevingsvergunning). Berekent leges via de juiste legesverordening voor het bevoegd gezag.
bereken_legesget_indieningsvereistenget_bevoegd_gezag_infoget_omgevingsplan_regelslookup_wettenrender_beschikking_templateSystem prompt (kern) →
Je bent de BESCHIKKING-AGENT. Stel een Awb-conforme omgevingsvergunning op met deze structuur: 1. BESLUIT (art 5.1 Ow + verleend/geweigerd) 2. BESLUITGEGEVENS (zaak, datum, locatie, kadastraal) 3. AANVRAAGGEGEVENS (NAW aanvrager) 4. INHOUDELIJKE OVERWEGINGEN (toets per aspect) 5. VOORSCHRIFTEN (indien van toepassing) 6. RECHTSMIDDELEN (bezwaar binnen 6 weken) 7. LEGES (op basis van juiste verordening voor bevoegd gezag) Plus aparte begeleidende brief in B1-taal.
Live tools — echte HTTP calls naar publieke APIs
Deze vier tools doen echte HTTP-requests naar publieke Nederlandse overheid-APIs. Geen authenticatie nodig, gratis. De responses hieronder zijn echte responses uit een PoC-run op 20 mei 2026.
pdok_adres_lookupLIVEGeocodeert een adres naar coordinaten (WGS84 + RD-new) + gemeente + provincie + BAG-id. Gratis, geen auth.
Voorbeeld call →
pdok_adres_lookup(adres="Marktplein 1 Almelo") Maakt onder de motorkap: GET https://api.pdok.nl/bzk/locatieserver/search/v3_1/free?q=Marktplein+1+Almelo&rows=3
Voorbeeld resultaat →
{
"_status": "LIVE",
"weergavenaam": "Marktplein, Almelo",
"type": "weg",
"gemeente": "Almelo",
"provincie": "Overijssel",
"id": "weg-100a571652f5451109f88f59ee5b4c35",
"score": 14.47,
"centroide_ll": "POINT(6.66309111 52.35615757)",
"centroide_rd": "POINT(241917.624 486127.594)",
"aantal_resultaten": 3
}check_monumentenLIVEDoet eerst pdok_adres_lookup → coordinaten, daarna geo-intersect met de OGC Features API om te bepalen of locatie binnen een Rijksmonument, beschermd stads-/dorpsgezicht of UNESCO werelderfgoed valt.
Voorbeeld call →
check_monumenten(adres="Dam 1 Amsterdam")
Maakt twee HTTP calls:
1. GET .../locatieserver/search/v3_1/free?q=Dam+1+Amsterdam
2. GET .../beschermde-gebieden-cultuurhistorie/ogc/v1/collections/
rce_inspire_polygons/items?bbox=4.892,52.372,4.894,52.374Voorbeeld resultaat →
{
"_status": "LIVE",
"coordinaten_wgs84": {"lon": 4.893, "lat": 52.373},
"is_rijksmonument": true,
"is_beschermd_stadsgezicht": true,
"is_unesco_werelderfgoed": false,
"aantal_beschermde_gebieden_in_buurt": 3,
"monumenten_in_buurt": [
{
"type": "Beschermd stads-/dorpsgezicht",
"localid": "10134346.00",
"wettelijke_grondslag_sinds": "1999-05-26",
"meer_info": "https://kennis.cultureelerfgoed.nl/index.php/Gezicht/1477"
},
{
"type": "Rijksmonument",
"localid": "42514.00",
"wettelijke_grondslag_sinds": "2009-10-19",
"meer_info": "https://monumentenregister.cultureelerfgoed.nl/monumenten/530906"
}
],
"conclusie": "Locatie ligt in/nabij 3 beschermd cultureel-erfgoed gebied(en)"
}wetten_lookupLIVEHaalt metadata op van een BWB (Basis Wetten Bestand) regeling. Geen REST API beschikbaar, dus we lezen de HTML-meta-tags van de regelpagina.
Voorbeeld call →
wetten_lookup(bwb_code="BWBR0041297") Maakt: GET https://wetten.overheid.nl/BWBR0041297 (volgt redirects naar /BWBR0041297/2026-03-27)
Voorbeeld resultaat →
{
"_status": "LIVE",
"bwb_code": "BWBR0041297",
"naam": "Besluit bouwwerken leefomgeving",
"type": "AMvB",
"uitgever": "Ministerie van Binnenlandse Zaken en Koninkrijksrelaties",
"laatst_gewijzigd": "2026-05-19",
"url": "https://wetten.overheid.nl/BWBR0041297",
"structuur": {
"Hoofdstuk 2": "Bestaande bouw",
"Hoofdstuk 3": "Verbouw, verplaatsing en wijziging gebruiksfunctie",
"Hoofdstuk 4": "Nieuwbouw",
"Hoofdstuk 5": "Bouwwerk in gebruiksfase",
"Hoofdstuk 6": "Bouw- en sloopwerkzaamheden",
"Hoofdstuk 7": "Wkb (kwaliteitsborging bouw)"
}
}lokale_regelgeving_zoekLIVEZoekt in officiële publicaties (gemeenteblad gmb-*, provincieblad pbl-*, CVDR-records) via SRU 2.0 + CQL query-syntax. Filtert lokaal op gemeente-creator.
Niet alle hits zijn van de gevraagde gemeente — eerste pagina wordt op relevantie gesorteerd; we filteren clientside op `creator == gemeente`.
Voorbeeld call →
lokale_regelgeving_zoek(gemeente="Almelo", onderwerp="welstand") Maakt: GET https://repository.overheid.nl/sru? query=cql.textAndIndexes any "Almelo welstand"& maximumRecords=10& operation=searchRetrieve& version=2.0
Voorbeeld resultaat →
{
"_status": "LIVE",
"aantal_totaal_in_overheid_nl": 65730,
"aantal_van_gemeente": 3,
"publicaties": [
{
"titel": "Bouwverordening Almelo 2018",
"identifier": "gmb-2018-221165",
"creator": "Almelo",
"type": "Verordeningen",
"laatst_gewijzigd": "2018-10-17",
"url": "https://zoek.officielebekendmakingen.nl/gmb-2018-221165.html"
},
...
]
}Mock tools — productie vereist toegang
Deze tools zijn in de PoC mock. Voor productie is toegang nodig (PKIoverheid certificaat, OIN, leveranciersovereenkomst, etc.). De mock-responses zijn realistisch genoeg om de agent-flow te testen.
regels_op_kaartMOCKOfficiële plek: alle omgevingsplan-regels per locatie.
Echte koppeling vereist PKIoverheid Services Server certificaat + OIN + ETO (Eenmalige Testovereenkomst) bij DSO/IPLO. Voor PoC: heuristische mock op basis van postcode/adres.
Voorbeeld call →
regels_op_kaart(adres="Voorbeeldstraat 1 Almelo", activiteit_type="bouw")
Voorbeeld resultaat →
{
"_status": "MOCK",
"_let_op": "Echte koppeling vereist PKIo + OIN + ETO bij DSO",
"omgevingsplan": "Omgevingsplan Almelo (tijdelijk deel)",
"bestemmingen": [{"naam": "Woongebied", "code": "W"}],
"bouwregels": [
{"artikel": "8.1", "omschrijving": "Max bouwhoogte 9 m", "waarde": 9, "eenheid": "m"},
{"artikel": "8.2", "omschrijving": "Max goothoogte 6 m", "waarde": 6, "eenheid": "m"},
{"artikel": "8.4", "omschrijving": "Min 3 m tot zijdelingse perceelsgrens"}
]
}check_natuurMOCKNatuurtoets — stikstofdepositie + soortenbescherming.
Aerius is een interactieve calculator (geen REST API). NDFF (Nationale Databank Flora en Fauna) vereist licentie via BIJ12 of EcoData. Voor PoC: heuristische check op afstand tot Natura2000-gebied.
Voorbeeld call →
check_natuur(adres="Voorbeeldstraat 1 Almelo", afstand_tot_natura2000_km=5.0)
Voorbeeld resultaat →
{
"_status": "MOCK",
"stikstof_check_vereist": true,
"soortenbeschermingscheck_vereist": false,
"conclusie": "Heuristische check (mock) — bij echte vergunning altijd handmatige Aerius-berekening"
}Knowledge files — eigen JSON kennis
Naast de live APIs heeft elke agent toegang tot eigen JSON-knowledge files in /srv/vv/poc/src/vv/knowledge/. Dit is wetgeving die we vooraf gestructureerd hebben zodat het direct als data bevraagbaar is — geen LLM-call nodig om bv. een Bbl-eis op te zoeken.
lookup_bbl_eisLIVEHaalt gestructureerde Bbl-eisen op per aspect. Bron is de officiële Bbl-tekst, vooraf geparsed naar JSON.
Voorbeeld call →
lookup_bbl_eis(aspect="energiezuinigheid_BENG")
Voorbeeld resultaat →
{
"aspect": "energiezuinigheid_BENG",
"categorie": "Energie - Hoofdstuk 4 Afdeling 4.5",
"artikelen": [
{
"artikel": "4.149",
"titel": "BENG-1: Maximale energiebehoefte",
"eis": "Voor woonfunctie grondgebonden: maximaal 55 kWh/m² per jaar",
"max_beng1_kwh_m2_jr": 55,
"voor_gebruiksfunctie": ["woonfunctie"],
"te_checken_in": ["uniec3-berekening", "energielabel"]
},
{
"artikel": "4.150",
"titel": "BENG-2: Maximaal primair fossiel energiegebruik",
"max_beng2_kwh_m2_jr": 30
},
{
"artikel": "4.151",
"titel": "BENG-3: Aandeel hernieuwbare energie",
"min_beng3_percent": 50
},
{
"artikel": "4.155",
"titel": "Luchtdichtheid",
"max_qv10_dm3s_per_m2": 0.4
}
]
}lookup_omgevingsplan_lokaalLIVELokale uitwerking voor specifieke onderwerpen waar agents vaak op moeten checken — achtererfgebied (incl. hoekwoning-uitzondering), warmtepomp-plaatsing.
Voorbeeld call →
lookup_omgevingsplan_lokaal(onderwerp="achtererfgebied_vergunningvrij")
Voorbeeld resultaat →
{
"_artikel": "Bbl Bijlage II artikel 2",
"definitie": "Het deel van het erf gelegen ACHTER de voorgevelrooilijn (+1m).
Voor een woning op de HOEK telt de zijkant alleen mee als deze ook
achter die rooilijn ligt.",
"regels_oppervlakte": {
"tot_100_m2_achtererfgebied": "max 50% van het achtererfgebied",
"100_tot_300_m2": "50 m² + 20% van het oppervlak boven 100 m²",
"boven_300_m2": "90 m² + 10% van oppervlak boven 300 m², max 150 m²"
},
"voorbeelden": [
{
"scenario": "Hoekwoning - achtererf 195 m² (zijkant telt NIET mee)",
"max_vergunningvrij_m2": 69.0,
"berekening": "50 + 20% × (195-100) = 50 + 19 = 69 m²",
"let_op": "Voor hoekwoning: zijkant naast openbare ruimte telt niet als achtererfgebied. Veel aanvragers maken hier fouten."
}
],
"warmtepomp_buitenunit": {
"_artikel": "Bbl artikel 4.109 + lokale APV",
"regels": [
"Geluidsniveau op perceelgrens max 40 dB(A) overdag / 35 dB(A) avond / 30 dB(A) nacht",
"Buitenunit moet OP TEKENING worden ingetekend met exacte positie",
"Bij vrije opstelling in tuin: min 2m afstand tot perceelgrens"
]
}
}bereken_legesLIVEBerekent leges voor een aanvraag, gebaseerd op de legesverordening van het juiste bevoegd gezag. Dinkelland werkt met percentages, Tubbergen met eenheden — agent kiest automatisch op basis van bevoegd_gezag parameter. Voor TB: open legesverordeningen/tubbergen_2026.json.
Voorbeeld call →
bereken_leges(activiteit_type="bouw", bouwkosten=250000, bevoegd_gezag="DK")
Voorbeeld resultaat →
{
"activiteit": "bouw",
"bouwkosten": 250000,
"bevoegd_gezag": "DK",
"gemeente_naam": "Dinkelland",
"legesverordening": "Legesverordening gemeente Dinkelland 2025/2026",
"legesverordening_url": "https://lokaleregelgeving.overheid.nl/CVDR730533",
"regels": [
{
"artikel": "2.3.1",
"omschrijving": "Bouwactiviteit (bouwtechnisch deel, paragraaf 2.3.2 Bbl)",
"berekening": "0.73% × € 250,000.00 = € 1825.00",
"bedrag": 1825.0
},
{
"artikel": "2.3.2",
"omschrijving": "Omgevingsplanactiviteit bouw (ruimtelijk deel) (binnenplans)",
"berekening": "1.72% × € 250,000.00 = € 4300.00",
"bedrag": 4300.0
}
],
"totaal": 6125.0
}Audit-trail per agent-run
Elke agent-run wordt chronologisch gelogd in een JSONL-bestand per zaak (/srv/vv/uploads/_audit/{zaaknummer}.jsonl). Per tool-call zit debron_info erbij — wat is opgehaald en waar het vandaan kwam.
{
"timestamp": "2026-05-20T11:53:45.123Z",
"type": "agent_run",
"actor": "agent:ro-bot",
"titel": "ro-bot uitgevoerd",
"details": {
"agent": "ro-bot",
"model": "groq/llama-3.3-70b-versatile",
"duur_ms": 6234,
"stappen": 14,
"tokens_in": 4521,
"tokens_out": 892,
"audit_trail": [
{
"type": "tool_call",
"tool_name": "pdok_adres_lookup",
"tool_args": {
"adres": "Van Musschenbroeklaan 19, 7608SR",
"_bron": {
"type": "http_api",
"naam": "PDOK Locatieserver v3_1 (live, gratis, geen auth)",
"url": "https://api.pdok.nl/bzk/locatieserver/search/v3_1/ui/"
}
}
},
...
]
}
}Per zaak is dit zichtbaar via vv.lostlands.nl/audit/{zaaknummer}.
Zelf testen
De PoC draait op vv.lostlands.nl/probeer. Upload je eigen geanonimiseerde aanvraag, en zie de agents door je documenten heen werken met live tool-calls + bron-info.
/srv/vv/poc/src/vv/tools/ro_kennis.py, /srv/vv/poc/src/vv/agents/agent_tools.py, /srv/vv/poc/src/vv/agents/{intake,ro,bbl_toetsing,beschikking}_hermes.py.