Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions internal/ajean/backend_cloud.go
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,10 @@ func cloudEndpoint(cfg map[string]string) chatEndpoint {
// doLLM envoie la requête ; pour un GPU cloud, attend le réveil du conteneur
// (llama-server répond 503 « Loading model » tant que le modèle charge).
func doLLM(ctx context.Context, req *http.Request, body []byte, ep chatEndpoint) (*http.Response, error) {
// Vu par le pré-chauffage de prompt (llm_prewarm.go) : une génération occupe
// le moteur, il ne faut pas s'insérer devant elle.
llmInFlight.Add(1)
defer llmInFlight.Add(-1)
if !ep.Cloud {
return http.DefaultClient.Do(req)
}
Expand Down
8 changes: 8 additions & 0 deletions internal/ajean/chat_conversation.go
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,9 @@ func (c *Conversation) StartTurn(text string, files []attachInfo, caps Caps, tem
}
c.Generating = true
c.genStart = time.Now()
// Le message de l'utilisateur passe devant tout pré-chauffage interne : le
// tour va de toute façon traiter le préfixe et garder le cache KV.
cancelLLMPrewarmForTurn()
jeanReflectAbort() // le moteur est à l'utilisateur, la révision attendra
ctx, cancel := context.WithCancel(context.Background())
c.cancel = cancel
Expand Down Expand Up @@ -579,6 +582,10 @@ func (c *Conversation) StartTurn(text string, files []attachInfo, caps Caps, tem
if temperature == 0 {
temperature = 0.7
}
// Un tour utilisateur est en cours : le pré-chauffage s'efface, y compris
// pendant les trous entre deux appels d'outil (llmTurnsActive, voir
// llm_prewarm.go).
llmTurnsActive.Add(1)
go c.generate(ctx, caps, temperature, epoch)
return nil
}
Expand Down Expand Up @@ -685,6 +692,7 @@ func (c *Conversation) generate(ctx context.Context, caps Caps, temperature floa
// donc les vieux tours affichaient le preset du moment, pas celui qui a répondu).
turnPreset := activePresetName()
defer func() {
llmTurnsActive.Add(-1)
c.mu.Lock()
stale := c.epoch != epoch
// ⚠️ Un tour périmé ne touche PAS à l'état courant. Depuis que Reset
Expand Down
Loading
Loading