fix(agent): v4.13.2 - saisie libre redaction avec doc ouvert -> proposition appliquer/rejeter (generate sans outils)
This commit is contained in:
@@ -1,5 +1,22 @@
|
||||
# Changelog — FlowDeck
|
||||
|
||||
## v4.13.2 (2026-09-06) — Saisie libre « écrire un texte » → proposition à appliquer au document
|
||||
|
||||
> Quand un **document est ouvert** et qu'on tape directement une demande de **rédaction/contenu**
|
||||
> dans le chat (« Écrire un texte sur… », « Rédige… », « Résume… », « Traduis… »), la requête est
|
||||
> maintenant routée vers la **génération de texte** (sans outils) et affichée comme **proposition
|
||||
> à appliquer ou rejeter** — au lieu d'un `search_workspace` puis d'un simple « Objectif traité ».
|
||||
> « Traduire » remplace le contenu de la page ; les autres demandes l'insèrent en fin de page.
|
||||
|
||||
### Fix
|
||||
- Envoi libre avec contexte document : détection d'intention de contenu (écrire/rédiger/générer/
|
||||
résumer/traduire/améliorer/note de réunion/texte sur/série…) → `POST /api/agent/generate` +
|
||||
aperçu « ✓ Appliquer au document / ✕ Rejeter ».
|
||||
- Mock : « écrire » (infinitif) reconnu comme verbe de rédaction.
|
||||
|
||||
### Infra
|
||||
- `VERSION` → 4.13.2 ; `app/main.py` version → 4.13.2.
|
||||
|
||||
## v4.13.1 (2026-09-06) — Corrections actions contenu Agent & aperçu à approuver
|
||||
|
||||
> Corrige les actions de contenu sur document (« Résumer », « Traduire cette page », « Proposer
|
||||
|
||||
+1
-1
@@ -60,7 +60,7 @@ async def lifespan(_app: FastAPI):
|
||||
|
||||
app = FastAPI(
|
||||
title="FlowDeck",
|
||||
version="4.13.1",
|
||||
version="4.13.2",
|
||||
docs_url="/docs" if settings.log_level == "DEBUG" else None,
|
||||
redoc_url=None,
|
||||
lifespan=lifespan,
|
||||
|
||||
@@ -381,7 +381,7 @@ class LLMClient:
|
||||
)
|
||||
|
||||
# ── Generic drafting verb, no title (typing directly in the chat) ──
|
||||
if re.search(r"^(r[ée]dige|[ée]cris|g[ée]n[èe]re|produis|d[ée]veloppe|"
|
||||
if re.search(r"^(r[ée]dige|[ée]cris|[ée]crire|g[ée]n[èe]re|produis|d[ée]veloppe|"
|
||||
r"[ée]cris\s+un|g[ée]n[èe]re\s+un|r[ée]dige\s+un)\b", low):
|
||||
return (
|
||||
"## Introduction\n"
|
||||
|
||||
@@ -424,6 +424,20 @@
|
||||
},
|
||||
|
||||
// ── Document actions (no tools) → proposition à approuver / rejeter ──
|
||||
_isContentRequest(t){
|
||||
var low = (t || '').toLowerCase();
|
||||
var kws = ['écris','écrire','écrit un','rédige','rédiger','génère','générer','produis',
|
||||
'développe','texte sur','paragraphe','article sur','rédaction','résume','résumer',
|
||||
'résumé de','traduis','traduire','améliore','améliorer','note de réunion',
|
||||
'série tv','série','contenu de la page','poème','histoire sur','sujet de','courriel','email sur'];
|
||||
for(var i=0;i<kws.length;i++){ if(low.indexOf(kws[i]) !== -1) return true; }
|
||||
return false;
|
||||
},
|
||||
_docModeFor(t){
|
||||
var low = (t || '').toLowerCase();
|
||||
if(low.indexOf('traduis') !== -1 || low.indexOf('traduire') !== -1 || low.indexOf('translate') !== -1) return 'replace';
|
||||
return 'insert';
|
||||
},
|
||||
runDocAction(q){
|
||||
var self = this;
|
||||
this.ensureConversation().then(function(){
|
||||
@@ -720,6 +734,15 @@
|
||||
self.input = '';
|
||||
this.resizeInput();
|
||||
self.errorMsg = '';
|
||||
|
||||
// A writing/content request typed while a document is open → route it to
|
||||
// headless text generation and offer the result with Apply / Reject,
|
||||
// instead of sending the agent into tool calls (search/create).
|
||||
if(self.activeContext && self.activeContext.kind === 'page' && self._isContentRequest(text)){
|
||||
self.refreshContext();
|
||||
return self.runDocAction({prompt: text, label: text, mode: self._docModeFor(text)});
|
||||
}
|
||||
|
||||
self.streaming = true;
|
||||
self.liveReasoning = '…';
|
||||
self.messages.push({id:'u-'+Date.now(), role:'user', content: text});
|
||||
|
||||
Reference in New Issue
Block a user