|
|
""" |
|
|
Skill Tool - Tool for Agent to load Skills on-demand |
|
|
|
|
|
Implements Progressive Disclosure (Level 2): Load full skill content when needed |
|
|
""" |
|
|
|
|
|
from typing import Any, Dict, List, Optional |
|
|
|
|
|
from .base import Tool, ToolResult |
|
|
from .skill_loader import SkillLoader |
|
|
|
|
|
|
|
|
class GetSkillTool(Tool): |
|
|
"""Tool to get detailed information about a specific skill""" |
|
|
|
|
|
def __init__(self, skill_loader: SkillLoader): |
|
|
self.skill_loader = skill_loader |
|
|
|
|
|
@property |
|
|
def name(self) -> str: |
|
|
return "get_skill" |
|
|
|
|
|
@property |
|
|
def description(self) -> str: |
|
|
return "Get complete content and guidance for a specified skill, used for executing specific types of tasks" |
|
|
|
|
|
@property |
|
|
def parameters(self) -> Dict[str, Any]: |
|
|
return { |
|
|
"type": "object", |
|
|
"properties": { |
|
|
"skill_name": { |
|
|
"type": "string", |
|
|
"description": "Name of the skill to retrieve (use list_skills to view available skills)", |
|
|
} |
|
|
}, |
|
|
"required": ["skill_name"], |
|
|
} |
|
|
|
|
|
async def execute(self, skill_name: str) -> ToolResult: |
|
|
"""Get detailed information about specified skill""" |
|
|
skill = self.skill_loader.get_skill(skill_name) |
|
|
|
|
|
if not skill: |
|
|
available = ", ".join(self.skill_loader.list_skills()) |
|
|
return ToolResult( |
|
|
success=False, |
|
|
content="", |
|
|
error=f"Skill '{skill_name}' does not exist. Available skills: {available}", |
|
|
) |
|
|
|
|
|
|
|
|
result = skill.to_prompt() |
|
|
return ToolResult(success=True, content=result) |
|
|
|
|
|
|
|
|
def create_skill_tools( |
|
|
skills_dir: str = "./skills", |
|
|
) -> tuple[List[Tool], Optional[SkillLoader]]: |
|
|
""" |
|
|
Create skill tool for Progressive Disclosure |
|
|
|
|
|
Only provides get_skill tool - the agent uses metadata in system prompt |
|
|
to know what skills are available, then loads them on-demand. |
|
|
|
|
|
Args: |
|
|
skills_dir: Skills directory path |
|
|
|
|
|
Returns: |
|
|
Tuple of (list of tools, skill loader) |
|
|
""" |
|
|
|
|
|
loader = SkillLoader(skills_dir) |
|
|
|
|
|
|
|
|
skills = loader.discover_skills() |
|
|
print(f"✅ Discovered {len(skills)} Claude Skills") |
|
|
|
|
|
|
|
|
tools = [ |
|
|
GetSkillTool(loader), |
|
|
] |
|
|
|
|
|
return tools, loader |
|
|
|