Lot 33 : préchauffage (PREWARM) tenu par la façade

PREWARM ne garde plus la conversation au Go. La façade tient
l'historique : elle assemble et envoie la requête du prochain tour ; le
Go garde le compteur des requêtes en vol et ce qui l'annule.

Go (facade_prewarm.go) :
- /internal/v1/prewarm/check : moteur libre d'un vrai travail, loin de
  minuit, en bonne santé, slot visé ;
- /internal/v1/prewarm/begin : rechargement SLOT_PERSIST puis inscription
  comme LA requête en vol ; son annulation est relayée à la façade ;
- /internal/v1/prewarm/end : place rendue, cache repris noté ;
- /internal/v1/oai/begin : prewarm_keep pour l'étape qui le prolonge ;
- fin de tâche planifiée : le déclencheur part à la façade.

Rust (chat/prewarm.rs) :
- assemblage par les mêmes fonctions que le tour, sentinelle « . », un
  seul jeton, non streamé ; abstention (capacités inconnues, tour en
  cours, discussion vide, compaction attendue, assemblage inattendu) ;
- déclencheurs : fin de tour, fin de tâche, changement de discussion ou
  de projet (full : après 3 s) ;
- le tour garde le préchauffage qu'il prolonge (empreintes des messages
  et des options de rendu) et coupe tout de suite les autres ;
- télémétrie kind=prewarm.

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-16 02:52:44 +00:00
1 parent f79b74dac3
commit ff5c6d4571
21 files changed
+1457 -35

No files matched your search

+9 -1
View File
@@ -70,6 +70,10 @@ func handleInternalOAIBegin(w http.ResponseWriter, r *http.Request) {
// MainConv : étape d'un tour de cette discussion, tenue par la façade
// (LOKI_CHAT=rust) — comptée comme la requête principale du Go.
MainConv string `json:"main_conv"`
// PrewarmKeep : étape d'un tour de la façade qui prolonge exactement
// le préchauffage en vol (PREWARM, facade_prewarm.go) — il n'est pas
// annulé, la requête le suit dans le même slot.
PrewarmKeep bool `json:"prewarm_keep"`
}
if r.Method != http.MethodPost || json.NewDecoder(r.Body).Decode(&in) != nil {
sendJSON(w, http.StatusBadRequest, map[string]any{"error": "POST JSON attendu"})
@@ -80,7 +84,11 @@ func handleInternalOAIBegin(w http.ResponseWriter, r *http.Request) {
if in.Read {
end, seq = engineRequestBeginSide(func(*prewarmRun) bool { return true }, true)
} else {
end, seq = engineRequestBeginSide(nil, in.Side)
var keep func(*prewarmRun) bool
if in.PrewarmKeep {
keep = func(*prewarmRun) bool { return true }
}
end, seq = engineRequestBeginSide(keep, in.Side)
}
if in.PostV1 {
refuse := func(retry, msg, code string) {