Skip to content

Preset API externe : le raisonnement passe par les champs natifs du fournisseur - #179

Closed
oh-codes wants to merge 1 commit into
nathaninline:mainfrom
oh-codes:fix/external-reasoning-upstream
Closed

oh-codes wants to merge 1 commit into
nathaninline:mainfrom
oh-codes:fix/external-reasoning-upstream

Conversation

@oh-codes

Copy link
Copy Markdown
Contributor

Fixes #178.

Problème

Sur un preset EXTERNAL=1, REASONING=off n'était jamais transmis à l'API distante et REASONING_EFFORT partait dans chat_template_kwargs, un champ propre aux gabarits jinja de llama.cpp.

Mesuré chez DeepSeek avec un proxy d'interception local : le corps envoyé contenait chat_template_kwargs: {"reasoning_effort":"high"} et aucun champ natif ; l'API a répondu 200 en diffusant reasoning_content malgré REASONING=off. Les fournisseurs tolérants ignorent donc le réglage, et les API qui valident strictement le schéma le rejettent.

Correctif

  • chatEndpoint.Template distingue un endpoint llama.cpp (local, GPU Modal, EXTERNAL_SERVICE) d'une vraie API distante.
  • chat_template_kwargs, top_k, min_p et repeat_penalty ne partent plus que vers un endpoint llama.cpp.
  • Une API distante reçoit ses champs natifs : thinking.type + reasoning_effort pour DeepSeek, reasoning_effort de premier niveau pour OpenAI. DeepSeek est reconnu à son hôte ou au préfixe de son modèle ; EXTERNAL_REASONING=deepseek|openai|none permet de forcer le dialecte ou de le couper.
  • Un effort défini implique le raisonnement activé ; REASONING=off sans effort envoie thinking: {"type":"disabled"}.
  • Interface : l'interrupteur Raisonnement sort de #m-settings-row (il disparaissait pour un preset externe), le bloc API externe gagne un sélecteur de dialecte, le raccourci du composeur apparaît pour un preset externe, et --jinja n'est plus écrit dans EXTRA_ARGS.
  • backend_reasoning_test.go couvre l'endpoint externe sans champ llama.cpp, Modal qui les conserve, les mappages DeepSeek/OpenAI, l'auto-détection et le fournisseur inconnu qui ne reçoit rien.

Vérification

  • go test ciblé : vert.
  • gofmt, go vet, staticcheck, verify-i18n : propres.
  • Capture réelle après correctif : {"thinking":{"type":"enabled"},"reasoning_effort":"high"}, plus aucun chat_template_kwargs ; DeepSeek répond 200 avec raisonnement.
  • Deux tests échouent sur main avant et après ce correctif (TestShrinkToFit, TestSystemPromptStaysLean), sans rapport.

🤖 Generated with Claude Code

…ournisseur

REASONING=off n'était jamais transmis à l'API distante, et REASONING_EFFORT
partait dans chat_template_kwargs, un champ propre à llama.cpp que les
fournisseurs tolérants ignorent (DeepSeek) et que les stricts rejettent.

Les champs llama.cpp (chat_template_kwargs, top_k, min_p, repeat_penalty) ne
partent plus que vers un endpoint llama.cpp (local, Modal, EXTERNAL_SERVICE).
Une vraie API distante reçoit à la place ses champs natifs : thinking.type +
reasoning_effort pour DeepSeek, reasoning_effort pour OpenAI. DeepSeek est
reconnu à son hôte ou à son modèle ; la clé EXTERNAL_REASONING permet de forcer
le dialecte ou de le couper.

Côté interface, l'interrupteur Raisonnement sort de #m-settings-row (il
disparaissait pour un preset externe), un effort défini rallume le raisonnement,
et --jinja n'est plus écrit dans EXTRA_ARGS d'un preset externe.

Fixes nathaninline#178

Co-Authored-By: Claude Code <noreply@anthropic.com>
@oh-codes oh-codes closed this Oct 28, 2026
@oh-codes
oh-codes deleted the fix/external-reasoning-upstream branch October 28, 2026 11:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Preset API externe : le raisonnement n'est pas transmis (chat_template_kwargs llama.cpp envoyé à toute API, REASONING=off ignoré)

1 participant