fix(agent): v4.13.1 - actions contenu document (resume/traduire/ameliorer/meeting) sans outils, apercu + appliquer/rejeter, mock ignore contexte
FlowDeck CI / test (push) Failing after 14s
FlowDeck CI / docker (push) Skipped

This commit is contained in:
2026-09-06 01:14:52 -04:00
parent 0b63ed17bc
commit 75b7f29826
8 changed files with 291 additions and 18 deletions
+56
View File
@@ -310,6 +310,62 @@ async def run_conversation(request: Request, conversation_id: int):
)
@router.post("/generate")
async def agent_generate(request: Request):
"""Headless text generation (NO tools) for content actions on documents.
Used by the Agent panel's contextual actions ("Résumer ce document",
"Traduire cette page", "Proposer des améliorations", "AI meeting note").
Because no tool schema is offered, the model answers with plain text based on
the provided document context instead of issuing search_workspace / tools.
"""
user_id = await _current_user_id(request)
body = await request.json() if request.headers.get("content-type") else {}
prompt = (body.get("prompt") or "").strip()
if not prompt:
raise HTTPException(status_code=400, detail="prompt est requis")
provider = (body.get("provider") or "").strip().lower() or None
model = (body.get("model") or "").strip() or None
context = (body.get("context") or "") or ""
llm = LLMClient()
if provider:
if provider not in PROVIDERS:
raise HTTPException(status_code=400, detail=f"Provider inconnu: {provider}")
user_key = get_user_llm_key(user_id, provider)
if user_key and user_key.get("api_key"):
llm = LLMClient(provider=provider, api_key=user_key["api_key"],
api_base=(user_key.get("api_base") or "").strip() or None)
else:
llm = LLMClient(provider=provider)
offline = llm.provider == "offline" or not llm._has_credentials()
system = (
"Tu es l'assistant d'édition de FlowDeck (contenu). "
"Réponds UNIQUEMENT avec le texte demandé, en Markdown léger "
"(paragraphes, listes à puces, titres si utile). "
"N'ajoute aucun préambule, aucun commentaire, aucun bloc de code autour du texte. "
"Fonde ta réponse sur le contexte du document fourni."
)
user_content = prompt
if context and context.strip():
user_content += "\n\n# Contexte du document\n" + context.strip()[:20000]
messages = [
{"role": "system", "content": system},
{"role": "user", "content": user_content},
]
try:
resp = await llm.complete(messages, model=model or None, tools=None, stream=False)
except Exception as exc: # noqa: BLE001 — surface connectivity errors
return {"ok": False, "error": str(exc), "offline": offline, "model": model or ""}
return {
"ok": True,
"text": (resp.text or "").strip(),
"model": resp.model or model or "",
"offline": offline,
}
# ── Audit & rollback ──