File size: 2,446 Bytes
dc893fb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
"""
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}",
)
# Return complete skill content
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)
"""
# Create skill loader
loader = SkillLoader(skills_dir)
# Discover and load skills
skills = loader.discover_skills()
print(f"✅ Discovered {len(skills)} Claude Skills")
# Create only the get_skill tool (Progressive Disclosure Level 2)
tools = [
GetSkillTool(loader),
]
return tools, loader
|