Raisonnement : NUDGE_IN_TOOL décide sur le verdict de la forme de la requête

La sonde de gabarit gardait le verdict de la DERNIÈRE forme sondée (outils,
chat_template_kwargs, reasoning_effort), quelle qu'elle soit. NUDGE_IN_TOOL
pouvait donc glisser le rappel de budget dans un résultat d'outil sur la foi
d'un « préfixe instable » conclu pour une autre forme — un autre jeu
d'outils, la réflexion coupée, un autre niveau — dont le rendu n'a rien à
voir.

- Les verdicts sont aussi rangés par forme (empreinte tplShape, au plus 16,
  la plus ancienne cède) ; tplCapsFor rend celui de la forme demandée.
- NUDGE_IN_TOOL calcule la forme de la requête courante (mêmes outils,
  kwargs et niveau que ceux envoyés) et ne place le rappel dans le résultat
  que si CETTE forme est « instable » pour ce modèle ; forme jamais sondée ou
  inconnue : message à part, comme sans la clé. Une relance outils coupés ou
  tool_choice « none » (forme que la sonde ne voit jamais) se replie aussi.
- L'affichage (/api/perf/summary) et REASONING_ECHO gardent le dernier
  verdict, comme avant. Sans la clé, rien ne change.
- Tests : verdict par forme dans la sonde, autre forme / autres kwargs /
  autre niveau refusés, bout à bout avec le verdict d'une autre forme
  (échouait sur l'ancien code).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-04 14:50:15 +02:00
1 parent ac40a2556a
commit 4b659ac186
6 files changed
+154 -20

No files matched your search

+3 -1
View File
@@ -1417,8 +1417,10 @@ func runChatLoop(ctx context.Context, kt *keepImages, messages []Message, tools
// NUDGE_IN_TOOL (opt-in, gabarits dont le rendu bouge quand un message
// user s'ajoute) : au bout du dernier résultat d'outil. Sinon, ou si
// la forme ne s'y prête pas, un message à part comme toujours.
// La sonde ne connaît que la forme normale (outils annoncés, ni coupés
// ni neutralisés) : une relance d'une autre forme se replie.
placed := false
if nudgeInToolOn(chatCfg, ep) {
if !disableTools && !toolChoiceNone && nudgeInToolOn(chatCfg, ep, tools, reasoningKwargs, reasoningEffort) {
messages, extra, placed = nudgeIntoTool(messages, extra, msg)
}
if !placed {