fix(ai): mode agent utilise les outils natifs au lieu du bloc obsigate-action (BUG-053)
CI / lint (push) Successful in 1m33s
CI / security (push) Successful in 1m0s
CI / test (push) Successful in 2m57s
CI / build (push) Successful in 56s
CI / e2e (push) Successful in 10m48s

This commit is contained in:
2026-09-17 07:30:31 -04:00
parent e3434d19ea
commit f02174af57
14 changed files with 122 additions and 19 deletions
+17 -3
View File
@@ -193,10 +193,12 @@ def _recent_files_for_prompt(current_user, limit: int = 10) -> list[dict[str, An
return []
def _resolve_system_prompt(req, current_user) -> str:
def _resolve_system_prompt(req, current_user, agent: bool = False) -> str:
"""Resolve the vault access and build the assistant system prompt.
Shared by the classic chat endpoint and the tool-calling agent endpoint.
``agent=True`` selects the native-tool action protocol (no text
``obsigate-action`` blocks) for the General/empty-directory prompts.
"""
mode = _normalize_mode(req.mode)
vault_path: Path | None = None
@@ -222,6 +224,7 @@ def _resolve_system_prompt(req, current_user) -> str:
list(index.keys()),
app_context=_submitted_app_context(req),
recent_files=_recent_files_for_prompt(current_user),
agent=agent,
)
elif effective_mode == "documents":
prompt = build_system_prompt(context, scope="documents", vault_name=req.vault)
@@ -233,6 +236,7 @@ def _resolve_system_prompt(req, current_user) -> str:
list(index.keys()),
app_context=_submitted_app_context(req),
recent_files=_recent_files_for_prompt(current_user),
agent=agent,
)
prompt += (
f"\n## Dossier vide\nLe dossier « {req.directory or '/'} » "
@@ -243,6 +247,14 @@ def _resolve_system_prompt(req, current_user) -> str:
else:
prompt = build_system_prompt(context, scope="directory", vault_name=req.vault)
if agent and effective_mode != "general" and context["file_count"] > 0:
prompt += (
"\n## Mode agent\n"
"Utilise les outils natifs (function calling) pour agir sur les fichiers "
"(`create_file`, `create_directory`, `append_to_file`, `edit_file`, …). "
"N'écris jamais de bloc ```obsigate-action```."
)
skill_id = getattr(req, "skill", None)
if skill_id:
skill_prompt = get_skill_prompt(skill_id, current_user)
@@ -499,7 +511,7 @@ async def api_bookslm_agent(
``confirm`` / ``confirm_messages``.
"""
_validate_vision_support(req)
system_prompt = _resolve_system_prompt(req, current_user)
system_prompt = _resolve_system_prompt(req, current_user, agent=True)
vault_path = _resolve_optional_vault_path(req, current_user)
messages: list[dict] = [{"role": "system", "content": system_prompt}]
@@ -519,7 +531,9 @@ async def api_bookslm_agent(
provider=req.provider,
model=req.model,
temperature=0.3,
max_tokens=4096,
# Tool-call arguments can carry a whole file body (e.g. a generated
# table): leave more room than the plain-chat default.
max_tokens=8192,
)
async def generate_sse():