feat(agent): v4.15.2 - skills multi-epingles en bulles + chips de contexte cliquables
FlowDeck CI / test (push) Failing after 11s
FlowDeck CI / docker (push) Skipped

- Les skills (menu /, integres et enregistres) s'epinglent comme des bulles dans le composer, au meme titre que les mentions @; plusieurs peuvent coexister sur un meme post
- L'API /run accepte skill_ids (tableau) et l'engine injecte tous leurs prompts dans le system prompt (skill_id conserve pour retro-compat)
- Clic sur une bulle de contexte (@ document/page/base) ouvre l'element comme document courant (/pages/<id> ou /db/<id>); le bouton x retire sans ouvrir
- Envoi possible avec des skills seuls sans texte
- test_engine_multiple_skills_applied
This commit is contained in:
2026-09-06 13:27:38 -04:00
parent 113f880863
commit 917a04d543
7 changed files with 119 additions and 19 deletions
+32
View File
@@ -399,6 +399,38 @@ def test_engine_tool_protocol_messages(client):
assert payload["status"] == "ok"
def test_engine_multiple_skills_applied(client):
"""Plusieurs skills (skill_ids) sont injectés ensemble dans les instructions."""
from app.services.agent_engine import AgentEngine
from app.db import get_conn
with get_conn() as conn:
c1 = conn.execute(
"INSERT INTO agent_skills (workspace_id, name, description, prompt_template, allowed_tools_json, created_by) "
"VALUES (NULL, 'Skill A', '', 'Template A', '[]', ?)", (_admin_id(),))
c2 = conn.execute(
"INSERT INTO agent_skills (workspace_id, name, description, prompt_template, allowed_tools_json, created_by) "
"VALUES (NULL, 'Skill B', '', 'Template B', '[]', ?)", (_admin_id(),))
conn.commit()
id1, id2 = c1.lastrowid, c2.lastrowid
class FakeLLM:
def __init__(self):
self.system = ""
async def complete(self, messages, *, model=None, tools=None, stream=False):
self.system = next((m["content"] for m in messages if m["role"] == "system"), "")
return _Resp("ok", [])
fake = FakeLLM()
engine = AgentEngine(_admin_id(), llm=fake)
conv = client.post("/api/agent/conversations", json={"title": "multi-skill"}).json()["id"]
asyncio.run(_run_engine(engine, conv, "bonjour", skill_ids=[id1, id2]))
assert "Skill A" in fake.system and "Template A" in fake.system
assert "Skill B" in fake.system and "Template B" in fake.system
def _make_conversation(client) -> int:
resp = client.post("/api/agent/conversations", json={"title": "test"})
return resp.json()["id"]