Lot 6 : parité de la boucle d'un tour avec le Go (journaux de référence)

internal/loki/parity_test.go rejoue 19 scénarios dans runChatTools contre
un faux moteur aux réponses scriptées, outils aux résultats fixés
(execToolHook, nil en service) : réponse simple, raisonnement, outils
seuls et en parallèle, appel répété, arguments illisibles, outil inconnu,
budget dépassé, « pensé sans agir » une et deux fois, pensée en ligne,
échantillonnage et intensité, raisonnement coupé, 500 une et deux fois,
erreur du moteur, appel d'outil écrit en texte, API externe, historique
déjà outillé. Les corps envoyés au moteur, les événements d'affichage
(texte regroupé, mesures ignorées), l'historique ajouté et l'erreur sont
rangés dans rust/loki-rs/tests/parity/*.json ; le test Go échoue si la
boucle ne les produit plus (LOKI_PARITY_UPDATE=1 pour régénérer).

rust/loki-rs/tests/parity.rs rejoue les mêmes scénarios dans
chat::turn::run_turn et retrouve les 19 journaux à l'identique.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
This commit is contained in:
Claude committed 2026-10-15 11:32:11 +00:00
1 parent ad46bb69a6
commit bc388d7a01
22 files changed
+6250 -1

No files matched your search

+10 -1
View File
@@ -2366,7 +2366,12 @@ func runChatLoop(ctx context.Context, kt *keepImages, messages []Message, tools
extra = append(extra, toolMsg)
continue
}
ex := execTool(ctx, tc.Function.Name, args, label, caps)
var ex toolExecResult
if execToolHook != nil {
ex = execToolHook(ctx, tc.Function.Name, args, label, caps)
} else {
ex = execTool(ctx, tc.Function.Name, args, label, caps)
}
result, diff, diffAdd, diffDel, visionImg = ex.Result, ex.Diff, ex.Added, ex.Removed, ex.VisionImg
if ex.Ask != nil {
cb(StreamEvent{Ask: ex.Ask})
@@ -2609,6 +2614,10 @@ type toolExecResult struct {
Ask *AskEvent `json:"ask,omitempty"`
}
// execToolHook : nil en service. Les tests de parité Go/Rust
// (parity_test.go) y fixent les résultats des outils.
var execToolHook func(ctx context.Context, name string, args map[string]any, label string, caps Caps) toolExecResult
// execTool exécute UN appel d'outil. Extrait tel quel de runChatLoop (lot 6
// de la migration Rust) : c'est la frontière par laquelle une boucle de chat
// écrite en Rust fera exécuter ses outils par ce process, tant qu'ils n'auront