Chat : compactage sans redite, file multi-appareils, bascule par identifiant

Repris d'AJEAN 0.17.4.

- Compactage : la dernière demande du torse n'est plus réinjectée quand la
  queue contient déjà un message utilisateur (le modèle répondait une
  seconde fois à une vieille question), ni quand le résumé a échoué (elle
  est déjà dans le torse dégraissé et réapparaissait après ses propres
  résultats d'outils).
- Le texte écrit avant un appel d'outil n'est plus rangé deux fois dans
  l'historique du modèle (message tool_calls ET réponse finale) : du
  contexte gaspillé à chaque tour d'outil.
- Deux appareils qui envoient en même temps : le second message part en
  file au lieu d'un 409. Une tâche planifiée garde le refus.
- Un raisonnement qui reprend après du texte de réponse ouvre une nouvelle
  bulle sous la réponse au lieu de remplir l'ancienne, repliée au-dessus.
- Bascule de preset par identifiant : le numéro seul visait un autre
  preset quand la liste avait bougé sur un autre appareil. Le numéro reste
  accepté.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5.5 committed 2026-10-02 23:21:18 +02:00
1 parent 7f8c5d360f
commit 199d7f1e99
10 files changed
+159 -14

No files matched your search

+11
View File
@@ -560,6 +560,17 @@ function handleDelta(d){
return; }
if(d.reasoning_content){
killTyping('reasoning');
// Raisonnement qui reprend APRÈS du texte de réponse (modèle qui repense en
// cours de réponse, reprise après coupure) : il allait dans l'ANCIENNE bulle,
// déjà repliée au-dessus de la réponse. On en ouvre une nouvelle sous la
// réponse : l'ordre affiché suit l'ordre reçu (AJEAN 0.17.4).
// Réponse encore vide (simple saut de ligne avant la réflexion) : on retire
// la bulle vide et le raisonnement continue dans la sienne.
if(T.contentEl){
if((T.fullContent||'').trim()){ settleBlocks(); T.reasonEl=null; }
else { smoothReset(); cancelRender(); T.contentEl.remove(); }
T.contentEl=null;
}
if(!T.reasonEl){ collapseAll(T.turnCollapsibles); T.reasonEl=addMsg('reasoning',''); if(REPLAYING||viewOn('fold-tools')) collapseInstant(T.reasonEl); T.fullReason=''; resetReasonStats(); T.turnCollapsibles.push(T.reasonEl); }
// d.replace : le serveur renvoie le bloc ENTIER alors qu'on en affichait déjà
// le début (voir decorateEvent/coalesceReplay côté serveur) → on repart de zéro