Ga naar inhoud

Modelkeuze en kosten

Welk Claude-model de classificatie gebruikt, kiest de auditor in het configuratiescherm. Wat die keuze betekent — en wat er níet bij hoort — staat hier.

Kiesbare modellen

iso_audit.modellen.KIESBAAR, doorgegeven als KIESBARE_MODELLEN in classification/findings.py. Elk model hier moet een prijsregel hebben; tests/config/test_modelkeuze.py faalt anders, want een model zonder prijsregel draait met een kostenpost van nul en dat ziet in een auditrapport compleet uit.

model invoer uitvoer cache-read cache-minimum
Haiku 4.5 $1,00 $5,00 $0,10 4096 tokens
Sonnet 5 $2,00* $10,00* $0,20 1024 tokens
Opus 5 $5,00 $25,00 $0,50 512 tokens

Bedragen per miljoen tokens, peildatum in PRIJZEN_PEILDATUM. * Introtarief t/m 2026-08-31; lijstprijs is $3,00/$15,00.

Elke modelnaam staat in iso_audit.modellen

Eén module met de namen, en elders alleen verwijzingen. Tot 2026-08-20 stond dezelfde naam in vijf spellingen in src/ — vier constanten op claude-haiku-4-5-20251001 en één fallback op claude-haiku-4-5. Vijf plekken die uit elkaar kunnen lopen zonder dat iets faalt: een model bumpen was vijf greps, en één vergeten regel geeft geen foutmelding maar een run die stil op een ander model draait dan het rapport zegt.

test_geen_modelnaam_als_letterlijke_string_buiten_modellen_py is de gate: een modelnaam als letterlijke string buiten die module laat de suite falen. In een comment of docstring mag hij.

Een gedateerd model-ID uit een historisch record (claude-haiku-4-5-20251001) wordt via modellen.GEDATEERDE_VORM naar zijn alias herleid, zodat prijs_voor() oude runs kan prijzen zonder een tweede prijsregel per spelling.

Prijsgrondslag: lees PRIJZEN_GRONDSLAG

De tabel staat sinds 2026-08-20 op het werkelijke tarief, op verzoek van de opdrachtgever: het bedrag in het rapport moet zo dicht mogelijk bij de factuur liggen. Concreet raakt dat één regel — Sonnet 5 staat op zijn introtarief van $2,00/$10,00 in plaats van de lijstprijs $3,00/$15,00.

Wat het niet is: de factuur. Hier staat het publieke tarief dat op de peildatum gold. Heeft Conduction een eigen afspraak met Anthropic (volumekorting, commitment), dan wijkt de factuur daar nog van af en is dit een bovengrens. Dat hoort zo te blijven staan in het rapport: een bovengrens die je kunt navertellen is bruikbaar, een bedrag dat een contract nabootst niet.

Er zit bewust geen datumlogica in de tabel die zelf tussen tarieven kiest: dat zou een tweede administratie zijn die achterloopt op de leverancier, precies wat de peildatum moet voorkomen. In plaats daarvan noteert TIJDELIJK_TARIEF_TOT welk tarief tijdelijk is en tot wanneer, en logt prijs_voor() een waarschuwing zodra die datum verstreken is. Voor Sonnet 5 is dat 2026-08-31: daarna staat er een te laag bedrag in de tabel tot iemand hem bijwerkt, en een te laag bedrag is schadelijker dan geen bedrag omdat het compleet lijkt.

Wat een run kost — gemeten, niet geschat

Uit 215 echte classificaties in de referentie-checkout (2026-08-17): gemiddeld 702 invoer- en 594 uitvoertokens per classificatie. Voor die hele set:

model kosten bij 10× dit volume
Haiku 4.5 $0,79 $7,89
Sonnet 5 $2,37 $23,68
Opus 5 $3,95 $39,47

Prijs is bij dit volume geen argument. Het verschil tussen het goedkoopste en het duurste model is een paar dollar per audit, voor een oordeel dat naar een certificerende instantie gaat. De modelkeuze is daarmee een kwaliteitsvraag, niet een kostenvraag.

De kosten van een run staan in het run-record (runs.jsonl), met model, peildatum en grondslag. Het tokengebruik per classificatie staat in classifications.usage_json.

Thinking staat expliciet uit

De classificatie stuurt thinking={"type": "disabled"} mee. Dat is geen detail: weglaten van die parameter is niet "uit", maar model-afhankelijk. Gemeten tegen de echte API met een classificatie-achtige vraag:

aanroep blokken stop_reason
claude-sonnet-5 zonder thinking ['thinking'] max_tokens
claude-sonnet-5 met thinking: disabled ['text'] max_tokens
claude-opus-5 zonder thinking ['thinking'] max_tokens
claude-haiku-4-5 met thinking: disabled ['text'] —

Zonder de parameter kwam er op Sonnet 5 en Opus 5 alleen een thinking-blok terug en géén tekstblok, waarna de run zich klaar meldde met nul bevindingen. Dat gedrag was invoer-afhankelijk: op een triviale vraag gaf Sonnet 5 wél tekst, want adaptive thinking betekent dat het model zelf beslist. Het werkte dus in een snelle test en faalde op het echte werk.

Wie thinking later aanzet moet twee dingen weten. max_tokens begrenst op deze modellen thinking én antwoord samen — _max_tokens_voor is nu gedimensioneerd op het antwoord alleen, dus dat budget moet mee omhoog. En op Opus 5 mag thinking: disabled alleen bij effort high of lager; de combinatie met xhigh/max geeft een 400.

De cache doet niets

_maak_system_param zet cache_control: ephemeral op de systeem-prompt. Bij de huidige promptgroottes slaat dat niet aan: de prompts zijn 122–726 tokens en het minimum cacheerbare prefix staat in de tabel hierboven. Onder dat minimum cachet de API stil niet — geen fout, geen waarschuwing. Gemeten over 215 classificaties: cache_read en cache_write allebei nul.

Opvallend gevolg: caching zou alleen op Opus 5 aanslaan (minimum 512, prompt 726), het duurste model. Wil je de cache echt gebruiken, dan moet de systeem-prompt groter — en dat is een afweging tussen promptkwaliteit en cachewinst, niet een instelling.

De modelkeuze bereikt alleen de classificatie

AUDIT_CLASSIFICATION_MODEL gaat naar classification/findings.py en verder niet. classification/llm.py, classification/thema.py, memo/draft.py en reporting/report_generation.py draaien op modellen.STANDAARD (Haiku 4.5).

Dat is een keuze en geen restant: die vier paden schrijven tekst op basis van al geclassificeerde bevindingen en vellen zelf geen oordeel over bewijs. Het duurdere model kopen voor een samenvatting levert geen beter auditoordeel op.

De UI-kaart zei tot 2026-08-20 "Classificatie en memo-tekst" en dat was te ruim — de memo-tekst volgt de keuze niet. De kaart zegt nu "Classificatie van bevindingen", met eronder expliciet dat memo-tekst en rapportgeneratie altijd op Haiku draaien. Dat is dezelfde soort valse belofte als de zes die op 16, 17 en 18 augustus zijn weggehaald: een scherm dat meer belooft dan de code doet.