mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 23:18:13 +02:00
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:
1 parent
ac40a2556a
commit
4b659ac186
6 files changed
+154
-20
No files matched your search
@@ -29,6 +29,7 @@ func freshTplProbe(t *testing.T) {
|
||||
tplProbeMu.Lock()
|
||||
tplProbeCache = map[string]tplProbeResult{}
|
||||
tplProbeLast = nil
|
||||
tplProbeByShape = map[string]tplProbeResult{}
|
||||
tplProbeRunning = false
|
||||
tplProbeTried = time.Time{}
|
||||
tplProbeLogged = ""
|
||||
@@ -447,3 +448,33 @@ func TestSondeGabaritDeclencheeParRunChat(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Le verdict est rangé par forme de requête : la dernière forme sondée ne
|
||||
// décide pas pour une autre (NUDGE_IN_TOOL), et une forme jamais sondée n'a
|
||||
// pas de verdict.
|
||||
func TestSondeGabaritVerdictParForme(t *testing.T) {
|
||||
testHome(t)
|
||||
freshTplProbe(t)
|
||||
f := &fakeTpl{mode: "qwen3"}
|
||||
f.start(t)
|
||||
a := newTplShape(probeTools(), nil, "")
|
||||
b := newTplShape(nil, nil, "")
|
||||
if r := tplProbeEnsure(context.Background(), a); r.PrefixStable != tplNo {
|
||||
t.Fatalf("forme A : %+v", r)
|
||||
}
|
||||
f.mu.Lock()
|
||||
f.mode = "keep"
|
||||
f.mu.Unlock()
|
||||
if r := tplProbeEnsure(context.Background(), b); r.PrefixStable != tplYes {
|
||||
t.Fatalf("forme B : %+v", r)
|
||||
}
|
||||
if r, ok := tplCapsCurrent(); !ok || r.PrefixStable != tplYes {
|
||||
t.Errorf("affichage : la dernière sondée, B : %+v", r)
|
||||
}
|
||||
if r, ok := tplCapsFor(a); !ok || r.PrefixStable != tplNo {
|
||||
t.Errorf("forme A écrasée par B : %+v %v", r, ok)
|
||||
}
|
||||
if _, ok := tplCapsFor(newTplShape(probeTools(), map[string]any{"enable_thinking": false}, "")); ok {
|
||||
t.Error("verdict pour une forme jamais sondée")
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user