{"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\/fr\/hub\/claude-code-model-selection","title":{"rendered":"S\u00e9lection du mod\u00e8le de code Claude : param\u00e8tres par d\u00e9faut, changement de mod\u00e8le et co\u00fbt"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>Pour le choix du mod\u00e8le de code Claude, utilisez Haiku pour les modifications mineures et v\u00e9rifiables, Sonnet pour la mise en \u0153uvre courante, et Opus pour les t\u00e2ches pr\u00e9sentant davantage d'ambigu\u00eft\u00e9 ou n\u00e9cessitant davantage de raisonnement.<\/strong> Anthropic recommande actuellement Opus 5.5 comme point de d\u00e9part g\u00e9n\u00e9ral ; ce sont vos besoins, la charge de travail li\u00e9e aux r\u00e9visions et votre budget qui d\u00e9termineront si un mod\u00e8le plus petit est plus adapt\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour changer de mod\u00e8le, ouvrez <code>\/mod\u00e8le<\/code>. Presse <kbd>Entrer<\/kbd> pour enregistrer une valeur par d\u00e9faut, ou <kbd>s<\/kbd> pour modifier uniquement la session en cours. Pour un lancement unique, utilisez <code>claude --mod\u00e8le opus<\/code>. Ces choix ont une persistance diff\u00e9rente ; il est donc tout aussi important de d\u00e9terminer la dur\u00e9e de la commutation que de choisir le mod\u00e8le.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le travail de programmation implique \u00e9galement des recherches, des explications, de la documentation et des ressources cr\u00e9atives. GlobalGPT rassemble les meilleurs mod\u00e8les d'IA et de nombreux outils d'IA au sein d'un tableau de bord abordable, tandis que son interface en ligne de commande (CLI) relie ces outils au terminal et aux flux de travail de d\u00e9veloppement. <a href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_content_home&amp;login=1\">Cr\u00e9ez votre flux de travail avec GlobalGPT<\/a> pour regrouper ces t\u00e2ches connexes tout au long du processus, de l'id\u00e9e au code fonctionnel.<\/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>Essayez d\u00e8s maintenant Cluade Opus 5.5 sur GlobalGPT<\/strong><\/a><\/div>\n<\/div>\n<\/div>\n\n\n\n<nav class=\"ccms-toc\" aria-label=\"Sur cette page\" 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>Sur cette page<\/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\">Quel mod\u00e8le faut-il utiliser dans le code Claude ?<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#switch-models\">Comment changer de mod\u00e8le au cours d'une m\u00eame session<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#default-model\">Comment d\u00e9finir un mod\u00e8le par d\u00e9faut<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#opusplan\">Ce que fait r\u00e9ellement Opusplan<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#coding-tests\">Quelles sont les deux t\u00e2ches de programmation qui ont mis en \u00e9vidence<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#model-cost\">En quoi le choix du mod\u00e8le influe-t-il sur le co\u00fbt ?<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#troubleshooting\">Pourquoi le mod\u00e8le que vous avez choisi pourrait ne pas convenir<\/a><\/li><li style=\"margin:8px 0\"><a style=\"color:#254fc2;text-decoration:underline\" href=\"#globalgpt-workflow\">D\u00e9veloppez un flux de travail plus complet avec 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\">Quel mod\u00e8le faut-il utiliser dans le code Claude ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Commen\u00e7ons par d\u00e9finir la nature du travail. Une fonction simple dont les r\u00e9sultats attendus sont clairs n\u00e9cessite une \u00e9valuation diff\u00e9rente de celle d'un bug sporadique touchant plusieurs services. La question pertinente est de savoir si le mod\u00e8le permet d'aboutir \u00e0 un changement acceptable apr\u00e8s un nombre raisonnable de r\u00e9visions et d'it\u00e9rations.<\/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\">Mod\u00e8le actuel<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">\u00c0 quoi sert-il ?<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Un exercice pratique pour commencer<\/th><\/tr><\/thead><tbody><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Claude Ha\u00efku 4.5<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Un travail rapide et efficace dans le cadre d'un contrat restreint<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Une petite refactorisation, une transformation r\u00e9p\u00e9titive ou un cas de test simple<\/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\">Un juste \u00e9quilibre entre intelligence et rapidit\u00e9 pour le codage au quotidien<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Une fonctionnalit\u00e9 reposant sur des sch\u00e9mas bien \u00e9tablis, une correction de bug de routine ou une explication du 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\">Raisonnement complexe et travail de codage agentique plus long<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Une d\u00e9faillance ambigu\u00eb, un compromis architectural ou un changement impliquant des contraintes interd\u00e9pendantes<\/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\">Les enqu\u00eates les plus difficiles et les plus longues<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Une escalade lorsque des t\u00e2ches difficiles l'emportent encore sur un niveau d'effort Opus plus intense<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\" style=\"font-size:14px;line-height:1.6;color:#52617a;padding:12px\">Familles de mod\u00e8les actuelles et ad\u00e9quation aux t\u00e2ches, d'apr\u00e8s la documentation Anthropic ; les suggestions de t\u00e2ches constituent des points de d\u00e9part concrets.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il vaut la peine d'envisager Haiku lorsque les erreurs sont faciles \u00e0 d\u00e9tecter et que les modifications sont mineures. Sonnet est un choix judicieux lorsque la mise en \u0153uvre au quotidien n\u00e9cessite davantage de contexte et de discernement. Opus m\u00e9rite d'\u00eatre pris en consid\u00e9ration lorsque la compr\u00e9hension du probl\u00e8me constitue une part importante de la t\u00e2che. Fable m\u00e9rite une d\u00e9cision \u00e0 part pour les travaux exigeants ; il ne faisait pas partie de notre test de codage portant sur ces trois mod\u00e8les.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il s'agit l\u00e0 de points de d\u00e9part, et non de garanties automatiques de qualit\u00e9. Une solution moins co\u00fbteuse peut s'av\u00e9rer on\u00e9reuse si elle n\u00e9cessite plusieurs r\u00e9visions ou une relecture approfondie. \u00c0 l'inverse, un mod\u00e8le plus volumineux peut n'apporter que peu de valeur ajout\u00e9e \u00e0 une simple transformation qui satisfait d\u00e9j\u00e0 \u00e0 vos crit\u00e8res de contr\u00f4le. Pour une utilisation plus large, au-del\u00e0 du code Claude, <a href=\"https:\/\/www.glbgpt.com\/hub\/claude-haiku-vs-sonnet-vs-opus\/\">Comparer les gammes de mod\u00e8les Claude<\/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=\"Comparaison des mod\u00e8les actuelle de Anthropic pour Fable 5.1, Opus 5.5, Sonnet 5 et 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\">Gamme de mod\u00e8les Anthropic, consult\u00e9e le 28 septembre 2026. La disponibilit\u00e9 du code Claude d\u00e9pend de votre op\u00e9rateur et de votre compte.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Le <a href=\"https:\/\/platform.claude.com\/docs\/en\/about-claude\/models\/overview\">pr\u00e9sentation officielle de la gamme<\/a> r\u00e9pertorie des fen\u00eatres de contexte de 1 million de tokens pour Fable 5.1, Opus 5.5 et Sonnet 5, et de 200 000 pour Haiku 4.5. Il s'agit de sp\u00e9cifications d'API. Votre fournisseur de code Claude, votre compte et votre configuration d\u00e9terminent les options de contexte disponibles au cours d\u2019une session. Une grande fen\u00eatre est utile pour le contexte n\u00e9cessaire ; la remplir avec des \u00e9l\u00e9ments sans rapport avec le sujet g\u00e9n\u00e8re tout de m\u00eame une charge de travail suppl\u00e9mentaire pour le mod\u00e8le.<\/p>\n\n\n\n<h2 id=\"switch-models\" class=\"wp-block-heading\">Comment changer de mod\u00e8le au cours d'une m\u00eame session<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans le cadre d'une session interactive, lancez <code>\/mod\u00e8le<\/code> pour ouvrir la fen\u00eatre de s\u00e9lection des mod\u00e8les. S\u00e9lectionnez la ligne correspondant au mod\u00e8le, puis appuyez sur <kbd>s<\/kbd> s'il s'agit d'une modification ponctuelle. Appuyez sur <kbd>Entrer<\/kbd> enregistre la s\u00e9lection comme valeur par d\u00e9faut pour votre compte utilisateur. En tapant <code>\/sonnet type<\/code> Cela permet \u00e9galement de l'enregistrer directement dans les versions actuelles.<\/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\">Choisissez la commande en fonction de la dur\u00e9e souhait\u00e9e pour la modification<\/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\">Comportement du code Claude document\u00e9, v\u00e9rifi\u00e9 le 28 septembre 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\">Votre objectif<\/th><th scope=\"col\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Que faire<\/th><th scope=\"col\" style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top;background:#edf1fa;font-weight:600\">Les modifications apport\u00e9es aux param\u00e8tres par d\u00e9faut ont-elles \u00e9t\u00e9 enregistr\u00e9es ?<\/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\">Basculer uniquement cette session interactive<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Ouvrir <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/mod\u00e8le<\/code>, s\u00e9lectionnez un mod\u00e8le, puis appuyez sur <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\">Non.<\/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\">Enregistrer un mod\u00e8le favori<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Ouvrir <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/mod\u00e8le<\/code> et appuyez sur <kbd style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">Entrer<\/kbd>, ou tapez <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/sonnet type<\/code>.<\/td><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Oui, lorsque les param\u00e8tres utilisateur sont accessibles en \u00e9criture.<\/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\">Lancer une session unique sur Opus<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Lancement <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">claude --mod\u00e8le opus<\/code>.<\/td><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Non.<\/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\">Revenir \u00e0 la valeur par d\u00e9faut d'ex\u00e9cution du compte<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Utilisation <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/mod\u00e8le par d\u00e9faut<\/code>.<\/td><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Annule la modification du mod\u00e8le ; la valeur par d\u00e9faut retenue peut d\u00e9pendre des param\u00e8tres du compte et de l'organisation.<\/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\">V\u00e9rifier le mod\u00e8le actif<\/th><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Courir <code style=\"font:14px\/1.5 ui-monospace,SFMono-Regular,monospace;color:#172438;background:#edf1fa;padding:2px 5px;border-radius:3px\">\/statut<\/code>.<\/td><td style=\"padding:12px 10px;border-bottom:1px solid #d8dfeb;color:#172438;vertical-align:top\">Non.<\/td><\/tr>\n  <\/tbody><\/table><\/div>\n  <p style=\"color:#34435d;margin:12px 0\">Les param\u00e8tres de projet ou g\u00e9r\u00e9s, les modifications d'environnement et les sessions reprises peuvent avoir une incidence sur le prochain lancement. V\u00e9rifiez le mod\u00e8le actif lorsque la reproductibilit\u00e9 est essentielle.<\/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\">Source : Configuration du mod\u00e8le de code Claude<\/a>.<\/p>\n<\/section>\n\n\n\n<p class=\"wp-block-paragraph\">Pour une nouvelle session de terminal, s\u00e9lectionnez le mod\u00e8le au d\u00e9marrage. Ces commandes s\u2019appliquent \u00e9galement lorsque Claude Code s\u2019ex\u00e9cute dans le terminal int\u00e9gr\u00e9 de VS Code. Les exemples s\u00e9lectionnent explicitement une version :<\/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\">Ex\u00e9cutez la commande correspondant \u00e0 la session souhait\u00e9e ; les exemples propos\u00e9s constituent des alternatives. Vous pouvez ouvrir diff\u00e9rents terminaux avec diff\u00e9rentes <code>--mod\u00e8le<\/code> valeurs sans avoir \u00e0 modifier \u00e0 plusieurs reprises une valeur par d\u00e9faut enregistr\u00e9e et partag\u00e9e. Utilisez <code>\/statut<\/code> pour v\u00e9rifier le mod\u00e8le actif.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Des noms de famille tels que <code>opus<\/code> et <code>sonnet<\/code> peuvent passer \u00e0 des versions plus r\u00e9centes. Leur r\u00e9solution d\u00e9pend \u00e9galement du fournisseur : l'API Anthropic les associe actuellement \u00e0 Opus 5.5 et Sonnet 5, tandis que les correspondances propos\u00e9es par les fournisseurs de services cloud peuvent varier. Utilisez un identifiant de mod\u00e8le complet lorsque vous avez besoin d\u2019une ex\u00e9cution reproductible, et v\u00e9rifiez le nom sp\u00e9cifique au fournisseur si votre environnement l\u2019exige.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Opus 5.5 n\u00e9cessite la version 2.1.280 ou une version ult\u00e9rieure du Code Claude ; Sonnet 5 n\u00e9cessite la version 2.1.197 ou une version ult\u00e9rieure. Le <a href=\"https:\/\/code.claude.com\/docs\/en\/model-config\">documentation relative \u00e0 la configuration du mod\u00e8le<\/a> Constitue la r\u00e9f\u00e9rence en mati\u00e8re d'alias actuels, d'exigences de version et de mappages de fournisseurs. Les commandes pr\u00e9sent\u00e9es ici sont des exemples tir\u00e9s de la documentation ; notre section pratique \u00e9value le code g\u00e9n\u00e9r\u00e9 s\u00e9par\u00e9ment.<\/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=\"Documentation relative au code Claude expliquant le choix du mod\u00e8le et l&#039;utilisation des touches \u00ab Entr\u00e9e \u00bb et \u00ab s \u00bb.\" 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\">La touche Entr\u00e9e enregistre le mod\u00e8le comme valeur par d\u00e9faut ; la touche s ne modifie que la session en cours.<\/figcaption><\/figure>\n\n\n\n<h2 id=\"default-model\" class=\"wp-block-heading\">Comment d\u00e9finir un mod\u00e8le par d\u00e9faut<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour un param\u00e8tre par d\u00e9faut personnel, s\u00e9lectionnez un mod\u00e8le dans <code>\/mod\u00e8le<\/code> et appuyez sur <kbd>Entrer<\/kbd>, ou saisissez une s\u00e9lection telle que <code>\/sonnet type<\/code>. Le code Claude \u00e9crit le <code>mod\u00e8le<\/code> dans vos param\u00e8tres utilisateur lorsque ce fichier est accessible en \u00e9criture. Ouvrez une nouvelle session et v\u00e9rifiez son mod\u00e8le actif pour confirmer le r\u00e9sultat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Une pr\u00e9f\u00e9rence enregistr\u00e9e ne remplace pas tous les autres param\u00e8tres. Un indicateur de d\u00e9marrage, <code>MOD\u00c8LE_ANTHROPIE<\/code> Dans le shell, les param\u00e8tres du projet ou les param\u00e8tres g\u00e9r\u00e9s, ou encore si les param\u00e8tres par d\u00e9faut d'une organisation sont configur\u00e9s pour remplacer les choix de l'utilisateur, un autre \u00e9l\u00e9ment peut \u00eatre s\u00e9lectionn\u00e9 au d\u00e9marrage. Une session reprise peut \u00e9galement conserver le mod\u00e8le issu de son historique enregistr\u00e9. V\u00e9rifiez les informations de d\u00e9marrage et <code>\/statut<\/code> avant de consid\u00e9rer que le choix \u00e9tait perdu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\/mod\u00e8le par d\u00e9faut<\/code> efface votre red\u00e9finition de mod\u00e8le et r\u00e9tablit les valeurs par d\u00e9faut d'ex\u00e9cution de votre compte et de votre configuration. Le mot <code>par d\u00e9faut<\/code> Il s'agit d'une valeur de r\u00e9initialisation, et non du nom d'un mod\u00e8le Claude sp\u00e9cifique. Elle ne doit pas \u00eatre utilis\u00e9e comme identifiant de mod\u00e8le reproductible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour une configuration avanc\u00e9e, <code>MOD\u00c8LE_ANTHROPIC_PAR_D\u00c9FAUT<\/code> fournit une option de secours par d\u00e9faut \u00e0 partir de la version 2.1.236. Elle appara\u00eet sous les s\u00e9lections explicites relatives au lancement, \u00e0 l'environnement, aux param\u00e8tres et \u00e0 l'organisation, et ignore les valeurs telles que <code>ha\u00efku<\/code> et <code>opusplan<\/code>. En r\u00e8gle g\u00e9n\u00e9rale, le s\u00e9lecteur est plus facile \u00e0 v\u00e9rifier. Voir <a href=\"https:\/\/code.claude.com\/docs\/en\/settings\">Param\u00e8tres du code Claude<\/a> lorsqu'il s'agit d'une configuration partag\u00e9e.<\/p>\n\n\n\n<h2 id=\"opusplan\" class=\"wp-block-heading\">Ce que fait r\u00e9ellement Opusplan<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>opusplan<\/code> utilise Opus en mode planification et Sonnet pour l'ex\u00e9cution. L'int\u00e9r\u00eat est simple : utiliser un mod\u00e8le de raisonnement plus puissant pour \u00e9laborer l'approche, puis un mod\u00e8le de codage courant pour mettre ce plan en \u0153uvre.<\/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 suit ce mode de fonctionnement<\/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%\">Mode planification<strong style=\"display:block;color:#172438;font-size:1.2rem\">Opus<\/strong>Appliquez cette m\u00e9thode.<\/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%\">Ex\u00e9cution<strong style=\"display:block;color:#172438;font-size:1.2rem\">Sonnet<\/strong>Mettez le plan \u00e0 ex\u00e9cution.<\/div><\/div>\n<p style=\"color:#34445e;margin:12px 0\">Comportement de routage document\u00e9. Les versions associ\u00e9es \u00e0 ces noms de famille d\u00e9pendent de votre fournisseur d'acc\u00e8s et de votre configuration.<\/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\">Source : Configuration du mod\u00e8le de code Claude<\/a><\/p>\n<\/section>\n\n\n\n<p class=\"wp-block-paragraph\">Il s'agit d'une r\u00e8gle qui d\u00e9pend du mode. Elle n'analyse pas chaque invite et ne choisit pas automatiquement la famille la moins ch\u00e8re parmi celles qui conviennent. Les mappages des fournisseurs et les restrictions d'acc\u00e8s s'appliquent toujours aux mod\u00e8les sous-jacents. De plus, ce nom ne garantit pas de \u00e9conomies : le co\u00fbt total d\u00e9pend de l'ampleur de la planification, de la mise en \u0153uvre, de la r\u00e9vision et du traitement du contexte que n\u00e9cessite la t\u00e2che.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Envisagez plut\u00f4t une approche o\u00f9 la conception b\u00e9n\u00e9ficie d'une analyse plus approfondie et o\u00f9 la mise en \u0153uvre suit un plan clair. Pour une petite modification, cette planification suppl\u00e9mentaire n'est peut-\u00eatre pas n\u00e9cessaire.<\/p>\n\n\n\n<h2 id=\"coding-tests\" class=\"wp-block-heading\">Quelles sont les deux t\u00e2ches de programmation qui ont mis en \u00e9vidence<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Afin d'illustrer concr\u00e8tement le processus de s\u00e9lection de mod\u00e8les, nous avons test\u00e9 une refonte partielle d'Unicode et une correction du s\u00e9lecteur d'itin\u00e9raires, dont les exigences \u00e9taient interd\u00e9pendantes. La distinction entre une fonction correcte et un r\u00e9sultat complet conforme aux exigences s'est av\u00e9r\u00e9e plus importante qu'un simple 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\">Comment nous avons test\u00e9 les r\u00e9sultats du codage<\/h3>\n<p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Le 28 septembre 2026, nous avons soumis les mod\u00e8les Claude Haiku 4.5, Claude Sonnet 5 et Claude Opus 5.5 aux deux m\u00eames t\u00e2ches JavaScript, jusqu\u2019au mod\u00e8le GlobalGPT. Chaque mod\u00e8le a renvoy\u00e9 du code source ; nous avons inspect\u00e9 ce code et effectu\u00e9 des v\u00e9rifications locales fixes. Les instructions de changement de mod\u00e8le de Claude figurant ailleurs dans ce guide proviennent de sa documentation officielle.<\/p>\n<p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Chaque requ\u00eate \u00e9tait soumise \u00e0 une limite de sortie de 4 096 tokens, sans outils ni historique de conversation, et avec les param\u00e8tres par d\u00e9faut du mod\u00e8le. Nous avons conserv\u00e9 la premi\u00e8re r\u00e9ponse \u00e9valuable, y compris les r\u00e9ponses incompl\u00e8tes. Une erreur de service sur la t\u00e2che de routage de Sonnet a donn\u00e9 lieu \u00e0 une seule nouvelle tentative autoris\u00e9e : sept requ\u00eates ont g\u00e9n\u00e9r\u00e9 six r\u00e9sultats.<\/p>\n<p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Ces deux petites t\u00e2ches \u00e9valuent le code renvoy\u00e9 et l'exhaustivit\u00e9 de la livraison. Elles ne mesurent pas l'ex\u00e9cution par les agents de Claude Code, l'exploration du r\u00e9f\u00e9rentiel ni une session de d\u00e9veloppement dans son int\u00e9gralit\u00e9. Les co\u00fbts r\u00e9els en dollars n'ont pas \u00e9t\u00e9 communiqu\u00e9s. Une seule observation par t\u00e2che ne permet pas d'\u00e9tablir un classement g\u00e9n\u00e9ral en termes de rapidit\u00e9 ou de fiabilit\u00e9.<\/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\">Afficher les identifiants exacts des mod\u00e8les et les conditions d'\u00e9valuation<\/summary><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Identifiants demand\u00e9s : <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>, et <code style=\"box-sizing:border-box;color:inherit\">claude-opus-5-5<\/code>. Les tests locaux ont \u00e9t\u00e9 effectu\u00e9s avec Node.js v24.19.0. Les invites de commande sont destin\u00e9es \u00e0 Node.js 18 et versions ult\u00e9rieures ; Node.js 18 n'a pas \u00e9t\u00e9 test\u00e9 en lui-m\u00eame.<\/p><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Huit groupes de comportements ont \u00e9t\u00e9 d\u00e9finis pour la t\u00e2che \u00ab slug \u00bb et douze pour le \u00ab route selector \u00bb. Le respect du format et l'ex\u00e9cution compl\u00e8te sont indiqu\u00e9s s\u00e9par\u00e9ment. Une v\u00e9rification ult\u00e9rieure du code est mentionn\u00e9e s\u00e9par\u00e9ment et ne modifie pas ces chiffres. Nous n'avons pas modifi\u00e9 le code source renvoy\u00e9 pour qu'il soit valid\u00e9.<\/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\">T\u00e2che 1 : Pr\u00e9server l'Unicode lors d'une refonte d'un petit \u00ab slug \u00bb<\/h3><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">La fonction devait conserver les lettres non latines et les signes combinatoires, normaliser les accents d\u00e9compos\u00e9s et pr\u00e9server son comportement ASCII existant.<\/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\">Premiers r\u00e9sultats renvoy\u00e9s, avec des v\u00e9rifications du comportement local corrig\u00e9es<\/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\">Mod\u00e8le<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Contr\u00f4les de comportement<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Format de r\u00e9ponse<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Effectuer la livraison demand\u00e9e<\/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 Ha\u00efku 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\">\u00c9chec : balise Markdown<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Oui : fonction compl\u00e8te<\/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\">Donn\u00e9es : JSON brut<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Oui : fonction compl\u00e8te<\/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\">Donn\u00e9es : JSON brut<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Oui : fonction compl\u00e8te<\/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\">R\u00e9sultat observ\u00e9 :<\/strong> Ces trois fonctions ont toutes trait\u00e9 les m\u00eames huit groupes. Sonnet et Opus ont \u00e9galement respect\u00e9 l'exigence relative \u00e0 la r\u00e9ponse au format JSON brut. Haiku a encapsul\u00e9 sa r\u00e9ponse dans du Markdown, et sa note d'\u00e9valuation d\u00e9crivait \u00e0 tort la fonction NFC comme une d\u00e9composition de caract\u00e8res ; son code appelait toutefois correctement la fonction NFC.<\/p><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Dans le cadre de cette refonte ponctuelle, la mise \u00e0 jour n'a pas permis d'am\u00e9liorer le comportement de la fonction test\u00e9e. Les exigences de mise en forme et la pr\u00e9cision de l'explication qui l'accompagne devaient encore faire l'objet d'une r\u00e9vision.<\/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\">Consultez l'invite partag\u00e9e compl\u00e8te et le code de saisie<\/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\">Consultez la r\u00e9ponse compl\u00e8te de Claude Haiku 4.5 telle qu'elle a \u00e9t\u00e9 renvoy\u00e9e<\/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\">Consultez la r\u00e9ponse compl\u00e8te de Claude Sonnet 5 telle qu'elle a \u00e9t\u00e9 renvoy\u00e9e<\/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\">Consultez la r\u00e9ponse compl\u00e8te de Claude Opus 5.5 telle qu\u2019elle a \u00e9t\u00e9 renvoy\u00e9e<\/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\">Exercice 2 : R\u00e9parer un s\u00e9lecteur d'itin\u00e9raire et renvoyer ses tests<\/h3><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">La fonction devait g\u00e9rer les correspondances de pr\u00e9fixes les plus longs, la priorit\u00e9 des m\u00e9thodes, les limites de segments, les r\u00e8gles mal form\u00e9es et les entr\u00e9es immuables. La r\u00e9ponse demand\u00e9e comprenait \u00e9galement un nouveau fichier de test.<\/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\">Premiers r\u00e9sultats renvoy\u00e9s, avec des v\u00e9rifications du comportement local corrig\u00e9es<\/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\">Mod\u00e8le<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Contr\u00f4les de comportement<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Format de r\u00e9ponse<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top;background:#eaf0fa\">Effectuer la livraison demand\u00e9e<\/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 Ha\u00efku 4.5<\/th><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">12\/12 uniquement pour la fonction compl\u00e8te<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">\u00c9chec : JSON tronqu\u00e9<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Non : fichier de test tronqu\u00e9<\/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 uniquement pour la fonction compl\u00e8te<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">\u00c9chec : JSON tronqu\u00e9<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Non : fichier de test tronqu\u00e9<\/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 uniquement pour la fonction compl\u00e8te<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">\u00c9chec : JSON tronqu\u00e9<\/td><td style=\"box-sizing:border-box;padding:12px 10px;border-bottom:1px solid #d7dfed;color:#172438;vertical-align:top\">Non : fichier de test tronqu\u00e9<\/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\">R\u00e9sultat observ\u00e9 :<\/strong> Aucun mod\u00e8le n'a r\u00e9ussi \u00e0 fournir la r\u00e9ponse demand\u00e9e (deux fichiers) dans la limite de sortie partag\u00e9e. Les trois se sont arr\u00eat\u00e9s \u00e0 4 096 tokens de fin de traitement. Chacun avait d\u00e9j\u00e0 renvoy\u00e9 une fonction de routage compl\u00e8te, qui avait satisfait aux douze groupes de comportements fixes ; les nouveaux fichiers de test \u00e9taient incomplets et n'ont pas \u00e9t\u00e9 ex\u00e9cut\u00e9s.<\/p><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Nous n'avons extrait que les cha\u00eenes de code source enti\u00e8rement ferm\u00e9es. Les r\u00e9ponses tronqu\u00e9es d'origine sont conserv\u00e9es telles quelles ci-dessous. Un score de fonction satisfaisant ne signifie donc pas que la requ\u00eate compl\u00e8te a abouti.<\/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\">Autre constat issu de la revue de code : une \u00e9galit\u00e9 entre deux racines<\/summary><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Apr\u00e8s les v\u00e9rifications de routine, nous avons remarqu\u00e9 que Haiku s'\u00e9tait stabilis\u00e9 <code style=\"box-sizing:border-box;color:inherit\">\/\/\/<\/code> \u00e0 une cha\u00eene vide plut\u00f4t que <code style=\"box-sizing:border-box;color:inherit\">\/<\/code>. Une v\u00e9rification locale distincte utilisait deux r\u00e8gles GET, avec les pr\u00e9fixes <code style=\"box-sizing:border-box;color:inherit\">\/\/\/<\/code> et <code style=\"box-sizing:border-box;color:inherit\">\/<\/code>, en ciblant <code style=\"box-sizing:border-box;color:inherit\">premier<\/code> et <code style=\"box-sizing:border-box;color:inherit\">deuxi\u00e8me<\/code> dans cet ordre. Pour <code style=\"box-sizing:border-box;color:inherit\">\/n'importe quoi<\/code>, le contrat stipule que <code style=\"box-sizing:border-box;color:inherit\">premier<\/code>.<\/p><p style=\"box-sizing:border-box;color:#35435a;margin:12px 0\">Ha\u00efku est de retour <code style=\"box-sizing:border-box;color:inherit\">deuxi\u00e8me<\/code>; Sonnet et Opus sont de retour <code style=\"box-sizing:border-box;color:inherit\">premier<\/code>. Ce contr\u00f4le suppl\u00e9mentaire a \u00e9t\u00e9 d\u00e9clench\u00e9 par la r\u00e9vision du code et est distinct des douze contr\u00f4les d\u00e9finis avant les tests. Il n'a aucune incidence sur leurs notes.<\/p><\/details><p class=\"ccms-note\" style=\"box-sizing:border-box;color:#35435a;margin:12px 0;font-size:14px\">Sonnet a rencontr\u00e9 une erreur de service avant que sa nouvelle tentative autoris\u00e9e ne renvoie la r\u00e9ponse tronqu\u00e9e affich\u00e9e. Cette d\u00e9faillance du service est ind\u00e9pendante de la qualit\u00e9 du code. Aucun mod\u00e8le n'a re\u00e7u de nouvelle tentative visant \u00e0 am\u00e9liorer ou \u00e0 compl\u00e9ter sa r\u00e9ponse.<\/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\">Consultez l'invite partag\u00e9e compl\u00e8te et le code de saisie<\/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\">Consultez la r\u00e9ponse compl\u00e8te de Claude Haiku 4.5 telle qu'elle a \u00e9t\u00e9 renvoy\u00e9e<\/summary><p class=\"ccms-note\" style=\"box-sizing:border-box;color:#35435a;margin:12px 0;font-size:14px\">Voici l'int\u00e9gralit\u00e9 de la r\u00e9ponse re\u00e7ue. Elle s'arr\u00eate en cours de sortie car la limite a \u00e9t\u00e9 atteinte ; le contenu manquant n'a pas \u00e9t\u00e9 compl\u00e9t\u00e9.<\/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\">Consultez la r\u00e9ponse compl\u00e8te de Claude Sonnet 5 telle qu'elle a \u00e9t\u00e9 renvoy\u00e9e<\/summary><p class=\"ccms-note\" style=\"box-sizing:border-box;color:#35435a;margin:12px 0;font-size:14px\">Voici l'int\u00e9gralit\u00e9 de la r\u00e9ponse re\u00e7ue. Elle s'arr\u00eate en cours de sortie car la limite a \u00e9t\u00e9 atteinte ; le contenu manquant n'a pas \u00e9t\u00e9 compl\u00e9t\u00e9.<\/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\">Consultez la r\u00e9ponse compl\u00e8te de Claude Opus 5.5 telle qu\u2019elle a \u00e9t\u00e9 renvoy\u00e9e<\/summary><p class=\"ccms-note\" style=\"box-sizing:border-box;color:#35435a;margin:12px 0;font-size:14px\">Voici l'int\u00e9gralit\u00e9 de la r\u00e9ponse re\u00e7ue. Elle s'arr\u00eate en cours de sortie car la limite a \u00e9t\u00e9 atteinte ; le contenu manquant n'a pas \u00e9t\u00e9 compl\u00e9t\u00e9.<\/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\">La limite de 4 096 tokens correspondait au budget de sortie choisi pour ce test, et non \u00e0 la capacit\u00e9 maximale document\u00e9e d\u2019un mod\u00e8le quelconque. Le r\u00e9sultat du routage sugg\u00e8re de proc\u00e9der \u00e0 une v\u00e9rification pratique avant d\u2019envoyer une requ\u00eate plus volumineuse : estimez la taille de l\u2019impl\u00e9mentation, des tests et de l\u2019explication que vous vous attendez \u00e0 recevoir en retour. Il peut \u00eatre judicieux de fractionner les livrables ou d\u2019allouer davantage d\u2019espace de sortie ; nous n\u2019avons pas r\u00e9ex\u00e9cut\u00e9 ces sorties avec des param\u00e8tres diff\u00e9rents.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour votre propre travail, \u00e9valuez trois \u00e9l\u00e9ments s\u00e9par\u00e9ment : si la r\u00e9ponse est compl\u00e8te, si le code passe avec succ\u00e8s des tests pertinents, et si la r\u00e9vision met en \u00e9vidence des lacunes que ces tests n'ont pas d\u00e9tect\u00e9es. Le fait d'avoir r\u00e9ussi douze tests de fonction ne suffisait pas \u00e0 faire de l'une de ces r\u00e9ponses tronqu\u00e9es, compos\u00e9es de deux fichiers, une livraison compl\u00e8te.<\/p>\n\n\n\n<h2 id=\"model-cost\" class=\"wp-block-heading\">En quoi le choix du mod\u00e8le influe-t-il sur le co\u00fbt ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u00ab Claude Code \u00bb est l'outil de codage ; Haiku, Sonnet, Opus et Fable sont des mod\u00e8les disponibles dans l'environnement pris en charge. Le mode d'authentification et de paiement constitue un autre choix. Changer de mod\u00e8le ne transforme pas un abonnement en compte API et ne supprime pas toutes les limites d'utilisation.<\/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\">Mode de facturation<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">\u00c0 ne pas manquer<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Comment interpr\u00e9ter le choix du mod\u00e8le<\/th><\/tr><\/thead><tbody><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Acc\u00e8s par abonnement Claude<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Utilisation comprise dans le forfait et cr\u00e9dits d'utilisation activ\u00e9s s\u00e9par\u00e9ment<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">La consommation des quotas peut varier selon les mod\u00e8les ; consultez les mod\u00e8les disponibles et les limites du forfait.<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Acc\u00e8s \u00e0 l'API Anthropic<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Jetons d'entr\u00e9e\/sortie, mise en cache et frais d'API applicables<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Utilisez la grille tarifaire en vigueur et les donn\u00e9es de consommation r\u00e9elles, puis validez les frais dans la console de facturation<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Fournisseur de services cloud ou passerelle<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Identifiants, tarifs et relev\u00e9s de facturation pris en charge par votre prestataire<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Le prix catalogue indiqu\u00e9 pour un produit Anthropic peut ne pas correspondre au montant factur\u00e9 par votre fournisseur.<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\" style=\"font-size:14px;line-height:1.6;color:#52617a;padding:12px\">Le choix du forfait et la facturation sont li\u00e9s, mais c'est le mode de facturation qui d\u00e9termine la mani\u00e8re dont la consommation est factur\u00e9e.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dans le code Claude, <code>\/usage<\/code> affiche les informations relatives au jeton de session et, le cas \u00e9ch\u00e9ant, les barres d'utilisation de l'abonnement. Le montant indiqu\u00e9 en dollars est une estimation calcul\u00e9e localement sur la base des tarifs indiqu\u00e9s dans la liste ou configur\u00e9s ; il ne s'agit pas d'une facture. Pour les abonn\u00e9s aux formules Pro et Max, ce montant li\u00e9 \u00e0 la session ne signifie pas qu'une facturation suppl\u00e9mentaire li\u00e9e \u00e0 l'API a \u00e9t\u00e9 ajout\u00e9e \u00e0 l'abonnement. En savoir plus sur <a href=\"https:\/\/www.glbgpt.com\/hub\/claude-code-pricing\/\">Claude : tarification et modes de facturation<\/a> si vous \u00eates en train de choisir le mode de paiement.<\/p>\n\n\n\n<h3 id=\"api-price-example\" class=\"wp-block-heading\">Cours actuels de l'API et exemple de jeton \u00e9quivalent<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Les taux de base habituels de Anthropic par million de jetons d'entr\u00e9e\/sortie sont les suivants : <strong>Haiku 4.5 : $1\/$5 ; Sonnet 5 : $2\/$10 ; Opus 5.5 : $4\/$20 ; Fable 5.1 : $10\/$50<\/strong>, consult\u00e9 le 28 septembre 2026. Le graphique ci-dessous pr\u00e9sente un volume de jetons constant, ce qui facilite la comparaison des chiffres.<\/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\">M\u00eame volume de jetons, quatre co\u00fbts d'API diff\u00e9rents<\/h3>\n  <p style=\"box-sizing:border-box;color:#34435d;margin:10px 0\">Exemple : <strong style=\"box-sizing:border-box\">100 000 jetons d'entr\u00e9e non mis en cache + 10 000 jetons de sortie<\/strong>, sur la base des prix catalogue normaux de l'API de Anthropic, v\u00e9rifi\u00e9s le 28 septembre 2026.<\/p>\n  <div class=\"ccms-cost__rows\" aria-label=\"Co\u00fbt de base de l&#039;API pour le volume de jetons de l&#039;exemple\" 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 n\u00b0 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\">Consultez les tarifs et le mode de calcul<\/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 par million de jetons et l'exemple de calcul<\/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\">Mod\u00e8le<\/th><th scope=\"col\" style=\"box-sizing:border-box;padding:10px 8px;text-align:left;border-bottom:1px solid #d8dfeb;color:#182439;background:#edf1fa\">Entr\u00e9e \/ 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\">Sortie \/ 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\">Exemple de total<\/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 n\u00b0 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\">Calcul : 0,1 \u00d7 d\u00e9bit d'entr\u00e9e + 0,01 \u00d7 d\u00e9bit de sortie. Pour 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\">Il s'agit d'un exemple illustratif bas\u00e9 sur un nombre fixe de jetons. Les t\u00e2ches r\u00e9elles consomment des nombres de jetons variables ; les \u00e9critures et lectures en cache, les tentatives de r\u00e9essai, les outils, la facturation des fournisseurs et les limites d'abonnement doivent faire l'objet d'une comptabilisation distincte.<\/p>\n  <p class=\"ccms-cost__note\" style=\"box-sizing:border-box;font-size:14px;color:#34435d;margin:10px 0\">Source : <a href=\"https:\/\/platform.claude.com\/docs\/en\/about-claude\/pricing#model-pricing\" style=\"box-sizing:border-box;color:#254fc2;text-decoration:underline\">Tarification de l'API Anthropic<\/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=\"Tableau des tarifs de l&#039;API Anthropic indiquant les tarifs d&#039;entr\u00e9e, de sortie et de mise en cache des invites.\" 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\">Les prix catalogue normaux de l'API sont indiqu\u00e9s par million de jetons ; les \u00e9critures et les lectures en cache font l'objet de tarifs distincts.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Une v\u00e9ritable t\u00e2che de type \u00ab Claude Code \u00bb est une s\u00e9quence de requ\u00eates. Le contexte ant\u00e9rieur peut \u00eatre renvoy\u00e9, un mod\u00e8le peut approfondir son analyse, et des outils ou des agents suppl\u00e9mentaires peuvent g\u00e9n\u00e9rer davantage de travail. La mise en cache des invites pr\u00e9sente \u00e9galement des taux d'\u00e9criture et de lecture distincts. La barre la plus basse de l'exemple ne correspond donc pas au co\u00fbt le plus bas par modification accept\u00e9e.<\/p>\n\n\n\n<h3 id=\"cost-strategies\" class=\"wp-block-heading\">Cinq fa\u00e7ons de ma\u00eetriser les co\u00fbts sans compromettre la qualit\u00e9 du travail<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>D\u00e9finissez les crit\u00e8res d'acceptation avant de choisir un mod\u00e8le.<\/strong> Pr\u00e9cisez le comportement attendu, les cas limites et les contraintes existantes. Une petite t\u00e2che clairement d\u00e9finie est plus facile \u00e0 d\u00e9l\u00e9guer de mani\u00e8re \u00e9conomique et plus simple \u00e0 v\u00e9rifier.<\/li>\n\n\n\n<li><strong>Donnez le contexte n\u00e9cessaire.<\/strong> Joignez les fichiers et les d\u00e9tails de l'erreur dont le mod\u00e8le a besoin. Pour les sujets sans rapport avec ce sujet, lancez une nouvelle discussion plut\u00f4t que de reprendre un historique trop long simplement parce qu'il existe d\u00e9j\u00e0.<\/li>\n\n\n\n<li><strong>Il faut distinguer la capacit\u00e9 de l'effort.<\/strong> Anthropic recommande de commencer par le niveau d'effort par d\u00e9faut du mod\u00e8le. Si celui-ci a correctement analys\u00e9 le contexte mais n'a toujours pas r\u00e9ussi \u00e0 r\u00e9soudre le probl\u00e8me, un mod\u00e8le plus puissant pourrait s'av\u00e9rer utile. S'il a ignor\u00e9 l'\u00e9tape de lecture ou de v\u00e9rification, v\u00e9rifiez la configuration de la t\u00e2che et le choix du niveau d'effort.<\/li>\n\n\n\n<li><strong>Budget pour l'ensemble de la r\u00e9ponse.<\/strong> Le code source, les tests et les explications n\u00e9cessitent tous de l'espace. Notre deuxi\u00e8me exercice montre pourquoi le fait de disposer d'une fonction compl\u00e8te ne suffit pas \u00e0 lui seul \u00e0 prouver que la livraison demand\u00e9e respecte le budget.<\/li>\n\n\n\n<li><strong>Comparer les travaux accept\u00e9s.<\/strong> Enregistrez les r\u00e9sultats utiles, les tentatives de reprise, le temps de r\u00e9vision et les donn\u00e9es de facturation r\u00e9elles pour des t\u00e2ches repr\u00e9sentatives. Distinguez les erreurs des prestataires des d\u00e9faillances li\u00e9es \u00e0 la qualit\u00e9 du mod\u00e8le.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Ces strat\u00e9gies s'inscrivent dans le cadre de la <a href=\"https:\/\/code.claude.com\/docs\/en\/costs\">guide officiel des tarifs<\/a> et <a href=\"https:\/\/claude.com\/blog\/claude-model-and-effort-level-in-claude-code\">Recommandations de Anthropic concernant le mod\u00e8le et l'effort<\/a>. Une limite hebdomadaire ou par session applicable \u00e0 l'ensemble du forfait peut rester en vigueur apr\u00e8s un changement de forfait ; il en va autrement pour une limite sp\u00e9cifique \u00e0 un forfait. V\u00e9rifiez la limite effective avant d'effectuer des changements r\u00e9p\u00e9t\u00e9s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si votre travail m\u00eale programmation, recherche, r\u00e9daction et m\u00e9dias, comparez \u00e9galement le flux de travail pour lequel vous payez. <a href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_content_home&amp;login=1\">L'espace de travail multimod\u00e8le de GlobalGPT<\/a> rassemble ces fonctionnalit\u00e9s au sein d'un tableau de bord unique, avec un acc\u00e8s via l'interface de ligne de commande (CLI) pour les t\u00e2ches de d\u00e9veloppement. Il est utile de prendre en compte cette valeur ajout\u00e9e au niveau du flux de travail global, parall\u00e8lement \u00e0 une route API factur\u00e9e \u00e0 l'utilisation ; le tableau des API ci-dessus ne constitue pas une liste de prix des abonnements GlobalGPT.<\/p>\n\n\n\n<h2 id=\"troubleshooting\" class=\"wp-block-heading\">Pourquoi le mod\u00e8le que vous avez choisi pourrait ne pas convenir<\/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\">Sympt\u00f4me<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">V\u00e9rification probable<\/th><th scope=\"col\" style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#172438;background:#edf1fa\">Prochaine \u00e9tape concr\u00e8te<\/th><\/tr><\/thead><tbody><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">La session suivante utilise l'ancien mod\u00e8le<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Il se peut que ce commutateur n'ait \u00e9t\u00e9 actif que pendant la session.<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Utilisez l'action \u00ab Entr\u00e9e \u00bb du s\u00e9lecteur pour enregistrer, puis s\u00e9lectionnez une nouvelle session<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">La pr\u00e9f\u00e9rence est enregistr\u00e9e, mais c'est un autre mod\u00e8le qui d\u00e9marre<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Un param\u00e8tre de lancement, de shell, de projet, de gestion ou d'organisation peut pr\u00e9valoir<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Lisez les informations relatives au d\u00e9marrage et v\u00e9rifiez la configuration correspondante avec son responsable<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Une conversation reprise suit un mod\u00e8le diff\u00e9rent<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">La session enregistr\u00e9e peut r\u00e9tablir son mod\u00e8le pr\u00e9c\u00e9dent<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">V\u00e9rifiez \/status ; choisissez soigneusement le mod\u00e8le souhait\u00e9 pour la reprise du travail<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Le mod\u00e8le est manquant ou a \u00e9t\u00e9 rejet\u00e9<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Disponibilit\u00e9 des prestataires, r\u00e8gles organisationnelles ou ancienne version du code Claude<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">V\u00e9rifiez les identifiants des mod\u00e8les pris en charge, les droits d'acc\u00e8s au compte et les exigences en mati\u00e8re de version<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Un m\u00eame nom de famille peut se traduire diff\u00e9remment selon les pays<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Les alias et les correspondances de fournisseurs diff\u00e8rent<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Utilisez l'identifiant complet correct du fournisseur lorsqu'une version doit rester inchang\u00e9e<\/td><\/tr><tr><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Le changement d'op\u00e9rateur n'entra\u00eene pas la r\u00e9initialisation d'une limite d'utilisation<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">La limite peut s'appliquer \u00e0 l'ensemble du plan<\/td><td style=\"padding:12px;border-bottom:1px solid #d7dfed;text-align:left;vertical-align:top;color:#23334c\">Lisez le message d'utilisation et r\u00e9initialisez la p\u00e9riode plut\u00f4t que de supposer qu'un changement de forfait familial suffit<\/td><\/tr><\/tbody><\/table><figcaption class=\"wp-element-caption\" style=\"font-size:14px;line-height:1.6;color:#52617a;padding:12px\">\u00c9valuez l'ampleur du probl\u00e8me avant de modifier un autre param\u00e8tre.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Si le code Claude ne parvient pas \u00e0 enregistrer vos param\u00e8tres utilisateur, une option interactive peut s'appliquer \u00e0 la session en cours sans \u00eatre conserv\u00e9e. Un fichier de param\u00e8tres g\u00e9r\u00e9 ou g\u00e9n\u00e9r\u00e9 peut n\u00e9cessiter une modification de la part de son propri\u00e9taire plut\u00f4t qu'une nouvelle tentative de s\u00e9lection. \u00c9vitez de supprimer les restrictions organisationnelles dans le seul but de faire appara\u00eetre une option.<\/p>\n\n\n\n<h2 id=\"globalgpt-workflow\" class=\"wp-block-heading\">D\u00e9veloppez un flux de travail plus complet avec GlobalGPT<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La s\u00e9lection de mod\u00e8les ne constitue qu'une partie du flux de travail. Vous pouvez \u00eatre amen\u00e9 \u00e0 effectuer des recherches dans une biblioth\u00e8que, \u00e0 r\u00e9diger une \u00e9bauche de fonction, \u00e0 expliquer une modification \u00e0 un coll\u00e8gue, \u00e0 cr\u00e9er de la documentation et \u00e0 pr\u00e9parer des ressources visuelles. GlobalGPT regroupe plusieurs mod\u00e8les de pointe et fonctions d'IA au sein d'un espace de travail abordable, ce qui permet de regrouper toutes ces t\u00e2ches dans un m\u00eame tableau de bord.<\/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\">Essayez la ligne de commande GlobalGPT<\/a><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Pour les op\u00e9rations en terminal, le <a href=\"https:\/\/www.glbgpt.com\/home\/cli\">GlobalGPT CLI<\/a> relie les outils de la plateforme aux environnements de d\u00e9veloppement. La proc\u00e9dure de configuration d\u00e9crite dans la documentation utilise les identifiants de votre compte GlobalGPT et le solde habituel de ce compte. L'interface en ligne de commande (CLI) permet de prendre en charge un flux de travail plus large en mati\u00e8re de codage et de cr\u00e9ation, tandis que le mod\u00e8le propre \u00e0 Claude Code reste un choix d\u00e9lib\u00e9r\u00e9 gr\u00e2ce \u00e0 ses commandes de gestion du mod\u00e8le.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Par exemple, r\u00e9digez et relisez un plan de mise en \u0153uvre, utilisez un autre mod\u00e8le pour fournir une explication concise, puis cr\u00e9ez la documentation ou les ressources qui accompagnent la version. Suivez le guide pour <a href=\"https:\/\/www.glbgpt.com\/hub\/how-to-use-globalgpt-cli-in-claude-code\/\">Relier l'interface CLI du GlobalGPT au code du Claude<\/a> lorsque vous souhaitez int\u00e9grer cet outil. Configurez votre mod\u00e8le de raisonnement Claude s\u00e9par\u00e9ment, en fonction de la t\u00e2che de codage.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Choisissez un mod\u00e8le de d\u00e9part, d\u00e9finissez les crit\u00e8res qui permettront de d\u00e9terminer si la t\u00e2che est r\u00e9ussie, puis passez \u00e0 l'\u00e9tape suivante lorsque la t\u00e2che l'exige. V\u00e9rifiez l'ensemble du r\u00e9sultat avant de consid\u00e9rer le travail comme termin\u00e9. <a href=\"https:\/\/www.glbgpt.com\/home?inviter=hub_content_home&amp;login=1\">Cr\u00e9ez votre flux de travail avec GlobalGPT<\/a> lorsque vous souhaitez disposer d'outils de s\u00e9lection de mod\u00e8les, de recherche, de programmation et de cr\u00e9ation interconnect\u00e9s dans le cadre de votre travail quotidien.<\/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\">Comment puis-je modifier le mod\u00e8le dans le code Claude ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ex\u00e9cutez la commande \/model pour ouvrir la fen\u00eatre de s\u00e9lection. Appuyez sur la touche \u00ab s \u00bb pour modifier uniquement la session en cours, ou sur Entr\u00e9e pour enregistrer le mod\u00e8le s\u00e9lectionn\u00e9 comme mod\u00e8le par d\u00e9faut. Pour choisir un mod\u00e8le pour une seule nouvelle session, lancez la commande claude \u2013model suivie du nom du mod\u00e8le.<\/p>\n\n\n\n<h3 id=\"faq-2\" class=\"wp-block-heading\">La commande \/model modifie-t-elle mes param\u00e8tres par d\u00e9faut enregistr\u00e9s ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Dans les versions interactives actuelles, s\u00e9lectionner un mod\u00e8le \u00e0 l'aide de la touche Entr\u00e9e ou saisir \/model sonnet permet d'enregistrer ce choix dans les param\u00e8tres utilisateur si ceux-ci sont accessibles en \u00e9criture. Appuyer sur la touche \u00ab s \u00bb dans le s\u00e9lecteur n'a qu'une validit\u00e9 limit\u00e9e \u00e0 la session en cours. D'autres param\u00e8tres peuvent toutefois pr\u00e9valoir lors du prochain d\u00e9marrage.<\/p>\n\n\n\n<h3 id=\"faq-3\" class=\"wp-block-heading\">Quel est le mod\u00e8le par d\u00e9faut du code Claude ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La valeur par d\u00e9faut d'ex\u00e9cution d\u00e9pend de votre compte, de votre fournisseur et de votre configuration. La valeur par d\u00e9faut efface toute red\u00e9finition de mod\u00e8le ; il ne s'agit pas d'un identifiant de mod\u00e8le fixe. V\u00e9rifiez le mod\u00e8le actif \u00e0 l'aide de la commande \/status et consultez le s\u00e9lecteur plut\u00f4t que de partir du principe que tous les comptes d\u00e9marrent avec la m\u00eame version.<\/p>\n\n\n\n<h3 id=\"faq-4\" class=\"wp-block-heading\">Que fait Opusplan ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il utilise Opus en mode planification et Sonnet en mode ex\u00e9cution. Il suit la transition entre les modes plut\u00f4t que de choisir automatiquement le mod\u00e8le le moins co\u00fbteux pour chaque requ\u00eate. Le co\u00fbt r\u00e9el d\u00e9pend du travail effectu\u00e9 \u00e0 chaque phase.<\/p>\n\n\n\n<h3 id=\"faq-5\" class=\"wp-block-heading\">Pourquoi un mod\u00e8le n'appara\u00eet-il pas dans la liste de s\u00e9lection ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La disponibilit\u00e9 peut d\u00e9pendre de votre fournisseur, de votre compte, des restrictions de votre organisation et de la version du code Claude. Consultez la documentation du mod\u00e8le actuel et la liste des mod\u00e8les autoris\u00e9s dans votre environnement. Un alias de famille peut \u00e9galement renvoyer \u00e0 une version diff\u00e9rente chez un autre fournisseur.<\/p>\n\n\n\n<h3 id=\"faq-6\" class=\"wp-block-heading\">Est-ce qu'un mod\u00e8le moins cher permet toujours de r\u00e9duire le co\u00fbt d'une t\u00e2che ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Non. Le prix du jeton n'est qu'un facteur parmi d'autres. L'utilisation totale, les r\u00e9ponses incompl\u00e8tes, les nouvelles tentatives et le travail de r\u00e9vision ont tous une incidence sur le co\u00fbt d'une modification acceptable. Lors de notre petite refactorisation, les trois fonctions ont \u00e9t\u00e9 valid\u00e9es, tandis que les trois r\u00e9ponses plus volumineuses, compos\u00e9es de deux fichiers, ont \u00e9t\u00e9 tronqu\u00e9es en raison de la limite de sortie commune.<\/p>\n\n\n\n<h2 id=\"sources\" class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/model-config\">Configuration du mod\u00e8le de code Claude<\/a> \u2014 s\u00e9lection de mod\u00e8les, valeurs par d\u00e9faut, alias, diff\u00e9rences entre fournisseurs et Opusplan.<\/li>\n\n\n\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/costs\">Co\u00fbts li\u00e9s au code Claude<\/a> \u2014 estimations de consommation, limites d'abonnement, mise en cache et ma\u00eetrise des co\u00fbts.<\/li>\n\n\n\n<li><a href=\"https:\/\/platform.claude.com\/docs\/en\/about-claude\/models\/overview\">Pr\u00e9sentation du mod\u00e8le Anthropic<\/a> et <a href=\"https:\/\/platform.claude.com\/docs\/en\/about-claude\/pricing\">Prix de l'API<\/a> \u2014 caract\u00e9ristiques techniques et prix catalogue des mod\u00e8les actuels.<\/li>\n\n\n\n<li><a href=\"https:\/\/claude.com\/blog\/claude-model-and-effort-level-in-claude-code\">Guide sur les mod\u00e8les et les efforts<\/a> \u2014 les diff\u00e9rences concr\u00e8tes entre les capacit\u00e9s, le contexte et l'effort.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.glbgpt.com\/home\/cli\">Documentation de l'interface CLI GlobalGPT<\/a> \u2014 flux de travail sur terminal et configuration par compte.<\/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>Pour le choix d\u2019un mod\u00e8le selon le code Claude, utilisez Haiku pour les modifications mineures et v\u00e9rifiables, Sonnet pour les impl\u00e9mentations courantes, et Opus pour les t\u00e2ches pr\u00e9sentant davantage d\u2019ambigu\u00eft\u00e9 ou exigeant davantage de raisonnement. Anthropic recommande actuellement Opus 5.5 comme point de d\u00e9part g\u00e9n\u00e9ral ; ce sont votre t\u00e2che, la charge de travail li\u00e9e \u00e0 la r\u00e9vision et votre budget qui d\u00e9terminent si un mod\u00e8le plus petit est plus adapt\u00e9. Pour changer de mod\u00e8le, ouvrez \/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\/fr\/wp-json\/wp\/v2\/posts\/20166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/comments?post=20166"}],"version-history":[{"count":2,"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/posts\/20166\/revisions"}],"predecessor-version":[{"id":20174,"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/posts\/20166\/revisions\/20174"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/media\/20168"}],"wp:attachment":[{"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/media?parent=20166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/categories?post=20166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.glbgpt.com\/fr\/wp-json\/wp\/v2\/tags?post=20166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}