{"id":20166,"date":"2026-09-29T09:17:46","date_gmt":"2026-09-29T13:17:46","guid":{"rendered":"https:\/\/wp.glbgpt.com\/?p=20166"},"modified":"2026-09-29T09:17:47","modified_gmt":"2026-09-29T13:17:47","slug":"claude-code-model-selection","status":"publish","type":"post","link":"https:\/\/wp.glbgpt.com\/nl\/hub\/claude-code-model-selection","title":{"rendered":"Claude-codemodelselectie: standaardinstellingen, omschakelen en kosten"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>Gebruik bij de modelkeuze volgens de Claude-code Haiku voor kleine, testbare wijzigingen, Sonnet voor routinematige implementaties en Opus voor werkzaamheden die meer onduidelijkheid of redeneringsinspanning vereisen.<\/strong> Anthropic raadt momenteel Opus 5.5 aan als algemeen uitgangspunt; uw takenpakket, de omvang van de beoordelingswerkzaamheden en uw budget bepalen of een kleiner model beter bij u past.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Om van model te wisselen, open je <code>\/model<\/code>. Druk op <kbd>Ga naar<\/kbd> om een standaardinstelling op te slaan, of <kbd>s<\/kbd> om alleen de huidige sessie om te schakelen. Gebruik voor een eenmalige start <code>claude --model opus<\/code>. Die keuzes hebben een verschillende duurzaamheid, dus het is net zo belangrijk om te bepalen hoe lang de schakelaar mee moet gaan als het kiezen van het model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Programmeerwerk omvat ook onderzoek, uitleg, documentatie en creatieve middelen. GlobalGPT brengt toonaangevende AI-modellen en diverse AI-tools samen in \u00e9\u00e9n betaalbaar dashboard, terwijl de CLI deze tools koppelt aan terminal- en ontwikkelingsworkflows. <a href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_content_home&amp;login=1\">Stel je workflow samen met GlobalGPT<\/a> om die gerelateerde taken bij elkaar te houden terwijl je van een idee naar werkende code gaat.<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-large\"><img alt=\"\" fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"636\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-opus-5-5-1024x636.png\" class=\"wp-image-19921\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-opus-5-5-1024x636.png 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-opus-5-5-300x186.png 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-opus-5-5-767x477.png 767w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-opus-5-5-1536x955.png 1536w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-opus-5-5-18x11.png 18w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/claude-opus-5-5.jpg 1897w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-3e41869c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-fill\"><a class=\"wp-block-button__link has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background has-background wp-element-button\" href=\"https:\/\/www.glbgpt.com\/home\/claude-opus-5-5?inviter=hub_claude55&amp;login=1\"><strong>Probeer Cluade Opus 5.5 nu op GlobalGPT<\/strong><\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<nav class=\"ccms-toc\" aria-label=\"Op deze pagina\" style=\"background:#f0f4fb;border:1px solid #d7dfed;border-radius:8px;padding:18px 24px;margin:30px 0;color:#172438;font:16px\/1.65 system-ui,sans-serif\"><p><strong>Op deze pagina<\/strong><\/p><ul style=\"margin:0;padding-left:22px\"><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#choose-a-model\">Welk model moet je gebruiken in de Claude-code?<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#switch-models\">Hoe je tijdens \u00e9\u00e9n sessie van model kunt wisselen<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#default-model\">Hoe stel je een standaardmodel in?<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#opusplan\">Wat Opusplan eigenlijk doet<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#coding-tests\">Welke twee programmeertaken kwamen aan bod?<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#model-cost\">Welke invloed heeft de modelkeuze op de kosten?<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#troubleshooting\">Waarom het door u gekozen model misschien niet blijft zitten<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#globalgpt-workflow\">Cre\u00eber een bredere workflow met GlobalGPT<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#faq\">FAQ<\/a><\/li><\/ul><\/nav>\n\n\n\n<h2 id=\"choose-a-model\" class=\"wp-block-heading\">Welk model moet je gebruiken in de Claude-code?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Begin bij de opzet van het werk. Een korte functie met duidelijke verwachte resultaten vereist een andere beoordeling dan een sporadisch voorkomende bug die zich over meerdere diensten uitstrekt. De relevante vraag is of het model met een redelijke mate van controle en iteratie tot een aanvaardbare wijziging kan leiden.<\/p>\n\n\n\n<figure class=\"wp-block-table\" style=\"overflow-x:auto;margin:24px 0;border:1px solid #d7dfed;border-radius:8px;box-sizing:border-box;max-width:100%\"><table style=\"width:100%;min-width:640px;border-collapse:collapse;font:15px\/1.6 system-ui,sans-serif\"><thead><tr><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Huidig model<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Waarvoor het bedoeld is<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Een praktische opstartopdracht<\/th><\/tr><\/thead><tbody><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Claude Haiku 4.5<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Snel en effici\u00ebnt werken met een beperkt contract<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Een kleine refactor, een repetitieve transformatie of een eenvoudige testcase<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Claude Sonnet 5<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Een evenwicht tussen intelligentie en snelheid voor het dagelijkse programmeerwerk<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Een functie met vaste patronen, een routinematige bugfix of een uitleg van de code<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Claude Opus 5,5<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Complexe redeneringen en langdurige agentische codering<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Een dubbelzinnige mislukking, een architecturale afweging of een verandering waarbij verschillende beperkingen op elkaar inwerken<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Claude Fable 5.1<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">De moeilijkste en langstlopende onderzoeken<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Een escalatie waarbij moeilijk werk nog steeds de overhand heeft op een grotere inspanning van Opus<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\" style=\"font-size:14px;line-height:1.6;color:#52617a;padding:12px\">Huidige modelfamilies en geschiktheid voor taken, op basis van de Anthropic-documentatie; de voorgestelde taken vormen praktische uitgangspunten.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Haiku is het overwegen waard wanneer fouten gemakkelijk op te sporen zijn en de wijziging klein is. Sonnet is een verstandige keuze wanneer de dagelijkse implementatie meer context en inzicht vereist. Opus verdient aandacht wanneer het begrijpen van het probleem een aanzienlijk deel van de taak uitmaakt. Fable verdient een aparte afweging voor veeleisend werk; het viel buiten onze coderingstest met drie modellen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dit zijn uitgangspunten, geen automatische kwaliteitsgaranties. Een goedkopere oplossing kan duur uitvallen als er meerdere herzieningen of een uitgebreide beoordeling nodig zijn. Omgekeerd kan een groter model weinig toevoegen aan een eenvoudige transformatie die al aan je controles voldoet. Voor breder gebruik buiten Claude Code, <a href=\"https:\/\/www.glbgpt.com\/hub\/claude-haiku-vs-sonnet-vs-opus\/\">vergelijk de Claude-modelfamilies<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1440\" height=\"900\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/anthropic-model-lineup-20260928_ac366ec699fe4dc393b80b2cf128cf46.webp\" alt=\"De huidige modelvergelijking van Anthropic voor Fable 5.1, Opus 5.5, Sonnet 5 en Haiku 4.5.\" class=\"wp-image-20171\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/anthropic-model-lineup-20260928_ac366ec699fe4dc393b80b2cf128cf46.webp 1440w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/anthropic-model-lineup-20260928_ac366ec699fe4dc393b80b2cf128cf46-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/anthropic-model-lineup-20260928_ac366ec699fe4dc393b80b2cf128cf46-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/anthropic-model-lineup-20260928_ac366ec699fe4dc393b80b2cf128cf46-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/anthropic-model-lineup-20260928_ac366ec699fe4dc393b80b2cf128cf46-18x12.webp 18w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Het modelaanbod van Anthropic, gecontroleerd op 28 september 2026. De beschikbaarheid in Claude Code is afhankelijk van je provider en je account.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">De <a href=\"https:\/\/platform.claude.com\/docs\/en\/about-claude\/models\/overview\">officieel modeloverzicht<\/a> geeft een overzicht van contextvensters van 1 miljoen tokens voor Fable 5.1, Opus 5.5 en Sonnet 5, en van 200.000 tokens voor Haiku 4.5. Dit zijn API-specificaties. Uw Claude-codeprovider, account en configuratie bepalen welke contextopties beschikbaar zijn in een sessie. Een groot venster is handig voor noodzakelijke context; het vullen ervan met niet-gerelateerd materiaal zorgt nog steeds voor extra werk voor het model.<\/p>\n\n\n\n<h2 id=\"switch-models\" class=\"wp-block-heading\">Hoe je tijdens \u00e9\u00e9n sessie van model kunt wisselen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tijdens een interactieve sessie, uitgevoerd <code>\/model<\/code> om de modelkiezer te openen. Selecteer de modelrij en druk op <kbd>s<\/kbd> als dit een eenmalige wijziging is. Druk op <kbd>Ga naar<\/kbd> slaat de selectie op als je standaardinstelling. Door te typen <code>\/model sonnet<\/code> In de huidige versies wordt het ook direct opgeslagen.<\/p>\n\n\n\n<style>\n.ccms-commands{border:1px solid #d8dfeb;border-radius:8px;padding:22px;background:#fff;color:#172438;font:16px\/1.6 system-ui,sans-serif;margin:28px 0}.ccms-commands h3{color:#172438;font-size:1.3rem;line-height:1.3;margin:0 0 10px}.ccms-commands p{color:#34435d;margin:12px 0}.ccms-commands a{color:#254fc2;text-decoration:underline}.ccms-commands code,.ccms-commands kbd{font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px}.ccms-commands__scroll{overflow-x:auto}.ccms-commands table{border-collapse:collapse;width:100%;min-width:620px;text-align:left}.ccms-commands th,.ccms-commands td{padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top}.ccms-commands th{background:#edf1fa;font-weight:600}.ccms-commands caption{text-align:left;font-size:14px;color:#43536f;margin-bottom:10px}@media(max-width:520px){.ccms-commands{padding:16px}}\n<\/style>\n<section class=\"ccms-commands\" aria-labelledby=\"ccms-command-title\" style=\"border:1px solid #d8dfeb;border-radius:8px;padding:22px;background:#fff;color:#172438;font:16px\/1.6 system-ui,sans-serif;margin:28px 0;box-sizing:border-box;max-width:100%\">\n  <h3 id=\"ccms-command-title\" style=\"color:#172438;font-size:1.3rem;line-height:1.3;margin:0 0 10px\">Kies de opdracht op basis van hoe lang de wijziging moet duren<\/h3>\n  <div class=\"ccms-commands__scroll\" style=\"overflow-x:auto;box-sizing:border-box;max-width:100%\"><table style=\"border-collapse:collapse;width:100%;min-width:620px;text-align:left\"><caption style=\"text-align:left;font-size:14px;color:#43536f;margin-bottom:10px\">Gedocumenteerd gedrag van de Claude-code, gecontroleerd op 28 september 2026<\/caption><thead><tr><th scope=\"col\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Je doel<\/th><th scope=\"col\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Wat te doen<\/th><th scope=\"col\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Zijn de standaardwijzigingen opgeslagen?<\/th><\/tr><\/thead><tbody>\n    <tr><th scope=\"row\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Alleen deze interactieve sessie omschakelen<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Open <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/model<\/code>, kies een model, druk op <kbd style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">s<\/kbd>.<\/td><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Nee.<\/td><\/tr>\n    <tr><th scope=\"row\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Een favoriet model opslaan<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Open <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/model<\/code> en druk op <kbd style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">Ga naar<\/kbd>, of typ <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/model sonnet<\/code>.<\/td><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Ja, wanneer de gebruikersinstellingen kunnen worden bewerkt.<\/td><\/tr>\n    <tr><th scope=\"row\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Start een enkele sessie op Opus<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Lancering <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">claude --model opus<\/code>.<\/td><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Nee.<\/td><\/tr>\n    <tr><th scope=\"row\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Terug naar de standaardinstelling voor de uitvoeringstijd van het account<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Gebruik <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/standaardmodel<\/code>.<\/td><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Hiermee wordt de modeloverschrijving ongedaan gemaakt; de vastgestelde standaardinstelling kan afhankelijk zijn van account- en organisatie-instellingen.<\/td><\/tr>\n    <tr><th scope=\"row\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Controleer het actieve model<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Uitvoeren <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/status<\/code>.<\/td><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Nee.<\/td><\/tr>\n  <\/tbody><\/table><\/div>\n  <p style=\"color:#34435d;margin:12px 0\">Project- of beheerde instellingen, omgevingsoverschrijvingen en hervatte sessies kunnen van invloed zijn op de volgende start. Controleer het actieve model wanneer reproduceerbaarheid van belang is.<\/p>\n  <p style=\"color:#34435d;margin:12px 0\"><a href=\"https:\/\/code.claude.com\/docs\/en\/model-config#setting-your-model\" style=\"color:#254fc2;text-decoration:underline\">Bron: Claude-codeconfiguratie<\/a>.<\/p>\n<\/section>\n\n\n\n<p class=\"wp-block-paragraph\">Kies bij het opstarten van een nieuwe terminalsessie het model. Deze opdrachten gelden ook wanneer Claude Code in de ge\u00efntegreerde terminal van VS Code wordt uitgevoerd. In de voorbeelden wordt expliciet een release geselecteerd:<\/p>\n\n\n\n<div style=\"margin:22px 0;padding:18px;background:#edf1f7;color:#172438;border:1px solid #d7dfed;border-radius:8px;overflow-x:auto\"><pre style=\"margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font:14px\/1.6 ui-monospace,monospace\"><code>claude --model claude-opus-5-5\nclaude --model claude-sonnet-5<\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Voer de opdracht uit voor de gewenste sessie; de voorbeelden zijn alternatieven. Je kunt verschillende terminals starten met verschillende <code>-model<\/code> waarden zonder een gedeelde, opgeslagen standaardinstelling steeds opnieuw te wijzigen. Gebruik <code>\/status<\/code> om het actieve model te controleren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Achternamen zoals <code>opus<\/code> en <code>sonnet<\/code> kunnen worden omgezet naar nieuwere versies. De resolutie hangt ook af van de provider: de Anthropic-API koppelt ze momenteel aan Opus 5.5 en Sonnet 5, terwijl de koppelingen van cloudproviders kunnen verschillen. Gebruik een volledige model-ID wanneer je een reproduceerbare run nodig hebt, en controleer de providerspecifieke naam als je omgeving dat vereist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voor Opus 5.5 is Claude Code v2.1.280 of hoger vereist; voor Sonnet 5 is v2.1.197 of hoger vereist. De <a href=\"https:\/\/code.claude.com\/docs\/en\/model-config\">documentatie over modelconfiguratie<\/a> is de bron voor actuele aliassen, versievereisten en toewijzingen aan providers. De opdrachten hier zijn voorbeelden uit de documentatie; in ons praktijkgedeelte wordt de gegenereerde code apart ge\u00ebvalueerd.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"1440\" height=\"900\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-model-switching-20260928_bdea45c6a3c84511afb34df961d9542d.webp\" alt=\"Claude-codedocumentatie met uitleg over de modelkeuze en de toetsen Enter en s.\" class=\"wp-image-20172\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-model-switching-20260928_bdea45c6a3c84511afb34df961d9542d.webp 1440w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-model-switching-20260928_bdea45c6a3c84511afb34df961d9542d-300x188.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-model-switching-20260928_bdea45c6a3c84511afb34df961d9542d-1024x640.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-model-switching-20260928_bdea45c6a3c84511afb34df961d9542d-768x480.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-model-switching-20260928_bdea45c6a3c84511afb34df961d9542d-18x12.webp 18w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">Met Enter wordt het model als standaard opgeslagen; met s worden alleen de instellingen voor de huidige sessie gewijzigd.<\/figcaption><\/figure>\n\n\n\n<h2 id=\"default-model\" class=\"wp-block-heading\">Hoe stel je een standaardmodel in?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Als je een standaardinstelling wilt kiezen, selecteer dan een model in <code>\/model<\/code> en druk op <kbd>Ga naar<\/kbd>, of typ een selectie zoals <code>\/model sonnet<\/code>. De code Claude schrijft de <code>model<\/code> veld in je gebruikersinstellingen wanneer dat bestand beschrijfbaar is. Open een nieuwe sessie en controleer het actieve model om het resultaat te bevestigen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Een opgeslagen voorkeur heeft geen voorrang op alle andere instellingen. Een opstartvlag, <code>ANTHROPIC_MODEL<\/code> in de shell, project- of beheerde instellingen, of een organisatiestandaard die is geconfigureerd om gebruikerskeuzes te overschrijven, kan bij het opstarten iets anders selecteren. Een hervatte sessie kan ook het model uit het opgeslagen transcript behouden. Controleer de opstartinformatie en <code>\/status<\/code> voordat hij ervan uitging dat de kans verkeken was.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\/standaardmodel<\/code> wist de aanpassingen aan je model en keert terug naar de standaardinstellingen van de runtime voor je account en configuratie. Het woord <code>standaard<\/code> is een resetwaarde, niet de naam van \u00e9\u00e9n vast Claude-model. Het mag niet worden gebruikt als een reproduceerbare modelidentificatie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voor geavanceerde instellingen, <code>ANTHROPIC_DEFAULT_MODEL<\/code> biedt vanaf versie 2.1.236 een standaardstartoptie. Deze staat onder de expliciete keuzes voor \u2018lancering\u2019, \u2018omgeving\u2019, \u2018instellingen\u2019 en \u2018organisatie\u2019, en negeert waarden zoals <code>haiku<\/code> en <code>opusplan<\/code>. Bij een normale persoonlijke voorkeur is de picker gemakkelijker te controleren. Zie <a href=\"https:\/\/code.claude.com\/docs\/en\/settings\">Claude Code-instellingen<\/a> wanneer er sprake is van een gedeelde configuratie.<\/p>\n\n\n\n<h2 id=\"opusplan\" class=\"wp-block-heading\">Wat Opusplan eigenlijk doet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>opusplan<\/code> maakt gebruik van Opus in de planningsfase en van Sonnet voor de uitvoering. Het voordeel is duidelijk: gebruik een krachtiger redeneermodel om de aanpak uit te werken, en vervolgens een alledaags programmeermodel om dat plan uit te voeren.<\/p>\n\n\n\n<style>\n.ccms-opusplan{border:1px solid #d7dfed;border-radius:8px;background:#f8faff;color:#172438;padding:22px;margin:26px 0;font:16px\/1.6 system-ui,sans-serif}.ccms-opusplan h3{color:#172438;font-size:1.25rem;margin:0 0 16px}.ccms-opusplan p{color:#34445e;margin:12px 0}.ccms-opusplan__flow{display:flex;gap:16px;align-items:center}.ccms-opusplan__step{background:#e9edfc;border-radius:6px;padding:18px;flex:1}.ccms-opusplan__step strong{display:block;color:#172438;font-size:1.2rem}.ccms-opusplan__arrow{font-size:24px;color:#4b55ba}.ccms-opusplan a{color:#254fc2;text-decoration:underline}@media(max-width:520px){.ccms-opusplan{padding:16px}.ccms-opusplan__flow{flex-direction:column;align-items:stretch}.ccms-opusplan__arrow{text-align:center;transform:rotate(90deg)}}\n<\/style>\n<section class=\"ccms-opusplan\" aria-labelledby=\"ccms-opusplan-title\" style=\"border:1px solid #d7dfed;border-radius:8px;background:#f8faff;color:#172438;padding:22px;margin:26px 0;font:16px\/1.6 system-ui,sans-serif;box-sizing:border-box;max-width:100%\">\n<h3 id=\"ccms-opusplan-title\" style=\"color:#172438;font-size:1.25rem;margin:0 0 16px\">Opusplan volgt de werkwijze<\/h3>\n<div class=\"ccms-opusplan__flow\" style=\"display:flex;gap:16px;align-items:center;box-sizing:border-box;max-width:100%;flex-wrap:wrap\"><div class=\"ccms-opusplan__step\" style=\"background:#e9edfc;border-radius:6px;padding:18px;flex:1;box-sizing:border-box;max-width:100%\">Planningsmodus<strong style=\"display:block;color:#172438;font-size:1.2rem\">Opus<\/strong>Werk de aanpak stap voor stap door.<\/div><span class=\"ccms-opusplan__arrow\" aria-hidden=\"true\" style=\"font-size:24px;color:#4b55ba\">\u2192<\/span><div class=\"ccms-opusplan__step\" style=\"background:#e9edfc;border-radius:6px;padding:18px;flex:1;box-sizing:border-box;max-width:100%\">Uitvoering<strong style=\"display:block;color:#172438;font-size:1.2rem\">Sonnet<\/strong>Voer het plan uit.<\/div><\/div>\n<p style=\"color:#34445e;margin:12px 0\">Gedocumenteerd routeringsgedrag. De versies die achter deze familienamen schuilgaan, zijn afhankelijk van uw provider en configuratie.<\/p>\n<p style=\"color:#34445e;margin:12px 0\"><a href=\"https:\/\/code.claude.com\/docs\/en\/model-config#opusplan-model-setting\" style=\"color:#254fc2;text-decoration:underline\">Bron: Claude-codeconfiguratie<\/a><\/p>\n<\/section>\n\n\n\n<p class=\"wp-block-paragraph\">Dit is een modusafhankelijke regel. Niet elke prompt wordt gecontroleerd en er wordt niet automatisch de goedkoopste geschikte familie gekozen. De toewijzingen van de provider en de toegangsbeperkingen blijven van toepassing op de onderliggende modellen. Ook garandeert de naam geen kostenbesparing: de totale kosten hangen af van de hoeveelheid planning, implementatie, herziening en contextverwerking die de taak vereist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Overweeg het eens voor de verandering: een situatie waarin het ontwerp profiteert van een grondigere analyse en de uitvoering volgens een duidelijk plan verloopt. Voor een kleine aanpassing is die extra planning wellicht overbodig.<\/p>\n\n\n\n<h2 id=\"coding-tests\" class=\"wp-block-heading\">Welke twee programmeertaken kwamen aan bod?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Om een concreet beeld te geven van modelselectie, hebben we een beperkte Unicode-refactor en een aanpassing aan de routeselector getest, waarbij de vereisten op elkaar inwerkten. Het bleek dat het onderscheid tussen een correcte functie en een volledige, gevraagde uitvoer belangrijker was dan een simpele score.<\/p>\n\n\n\n<style>\n.ccms-test-setup{border:1px solid #d7dfed;border-radius:8px;padding:24px;background:#f8faff;color:#172438;margin:28px 0;font:16px\/1.6 system-ui,sans-serif;box-sizing:border-box}.ccms-test-setup *{box-sizing:border-box}.ccms-test-setup h3,.ccms-test-setup h4{color:#172438;line-height:1.35;margin:0 0 12px}.ccms-test-setup h3{font-size:1.35rem}.ccms-test-setup h4{font-size:1.1rem}.ccms-test-setup p{color:#35435a;margin:12px 0}.ccms-test-setup a{color:#254fc2;text-decoration:underline}.ccms-test-setup .ccms-scroll{overflow-x:auto}.ccms-test-setup table{width:100%;min-width:650px;border-collapse:collapse;text-align:left;font-size:14px}.ccms-test-setup th,.ccms-test-setup td{padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top}.ccms-test-setup th{background:#eaf0fa}.ccms-test-setup details{border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff}.ccms-test-setup summary{cursor:pointer;font-weight:650;color:#254fc2}.ccms-test-setup pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace}.ccms-test-setup code{color:inherit}.ccms-test-setup .ccms-verdict{border-left:4px solid #5b62c8;padding:8px 14px;background:#eef0ff}.ccms-test-setup .ccms-note{font-size:14px}@media(max-width:520px){.ccms-test-setup{padding:16px}.ccms-test-setup pre{padding:10px}}\n<\/style>\n<section class=\"ccms-test-setup\" aria-labelledby=\"ccms-test-setup-title\" style=\"border:1px solid #d7dfed;border-radius:8px;padding:24px;background:#f8faff;color:#172438;margin:28px 0;font:16px\/1.6 system-ui,sans-serif;box-sizing:border-box;max-width:100%\">\n<h3 id=\"ccms-test-setup-title\" style=\"box-sizing:border-box;color:#172438;line-height:1.35;margin:0 0 12px;font-size:1.35rem\">Hoe we de programmeerresultaten hebben getest<\/h3>\n<p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Op 28 september 2026 hebben we Claude Haiku 4,5, Claude Sonnet 5 en Claude Opus 5,5 dezelfde twee JavaScript-opdrachten gegeven via GlobalGPT. Elk model leverde broncode op; we hebben de code ge\u00efnspecteerd en vaste lokale controles uitgevoerd. De instructies voor het wisselen van model in Claude Code elders in deze handleiding zijn afkomstig uit de offici\u00eble documentatie ervan.<\/p>\n<p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Elk verzoek had een uitvoerlimiet van 4.096 tokens, er waren geen hulpmiddelen of gespreksgeschiedenis beschikbaar en de modelinstellingen waren standaard. We hebben het eerste beoordeelbare antwoord behouden, inclusief onvolledige antwoorden. Bij \u00e9\u00e9n servicefout tijdens de routeringstaak van Sonnet was \u00e9\u00e9n herpoging toegestaan: zeven verzoeken leverden zes uitvoerresultaten op.<\/p>\n<p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Deze twee kleine taken meten de geretourneerde code en de volledigheid van de levering. Ze meten niet de uitvoering door de agent van de Claude-code, het doorzoeken van de repository of een volledige ontwikkelingssessie. Er zijn geen daadwerkelijke kosten in dollars gerapporteerd. E\u00e9n enkele waarneming per taak is onvoldoende om een algemene ranglijst op basis van snelheid of betrouwbaarheid op te stellen.<\/p>\n<details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Bekijk de exacte model-ID's en evaluatievoorwaarden<\/summary><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Gevraagde ID's: <code style=\"box-sizing:border-box;color:inherit\">claude-haiku-4-5-20251001<\/code>, <code style=\"box-sizing:border-box;color:inherit\">claude-sonnet-5<\/code>, en <code style=\"box-sizing:border-box;color:inherit\">claude-opus-5-5<\/code>. De lokale tests zijn uitgevoerd met Node.js v24.19.0. De instructies zijn bedoeld voor Node.js 18 en hoger; Node.js 18 zelf is niet getest.<\/p><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Voor de slak-taak werden acht gedragsgroepen vastgesteld en voor de route-selector twaalf. Naleving van het formaat en volledige levering worden afzonderlijk gerapporteerd. Een latere controle in het kader van de codereview wordt apart vermeld en heeft geen invloed op deze aantallen. We hebben de teruggestuurde broncode niet aangepast om deze goedgekeurd te krijgen.<\/p><\/details>\n<\/section>\n\n\n\n<style>\n.ccms-test-t01{border:1px solid #d7dfed;border-radius:8px;padding:24px;background:#f8faff;color:#172438;margin:28px 0;font:16px\/1.6 system-ui,sans-serif;box-sizing:border-box}.ccms-test-t01 *{box-sizing:border-box}.ccms-test-t01 h3,.ccms-test-t01 h4{color:#172438;line-height:1.35;margin:0 0 12px}.ccms-test-t01 h3{font-size:1.35rem}.ccms-test-t01 h4{font-size:1.1rem}.ccms-test-t01 p{color:#35435a;margin:12px 0}.ccms-test-t01 a{color:#254fc2;text-decoration:underline}.ccms-test-t01 .ccms-scroll{overflow-x:auto}.ccms-test-t01 table{width:100%;min-width:650px;border-collapse:collapse;text-align:left;font-size:14px}.ccms-test-t01 th,.ccms-test-t01 td{padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top}.ccms-test-t01 th{background:#eaf0fa}.ccms-test-t01 details{border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff}.ccms-test-t01 summary{cursor:pointer;font-weight:650;color:#254fc2}.ccms-test-t01 pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace}.ccms-test-t01 code{color:inherit}.ccms-test-t01 .ccms-verdict{border-left:4px solid #5b62c8;padding:8px 14px;background:#eef0ff}.ccms-test-t01 .ccms-note{font-size:14px}@media(max-width:520px){.ccms-test-t01{padding:16px}.ccms-test-t01 pre{padding:10px}}\n<\/style><section class=\"ccms-test-t01\" aria-labelledby=\"ccms-test-t01-title\" style=\"border:1px solid #d7dfed;border-radius:8px;padding:24px;background:#f8faff;color:#172438;margin:28px 0;font:16px\/1.6 system-ui,sans-serif;box-sizing:border-box;max-width:100%\"><h3 id=\"ccms-test-t01-title\" style=\"box-sizing:border-box;color:#172438;line-height:1.35;margin:0 0 12px;font-size:1.35rem\">Opdracht 1: Unicode behouden bij het herstructureren van een kleine slug<\/h3><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">De functie moest niet-Latijnse letters en combinatie-tekens behouden, ontleedde accenten normaliseren en het bestaande ASCII-gedrag behouden.<\/p><div class=\"ccms-scroll\" style=\"box-sizing:border-box;overflow-x:auto;max-width:100%\"><table style=\"box-sizing:border-box;width:100%;min-width:650px;border-collapse:collapse;text-align:left;font-size:14px\"><caption style=\"box-sizing:border-box\">Eerste retourwaarden, met controles op vastgelegd lokaal gedrag<\/caption><thead style=\"box-sizing:border-box\"><tr style=\"box-sizing:border-box\"><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Model<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Gedragscontroles<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Formaat van het antwoord<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">De gevraagde levering voltooien<\/th><\/tr><\/thead><tbody style=\"box-sizing:border-box\"><tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Claude Haiku 4.5<\/th><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">8\/8<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Fout: Markdown-wrapper<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Ja: volledige functie<\/td><\/tr><tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Claude Sonnet 5<\/th><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">8\/8<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Pass: onbewerkte JSON<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Ja: volledige functie<\/td><\/tr><tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Claude Opus 5,5<\/th><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">8\/8<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Pass: onbewerkte JSON<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Ja: volledige functie<\/td><\/tr><\/tbody><\/table><\/div><div class=\"ccms-verdict\" style=\"box-sizing:border-box;border-left:4px solid #5b62c8;padding:8px 14px;background:#eef0ff;max-width:100%\"><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\"><strong style=\"box-sizing:border-box\">Waargenomen resultaat:<\/strong> Alle drie de functies verwerkten dezelfde acht groepen. Sonnet en Opus voldeden ook aan de vereiste voor een ruwe JSON-respons. Haiku verpakte zijn respons in Markdown, en in de toelichting bij de beoordeling werd NFC ten onrechte omschreven als het ontleden van tekens; in de code werd NFC echter correct aangeroepen.<\/p><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Bij deze beperkte herstructurering leidde de upgrade niet tot een verbetering van het gedrag van de geteste functie. De opmaakvereisten en de nauwkeurigheid van de bijbehorende uitleg moesten nog worden gecontroleerd.<\/p><\/div><details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Bekijk de volledige gedeelde prompt en de invoercode<\/summary><pre style=\"box-sizing:border-box;white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace\"><code style=\"box-sizing:border-box;color:inherit\">SYSTEM\nYou are completing a bounded JavaScript coding task. Return only the requested JSON object with complete source files and brief review notes. Do not claim to have edited files, run commands, or used tools. You have no tool access. Do not include hidden reasoning.\n\nUSER\nImplement the following Node.js 18+ CommonJS function from its current source. Return complete replacement source for src\/slugify.js. Do not add dependencies, imports, I\/O, or other files.\n\nRequired behavior:\n1. slugify(value) returns an empty string for every non-string input.\n2. Normalize string input to Unicode NFC, then lowercase it using JavaScript toLowerCase().\n3. Preserve Unicode letters, numbers, and combining marks. Replace each consecutive run of all other characters with one ASCII hyphen.\n4. Trim leading and trailing hyphens. Preserve the CommonJS export { slugify }.\n5. Existing ASCII behavior must continue to work. Examples: Hello, World! -&gt; hello-world; two   words -&gt; two-words; null -&gt; empty string.\n6. Additional examples: Caf\u00e9 d\u00e9j\u00e0 vu -&gt; caf\u00e9-d\u00e9j\u00e0-vu; decomposed Cafe\\u0301 -&gt; caf\u00e9; \u4e2d\u6587 \u6d4b\u8bd5 42 -&gt; \u4e2d\u6587-\u6d4b\u8bd5-42; **hi___there** -&gt; hi-there; only punctuation or whitespace -&gt; empty string.\n\nCurrent src\/slugify.js:\n```javascript\nfunction slugify(value) {\n  if (typeof value !== &quot;string&quot;) return &quot;&quot;;\n  return value\n    .trim()\n    .toLowerCase()\n    .replace(\/[^a-z0-9]+\/g, &quot;-&quot;)\n    .replace(\/^-+|-+$\/g, &quot;&quot;);\n}\n\nmodule.exports = { slugify };\n\n\n```\n\nReturn exactly one JSON object with this shape:\n{&quot;files&quot;:{&quot;src\/slugify.js&quot;:&quot;complete JavaScript source as a JSON string&quot;},&quot;review_notes&quot;:[&quot;at most four brief implementation or assumption notes&quot;]}\nNo Markdown wrapper. You are returning code for someone else to evaluate locally; do not say that tests passed or that you ran them.\n<\/code><\/pre><\/details><details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Bekijk het volledige antwoord van Claude Haiku 4.5 zoals het is teruggestuurd<\/summary><pre style=\"box-sizing:border-box;white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace\"><code style=\"box-sizing:border-box;color:inherit\">```json\n{\n  &quot;files&quot;: {\n    &quot;src\/slugify.js&quot;: &quot;function slugify(value) {\\n  if (typeof value !== \\&quot;string\\&quot;) return \\&quot;\\&quot;;\\n  \\n  \/\/ Normalize to NFC and lowercase\\n  const normalized = value.normalize(\\&quot;NFC\\&quot;).toLowerCase();\\n  \\n  \/\/ Replace consecutive runs of non-letter, non-number, non-combining-mark characters with a single hyphen\\n  \/\/ Unicode letter categories: L* (Lu, Ll, Lt, Lm, Lo)\\n  \/\/ Unicode number categories: N* (Nd, Nl, No)\\n  \/\/ Unicode combining mark categories: M* (Mn, Mc, Me)\\n  const slugged = normalized.replace(\/[^\\\\p{L}\\\\p{N}\\\\p{M}]+\/gu, \\&quot;-\\&quot;);\\n  \\n  \/\/ Trim leading and trailing hyphens\\n  return slugged.replace(\/^-+|-+$\/g, \\&quot;\\&quot;);\\n}\\n\\nmodule.exports = { slugify };&quot;\n  },\n  &quot;review_notes&quot;: [\n    &quot;Uses String.prototype.normalize(\\&quot;NFC\\&quot;) to decompose composed characters like \u00e9 into base+combining mark, then toLowerCase() applies to normalized string&quot;,\n    &quot;Unicode property escapes (\\\\p{L}, \\\\p{N}, \\\\p{M}) with \/u flag preserve all Unicode letters, numbers, and combining marks while replacing other consecutive characters with single hyphens&quot;,\n    &quot;Existing ASCII behavior is preserved: punctuation and whitespace are replaced with hyphens, then leading\/trailing hyphens are trimmed&quot;,\n    &quot;Non-string inputs return empty string as required; normalized decomposed characters (e.g., Cafe\\\\u0301) are handled correctly by NFC normalization&quot;\n  ]\n}\n```<\/code><\/pre><\/details><details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Bekijk het volledige antwoord van Claude Sonnet 5 zoals het is teruggestuurd<\/summary><pre style=\"box-sizing:border-box;white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace\"><code style=\"box-sizing:border-box;color:inherit\">{&quot;files&quot;:{&quot;src\/slugify.js&quot;:&quot;function slugify(value) {\\n  if (typeof value !== \\&quot;string\\&quot;) return \\&quot;\\&quot;;\\n  return value\\n    .normalize(\\&quot;NFC\\&quot;)\\n    .toLowerCase()\\n    .replace(\/[^\\\\p{L}\\\\p{N}\\\\p{M}]+\/gu, \\&quot;-\\&quot;)\\n    .replace(\/^-+|-+$\/g, \\&quot;\\&quot;);\\n}\\n\\nmodule.exports = { slugify };\\n&quot;},&quot;review_notes&quot;:[&quot;Used Unicode property escapes (\\\\p{L}, \\\\p{N}, \\\\p{M}) with the u flag to preserve letters, numbers, and combining marks across scripts.&quot;,&quot;NFC normalization ensures decomposed sequences like Cafe + combining acute compose to caf\u00e9 before lowercasing.&quot;,&quot;Runs of any other characters (punctuation, whitespace, symbols) collapse to a single hyphen, then leading\/trailing hyphens are trimmed.&quot;]}<\/code><\/pre><\/details><details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Bekijk het volledige antwoord van Claude Opus 5.5 zoals het is teruggestuurd<\/summary><pre style=\"box-sizing:border-box;white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace\"><code style=\"box-sizing:border-box;color:inherit\">{&quot;files&quot;:{&quot;src\/slugify.js&quot;:&quot;function slugify(value) {\\n  if (typeof value !== \\&quot;string\\&quot;) return \\&quot;\\&quot;;\\n  return value\\n    .normalize(\\&quot;NFC\\&quot;)\\n    .toLowerCase()\\n    .replace(\/[^\\\\p{L}\\\\p{N}\\\\p{M}]+\/gu, \\&quot;-\\&quot;)\\n    .replace(\/^-+|-+$\/g, \\&quot;\\&quot;);\\n}\\n\\nmodule.exports = { slugify };\\n&quot;},&quot;review_notes&quot;:[&quot;The input is normalized to NFC before lowercasing, so decomposed input like Cafe\\\\u0301 composes to caf\u00e9.&quot;,&quot;A Unicode property regex with the u flag keeps letters (\\\\p{L}), numbers (\\\\p{N}) and combining marks (\\\\p{M}). Each run of any other characters, including underscores and whitespace, becomes one hyphen.&quot;,&quot;The explicit trim() was removed because the final step strips leading and trailing hyphens, which covers surrounding whitespace.&quot;,&quot;Lowercasing happens after NFC normalization, as the spec orders. toLowerCase can occasionally produce non-NFC output for rare characters, and it is not re-normalized here.&quot;]}<\/code><\/pre><\/details><\/section>\n\n\n\n<style>\n.ccms-test-t02{border:1px solid #d7dfed;border-radius:8px;padding:24px;background:#f8faff;color:#172438;margin:28px 0;font:16px\/1.6 system-ui,sans-serif;box-sizing:border-box}.ccms-test-t02 *{box-sizing:border-box}.ccms-test-t02 h3,.ccms-test-t02 h4{color:#172438;line-height:1.35;margin:0 0 12px}.ccms-test-t02 h3{font-size:1.35rem}.ccms-test-t02 h4{font-size:1.1rem}.ccms-test-t02 p{color:#35435a;margin:12px 0}.ccms-test-t02 a{color:#254fc2;text-decoration:underline}.ccms-test-t02 .ccms-scroll{overflow-x:auto}.ccms-test-t02 table{width:100%;min-width:650px;border-collapse:collapse;text-align:left;font-size:14px}.ccms-test-t02 th,.ccms-test-t02 td{padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top}.ccms-test-t02 th{background:#eaf0fa}.ccms-test-t02 details{border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff}.ccms-test-t02 summary{cursor:pointer;font-weight:650;color:#254fc2}.ccms-test-t02 pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace}.ccms-test-t02 code{color:inherit}.ccms-test-t02 .ccms-verdict{border-left:4px solid #5b62c8;padding:8px 14px;background:#eef0ff}.ccms-test-t02 .ccms-note{font-size:14px}@media(max-width:520px){.ccms-test-t02{padding:16px}.ccms-test-t02 pre{padding:10px}}\n<\/style><section class=\"ccms-test-t02\" aria-labelledby=\"ccms-test-t02-title\" style=\"border:1px solid #d7dfed;border-radius:8px;padding:24px;background:#f8faff;color:#172438;margin:28px 0;font:16px\/1.6 system-ui,sans-serif;box-sizing:border-box;max-width:100%\"><h3 id=\"ccms-test-t02-title\" style=\"box-sizing:border-box;color:#172438;line-height:1.35;margin:0 0 12px;font-size:1.35rem\">Opdracht 2: Een routeschakelaar repareren en de bijbehorende tests uitvoeren<\/h3><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">De functie moest problemen oplossen met betrekking tot overeenkomsten met de langste prefix, de prioriteit van methoden, segmentgrenzen, onjuist opgebouwde regels en onveranderlijke invoer. Het gevraagde antwoord bevatte ook een nieuw testbestand.<\/p><div class=\"ccms-scroll\" style=\"box-sizing:border-box;overflow-x:auto;max-width:100%\"><table style=\"box-sizing:border-box;width:100%;min-width:650px;border-collapse:collapse;text-align:left;font-size:14px\"><caption style=\"box-sizing:border-box\">Eerste retourwaarden, met controles op vastgelegd lokaal gedrag<\/caption><thead style=\"box-sizing:border-box\"><tr style=\"box-sizing:border-box\"><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Model<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Gedragscontroles<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Formaat van het antwoord<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">De gevraagde levering voltooien<\/th><\/tr><\/thead><tbody style=\"box-sizing:border-box\"><tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Claude Haiku 4.5<\/th><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">12\/12 alleen voor de volledige functie<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Fout: afgekorte JSON<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Nee: testbestand is afgekapt<\/td><\/tr><tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Claude Sonnet 5<\/th><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">12\/12 alleen voor de volledige functie<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Fout: afgekorte JSON<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Nee: testbestand is afgekapt<\/td><\/tr><tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Claude Opus 5,5<\/th><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">12\/12 alleen voor de volledige functie<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Fout: afgekorte JSON<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Nee: testbestand is afgekapt<\/td><\/tr><\/tbody><\/table><\/div><div class=\"ccms-verdict\" style=\"box-sizing:border-box;border-left:4px solid #5b62c8;padding:8px 14px;background:#eef0ff;max-width:100%\"><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\"><strong style=\"box-sizing:border-box\">Waargenomen resultaat:<\/strong> Geen enkel model voltooide de gevraagde respons met twee bestanden binnen de gedeelde uitvoerlimiet. Alle drie stopten bij 4.096 gerapporteerde voltooiingstokens. Elk model had al een volledige routerfunctie geretourneerd, die de twaalf vaste gedragsgroepen had doorlopen; de nieuwe testbestanden waren onvolledig en werden niet uitgevoerd.<\/p><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">We hebben uitsluitend de volledig gesloten broncodestrings eruit gehaald. De oorspronkelijke, ingekorte antwoorden blijven hieronder intact. Een geslaagde functiescore betekent daarom niet dat het volledige verzoek is geslaagd.<\/p><\/div><details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Extra bevinding bij de codereview: een gelijkspel met gelijke wortels<\/summary><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Na de vaste controles merkten we dat Haiku zich had genormaliseerd <code style=\"box-sizing:border-box;color:inherit\">\/\/\/<\/code> naar een lege tekenreeks in plaats van <code style=\"box-sizing:border-box;color:inherit\">\/<\/code>. Bij een afzonderlijke lokale controle werden twee GET-regels gebruikt, met voorvoegsels <code style=\"box-sizing:border-box;color:inherit\">\/\/\/<\/code> en <code style=\"box-sizing:border-box;color:inherit\">\/<\/code>, gericht op <code style=\"box-sizing:border-box;color:inherit\">eerste<\/code> en <code style=\"box-sizing:border-box;color:inherit\">tweede<\/code> in die volgorde. Voor <code style=\"box-sizing:border-box;color:inherit\">\/wat dan ook<\/code>, het contract schrijft voor dat <code style=\"box-sizing:border-box;color:inherit\">eerste<\/code>.<\/p><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Haiku is terug <code style=\"box-sizing:border-box;color:inherit\">tweede<\/code>; Sonnet en Opus zijn teruggekeerd <code style=\"box-sizing:border-box;color:inherit\">eerste<\/code>. Deze extra controle vloeide voort uit de codereview en staat los van de twaalf controles die voorafgaand aan het testen zijn vastgesteld. Het heeft geen invloed op de scores daarvan.<\/p><\/details><p class=\"ccms-note\" style=\"box-sizing:border-box;color:#35435a;margin:12px 0;font-size:14px\">Sonnet kreeg \u00e9\u00e9n servicefout te verwerken voordat de toegestane herpoging het weergegeven, ingekorte antwoord opleverde. Die servicefout staat los van de kwaliteit van de code. Geen enkel model kreeg nog een kans om zijn antwoord te verbeteren of af te ronden.<\/p><details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Bekijk de volledige gedeelde prompt en de invoercode<\/summary><pre style=\"box-sizing:border-box;white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace\"><code style=\"box-sizing:border-box;color:inherit\">SYSTEM\nYou are completing a bounded JavaScript coding task. Return only the requested JSON object with complete source files and brief review notes. Do not claim to have edited files, run commands, or used tools. You have no tool access. Do not include hidden reasoning.\n\nUSER\nRepair a Node.js 18+ CommonJS route selector. Return complete replacement src\/router.js and an additional test\/router-added.test.js using node:test and node:assert\/strict. Do not add dependencies or edit existing tests. Do not use I\/O other than the test runner, network, child processes, timers, or any files beyond the two requested outputs.\n\nContract for chooseRoute(request, rules):\n1. Invalid request or rules returns null, without throwing. Request must be a non-null, non-array object; method must be a nonempty ASCII-letter string; path must be a string beginning with \/. Rules must be an array.\n2. Before matching, remove the request path&#x27;s query and fragment starting at the earliest ? or #. Do not URL-decode or collapse interior slashes.\n3. Ignore invalid rules. A valid rule is a non-null, non-array object with method &#x27;*&#x27; or a nonempty ASCII-letter string, prefix a string starting with \/ containing neither ? nor #, and target a nonempty string.\n4. Compare methods case-insensitively. Prefer any matching exact-method rule over all wildcard-method &#x27;*&#x27; rules, even if a wildcard has a longer prefix. Use wildcard rules only if no exact-method route matches the path.\n5. Remove trailing slashes from a rule prefix, except that an all-slash prefix normalizes to \/. A prefix matches the path only at a segment boundary: \/api matches \/api and \/api\/users, never \/apix. Root \/ matches every valid request path.\n6. Within the chosen method group, choose the longest normalized matching prefix. On equal prefix length, choose the earlier rule in the original input array. Return its target. Return null if none matches.\n7. Do not mutate the request, rules array, or rule objects, including order or prefix strings. Preserve module.exports = { chooseRoute }.\n8. Add tests for segment boundaries, query\/fragment removal, method precedence, ties, malformed inputs and immutability. Existing simple GET \/api\/users and POST-no-match cases must still pass.\n\nCurrent src\/router.js:\n```javascript\nfunction chooseRoute(request, rules) {\n  if (!request || !Array.isArray(rules)) return null;\n  for (const rule of rules) {\n    if (request.method === rule.method &amp;&amp; request.path.startsWith(rule.prefix)) {\n      return rule.target;\n    }\n  }\n  return null;\n}\n\nmodule.exports = { chooseRoute };\n\n\n```\n\nExisting regression cases (unchanged): rules [{method:&#x27;GET&#x27;,prefix:&#x27;\/api&#x27;,target:&#x27;api&#x27;},{method:&#x27;GET&#x27;,prefix:&#x27;\/api\/admin&#x27;,target:&#x27;admin&#x27;}]; GET \/api\/users returns &#x27;api&#x27;; POST \/api\/users returns null.\n\nReturn exactly one JSON object with this shape:\n{&quot;files&quot;:{&quot;src\/router.js&quot;:&quot;complete JavaScript source as a JSON string&quot;,&quot;test\/router-added.test.js&quot;:&quot;complete JavaScript tests as a JSON string&quot;},&quot;review_notes&quot;:[&quot;at most four brief implementation or assumption notes&quot;]}\nNo Markdown wrapper. You are returning code for someone else to evaluate locally; do not say you edited files, ran tests, or observed passing results.\n<\/code><\/pre><\/details><details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Bekijk het volledige antwoord van Claude Haiku 4.5 zoals het is teruggestuurd<\/summary><p class=\"ccms-note\" style=\"box-sizing:border-box;color:#35435a;margin:12px 0;font-size:14px\">Dit is het volledige antwoord dat we hebben ontvangen. Het stopt halverwege omdat de limiet is bereikt; de ontbrekende inhoud is niet aangevuld.<\/p><pre style=\"box-sizing:border-box;white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace\"><code style=\"box-sizing:border-box;color:inherit\">```json\n{\n  &quot;files&quot;: {\n    &quot;src\/router.js&quot;: &quot;function chooseRoute(request, rules) {\\n  \/\/ Validate request\\n  if (request === null || Array.isArray(request) || typeof request !== &#x27;object&#x27;) {\\n    return null;\\n  }\\n  if (typeof request.method !== &#x27;string&#x27; || request.method.length === 0 || !\/^[a-zA-Z]+$\/.test(request.method)) {\\n    return null;\\n  }\\n  if (typeof request.path !== &#x27;string&#x27; || !request.path.startsWith(&#x27;\/&#x27;)) {\\n    return null;\\n  }\\n\\n  \/\/ Validate rules\\n  if (!Array.isArray(rules)) {\\n    return null;\\n  }\\n\\n  \/\/ Remove query and fragment from path\\n  const cleanPath = request.path.split(\/[?#]\/)[0];\\n\\n  \/\/ Filter and validate rules\\n  const validRules = [];\\n  for (const rule of rules) {\\n    if (rule === null || Array.isArray(rule) || typeof rule !== &#x27;object&#x27;) {\\n      continue;\\n    }\\n    \\n    const method = rule.method;\\n    if (typeof method !== &#x27;string&#x27; || (method !== &#x27;*&#x27; &amp;&amp; (method.length === 0 || !\/^[a-zA-Z]+$\/.test(method)))) {\\n      continue;\\n    }\\n    \\n    const prefix = rule.prefix;\\n    if (typeof prefix !== &#x27;string&#x27; || !prefix.startsWith(&#x27;\/&#x27;) || prefix.includes(&#x27;?&#x27;) || prefix.includes(&#x27;#&#x27;)) {\\n      continue;\\n    }\\n    \\n    const target = rule.target;\\n    if (typeof target !== &#x27;string&#x27; || target.length === 0) {\\n      continue;\\n    }\\n    \\n    validRules.push(rule);\\n  }\\n\\n  \/\/ Normalize prefixes and partition into exact-method and wildcard groups\\n  const exactMethodRules = [];\\n  const wildcardRules = [];\\n  \\n  for (const rule of validRules) {\\n    const normalizedPrefix = rule.prefix === &#x27;\/&#x27; ? &#x27;\/&#x27; : rule.prefix.replace(\/\\\\\/+$\/, &#x27;&#x27;);\\n    \\n    const entry = {\\n      originalRule: rule,\\n      normalizedPrefix: normalizedPrefix,\\n      method: rule.method\\n    };\\n    \\n    if (rule.method === &#x27;*&#x27;) {\\n      wildcardRules.push(entry);\\n    } else {\\n      exactMethodRules.push(entry);\\n    }\\n  }\\n\\n  const requestMethod = request.method.toUpperCase();\\n\\n  \/\/ Helper to check if a prefix matches the path at a segment boundary\\n  function prefixMatches(prefix, path) {\\n    if (prefix === &#x27;\/&#x27;) {\\n      return true;\\n    }\\n    if (!path.startsWith(prefix)) {\\n      return false;\\n    }\\n    \/\/ Check segment boundary: next character must be &#x27;\/&#x27; or end of string\\n    const nextChar = path[prefix.length];\\n    return nextChar === undefined || nextChar === &#x27;\/&#x27;;\\n  }\\n\\n  \/\/ Try exact-method rules first\\n  let bestMatch = null;\\n  let bestLength = -1;\\n  \\n  for (const entry of exactMethodRules) {\\n    if (entry.method.toUpperCase() === requestMethod) {\\n      if (prefixMatches(entry.normalizedPrefix, cleanPath)) {\\n        if (entry.normalizedPrefix.length &gt; bestLength) {\\n          bestMatch = entry.originalRule;\\n          bestLength = entry.normalizedPrefix.length;\\n        }\\n      }\\n    }\\n  }\\n  \\n  if (bestMatch !== null) {\\n    return bestMatch.target;\\n  }\\n\\n  \/\/ Try wildcard rules only if no exact-method match\\n  bestMatch = null;\\n  bestLength = -1;\\n  \\n  for (const entry of wildcardRules) {\\n    if (prefixMatches(entry.normalizedPrefix, cleanPath)) {\\n      if (entry.normalizedPrefix.length &gt; bestLength) {\\n        bestMatch = entry.originalRule;\\n        bestLength = entry.normalizedPrefix.length;\\n      }\\n    }\\n  }\\n  \\n  if (bestMatch !== null) {\\n    return bestMatch.target;\\n  }\\n\\n  return null;\\n}\\n\\nmodule.exports = { chooseRoute };&quot;,\n    &quot;test\/router-added.test.js&quot;: &quot;const test = require(&#x27;node:test&#x27;);\\nconst assert = require(&#x27;node:assert\/strict&#x27;);\\nconst { chooseRoute } = require(&#x27;..\/src\/router.js&#x27;);\\n\\n\/\/ Regression: existing test cases\\ntest(&#x27;GET \/api\/users matches \/api prefix (exact method)&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;api&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api\/admin&#x27;, target: &#x27;admin&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users&#x27; }, rules), &#x27;api&#x27;);\\n});\\n\\ntest(&#x27;POST \/api\/users returns null (no matching method)&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;api&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api\/admin&#x27;, target: &#x27;admin&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;POST&#x27;, path: &#x27;\/api\/users&#x27; }, rules), null);\\n});\\n\\n\/\/ Invalid request handling\\ntest(&#x27;null request returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute(null, []), null);\\n});\\n\\ntest(&#x27;array request returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute([], []), null);\\n});\\n\\ntest(&#x27;request with missing method returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ path: &#x27;\/api&#x27; }, []), null);\\n});\\n\\ntest(&#x27;request with empty method returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;&#x27;, path: &#x27;\/api&#x27; }, []), null);\\n});\\n\\ntest(&#x27;request with non-letter method returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;GET-POST&#x27;, path: &#x27;\/api&#x27; }, []), null);\\n});\\n\\ntest(&#x27;request with numeric method returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;123&#x27;, path: &#x27;\/api&#x27; }, []), null);\\n});\\n\\ntest(&#x27;request with missing path returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27; }, []), null);\\n});\\n\\ntest(&#x27;request with path not starting with \/ returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;api&#x27; }, []), null);\\n});\\n\\ntest(&#x27;null rules returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, null), null);\\n});\\n\\ntest(&#x27;non-array rules returns null&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, { method: &#x27;GET&#x27; }), null);\\n});\\n\\n\/\/ Query and fragment removal\\ntest(&#x27;query string is removed before matching&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users?foo=bar&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;fragment is removed before matching&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users#section&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;earliest ? or # is used as boundary&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users?foo#bar&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;fragment before query is used as boundary&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users#foo?bar&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\n\/\/ Segment boundary matching\\ntest(&#x27;prefix \/api matches \/api\/users at segment boundary&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;prefix \/api does not match \/apix (no segment boundary)&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/apix&#x27; }, rules), null);\\n});\\n\\ntest(&#x27;prefix \/api matches \/api exactly at segment boundary&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;root \/ matches any valid path&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/&#x27;, target: &#x27;root&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/anything\/here&#x27; }, rules), &#x27;root&#x27;);\\n});\\n\\ntest(&#x27;root \/ matches \/&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/&#x27;, target: &#x27;root&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/&#x27; }, rules), &#x27;root&#x27;);\\n});\\n\\n\/\/ Prefix normalization (trailing slash removal)\\ntest(&#x27;trailing slash is removed from prefix&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api\/&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;multiple trailing slashes are removed&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api\/\/\/&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;all-slash prefix normalizes to single \/&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/\/\/&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\n\/\/ Method case-insensitivity\\ntest(&#x27;method comparison is case-insensitive&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;get&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;request method case does not affect matching&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;get&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\n\/\/ Exact-method vs wildcard precedence\\ntest(&#x27;exact-method rule preferred over wildcard with longer prefix&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;*&#x27;, prefix: &#x27;\/api\/admin\/users&#x27;, target: &#x27;wildcard&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;exact&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/test&#x27; }, rules), &#x27;exact&#x27;);\\n});\\n\\ntest(&#x27;wildcard rule used when no exact-method matches&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;*&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;wildcard&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/other&#x27;, target: &#x27;exact&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;POST&#x27;, path: &#x27;\/api\/users&#x27; }, rules), &#x27;wildcard&#x27;);\\n});\\n\\n\/\/ Longest prefix matching\\ntest(&#x27;longest matching prefix is chosen&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;short&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api\/admin&#x27;, target: &#x27;long&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/admin\/users&#x27; }, rules), &#x27;long&#x27;);\\n});\\n\\n\/\/ Tie-breaking (first rule wins on equal prefix length)\\ntest(&#x27;first rule wins on equal prefix length&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;first&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;second&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users&#x27; }, rules), &#x27;first&#x27;);\\n});\\n\\n\/\/ Invalid rules are ignored\\ntest(&#x27;null rule is ignored&#x27;, () =&gt; {\\n  const rules = [\\n    null,\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;array rule is ignored&#x27;, () =&gt; {\\n  const rules = [\\n    [],\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;found&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;found&#x27;);\\n});\\n\\ntest(&#x27;rule with invalid method is ignored&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;invalid&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;valid&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;valid&#x27;);\\n});\\n\\ntest(&#x27;rule with non-letter method (if not wildcard) is ignored&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;G3T&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;invalid&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;valid&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;valid&#x27;);\\n});\\n\\ntest(&#x27;rule with prefix not starting with \/ is ignored&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;GET&#x27;, prefix: &#x27;api&#x27;, target: &#x27;invalid&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;valid&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;valid&#x27;);\\n});\\n\\ntest(&#x27;rule with query in prefix is ignored&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api?foo=bar&#x27;, target: &#x27;invalid&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;valid&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;valid&#x27;);\\n});\\n\\ntest(&#x27;rule with fragment in prefix is ignored&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api#section&#x27;, target: <\/code><\/pre><\/details><details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Bekijk het volledige antwoord van Claude Sonnet 5 zoals het is teruggestuurd<\/summary><p class=\"ccms-note\" style=\"box-sizing:border-box;color:#35435a;margin:12px 0;font-size:14px\">Dit is het volledige antwoord dat we hebben ontvangen. Het stopt halverwege omdat de limiet is bereikt; de ontbrekende inhoud is niet aangevuld.<\/p><pre style=\"box-sizing:border-box;white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace\"><code style=\"box-sizing:border-box;color:inherit\">{&quot;files&quot;:{&quot;src\/router.js&quot;:&quot;function isValidRequest(request) {\\n  return (\\n    request !== null &amp;&amp;\\n    typeof request === &#x27;object&#x27; &amp;&amp;\\n    !Array.isArray(request) &amp;&amp;\\n    typeof request.method === &#x27;string&#x27; &amp;&amp;\\n    request.method.length &gt; 0 &amp;&amp;\\n    \/^[A-Za-z]+$\/.test(request.method) &amp;&amp;\\n    typeof request.path === &#x27;string&#x27; &amp;&amp;\\n    request.path.startsWith(&#x27;\/&#x27;)\\n  );\\n}\\n\\nfunction isValidRule(rule) {\\n  if (rule === null || typeof rule !== &#x27;object&#x27; || Array.isArray(rule)) {\\n    return false;\\n  }\\n  const { method, prefix, target } = rule;\\n\\n  if (typeof method !== &#x27;string&#x27;) return false;\\n  if (method !== &#x27;*&#x27; &amp;&amp; !(method.length &gt; 0 &amp;&amp; \/^[A-Za-z]+$\/.test(method))) {\\n    return false;\\n  }\\n\\n  if (\\n    typeof prefix !== &#x27;string&#x27; ||\\n    !prefix.startsWith(&#x27;\/&#x27;) ||\\n    prefix.includes(&#x27;?&#x27;) ||\\n    prefix.includes(&#x27;#&#x27;)\\n  ) {\\n    return false;\\n  }\\n\\n  if (typeof target !== &#x27;string&#x27; || target.length === 0) return false;\\n\\n  return true;\\n}\\n\\nfunction normalizePrefix(prefix) {\\n  if (\/^\\\\\/+$\/.test(prefix)) return &#x27;\/&#x27;;\\n  return prefix.replace(\/\\\\\/+$\/, &#x27;&#x27;);\\n}\\n\\nfunction prefixMatches(normalizedPrefix, path) {\\n  if (normalizedPrefix === &#x27;\/&#x27;) return true;\\n  if (path === normalizedPrefix) return true;\\n  return path.startsWith(normalizedPrefix + &#x27;\/&#x27;);\\n}\\n\\nfunction stripQueryAndFragment(path) {\\n  let cutIndex = path.length;\\n  for (let i = 0; i &lt; path.length; i++) {\\n    const c = path[i];\\n    if (c === &#x27;?&#x27; || c === &#x27;#&#x27;) {\\n      cutIndex = i;\\n      break;\\n    }\\n  }\\n  return path.slice(0, cutIndex);\\n}\\n\\nfunction chooseRoute(request, rules) {\\n  if (!isValidRequest(request) || !Array.isArray(rules)) return null;\\n\\n  const path = stripQueryAndFragment(request.path);\\n  const reqMethodLower = request.method.toLowerCase();\\n\\n  let bestExact = null; \/\/ { len, idx, target }\\n  let bestWildcard = null;\\n\\n  for (let idx = 0; idx &lt; rules.length; idx++) {\\n    const rule = rules[idx];\\n    if (!isValidRule(rule)) continue;\\n\\n    const normPrefix = normalizePrefix(rule.prefix);\\n    if (!prefixMatches(normPrefix, path)) continue;\\n\\n    const len = normPrefix.length;\\n\\n    if (rule.method === &#x27;*&#x27;) {\\n      if (\\n        bestWildcard === null ||\\n        len &gt; bestWildcard.len ||\\n        (len === bestWildcard.len &amp;&amp; idx &lt; bestWildcard.idx)\\n      ) {\\n        bestWildcard = { len, idx, target: rule.target };\\n      }\\n    } else if (rule.method.toLowerCase() === reqMethodLower) {\\n      if (\\n        bestExact === null ||\\n        len &gt; bestExact.len ||\\n        (len === bestExact.len &amp;&amp; idx &lt; bestExact.idx)\\n      ) {\\n        bestExact = { len, idx, target: rule.target };\\n      }\\n    }\\n  }\\n\\n  if (bestExact !== null) return bestExact.target;\\n  if (bestWildcard !== null) return bestWildcard.target;\\n  return null;\\n}\\n\\nmodule.exports = { chooseRoute };\\n&quot;,&quot;test\/router-added.test.js&quot;:&quot;const test = require(&#x27;node:test&#x27;);\\nconst assert = require(&#x27;node:assert\/strict&#x27;);\\nconst { chooseRoute } = require(&#x27;..\/src\/router&#x27;);\\n\\ntest(&#x27;segment boundary: prefix matches at slash boundary only&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;api&#x27; },\\n  ];\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users&#x27; }, rules),\\n    &#x27;api&#x27;\\n  );\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules),\\n    &#x27;api&#x27;\\n  );\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/apix&#x27; }, rules),\\n    null\\n  );\\n});\\n\\ntest(&#x27;root prefix matches every valid path&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/&#x27;, target: &#x27;root&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/&#x27; }, rules), &#x27;root&#x27;);\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/anything\/here&#x27; }, rules),\\n    &#x27;root&#x27;\\n  );\\n});\\n\\ntest(&#x27;trailing slashes in rule prefix are normalized&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api\/\/\/&#x27;, target: &#x27;api&#x27; }];\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users&#x27; }, rules),\\n    &#x27;api&#x27;\\n  );\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;api&#x27;);\\n});\\n\\ntest(&#x27;all-slash prefix normalizes to \/&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/\/\/\/&#x27;, target: &#x27;root&#x27; }];\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/whatever&#x27; }, rules),\\n    &#x27;root&#x27;\\n  );\\n});\\n\\ntest(&#x27;query and fragment are stripped before matching&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;api&#x27; }];\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users?x=1&amp;y=2&#x27; }, rules),\\n    &#x27;api&#x27;\\n  );\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users#section&#x27; }, rules),\\n    &#x27;api&#x27;\\n  );\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users?x=1#frag&#x27; }, rules),\\n    &#x27;api&#x27;\\n  );\\n});\\n\\ntest(&#x27;query\/fragment stripping does not decode or collapse slashes&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/a\/\/b&#x27;, target: &#x27;weird&#x27; }];\\n  assert.equal(\\n    chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/a\/\/b?x=1&#x27; }, rules),<\/code><\/pre><\/details><details style=\"box-sizing:border-box;border:1px solid #d7dfed;border-radius:6px;padding:12px;margin:12px 0;background:#fff\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:650;color:#254fc2\">Bekijk het volledige antwoord van Claude Opus 5.5 zoals het is teruggestuurd<\/summary><p class=\"ccms-note\" style=\"box-sizing:border-box;color:#35435a;margin:12px 0;font-size:14px\">Dit is het volledige antwoord dat we hebben ontvangen. Het stopt halverwege omdat de limiet is bereikt; de ontbrekende inhoud is niet aangevuld.<\/p><pre style=\"box-sizing:border-box;white-space:pre-wrap;overflow-wrap:anywhere;max-height:520px;overflow:auto;background:#edf1f7;padding:14px;border-radius:4px;color:#162239;font:13px\/1.55 ui-monospace,SFMono-Regular,monospace\"><code style=\"box-sizing:border-box;color:inherit\">{&quot;files&quot;:{&quot;src\/router.js&quot;:&quot;&#x27;use strict&#x27;;\\n\\nconst LETTERS = \/^[A-Za-z]+$\/;\\n\\nfunction isPlainObject(value) {\\n  return value !== null &amp;&amp; typeof value === &#x27;object&#x27; &amp;&amp; !Array.isArray(value);\\n}\\n\\nfunction isMethodName(value) {\\n  return typeof value === &#x27;string&#x27; &amp;&amp; value.length &gt; 0 &amp;&amp; LETTERS.test(value);\\n}\\n\\nfunction stripQueryAndFragment(path) {\\n  const q = path.indexOf(&#x27;?&#x27;);\\n  const h = path.indexOf(&#x27;#&#x27;);\\n  let cut = -1;\\n  if (q !== -1 &amp;&amp; h !== -1) cut = Math.min(q, h);\\n  else if (q !== -1) cut = q;\\n  else if (h !== -1) cut = h;\\n  return cut === -1 ? path : path.slice(0, cut);\\n}\\n\\nfunction normalizePrefix(prefix) {\\n  let end = prefix.length;\\n  while (end &gt; 0 &amp;&amp; prefix[end - 1] === &#x27;\/&#x27;) end -= 1;\\n  return end === 0 ? &#x27;\/&#x27; : prefix.slice(0, end);\\n}\\n\\nfunction prefixMatches(path, prefix) {\\n  if (prefix === &#x27;\/&#x27;) return true;\\n  return path === prefix || path.startsWith(prefix + &#x27;\/&#x27;);\\n}\\n\\nfunction chooseRoute(request, rules) {\\n  try {\\n    if (!isPlainObject(request) || !Array.isArray(rules)) return null;\\n    const method = request.method;\\n    const rawPath = request.path;\\n    if (!isMethodName(method)) return null;\\n    if (typeof rawPath !== &#x27;string&#x27; || rawPath[0] !== &#x27;\/&#x27;) return null;\\n\\n    const path = stripQueryAndFragment(rawPath);\\n    const upperMethod = method.toUpperCase();\\n\\n    let bestExact = null;\\n    let bestWildcard = null;\\n\\n    const count = rules.length;\\n    for (let i = 0; i &lt; count; i += 1) {\\n      const rule = rules[i];\\n      if (!isPlainObject(rule)) continue;\\n      const ruleMethod = rule.method;\\n      const prefix = rule.prefix;\\n      const target = rule.target;\\n      const isWildcard = ruleMethod === &#x27;*&#x27;;\\n      if (!isWildcard &amp;&amp; !isMethodName(ruleMethod)) continue;\\n      if (typeof prefix !== &#x27;string&#x27; || prefix[0] !== &#x27;\/&#x27;) continue;\\n      if (prefix.indexOf(&#x27;?&#x27;) !== -1 || prefix.indexOf(&#x27;#&#x27;) !== -1) continue;\\n      if (typeof target !== &#x27;string&#x27; || target.length === 0) continue;\\n\\n      const normalized = normalizePrefix(prefix);\\n      if (!prefixMatches(path, normalized)) continue;\\n\\n      const candidate = { length: normalized.length, target };\\n      if (isWildcard) {\\n        if (bestWildcard === null || candidate.length &gt; bestWildcard.length) bestWildcard = candidate;\\n      } else if (ruleMethod.toUpperCase() === upperMethod) {\\n        if (bestExact === null || candidate.length &gt; bestExact.length) bestExact = candidate;\\n      }\\n    }\\n\\n    if (bestExact !== null) return bestExact.target;\\n    if (bestWildcard !== null) return bestWildcard.target;\\n    return null;\\n  } catch (err) {\\n    return null;\\n  }\\n}\\n\\nmodule.exports = { chooseRoute };\\n&quot;,&quot;test\/router-added.test.js&quot;:&quot;&#x27;use strict&#x27;;\\n\\nconst test = require(&#x27;node:test&#x27;);\\nconst assert = require(&#x27;node:assert\/strict&#x27;);\\nconst { chooseRoute } = require(&#x27;..\/src\/router.js&#x27;);\\n\\nconst baseRules = [\\n  { method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;api&#x27; },\\n  { method: &#x27;GET&#x27;, prefix: &#x27;\/api\/admin&#x27;, target: &#x27;admin&#x27; }\\n];\\n\\ntest(&#x27;existing regression cases still hold&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users&#x27; }, baseRules), &#x27;api&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;POST&#x27;, path: &#x27;\/api\/users&#x27; }, baseRules), null);\\n});\\n\\ntest(&#x27;longest prefix wins within method group&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/admin\/x&#x27; }, baseRules), &#x27;admin&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/admin&#x27; }, baseRules), &#x27;admin&#x27;);\\n});\\n\\ntest(&#x27;segment boundaries&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;api&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;api&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/&#x27; }, rules), &#x27;api&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/users&#x27; }, rules), &#x27;api&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/apix&#x27; }, rules), null);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/ap&#x27; }, rules), null);\\n});\\n\\ntest(&#x27;trailing slashes in prefixes are normalized, all-slash is root&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api\/\/\/&#x27;, target: &#x27;api&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api&#x27; }, rules), &#x27;api&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/apix&#x27; }, rules), null);\\n  const rootRules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/\/\/&#x27;, target: &#x27;root&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/&#x27; }, rootRules), &#x27;root&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/anything\/else&#x27; }, rootRules), &#x27;root&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/x&#x27; }, [{ method: &#x27;GET&#x27;, prefix: &#x27;\/&#x27;, target: &#x27;r&#x27; }]), &#x27;r&#x27;);\\n});\\n\\ntest(&#x27;query and fragment are removed at earliest ? or #&#x27;, () =&gt; {\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api?next=\/api\/admin&#x27; }, baseRules), &#x27;api&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api#\/admin&#x27; }, baseRules), &#x27;api&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/apix?\/api&#x27; }, baseRules), null);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/admin#frag?q&#x27; }, baseRules), &#x27;admin&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api?q#\/admin&#x27; }, baseRules), &#x27;api&#x27;);\\n});\\n\\ntest(&#x27;no URL decoding and no slash collapsing&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;GET&#x27;, prefix: &#x27;\/api\/admin&#x27;, target: &#x27;admin&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api%2Fadmin&#x27; }, rules), null);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/\/admin&#x27; }, rules), null);\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/\/admin&#x27; }, baseRules), &#x27;api&#x27;);\\n});\\n\\ntest(&#x27;methods compare case-insensitively&#x27;, () =&gt; {\\n  const rules = [{ method: &#x27;get&#x27;, prefix: &#x27;\/a&#x27;, target: &#x27;lower&#x27; }];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/a&#x27; }, rules), &#x27;lower&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;gEt&#x27;, path: &#x27;\/a\/b&#x27; }, rules), &#x27;lower&#x27;);\\n});\\n\\ntest(&#x27;exact method beats longer wildcard; wildcard used only as fallback&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;*&#x27;, prefix: &#x27;\/api\/admin&#x27;, target: &#x27;wild-admin&#x27; },\\n    { method: &#x27;GET&#x27;, prefix: &#x27;\/&#x27;, target: &#x27;get-root&#x27; },\\n    { method: &#x27;POST&#x27;, prefix: &#x27;\/other&#x27;, target: &#x27;post-other&#x27; },\\n    { method: &#x27;*&#x27;, prefix: &#x27;\/api&#x27;, target: &#x27;wild-api&#x27; }\\n  ];\\n  assert.equal(chooseRoute({ method: &#x27;GET&#x27;, path: &#x27;\/api\/admin\/x&#x27; }, rules), &#x27;get-root&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;POST&#x27;, path: &#x27;\/api\/admin\/x&#x27; }, rules), &#x27;wild-admin&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;POST&#x27;, path: &#x27;\/api\/x&#x27; }, rules), &#x27;wild-api&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;POST&#x27;, path: &#x27;\/other\/1&#x27; }, rules), &#x27;post-other&#x27;);\\n  assert.equal(chooseRoute({ method: &#x27;PUT&#x27;, path: &#x27;\/nothing&#x27; }, rules), null);\\n});\\n\\ntest(&#x27;ties go to earlier rule in input order&#x27;, () =&gt; {\\n  const rules = [\\n    { method: &#x27;GET&#x27;, pref<\/code><\/pre><\/details><\/section>\n\n\n\n<p class=\"wp-block-paragraph\">Het maximum van 4.096 tokens was het voor deze test gekozen outputbudget, en niet het gedocumenteerde maximum van een bepaald model. Het routingresultaat wijst erop dat het raadzaam is om, voordat je een grotere aanvraag indient, de omvang van de implementatie, de tests en de uitleg die je terugverwacht, in te schatten. Het kan zinvol zijn om de te leveren resultaten op te splitsen of meer uitvoerruimte toe te staan; we hebben deze uitvoer niet opnieuw uitgevoerd met andere instellingen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beoordeel voor je eigen opdracht drie zaken afzonderlijk: of het antwoord volledig is, of de code nuttige controles doorstaat en of er bij de beoordeling hiaten worden ontdekt die bij die controles over het hoofd zijn gezien. Het doorstaan van twaalf functiecontroles maakte geen van de onvolledige antwoorden met twee bestanden tot een voltooide oplevering.<\/p>\n\n\n\n<h2 id=\"model-cost\" class=\"wp-block-heading\">Welke invloed heeft de modelkeuze op de kosten?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Claude Code is de coderingstool; Haiku, Sonnet, Opus en Fable zijn beschikbare modellen binnen de ondersteunde omgeving. De manier waarop je je aanmeldt en betaalt, is een andere keuze. Het wijzigen van het model zorgt er niet voor dat een abonnement wordt omgezet in een API-account of dat alle gebruikslimieten verdwijnen.<\/p>\n\n\n\n<figure class=\"wp-block-table\" style=\"overflow-x:auto;margin:24px 0;border:1px solid #d7dfed;border-radius:8px;box-sizing:border-box;max-width:100%\"><table style=\"width:100%;min-width:640px;border-collapse:collapse;font:15px\/1.6 system-ui,sans-serif\"><thead><tr><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Factureringsroute<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Wat je kunt bekijken<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Hoe moet de modelkeuze worden ge\u00efnterpreteerd?<\/th><\/tr><\/thead><tbody><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Toegang via een Claude-abonnement<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Het inbegrepen gebruik volgens het abonnement en eventuele afzonderlijk geactiveerde gebruikskredieten<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Verschillende modellen kunnen op verschillende manieren verbruiksquota verbruiken; bekijk de beschikbare modellen en limieten van het abonnement<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Toegang tot de Anthropic-API<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Input-\/output-tokens, caching en eventuele API-kosten<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Gebruik de huidige tarieflijst en het daadwerkelijke verbruik, en bevestig vervolgens de kosten in de factureringsconsole<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Cloudprovider of gateway<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">De door uw provider ondersteunde ID\u2019s, tarieven en factuurgegevens<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Een voorbeeld van de catalogusprijs voor Anthropic komt mogelijk niet overeen met het bedrag dat uw provider in rekening brengt<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\" style=\"font-size:14px;line-height:1.6;color:#52617a;padding:12px\">Modelselectie en facturering hangen met elkaar samen, maar de factureringswijze bepaalt hoe het verbruik in rekening wordt gebracht.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In de Claude-code, <code>\/gebruik<\/code> toont informatie over het sessietoken en, indien van toepassing, balkjes die het verbruik van het abonnement aangeven. Het bedrag in dollars is een lokaal berekende schatting op basis van lijsttarieven of geconfigureerde tarieven; het is geen factuur. Voor Pro- en Max-abonnees betekent dit sessiebedrag niet dat er een extra API-factuur aan het abonnement is toegevoegd. Lees meer over <a href=\"https:\/\/www.glbgpt.com\/hub\/claude-code-pricing\/\">Claude: Prijsstelling en factureringsroutes<\/a> als u nog aan het bedenken bent hoe u wilt betalen.<\/p>\n\n\n\n<h3 id=\"api-price-example\" class=\"wp-block-heading\">Huidige API-prijzen en een voorbeeld met gelijke tokens<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De standaard basistarieven van Anthropic per miljoen input-\/output-tokens bedragen <strong>Haiku 4.5: $1\/$5; Sonnet 5: $2\/$10; Opus 5.5: $4\/$20; Fable 5.1: $10\/$50<\/strong>, geraadpleegd op 28 september 2026. In de onderstaande grafiek wordt het tokenvolume constant gehouden, zodat de cijfers gemakkelijk te vergelijken zijn.<\/p>\n\n\n\n<style>\n.ccms-cost{box-sizing:border-box;border:1px solid #d8dfeb;border-radius:8px;padding:24px;background:#f8faff;color:#182439;margin:28px 0;font:16px\/1.6 system-ui,sans-serif}.ccms-cost *{box-sizing:border-box}.ccms-cost h3{color:#182439;font-size:1.3rem;line-height:1.3;margin:0 0 8px}.ccms-cost p{color:#34435d;margin:10px 0}.ccms-cost a{color:#254fc2;text-decoration:underline}.ccms-cost__rows{display:grid;gap:16px;margin:22px 0}.ccms-cost__row{display:grid;grid-template-columns:100px 1fr 55px;gap:12px;align-items:center}.ccms-cost__track{background:#e2e8f2;height:18px;border-radius:4px;overflow:hidden}.ccms-cost__bar{display:block;height:100%;background:#5460c9}.ccms-cost__value{text-align:right;font-variant-numeric:tabular-nums}.ccms-cost__table{overflow-x:auto}.ccms-cost table{border-collapse:collapse;width:100%;min-width:460px;color:#182439;font-size:14px}.ccms-cost th,.ccms-cost td{padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb}.ccms-cost th{color:#182439;background:#edf1fa}.ccms-cost__note{font-size:14px}.ccms-cost summary{cursor:pointer;font-weight:600;color:#254fc2}.ccms-cost details{margin:16px 0 0}@media(max-width:520px){.ccms-cost{padding:16px}.ccms-cost__row{grid-template-columns:85px 1fr 48px;gap:8px}}\n<\/style>\n<section class=\"ccms-cost\" aria-labelledby=\"ccms-cost-title\" style=\"box-sizing:border-box;border:1px solid #d8dfeb;border-radius:8px;padding:24px;background:#f8faff;color:#182439;margin:28px 0;font:16px\/1.6 system-ui,sans-serif;max-width:100%\">\n  <h3 id=\"ccms-cost-title\" style=\"box-sizing:border-box;color:#182439;font-size:1.3rem;line-height:1.3;margin:0 0 8px\">Hetzelfde tokenvolume, vier verschillende API-kosten<\/h3>\n  <p style=\"box-sizing:border-box;color:#34435d;margin:10px 0\">Voorbeeld: <strong style=\"box-sizing:border-box\">100.000 niet-gecachete invoertokens + 10.000 uitvoertokens<\/strong>, op basis van de normale API-catalogusprijzen van Anthropic, gecontroleerd op 28 september 2026.<\/p>\n  <div class=\"ccms-cost__rows\" aria-label=\"Basis-API-kosten voor het tokenvolume in het voorbeeld\" style=\"box-sizing:border-box;display:grid;gap:16px;margin:22px 0;max-width:100%\">\n    <div class=\"ccms-cost__row\" style=\"box-sizing:border-box;display:grid;grid-template-columns:100px 1fr 55px;gap:12px;align-items:center;max-width:100%\"><span style=\"box-sizing:border-box\">Haiku 4.5<\/span><span class=\"ccms-cost__track\" aria-hidden=\"true\" style=\"box-sizing:border-box;background:#e2e8f2;height:18px;border-radius:4px;overflow:hidden\"><span class=\"ccms-cost__bar\" style=\"box-sizing:border-box;display:block;height:100%;background:#5460c9;width:10%\"><\/span><\/span><strong class=\"ccms-cost__value\" style=\"box-sizing:border-box;text-align:right;font-variant-numeric:tabular-nums\">$0.15<\/strong><\/div>\n    <div class=\"ccms-cost__row\" style=\"box-sizing:border-box;display:grid;grid-template-columns:100px 1fr 55px;gap:12px;align-items:center;max-width:100%\"><span style=\"box-sizing:border-box\">Sonnet 5<\/span><span class=\"ccms-cost__track\" aria-hidden=\"true\" style=\"box-sizing:border-box;background:#e2e8f2;height:18px;border-radius:4px;overflow:hidden\"><span class=\"ccms-cost__bar\" style=\"box-sizing:border-box;display:block;height:100%;background:#5460c9;width:20%\"><\/span><\/span><strong class=\"ccms-cost__value\" style=\"box-sizing:border-box;text-align:right;font-variant-numeric:tabular-nums\">$0.30<\/strong><\/div>\n    <div class=\"ccms-cost__row\" style=\"box-sizing:border-box;display:grid;grid-template-columns:100px 1fr 55px;gap:12px;align-items:center;max-width:100%\"><span style=\"box-sizing:border-box\">Opus 5.5<\/span><span class=\"ccms-cost__track\" aria-hidden=\"true\" style=\"box-sizing:border-box;background:#e2e8f2;height:18px;border-radius:4px;overflow:hidden\"><span class=\"ccms-cost__bar\" style=\"box-sizing:border-box;display:block;height:100%;background:#5460c9;width:40%\"><\/span><\/span><strong class=\"ccms-cost__value\" style=\"box-sizing:border-box;text-align:right;font-variant-numeric:tabular-nums\">$0.60<\/strong><\/div>\n    <div class=\"ccms-cost__row\" style=\"box-sizing:border-box;display:grid;grid-template-columns:100px 1fr 55px;gap:12px;align-items:center;max-width:100%\"><span style=\"box-sizing:border-box\">Fable 5.1<\/span><span class=\"ccms-cost__track\" aria-hidden=\"true\" style=\"box-sizing:border-box;background:#e2e8f2;height:18px;border-radius:4px;overflow:hidden\"><span class=\"ccms-cost__bar\" style=\"box-sizing:border-box;display:block;height:100%;background:#5460c9;width:100%\"><\/span><\/span><strong class=\"ccms-cost__value\" style=\"box-sizing:border-box;text-align:right;font-variant-numeric:tabular-nums\">$1.50<\/strong><\/div>\n  <\/div>\n  <details style=\"box-sizing:border-box;margin:16px 0 0\"><summary style=\"box-sizing:border-box;cursor:pointer;font-weight:600;color:#254fc2\">Bekijk de tarieven en de berekening<\/summary>\n    <div class=\"ccms-cost__table\" style=\"box-sizing:border-box;overflow-x:auto;max-width:100%\"><table style=\"box-sizing:border-box;border-collapse:collapse;width:100%;min-width:460px;color:#182439;font-size:14px\"><caption style=\"box-sizing:border-box\">USD per miljoen tokens en het rekenvoorbeeld<\/caption><thead style=\"box-sizing:border-box\"><tr style=\"box-sizing:border-box\"><th scope=\"col\" style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb;color:#182439;background:#edf1fa\">Model<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb;color:#182439;background:#edf1fa\">Ingang \/ 1M<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb;color:#182439;background:#edf1fa\">Uitgang \/ 1M<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb;color:#182439;background:#edf1fa\">Voorbeeld totaal<\/th><\/tr><\/thead><tbody style=\"box-sizing:border-box\">\n      <tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb;color:#182439;background:#edf1fa\">Haiku 4.5<\/th><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$1<\/td><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$5<\/td><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$0.15<\/td><\/tr>\n      <tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb;color:#182439;background:#edf1fa\">Sonnet 5<\/th><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$2<\/td><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$10<\/td><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$0.30<\/td><\/tr>\n      <tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb;color:#182439;background:#edf1fa\">Opus 5.5<\/th><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$4<\/td><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$20<\/td><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$0.60<\/td><\/tr>\n      <tr style=\"box-sizing:border-box\"><th scope=\"row\" style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb;color:#182439;background:#edf1fa\">Fable 5.1<\/th><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$10<\/td><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$50<\/td><td style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb\">$1.50<\/td><\/tr>\n    <\/tbody><\/table><\/div>\n    <p style=\"box-sizing:border-box;color:#34435d;margin:10px 0\">Berekening: 0,1 \u00d7 invoersnelheid + 0,01 \u00d7 uitvoersnelheid. Voor Opus 5.5: 0,1 \u00d7 $4 + 0,01 \u00d7 $20 = $0,60.<\/p>\n  <\/details>\n  <p class=\"ccms-cost__note\" style=\"box-sizing:border-box;font-size:14px;color:#34435d;margin:10px 0\">Dit is een illustratie met een vast aantal tokens. Daadwerkelijke taken verbruiken een verschillend totaal aantal tokens; schrijf- en leesbewerkingen in de cache, herpogingen, tools, facturering door de provider en abonnementslimieten moeten apart worden bijgehouden.<\/p>\n  <p class=\"ccms-cost__note\" style=\"box-sizing:border-box;font-size:14px;color:#34435d;margin:10px 0\">Bron: <a href=\"https:\/\/platform.claude.com\/docs\/en\/about-claude\/pricing#model-pricing\" style=\"box-sizing:border-box;color:#254fc2;text-decoration:underline\">Prijzen voor de Anthropic API<\/a>.<\/p>\n<\/section>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1440\" height=\"625\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-api-pricing-20260928_aa929ac5f992491abf410216b0d17992.webp\" alt=\"De tarieftabel van de API van Anthropic met tarieven voor invoer, uitvoer en prompt-cache.\" class=\"wp-image-20173\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-api-pricing-20260928_aa929ac5f992491abf410216b0d17992.webp 1440w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-api-pricing-20260928_aa929ac5f992491abf410216b0d17992-300x130.webp 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-api-pricing-20260928_aa929ac5f992491abf410216b0d17992-1024x444.webp 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-api-pricing-20260928_aa929ac5f992491abf410216b0d17992-768x333.webp 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/09\/claude-api-pricing-20260928_aa929ac5f992491abf410216b0d17992-18x8.webp 18w\" sizes=\"(max-width: 1440px) 100vw, 1440px\" \/><figcaption class=\"wp-element-caption\">De normale API-lijstprijzen worden per miljoen tokens aangegeven; voor het schrijven naar en lezen uit de cache gelden aparte tarieven.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Een echte Claude Code-taak bestaat uit een reeks verzoeken. Eerdere context kan opnieuw worden verzonden, een model kan verder onderzoek doen en tools of extra agents kunnen meer werk genereren. Bij het cachen van prompts gelden bovendien verschillende schrijf- en leessnelheden. De laagste balk in het voorbeeld geeft daarom niet de laagste kosten per geaccepteerde wijziging weer.<\/p>\n\n\n\n<h3 id=\"cost-strategies\" class=\"wp-block-heading\">Vijf manieren om de kosten te beheersen zonder dat dit ten koste gaat van de kwaliteit van de opdracht<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Bepaal eerst wat je onder \u2018acceptatie\u2019 verstaat, voordat je een model kiest.<\/strong> Geef aan welk gedrag wordt verwacht, welke randgevallen er zijn en welke beperkingen er gelden. Een duidelijke, kleine taak is gemakkelijker op een kosteneffici\u00ebnte manier uit te besteden en gemakkelijker te controleren.<\/li>\n\n\n\n<li><strong>Geef relevante achtergrondinformatie.<\/strong> Voeg de bestanden en foutdetails toe die het model nodig heeft. Start voor niet-gerelateerde zaken een nieuwe conversatie, in plaats van een lange geschiedenis mee te nemen alleen maar omdat die bestaat.<\/li>\n\n\n\n<li><strong>Maak onderscheid tussen bekwaamheid en inspanning.<\/strong> Anthropic raadt aan om te beginnen met de standaardinspanning van het model. Als het de juiste context heeft gelezen en het probleem toch niet kon oplossen, kan een krachtiger model wellicht helpen. Als het het lezen of de verificatie heeft overgeslagen, controleer dan de taakinstellingen en de keuze van de inspanning.<\/li>\n\n\n\n<li><strong>Begroting voor het volledige antwoord.<\/strong> Broncode, tests en uitleg hebben allemaal ruimte nodig om weergegeven te worden. Onze tweede opdracht laat zien waarom een complete functie op zich nog geen bewijs is dat de gevraagde oplevering binnen het budget paste.<\/li>\n\n\n\n<li><strong>Vergelijk goedgekeurd werk.<\/strong> Registreer nuttige output, het aantal herpogingen, de beoordelingstijd en de daadwerkelijke factuurgegevens voor representatieve taken. Maak een onderscheid tussen fouten van de dienstverlener en fouten die te wijten zijn aan de kwaliteit van het model.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Deze strategie\u00ebn sluiten aan bij de <a href=\"https:\/\/code.claude.com\/docs\/en\/costs\">offici\u00eble kostenoverzicht<\/a> en <a href=\"https:\/\/claude.com\/blog\/claude-model-and-effort-level-in-claude-code\">De richtlijnen van Anthropic inzake modellen en inspanningen<\/a>. Een wekelijkse of sessiegebonden limiet die voor het hele plan geldt, kan na een modelwisseling van kracht blijven; bij een modelspecifieke limiet ligt dat anders. Controleer de daadwerkelijke limiet voordat je herhaaldelijk van model wisselt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als je werk zowel code, onderzoek, schrijven als media omvat, vergelijk dan ook de workflow waarvoor je betaalt. <a href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_content_home&amp;login=1\">De multi-model-werkruimte van GlobalGPT<\/a> brengt die functies samen in \u00e9\u00e9n dashboard met CLI-toegang voor ontwikkelingstaken. Die bredere meerwaarde voor de workflow is nuttig om af te wegen tegen een API-route op basis van verbruik; de bovenstaande API-grafiek is geen prijslijst voor GlobalGPT-abonnementen.<\/p>\n\n\n\n<h2 id=\"troubleshooting\" class=\"wp-block-heading\">Waarom het door u gekozen model misschien niet blijft zitten<\/h2>\n\n\n\n<figure class=\"wp-block-table\" style=\"overflow-x:auto;margin:24px 0;border:1px solid #d7dfed;border-radius:8px;box-sizing:border-box;max-width:100%\"><table style=\"width:100%;min-width:640px;border-collapse:collapse;font:15px\/1.6 system-ui,sans-serif\"><thead><tr><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Symptoom<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Waarschijnlijk controleren<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Praktische volgende stap<\/th><\/tr><\/thead><tbody><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">In de volgende sessie wordt het oude model gebruikt<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">De schakelaar was mogelijk alleen voor deze sessie geldig<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Gebruik de \u2018Enter\u2019-actie van de picker om op te slaan en start vervolgens een nieuwe sessie<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">De voorkeur wordt opgeslagen, maar er wordt een ander model gestart<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Een instelling voor \u2018lancering\u2019, \u2018shell\u2019, \u2018project\u2019, \u2018beheerd\u2019 of \u2018organisatie\u2019 kan voorrang hebben<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Lees de opstartinformatie door en controleer de betreffende configuratie samen met de eigenaar<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Een hervat gesprek heeft een ander model<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">De opgeslagen sessie kan het vorige model herstellen<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Controleer \/status; kies bewust het gewenste model voor de hervatting van het werk<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Het model ontbreekt of is afgewezen<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Beschikbaarheid van zorgverleners, organisatieregels of een verouderde versie van de Claude-code<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Controleer de ondersteunde model-ID\u2019s, de accounttoegang en de versievereisten<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Dezelfde achternaam wordt elders anders uitgesproken<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Aliassen en providertoewijzingen verschillen<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Gebruik de juiste volledige ID van de aanbieder wanneer een release vast moet blijven staan<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Bij het wisselen van tarief wordt de gebruikslimiet niet gewist<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">De limiet kan van toepassing zijn op het gehele plan<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Lees de gebruiksaanwijzing en stel de resetperiode opnieuw in, in plaats van ervan uit te gaan dat het voldoende is om de schakelaar op \u2018familie\u2019 te zetten<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\" style=\"font-size:14px;line-height:1.6;color:#52617a;padding:12px\">Stel vast hoe groot het probleem is voordat u een andere instelling wijzigt.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Als de Claude-code uw gebruikersinstellingen niet kan opslaan, kan een interactieve keuze alleen voor de huidige sessie gelden, zonder dat deze wordt opgeslagen. Bij een beheerd of gegenereerd instellingenbestand is wellicht een wijziging door de eigenaar nodig, in plaats van een nieuwe poging om een keuze te maken. Vermijd het opheffen van organisatorische beperkingen louter om een optie zichtbaar te maken.<\/p>\n\n\n\n<h2 id=\"globalgpt-workflow\" class=\"wp-block-heading\">Cre\u00eber een bredere workflow met GlobalGPT<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Modelselectie is een onderdeel van de workflow. Het kan zijn dat je onderzoek moet doen in een bibliotheek, een functie moet ontwerpen, een wijziging aan een teamgenoot moet uitleggen, documentatie moet opstellen en visuele elementen moet voorbereiden. GlobalGPT combineert meerdere toonaangevende modellen en AI-functies in \u00e9\u00e9n betaalbare werkruimte, zodat al deze taken in hetzelfde dashboard kunnen worden uitgevoerd.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img alt=\"\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"547\" src=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/image-15-1024x547.png\" class=\"wp-image-16961\" srcset=\"https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/image-15-1024x547.png 1024w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/image-15-300x160.png 300w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/image-15-768x410.png 768w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/image-15-1536x820.png 1536w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/image-15-2048x1094.png 2048w, https:\/\/wp.glbgpt.com\/wp-content\/uploads\/2026\/07\/image-15-18x10.png 18w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-3e41869c wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.glbgpt.com\/home\/cli?inviter=hub_content_cli&amp;login=1\">Probeer GlobalGPT CLI eens<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Voor werkzaamheden aan de terminal geldt dat de <a href=\"https:\/\/www.glbgpt.com\/home\/cli\">GlobalGPT CLI<\/a> koppelt de tools van het platform aan ontwikkelomgevingen. De gedocumenteerde installatieprocedure maakt gebruik van de inloggegevens van je GlobalGPT-account en je normale accountsaldo. De CLI biedt ondersteuning voor een bredere workflow op het gebied van coderen en ontwerpen, terwijl het eigen model van Claude Code een bewuste keuze blijft dankzij de modelinstellingen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stel bijvoorbeeld een implementatieplan op en evalueer dit, gebruik een ander model voor een beknopte uitleg en stel vervolgens de documentatie of hulpmiddelen op die bij de release horen. Volg de handleiding om <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-claude-code\/\">GlobalGPT CLI koppelen aan Claude-code<\/a> wanneer je die toolintegratie wilt. Stel je Claude-code-redeneringsmodel afzonderlijk in, afhankelijk van de codeertaak.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kies een startmodel, leg vast aan de hand van welke criteria het succes wordt bepaald, en schakel over naar een hoger niveau wanneer de taak dat vereist. Controleer de volledige oplevering voordat je het werk als voltooid beschouwt. <a href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_content_home&amp;login=1\">Stel je workflow samen met GlobalGPT<\/a> wanneer je wilt dat modelkeuze, onderzoek, programmeren en creatieve tools naadloos in je dagelijkse werk zijn ge\u00efntegreerd.<\/p>\n\n\n\n<h2 id=\"faq\" class=\"wp-block-heading\">FAQ<\/h2>\n\n\n\n<h3 id=\"faq-1\" class=\"wp-block-heading\">Hoe wijzig ik het model in Claude Code?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Voer \/model uit om de keuzelijst te openen. Druk op s om alleen de huidige sessie te wijzigen, of op Enter om het geselecteerde model als standaard op te slaan. Om een model voor een enkele nieuwe sessie te kiezen, start je het programma met claude \u2013model gevolgd door de modelnaam.<\/p>\n\n\n\n<h3 id=\"faq-2\" class=\"wp-block-heading\">Verandert \/model mijn opgeslagen standaardinstelling?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In de huidige interactieve versies wordt de keuze voor een model \u2013 door op Enter te drukken of \/model sonnet in te typen \u2013 opgeslagen in de gebruikersinstellingen, mits deze bewerkbaar zijn. Het indrukken van de toets s in de keuzelijst geldt alleen voor de huidige sessie. Bij de volgende keer opstarten kunnen andere instellingen nog steeds voorrang krijgen.<\/p>\n\n\n\n<h3 id=\"faq-3\" class=\"wp-block-heading\">Wat is het standaardmodel met de Claude-code?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De standaardinstelling voor de looptijd hangt af van je account, provider en configuratie. De standaardwaarde wist een modeloverschrijving; het is geen vaste model-ID. Controleer het actieve model met \/status en bekijk de keuzelijst, in plaats van ervan uit te gaan dat elk account met dezelfde release begint.<\/p>\n\n\n\n<h3 id=\"faq-4\" class=\"wp-block-heading\">Wat doet Opusplan?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Het maakt gebruik van Opus in de planningsmodus en van Sonnet tijdens de uitvoering. Het volgt de modusovergang in plaats van voor elke opdracht automatisch het goedkoopste model te kiezen. De werkelijke kosten zijn afhankelijk van het werk dat in elke fase wordt verricht.<\/p>\n\n\n\n<h3 id=\"faq-5\" class=\"wp-block-heading\">Waarom ontbreekt er een model in de keuzelijst?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">De beschikbaarheid kan afhangen van uw provider, account, beperkingen binnen uw organisatie en de versie van de Claude-code. Raadpleeg de documentatie van het huidige model en kijk welke modellen in uw omgeving zijn toegestaan. Een familie-alias kan bij een andere provider ook naar een andere release verwijzen.<\/p>\n\n\n\n<h3 id=\"faq-6\" class=\"wp-block-heading\">Maakt een goedkoper model een taak altijd goedkoper?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nee. De prijs van het token is slechts \u00e9\u00e9n factor. Het totale gebruik, onvolledige antwoorden, herpogingen en de inspanning die nodig is voor de beoordeling zijn allemaal van invloed op de kosten van een aanvaardbare wijziging. Bij onze kleine refactor zijn alle drie de functies geslaagd, terwijl alle drie de grotere reacties met twee bestanden werden afgekapt vanwege de gemeenschappelijke uitvoerlimiet.<\/p>\n\n\n\n<h2 id=\"sources\" class=\"wp-block-heading\">Bronnen<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/model-config\">Claude-codeconfiguratie<\/a> \u2014 modelkeuze, standaardinstellingen, aliassen, verschillen tussen providers en opusplan.<\/li>\n\n\n\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/costs\">Claude-code: kosten<\/a> \u2014 schattingen van het gebruik, abonnementslimieten, caching en kostenbeheersing.<\/li>\n\n\n\n<li><a href=\"https:\/\/platform.claude.com\/docs\/en\/about-claude\/models\/overview\">Overzicht van het Anthropic-model<\/a> en <a href=\"https:\/\/platform.claude.com\/docs\/en\/about-claude\/pricing\">API-prijzen<\/a> \u2014 specificaties en catalogusprijzen van de huidige modellen.<\/li>\n\n\n\n<li><a href=\"https:\/\/claude.com\/blog\/claude-model-and-effort-level-in-claude-code\">Richtlijnen voor modellen en inspanningen<\/a> \u2014 praktische verschillen tussen mogelijkheden, context en inspanning.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.glbgpt.com\/home\/cli\">GlobalGPT CLI-documentatie<\/a> \u2014 workflow op de terminal en configuratie op basis van accounts.<\/li>\n<\/ul>\n\n\n\n<script type=\"application\/ld+json\">{\n    \"@context\": \"https:\\\/\\\/schema.org\",\n    \"@type\": \"FAQPage\",\n    \"mainEntity\": [\n        {\n            \"@type\": \"Question\",\n            \"name\": \"How do I change the model in Claude Code?\",\n            \"acceptedAnswer\": {\n                \"@type\": \"Answer\",\n                \"text\": \"Run \\\/model to open the picker. Press s to switch only the current session, or Enter to save the selected model as your default. To choose a model for a single new session, launch with claude --model followed by the model name.\"\n            }\n        },\n        {\n            \"@type\": \"Question\",\n            \"name\": \"Does \\\/model change my saved default?\",\n            \"acceptedAnswer\": {\n                \"@type\": \"Answer\",\n                \"text\": \"In current interactive versions, selecting a model with Enter or typing \\\/model sonnet saves the choice in user settings when writable. Pressing s in the picker is session-only. Other settings can still take priority on the next launch.\"\n            }\n        },\n        {\n            \"@type\": \"Question\",\n            \"name\": \"What is the default Claude Code model?\",\n            \"acceptedAnswer\": {\n                \"@type\": \"Answer\",\n                \"text\": \"The runtime default depends on your account, provider, and configuration. The default value clears a model override; it is not one fixed model ID. Check the active model with \\\/status and inspect the picker rather than assuming every account starts on the same release.\"\n            }\n        },\n        {\n            \"@type\": \"Question\",\n            \"name\": \"What does opusplan do?\",\n            \"acceptedAnswer\": {\n                \"@type\": \"Answer\",\n                \"text\": \"It uses Opus during plan mode and Sonnet during execution. It follows the mode transition rather than automatically choosing the cheapest model for each prompt. Actual cost depends on the work performed in each phase.\"\n            }\n        },\n        {\n            \"@type\": \"Question\",\n            \"name\": \"Why is a model missing from the picker?\",\n            \"acceptedAnswer\": {\n                \"@type\": \"Answer\",\n                \"text\": \"Availability can depend on your provider, account, organization restrictions, and Claude Code version. Check the current model documentation and your environment\\u2019s allowed models. A family alias can also resolve to a different release on another provider.\"\n            }\n        },\n        {\n            \"@type\": \"Question\",\n            \"name\": \"Does a cheaper model always make a task cheaper?\",\n            \"acceptedAnswer\": {\n                \"@type\": \"Answer\",\n                \"text\": \"No. Token price is only one factor. Total usage, incomplete answers, retries, and review effort affect the cost of an acceptable change. In our small refactor all three functions passed, while all three larger two-file responses were truncated at the shared output limit.\"\n            }\n        }\n    ]\n}<\/script>","protected":false},"excerpt":{"rendered":"<p>Gebruik bij de modelkeuze voor Claude Code: Haiku voor kleine, testbare wijzigingen, Sonnet voor routinematige implementaties en Opus voor werkzaamheden met een grotere mate van onduidelijkheid of die meer redeneringsvermogen vereisen. Anthropic beveelt momenteel Opus 5.5 aan als algemeen uitgangspunt; uw taak, de omvang van de beoordelingswerkzaamheden en uw budget bepalen of een kleiner model beter geschikt is. Om van model te wisselen, opent u \/model. [\u2026]<\/p>","protected":false},"author":7,"featured_media":20168,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_seopress_robots_primary_cat":"","_seopress_titles_title":"Claude Code Model Selection: Defaults, Switching, and Cost","_seopress_titles_desc":"Choose a Claude Code model for your task, set a default, switch for one session, and compare current API costs with practical coding examples.","_seopress_robots_index":"","footnotes":""},"categories":[7],"tags":[],"class_list":["post-20166","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-chat"],"acf":[],"_links":{"self":[{"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/posts\/20166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/comments?post=20166"}],"version-history":[{"count":2,"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/posts\/20166\/revisions"}],"predecessor-version":[{"id":20174,"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/posts\/20166\/revisions\/20174"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/media\/20168"}],"wp:attachment":[{"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/media?parent=20166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/categories?post=20166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/nl\/wp-json\/wp\/v2\/tags?post=20166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}