Files
Loki/internal/loki/facade_slots.go
T
Claude a005626e66 Lot 31 : slots du moteur pour le tour tenu par la façade
SIDE_SLOT et SLOT_PERSIST ne gardent plus la conversation au Go. La
machinerie reste au Go (configuration, requêtes en vol, tampon du slot) ;
la façade la consulte avant chaque requête au moteur local.

Go :
- /internal/v1/turn/slot (facade_slots.go) rend engineSlotFor et, pour
  une étape de tour, recharge d'abord l'état gardé de la discussion
  (slotPersistRestore). La sauvegarde à la bascule voit les étapes de la
  façade : /internal/v1/oai/served marque le slot (engineMarkMain).
- facadeChatBlocker : SIDE_SLOT et SLOT_PERSIST retirés.

Rust :
- TurnHost::engine_slot : l'id_slot posé dans chaque requête (0 pour le
  fil de la discussion, 1 pour la vérification), le ticket « en vol »
  ouvert sur le second slot.
- Cache KV plein en plein calcul (sideSlotPoolError) : rejoué deux fois
  tel quel, sans compaction, puis l'erreur.
- Résumés de compaction comptés en vol comme postSummary : transcription
  sur le second slot, continuation sur le slot 0.
- La passe de vérification est un travail annexe (engineSideJob) : le Go
  efface le slot à la fin s'il a servi (écart du lot 7 levé).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
2026-10-16 02:13:20 +00:00

40 lines
1.6 KiB
Go

package loki
import (
"net/http"
)
// facade_slots.go — les slots du moteur pour le tour tenu par la façade (lot 31
// de la migration). La machinerie reste ici, où vivent la configuration, le
// compteur des requêtes en vol et le tampon du slot de la discussion
// (llm_slots.go) ; la façade demande, avant chaque requête au moteur local,
// le slot où l'envoyer.
//
// - SIDE_SLOT (llm_sideslot.go) : le fil de la discussion sur le slot 0, le
// reste (vérification, résumé sur transcription) sur le 1, tant que le
// second slot est en service ; sinon aucun id_slot.
// - SLOT_PERSIST (llm_slotpersist.go) : l'état gardé à la dernière bascule de
// preset est rechargé avant la première requête de la discussion, si tout
// concorde. La sauvegarde, elle, se fait à la bascule (déjà ici) : le slot
// porte la discussion dès que le moteur a accepté une étape de son tour
// (/internal/v1/oai/served, engineMarkMain).
// handleInternalTurnSlot : POST {"conv":"…","main":true} → {"slot":0|1|-1}.
// main : requête du fil de la discussion (étape d'un tour, résumé en
// continuation) ; conv : la discussion d'une étape de tour, pour le
// rechargement SLOT_PERSIST — vide pour un résumé. -1 : aucun id_slot.
func handleInternalTurnSlot(w http.ResponseWriter, r *http.Request) {
var in struct {
Conv string `json:"conv"`
Main bool `json:"main"`
}
if !readInternalJSON(w, r, &in) {
return
}
ep := resolveChatEndpoint()
if in.Main && in.Conv != "" {
slotPersistRestore(ep, in.Conv)
}
sendJSON(w, http.StatusOK, map[string]any{"slot": engineSlotFor(ep, in.Main)})
}