Skip to content

frognano-4b via hub: outbound body flips thinking ON — identical direct :5003 request does not think #399

Description

@jsboige

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-4b servie par le hub produit du raisonnement (4,4-8,9k car.) et un contenu vide à max_tokens 1024, stochastique à 2048. La même requête en DIRECT sur :5003 ne pense jamais et répond immédiatement.

Chemin max_tokens content reasoning finish
hub (capture resp-1-r11725-…-openai-frognano-4b.sse) 16 0 dès le 1er token length, completion=16 PILE
hub (po-2026, 5 runs) 1024/2048 0/stochastique 4,4-8,9k car. —
direct :5003, 9 variantes 256-1024 immédiat (« ok ») 0 stop

Les 9 variantes directes (toutes SANS thinking) : sans flag ; chat_template_kwargs.enable_thinking=false ; enable_thinking=false top-level ; system générique ; system vide ; content en tableau [{type:text}] ; content en chaîne ; stream:true+stream_options+temperature:1 ; temperature:1 seul. → AUCUN de ces champs ne bascule le thinking en direct.

Déjà exclu côté hub :

  • chat_template_kwargs jamais relayé (0 occurrence dans le source — le corps sortant est reconstruit, openai-api-format.ts#buildChatCompletionsPayload) ;
  • max_tokens honoré (completion=16 exact) ;
  • prompt rendu identique (16 tokens des deux côtés) ;
  • pas de dialecte pour 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 ≥ 4096 via hub. L'essai réel #4107 (Swift→mini) attend ce correctif.

Refs vllm#70/#71 (FrogNano), essai réel #4107 (roo-extensions)

Activity

  1. jsboige commented on Oct 11, 2026

    @jsboige
    OwnerAuthor

    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) :

    1. La requête entrante appariée était minimale. Capture req-1-11725 (07/10 19:39:33Z, extraite de captures-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.

    2. 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) et af52be5f (actuel). Aucun champ thinking d'aucune orthographe (enable_thinking, reasoning_effort, thinking, thinking_budget, chat_template_kwargs).

    3. 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édicat startsWith | "/fam"), le QwenModelDialect.prepareRequest — seul site qui pouvait émettre enable_thinking — n'a jamais tourné pour frognano.

    4. 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 tools req-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 bloc thinking entrant ; 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é.

  2. jsboige commented on Oct 11, 2026

    @jsboige
    OwnerAuthor

    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. QwenModelDialect ne 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 (merge 8e4bbc3b). J'ai vérifié par mutation que la porte isReasoningModel() de openai-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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions