mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-18 12:46:56 +02:00
Qwen3.8-27B valide `reasoning_effort` au lieu de l'ignorer : il connaît xhigh/medium/low, pas « high » — le niveau que l'interface enregistre par défaut. Chaque message partait donc en 500, avec une trace jinja affichée en guise d'erreur, et le 500 tombait dans la branche « prompt trop long » de runChat : loki compactait l'historique pour rien avant d'abandonner. Le refus dit lui-même ce que le gabarit accepte. On le lit (llm_effort.go), on traduit le niveau demandé vers le plus proche sur l'échelle none/minimal/low/medium/high/xhigh — à égalité, le plus fort, dégrader en silence étant pire que générer un peu plus longtemps — et on rejoue le tour, historique intact. Sans liste annoncée, le champ est simplement retiré. « aucune » n'est jamais traduite : c'est une coupure, portée par `enable_thinking` que tous les gabarits comprennent. La traduction est retenue par modèle : les messages suivants ne repaient pas l'aller-retour. Le repli est tracé sur stderr, sinon l'intensité choisie dans l'interface n'est pas celle qui part au moteur sans que rien ne le dise. « maximale » (xhigh) rejoint la liste des niveaux proposés : aucun gabarit ne les connaît toutes, et sans elle le maximum d'un Qwen3.8 restait hors d'atteinte. Le repli couvre les gabarits qui la refusent.
43 lines
1.7 KiB
JavaScript
43 lines
1.7 KiB
JavaScript
// ─── Intensité du raisonnement (barre de saisie) ─────────────────────────────
|
|
// Le même réglage existe dans l'éditeur de preset, mais il y est figé avec le
|
|
// preset : le changer demande d'ouvrir les réglages, éditer, enregistrer. Ici il
|
|
// s'applique au message suivant, sans redémarrer le moteur — `reasoning_effort`
|
|
// voyage dans le corps de la requête, pas dans la ligne de commande.
|
|
//
|
|
// La valeur part dans la config vivante. Appliquer un preset la réécrit : le
|
|
// réglage reste donc attaché au modèle, cette liste ne fait que le dévier à la
|
|
// volée.
|
|
|
|
const THINK_EFFORT_LABELS = {
|
|
'': 'auto',
|
|
none: 'aucune',
|
|
low: 'basse',
|
|
medium: 'moyenne',
|
|
high: 'haute',
|
|
xhigh: 'maximale',
|
|
};
|
|
|
|
async function loadThinkEffort(){
|
|
try{ applyThinkEffort(await jget('/api/reasoning-effort')); }
|
|
catch(e){ /* endpoint indisponible : la liste garde sa valeur par défaut */ }
|
|
}
|
|
|
|
function applyThinkEffort(r){
|
|
const sel = document.getElementById('think-effort');
|
|
if(!sel || !r || !r.ok) return;
|
|
sel.value = r.value || '';
|
|
// Raisonnement coupé au niveau du preset : le niveau n'a plus de prise. On
|
|
// grise plutôt que de masquer, pour que le réglage reste trouvable.
|
|
sel.disabled = !r.on;
|
|
sel.title = r.on
|
|
? 'Intensité du raisonnement — envoyée au gabarit du modèle'
|
|
: 'Raisonnement désactivé pour ce modèle (réglages → Raisonnement)';
|
|
}
|
|
|
|
async function setThinkEffort(value){
|
|
const r = await jpost('/api/reasoning-effort', {value});
|
|
if(!r || !r.ok){ toast((r && r.error) || 'réglage refusé'); return; }
|
|
applyThinkEffort(r);
|
|
toast('raisonnement : '+(THINK_EFFORT_LABELS[r.value||''] || r.value));
|
|
}
|