Télémétrie : corrections de relecture — compaction aussi tolérante qu'avant, pas d'alerte de cache sur une API externe, seuil qui suit EXTRA_ARGS

La relecture du relevé par complétion a trouvé quatre écarts, tous
d'affichage ou de robustesse ; rien ne touche aux requêtes ni au contexte.

- Compaction : la réponse lue d'un bloc passait de Decoder à Unmarshal,
  plus strict (un octet parasite après le JSON faisait échouer une
  compaction qui passait). Retour au Decoder, et perfWire fait de même.
- API externe : son cache suit ses propres règles, sans slot ni points de
  reprise à surveiller ici. Plus de ligne ambre « recalculés » pour elle ;
  le relevé reste dans l'anneau.
- Seuil d'alerte : même priorité qu'au lancement — -cms d'EXTRA_ARGS, puis
  LLAMA_ARG_CHECKPOINT_MIN_SPACING_NT, puis CKPT_MIN_STEP ; -ub d'EXTRA_ARGS
  avant UBATCH.
- UI : « recalculés après sous-agent, client /v1 » au lieu des identifiants
  internes (subagent, foreign).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-04 00:34:57 +02:00
1 parent 80b7793773
commit 18a723a671
6 files changed
+49 -12

No files matched your search

+10
View File
@@ -43,6 +43,8 @@ func TestPerfWireDecode(t *testing.T) {
{"moteur muet", `{"usage":{"prompt_tokens":900}}`, nil, nil, nil},
// Types de travers (fork, passerelle) : lu si c'est un nombre, sinon inconnu.
{"types de travers", `{"timings":{"cache_n":"abc","draft_n":"12","draft_n_accepted":7.0}}`, nil, iptr(12), iptr(7)},
// Octets parasites après la réponse (proxy) : la première valeur compte.
{"octets parasites", `{"timings":{"cache_n":12}}` + "\nxyz", iptr(12), nil, nil},
{"structure de travers", `{"timings":"nope","usage":{"prompt_tokens_details":{"cached_tokens":5.9}}}`, iptr(5), nil, nil},
}
eq := func(a, b *int) bool { return (a == nil) == (b == nil) && (a == nil || *a == *b) }
@@ -268,12 +270,20 @@ func TestPerfLostAlert(t *testing.T) {
{"espacement posé", map[string]string{"CKPT_MIN_STEP": "2048"}, 2560},
{"espacement et micro-batch", map[string]string{"CKPT_MIN_STEP": "4096", "UBATCH": "1024"}, 5120},
{"espacement illisible", map[string]string{"CKPT_MIN_STEP": "beaucoup"}, 1000},
// Comme au lancement : EXTRA_ARGS l'emporte sur les clés du preset.
{"-cms d'EXTRA_ARGS", map[string]string{"CKPT_MIN_STEP": "2048", "EXTRA_ARGS": "--checkpoint-min-step 8192 -ub 256"}, 8448},
{"-ub d'EXTRA_ARGS seul", map[string]string{"CKPT_MIN_STEP": "2048", "UBATCH": "1024", "EXTRA_ARGS": "-ub=2048"}, 4096},
}
t.Setenv("LLAMA_ARG_CHECKPOINT_MIN_SPACING_NT", "")
for _, c := range cases {
if got := perfLostAlertAt(c.cfg); got != c.want {
t.Errorf("%s : seuil %d, attendu %d", c.name, got, c.want)
}
}
t.Setenv("LLAMA_ARG_CHECKPOINT_MIN_SPACING_NT", "3000")
if got := perfLostAlertAt(map[string]string{"CKPT_MIN_STEP": "2048"}); got != 3512 {
t.Errorf("LLAMA_ARG_CHECKPOINT_MIN_SPACING_NT ignorée : seuil %d", got)
}
if perfAlert(perfRec{Lost: iptr(900)}, 1000) || !perfAlert(perfRec{Lost: iptr(1500)}, 1000) {
t.Fatal("seuil de perte")
}