feat(ai): section Fournisseur & modele compacte + correctifs menus @/ (#82, BUG-007, BUG-008)
CI / lint (push) Successful in 1m13s
CI / security (push) Successful in 43s
CI / test (push) Successful in 2m33s
CI / build (push) Successful in 39s
CI / e2e (push) Successful in 10m32s

Refonte de la section Fournisseur & modele de l'assistant : capacites regroupees dans une bulle d'information (survol/clic/appui long) au lieu d'une liste permanente, et liste de modeles avec recherche. Correctifs : detection Unicode + filtrage insensible aux accents des commandes / et mentions @, navigation clavier fiable, et prise en compte du contexte ad-hoc en mode General cote backend.
This commit is contained in:
2026-09-12 12:40:03 -04:00
parent f049e208b6
commit d6b7c0e9cb
14 changed files with 643 additions and 93 deletions
+50
View File
@@ -747,6 +747,56 @@ class TestBooksLMChatModes:
assert resp.status_code in (200, 500), f"unexpected {resp.status_code}: {resp.text[:200]}"
assert resp.status_code != 422
def test_general_chat_includes_adhoc_files(self, bookslm_client, monkeypatch):
"""`@` ad-hoc files must be read even in General mode (BUG-008)."""
import backend.bookslm_routes as routes
captured = {}
async def fake_stream(messages, **kwargs):
captured["messages"] = messages
yield "ok"
monkeypatch.setattr(routes, "stream_completion", fake_stream)
monkeypatch.setattr(routes, "_resolve_provider_name", lambda requested: "deepseek")
token, _ = _login_bookslm(bookslm_client)
resp = bookslm_client.post(
"/api/ai/bookslm/chat",
json={
"mode": "general",
"vault": "TestVault",
"extra_files": ["notes/note1.md"],
"message": "Résume",
},
headers={"Authorization": f"Bearer {token}"},
)
assert resp.status_code == 200, resp.text[:200]
system_prompt = captured["messages"][0]["content"]
assert "First note content" in system_prompt, "ad-hoc file content missing from prompt"
def test_general_chat_without_adhoc_ignores_vault(self, bookslm_client, monkeypatch):
"""General mode without ad-hoc context stays vault-independent."""
import backend.bookslm_routes as routes
captured = {}
async def fake_stream(messages, **kwargs):
captured["messages"] = messages
yield "ok"
monkeypatch.setattr(routes, "stream_completion", fake_stream)
monkeypatch.setattr(routes, "_resolve_provider_name", lambda requested: "deepseek")
token, _ = _login_bookslm(bookslm_client)
resp = bookslm_client.post(
"/api/ai/bookslm/chat",
json={"mode": "general", "vault": "UnknownVault", "message": "Bonjour"},
headers={"Authorization": f"Bearer {token}"},
)
assert resp.status_code == 200, resp.text[:200]
assert captured["messages"][0]["content"]
# ── Tool-calling agent endpoint ───────────────────────────────────────