Ga naar de hoofdinhoud
BVDNET
Arnhem · websites & automatiseringBVDNET
Tools & Frameworks

Programmatic tool calling

Met programmatic tool calling schrijft een AI-model een kort programma dat veel opzoekingen in je systemen doet en alleen de uitkomst teruggeeft, wat tijd en kosten bespaart.

Ook bekend als: PTC, Code Mode

Met programmatic tool calling gebruikt een AI-model je software via een kort programma dat het zelf schrijft. Normaal vraagt het model elke actie apart aan en leest het elk resultaat, wat traag en duur wordt als een taak veel opzoekwerk vraagt. Hier schrijft het code die de opzoekingen doet, het nuttige eruit haalt en alleen de uitkomst teruggeeft, zoals de drie facturen die over de vervaldatum zijn.

Waar komt het vandaan?

Anthropic lanceerde programmatic tool calling op 24 november 2025 als publieke bèta voor zijn Claude API, in een artikel over advanced tool use. Sinds 17 februari 2026 is er geen bèta-header meer voor nodig (release notes). Het idee is ouder dan de naam. In september 2025 beschreef Cloudflare Code Mode, dat MCP-tools omzet in een TypeScript-API waartegen het model code schrijft, en in november 2025 maakte Anthropic hetzelfde punt in Code execution with MCP.

Hoe werkt het?

Bij gewone function calling vraagt het model om een toolaanroep, voert je applicatie die uit en gaat het resultaat terug naar het contextvenster van het model. Elke aanroep kost zo een nieuwe ronde door het model. De documentatie van Anthropic beschrijft de programmatische route in vijf stappen:

  1. Je voegt de code-execution-tool van Anthropic aan het verzoek toe en markeert je eigen tools met allowed_callers, zodat code ze mag aanroepen.
  2. Claude schrijft Python die die tools als functies aanroept, zo nodig in een lus of met voorwaarden.
  3. De code draait in een afgeschermde container (een sandbox). Bij elke toolaanroep pauzeert hij, en de API stuurt een tool_use-blok naar je applicatie.
  4. Je voert de tool uit en stuurt het resultaat terug. Dat resultaat gaat naar de code, niet naar het contextvenster van Claude.
  5. Als de code klaar is, krijgt Claude alleen de uitvoer ervan en werkt het verder.

Je applicatie voert nog steeds elke tool uit. Wat verdwijnt, is een ronde door het model tussen de aanroepen: volgens de documentatie wordt het model tussen de toolaanroepen binnen één code-uitvoering niet opnieuw aangeroepen. Je zet het per tool aan, en gewone toolaanroepen blijven ernaast werken.

Wat levert het op?

Anthropic rapporteert eigen, interne metingen. Bij de lancering in november 2025 daalde het gemiddelde tokengebruik bij complexe onderzoekstaken van 43.588 naar 27.297, 37% minder. In september 2026 noemt de documentatie twee resultaten. Op een benchmark met een projectmanagement-agent met 75 tools daalden de gefactureerde invoer-tokens met ongeveer 38%, bij gelijke nauwkeurigheid. Op τ²-bench, waar elke beurt één of twee opeenvolgende toolaanroepen doet, bleven de scores gelijk en stegen de kosten met ongeveer 8%.

Waar gaat het mis?

  • Stap-voor-stapwerk. Hangt elke aanroep af van wat het model van het vorige resultaat vindt, dan kan het script het model niet overslaan. Bij een paar aanroepen met kleine resultaten kosten het opstarten van de container en het schrijven van het script meer dan ze opleveren.
  • Beperkingen. In september 2026 kunnen tools van de MCP-connector van Anthropic niet vanuit code worden aangeroepen, en tools met strict: true ook niet. Doet je applicatie er langer dan ongeveer 4 minuten over om een resultaat terug te sturen, dan krijgt de wachtende code een time-outfout.
  • Onbetrouwbare uitvoer. Toolresultaten komen als tekst (strings) bij de code aan, en de documentatie waarschuwt voor code-injectie als een resultaat uit een externe bron als code wordt uitgevoerd.

Voorbeeld

Het lanceringsartikel van Anthropic stelt de vraag: welke teamleden gingen in Q3 over hun reisbudget heen? Met gewone toolaanroepen komen de uitgaven van 20 mensen binnen als 20 toolresultaten met meer dan 2.000 posten, allemaal in de context van Claude. Met programmatic tool calling schrijft Claude een script als dit (ingekort uit het artikel):

Python
1team = await get_team_members("engineering")
2levels = list(set(m["level"] for m in team))
3budget_results = await asyncio.gather(*[get_budget_by_level(level) for level in levels])
4budgets = dict(zip(levels, budget_results))
5expenses = await asyncio.gather(*[get_expenses(m["id"], "Q3") for m in team])
6
7exceeded = []
8for member, items in zip(team, expenses):
9 total = sum(e["amount"] for e in items)
10 limit = budgets[member["level"]]["travel_limit"]
11 if total > limit:
12 exceeded.append({"name": member["name"], "spent": total, "limit": limit})
13
14print(json.dumps(exceeded))

Claude ziet alleen de afgedrukte lijst met de twee of drie mensen die over hun budget gingen. Anthropic becijfert het verschil op 200 KB aan ruwe uitgavengegevens tegenover 1 KB aan resultaten.