← Terug naar blog
20 mei 2026 · 12 min lezen · Technische bijlage bij V2

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.

Legenda: LIVE = doet echte HTTP call naar publieke API (geen auth nodig) · MOCK = mock voor PoC; productie vereist toegang (PKIo+OIN+ETO of leverancier-licentie)

Overzicht — welke agent gebruikt welke tools?

AgentModelToolsKnowledge files (klikbaar)
IntakeLlama 3.3 70B (Groq) + Claude Haiku 4-5 voor classifier5
RO-botLlama 3.3 70B (Groq)6
Bbl-toetsingClaude Opus 4-6 (Anthropic)8
BeschikkingClaude Sonnet 4-6 (Anthropic)6
WKB-controleLlama 3.3 70B (Groq)4
MeldingenLlama 3.3 70B (Groq)3
PublicatieLlama 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-5

Beoordeelt 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.

Model-rol
extraction — snel + goedkoop
Typische duur
~15-25s (incl. pre-classifier per PDF)
Tools
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-versatile

Toetst of activiteit past binnen omgevingsplan, monumentstatus, en natuurwaarden. Combineert 4 live API's met 2 mocks.

Model-rol
research — snel + tool-call heavy
Typische duur
~3-8s
Knowledge (klik om inhoud te bekijken op vv.lostlands.nl/knowledge)
Tools
pdok_adres_lookupregels_op_kaartlokale_regelgeving_zoekcheck_monumentencheck_natuurwetten_lookup
System 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-6

Doet 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.

Model-rol
scoring — zwaarste taak
Typische duur
~120-180s (60-80 tool-calls)
Tools
lookup_bbl_eislookup_omgevingsplan_lokaalbereken_achtererfgebiedcheck_eis_tegen_waarderead_pdf_textextract_drawing_infoget_pdf_info
System 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-6

Stelt Awb-conforme beschikking op (begeleidende brief + omgevingsvergunning). Berekent leges via de juiste legesverordening voor het bevoegd gezag.

Model-rol
research — juridische tekst
Typische duur
~60-90s
Tools
bereken_legesget_indieningsvereistenget_bevoegd_gezag_infoget_omgevingsplan_regelslookup_wettenrender_beschikking_template
System 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_lookupLIVE

Geocodeert 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_monumentenLIVE

Doet 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.

Bron: PDOK Cultureel Erfgoed OGC API (Rijksdienst voor het Cultureel Erfgoed) · https://api.pdok.nl/rce/beschermde-gebieden-cultuurhistorie/ogc/v1/
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.374
Voorbeeld 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_lookupLIVE

Haalt metadata op van een BWB (Basis Wetten Bestand) regeling. Geen REST API beschikbaar, dus we lezen de HTML-meta-tags van de regelpagina.

Bron: wetten.overheid.nl (BWB metadata via HTML) · https://wetten.overheid.nl/
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_zoekLIVE

Zoekt in officiële publicaties (gemeenteblad gmb-*, provincieblad pbl-*, CVDR-records) via SRU 2.0 + CQL query-syntax. Filtert lokaal op gemeente-creator.

Bron: overheid.nl SRU API → officiële publicaties (gemeenteblad + CVDR) · https://repository.overheid.nl/sru

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_kaartMOCK

Officiële plek: alle omgevingsplan-regels per locatie.

Bron: DSO 'Regels op de Kaart' (Omgevingsdocumenten API) · https://service.omgevingswet.overheid.nl/publiek/omgevingsdocumenten/api

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_natuurMOCK

Natuurtoets — stikstofdepositie + soortenbescherming.

Bron: Aerius Calculator + NDFF · https://www.aerius.nl/calculator/

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_eisLIVE

Haalt gestructureerde Bbl-eisen op per aspect. Bron is de officiële Bbl-tekst, vooraf geparsed naar JSON.

Bron: Gestructureerd uit Bbl Hoofdstuk 4 Nieuwbouw · https://wetten.overheid.nl/BWBR0041297
📚 JSON-inhoud: bbl_eisen.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_lokaalLIVE

Lokale uitwerking voor specifieke onderwerpen waar agents vaak op moeten checken — achtererfgebied (incl. hoekwoning-uitzondering), warmtepomp-plaatsing.

Bron: Gebaseerd op Bbl Bijlage II + lokale APV's · https://wetten.overheid.nl/BWBR0041297#BijlageII
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_legesLIVE

Berekent 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.

Bron: Legesverordening Dinkelland (CVDR730533) en Tubbergen (CVDR752464) · https://lokaleregelgeving.overheid.nl/CVDR730533
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.

Stand: 20 mei 2026 · alle voorbeeld-responses zijn echte responses uit de PoC, gevangen op die datum. Implementatie in /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.