Restore load_skill + surface skill catalog in system prompt
Main's load_skill tool was deleted during the SDK migration along with the prompt-mutation pattern it relied on. Re-add the capability without the mutation: load_skill(skills=[...]) now returns the skill markdown bodies as a tool result, so the content lands in conversation history as in-context reference rather than as patched-in system prompt content. Same source of truth (load_skills + skill files), same validation (validate_requested_skills) as create_agent. Tool result format is plain markdown (## Skill: <name> headers joined with ---), not the <specialized_knowledge> XML wrapping used at agent-build time. The XML framing was deliberately reserved for prompt-level privileged context; tool-loaded skills are honestly labelled as just-fetched reference material. Close the discovery loop by surfacing the full skill catalog in the system prompt. Without it the model could only guess skill names — discovering them via validation errors on misses. Now every agent sees a categorised <available_skills> block right after the <specialized_knowledge> block with a short hint pointing at create_agent / load_skill. Skills module: factored _iter_user_skill_files() so get_all_skill_names (set, for validation) and get_available_skills (dict by category, for the prompt) share one source of truth on what counts as user-selectable. Internal categories (scan_modes, coordination) stay excluded from both. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
"""``load_skill`` — fetch skill reference material into the conversation."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from agents import RunContextWrapper, function_tool
|
||||
|
||||
from strix.skills import load_skills, validate_requested_skills
|
||||
|
||||
|
||||
@function_tool(timeout=10)
|
||||
async def load_skill(ctx: RunContextWrapper, skills: list[str]) -> str:
|
||||
"""Return the markdown body of one or more skills as reference material.
|
||||
|
||||
Use this when you need exact syntax / workflow / payload guidance
|
||||
right before acting on a technology that wasn't preloaded for your
|
||||
agent. The skill content lands inline as a tool result — no
|
||||
permanent prompt change, just in-conversation reference.
|
||||
|
||||
For permanent skill assignment, pass ``skills=[…]`` to
|
||||
``create_agent`` when spawning a specialist child instead.
|
||||
|
||||
Args:
|
||||
skills: List of skill names (e.g. ``["xss", "sql_injection"]``).
|
||||
Max 5. Names match the bare files under
|
||||
``strix/skills/<category>/<name>.md``.
|
||||
"""
|
||||
del ctx
|
||||
requested = list(skills or [])
|
||||
err = validate_requested_skills(requested)
|
||||
if err:
|
||||
return f"load_skill: {err}"
|
||||
contents = load_skills(requested)
|
||||
if not contents:
|
||||
return "load_skill: no content loaded for requested skills."
|
||||
sections = [f"## Skill: {name}\n\n{body}" for name, body in contents.items()]
|
||||
return "\n\n---\n\n".join(sections)
|
||||
Reference in New Issue
Block a user