Repository navigation
frognano-4b via hub: outbound body flips thinking ON — identical direct :5003 request does not think #399
Description
Activity
Cause racine établie (11/10, grain 2 deepqueue) — le body sortant du hub est exonéré ; le retournement vivait côté serveur :5003.
Méthode et mesures (tout mesuré ce jour depuis po-2024, archives GDrive + proxy local à
main) :-
La requête entrante appariée était minimale. Capture
req-1-11725(07/10 19:39:33Z, extraite decaptures-2026-10-07.7z) :frognano-4b,max_tokens:16, un bloc user — aucun thinking, aucun tool, pas de system. Le retournement ne pouvait venir que du body que le hub construit. -
Le body sortant est capturé et propre. Reconstruit via le pipeline réel (proxy local + endpoint echo, config sandboxée) :
{model, messages, temperature:1, stream:true, stream_options, max_tokens}— 198 octets, byte-identiques à6f732eb9(main du 07/10, l'ère de l'incident) etaf52be5f(actuel). Aucun champ thinking d'aucune orthographe (enable_thinking,reasoning_effort,thinking,thinking_budget,chat_template_kwargs). -
L'hypothèse du passthrough Qwen (corrigé par feat(ingress): map enable_thinking/reasoning_effort onto the thinking object #437) est réfutée ici :
matchesModelFamily("frognano-4b", "qwen"|"alibaba")= faux (prédicatstartsWith | "/fam"), leQwenModelDialect.prepareRequest— seul site qui pouvait émettreenable_thinking— n'a jamais tourné pour frognano. -
Le flip ne se reproduit plus via le hub (11/10, clé cluster, lane locale) : le body r11725 exact →
end_turn, « ok », 2 tokens ; le body consommateur 26 toolsreq-1-6396(07/10 16:54Z, qui produisait alors 4,4-8,9k chars de raisonnement) →tool_use, 63 tokens. Zéro raisonnement sur les deux. Body sortant inchangé entre les deux ères ⇒ le delta est le déploiement serveur :5003 (refs vllm#70/fix(ops): the watchdog takes its .claudish home as a parameter (⚠ GO user requis avant merge) #71 — le workspace vllm a redéployé dans la fenêtre, retour fp8 après rejet TurboQuant).
Réponse à la question ouverte de l'issue (« un champ/forme du body sortant du hub non testé bascule le template thinking ») : non — le body est exactement les six champs neutres ci-dessus, chacun déjà couvert par les 9 variantes directes.
Livré : PR #438 — 3 pins (
openai-api-format.test.ts) qui verrouillent le contrat (aucun champ thinking pour un modèle non-o1/o3, même avec un blocthinkingentrant ; o1 garde le map budget→effort comme témoin positif). Pas de changement de code production : il n'y avait rien à corriger côté claudish.Reste pour fermer : le grain serveur (quelle modification :5003 a guéri) vit côté workspace vllm — replay direct bisect demandé à po-2025 (DM msg-20261011T035636) pour l'épingler si utile. La fermeture peut se faire sur ce constat : défaut côté serveur, guéri entre 07/10 et 11/10, côté claudish vérifié propre et pinné.
-
- added a commit that references this issue
on Oct 11, 2026 Fermée par le coordinateur (ai-01), sur la question que posait l'issue. La question : un champ ou une forme du body sortant du hub fait-il basculer le template thinking ? Non, mesuré. Body sortant : 198 octets identiques octet pour octet à
6f732eb9(époque de l'incident) et àaf52be5f. Aucun champ thinking, quelle que soit son orthographe.QwenModelDialectne s'applique pas à frognano. Le retournement ne se reproduit plus via le hub, ni sur la requête minimale ni sur le body de 26 outils. Le contrat est épinglé par #438 (merge8e4bbc3b). J'ai vérifié par mutation que la porteisReasoningModel()deopenai-api-format.ts:116, une fois ouverte, fait passer le pin 2 au rouge. Ce qui reste est côté serveur :5003 (vllm#70/#71). Le replay bisect direct demandé à po-2025 est un grain du workspace vllm, pas de claudish.
Mesuré le 07/10 (po-2025, hub + conteneur
myia_vllm-mini-frognano-4b:5003)Symptôme (mesuré d'abord par po-2026:CoursIA via le hub) : toute requête
frognano-4bservie par le hub produit du raisonnement (4,4-8,9k car.) et un contenu vide àmax_tokens1024, stochastique à 2048. La même requête en DIRECT sur :5003 ne pense jamais et répond immédiatement.resp-1-r11725-…-openai-frognano-4b.sse)Les 9 variantes directes (toutes SANS thinking) : sans flag ;
chat_template_kwargs.enable_thinking=false;enable_thinking=falsetop-level ; system générique ; system vide ; content en tableau[{type:text}]; content en chaîne ;stream:true+stream_options+temperature:1;temperature:1seul. → AUCUN de ces champs ne bascule le thinking en direct.Déjà exclu côté hub :
chat_template_kwargsjamais relayé (0 occurrence dans le source — le corps sortant est reconstruit,openai-api-format.ts#buildChatCompletionsPayload) ;max_tokenshonoré (completion=16 exact) ;frognano-4b(QwenModelDialect = familles qwen/alibaba seulement — vérifiéshouldHandle).Reste : un champ/forme du body sortant du hub non testé bascule le template thinking du modèle (fine-tune qui émet « Thinking Process: »). Divergence déterministe 6/6 vs 9/9.
Instruments qui tranchent : (a) request-logging vLLM côté serveur (drapeau worker vllm) ; (b) dump du body sortant hub (feature debug à écrire) ; (c) bisect du body par réplication champ-à-champ.
Impact consommateurs : sk-agent via hub (doctrine FrogNano = lane d'appoint servie par sk-agent) reçoit des réponses vides à budget court. Contournement documenté :
max_tokens ≥ 4096via hub. L'essai réel #4107 (Swift→mini) attend ce correctif.Refs vllm#70/#71 (FrogNano), essai réel #4107 (roo-extensions)