heaven_base.tools.skill_tool
SkillTool — gives any Heaven agent access to the skill system.
Actions: list, equip, get, get_equipped, search, list_personas, equip_persona
1"""SkillTool — gives any Heaven agent access to the skill system. 2 3Actions: list, equip, get, get_equipped, search, list_personas, equip_persona 4""" 5from typing import Any, Dict, Optional, Type 6 7from langchain.tools import Tool, BaseTool 8 9from ..baseheaventool import BaseHeavenTool, ToolResult, ToolError, ToolArgsSchema 10 11 12class SkillToolArgsSchema(ToolArgsSchema): 13 arguments: Dict[str, Dict[str, Any]] = { 14 'action': { 15 'name': 'action', 16 'type': 'str', 17 'description': ( 18 'The skill action to perform. One of: ' 19 'list, equip, get, get_equipped, search, ' 20 'list_personas, equip_persona, list_skillsets, equip_skillset' 21 ), 22 'required': True, 23 }, 24 'name': { 25 'name': 'name', 26 'type': 'str', 27 'description': 'Skill/persona/skillset name (required for equip, get, equip_persona, equip_skillset)', 28 'required': False, 29 }, 30 'query': { 31 'name': 'query', 32 'type': 'str', 33 'description': 'Search query (required for search action)', 34 'required': False, 35 }, 36 } 37 38 39async def skill_tool_func( 40 action: str, 41 name: Optional[str] = None, 42 query: Optional[str] = None, 43) -> str: 44 """Execute a skill manager action.""" 45 try: 46 from skill_manager.treeshell_functions import ( 47 list_skills, 48 get_skill, 49 equip, 50 get_equipped_content, 51 search_skills, 52 list_skillsets, 53 list_personas, 54 equip_persona, 55 ) 56 except ImportError: 57 raise ToolError("skill_manager package not installed") 58 59 action = action.strip().lower() 60 61 if action == "list": 62 return list_skills() 63 64 elif action == "equip": 65 if not name: 66 raise ToolError("'name' is required for equip action") 67 return equip(name) 68 69 elif action == "get": 70 if not name: 71 raise ToolError("'name' is required for get action") 72 return get_skill(name) 73 74 elif action == "get_equipped": 75 return get_equipped_content() 76 77 elif action == "search": 78 if not query: 79 raise ToolError("'query' is required for search action") 80 return search_skills(query) 81 82 elif action == "list_personas": 83 return list_personas() 84 85 elif action == "equip_persona": 86 if not name: 87 raise ToolError("'name' is required for equip_persona action") 88 return equip_persona(name) 89 90 elif action == "list_skillsets": 91 return list_skillsets() 92 93 elif action == "equip_skillset": 94 if not name: 95 raise ToolError("'name' is required for equip_skillset action") 96 from skill_manager.treeshell_functions import create_skillset 97 # equip_skillset not exposed directly, use equip on the skillset 98 return equip(name) 99 100 else: 101 raise ToolError( 102 f"Unknown action '{action}'. Valid: list, equip, get, get_equipped, " 103 f"search, list_personas, equip_persona, list_skillsets, equip_skillset" 104 ) 105 106 107class SkillTool(BaseHeavenTool): 108 name = "SkillTool" 109 description = ( 110 "Manage skills — list, equip, get, search skills/personas/skillsets. " 111 "Skills provide domain knowledge and workflow templates." 112 ) 113 func = skill_tool_func 114 args_schema = SkillToolArgsSchema 115 is_async = True
13class SkillToolArgsSchema(ToolArgsSchema): 14 arguments: Dict[str, Dict[str, Any]] = { 15 'action': { 16 'name': 'action', 17 'type': 'str', 18 'description': ( 19 'The skill action to perform. One of: ' 20 'list, equip, get, get_equipped, search, ' 21 'list_personas, equip_persona, list_skillsets, equip_skillset' 22 ), 23 'required': True, 24 }, 25 'name': { 26 'name': 'name', 27 'type': 'str', 28 'description': 'Skill/persona/skillset name (required for equip, get, equip_persona, equip_skillset)', 29 'required': False, 30 }, 31 'query': { 32 'name': 'query', 33 'type': 'str', 34 'description': 'Search query (required for search action)', 35 'required': False, 36 }, 37 }
Meta-validator for tool arguments ensuring LangChain compatibility
arguments: Dict[str, Dict[str, Any]] =
{'action': {'name': 'action', 'type': 'str', 'description': 'The skill action to perform. One of: list, equip, get, get_equipped, search, list_personas, equip_persona, list_skillsets, equip_skillset', 'required': True}, 'name': {'name': 'name', 'type': 'str', 'description': 'Skill/persona/skillset name (required for equip, get, equip_persona, equip_skillset)', 'required': False}, 'query': {'name': 'query', 'type': 'str', 'description': 'Search query (required for search action)', 'required': False}}
async def
skill_tool_func( action: str, name: Optional[str] = None, query: Optional[str] = None) -> str:
40async def skill_tool_func( 41 action: str, 42 name: Optional[str] = None, 43 query: Optional[str] = None, 44) -> str: 45 """Execute a skill manager action.""" 46 try: 47 from skill_manager.treeshell_functions import ( 48 list_skills, 49 get_skill, 50 equip, 51 get_equipped_content, 52 search_skills, 53 list_skillsets, 54 list_personas, 55 equip_persona, 56 ) 57 except ImportError: 58 raise ToolError("skill_manager package not installed") 59 60 action = action.strip().lower() 61 62 if action == "list": 63 return list_skills() 64 65 elif action == "equip": 66 if not name: 67 raise ToolError("'name' is required for equip action") 68 return equip(name) 69 70 elif action == "get": 71 if not name: 72 raise ToolError("'name' is required for get action") 73 return get_skill(name) 74 75 elif action == "get_equipped": 76 return get_equipped_content() 77 78 elif action == "search": 79 if not query: 80 raise ToolError("'query' is required for search action") 81 return search_skills(query) 82 83 elif action == "list_personas": 84 return list_personas() 85 86 elif action == "equip_persona": 87 if not name: 88 raise ToolError("'name' is required for equip_persona action") 89 return equip_persona(name) 90 91 elif action == "list_skillsets": 92 return list_skillsets() 93 94 elif action == "equip_skillset": 95 if not name: 96 raise ToolError("'name' is required for equip_skillset action") 97 from skill_manager.treeshell_functions import create_skillset 98 # equip_skillset not exposed directly, use equip on the skillset 99 return equip(name) 100 101 else: 102 raise ToolError( 103 f"Unknown action '{action}'. Valid: list, equip, get, get_equipped, " 104 f"search, list_personas, equip_persona, list_skillsets, equip_skillset" 105 )
Execute a skill manager action.
108class SkillTool(BaseHeavenTool): 109 name = "SkillTool" 110 description = ( 111 "Manage skills — list, equip, get, search skills/personas/skillsets. " 112 "Skills provide domain knowledge and workflow templates." 113 ) 114 func = skill_tool_func 115 args_schema = SkillToolArgsSchema 116 is_async = True
Provider-agnostic tool base class with standardized results
description =
'Manage skills — list, equip, get, search skills/personas/skillsets. Skills provide domain knowledge and workflow templates.'
async def
func( action: str, name: Optional[str] = None, query: Optional[str] = None) -> str:
40async def skill_tool_func( 41 action: str, 42 name: Optional[str] = None, 43 query: Optional[str] = None, 44) -> str: 45 """Execute a skill manager action.""" 46 try: 47 from skill_manager.treeshell_functions import ( 48 list_skills, 49 get_skill, 50 equip, 51 get_equipped_content, 52 search_skills, 53 list_skillsets, 54 list_personas, 55 equip_persona, 56 ) 57 except ImportError: 58 raise ToolError("skill_manager package not installed") 59 60 action = action.strip().lower() 61 62 if action == "list": 63 return list_skills() 64 65 elif action == "equip": 66 if not name: 67 raise ToolError("'name' is required for equip action") 68 return equip(name) 69 70 elif action == "get": 71 if not name: 72 raise ToolError("'name' is required for get action") 73 return get_skill(name) 74 75 elif action == "get_equipped": 76 return get_equipped_content() 77 78 elif action == "search": 79 if not query: 80 raise ToolError("'query' is required for search action") 81 return search_skills(query) 82 83 elif action == "list_personas": 84 return list_personas() 85 86 elif action == "equip_persona": 87 if not name: 88 raise ToolError("'name' is required for equip_persona action") 89 return equip_persona(name) 90 91 elif action == "list_skillsets": 92 return list_skillsets() 93 94 elif action == "equip_skillset": 95 if not name: 96 raise ToolError("'name' is required for equip_skillset action") 97 from skill_manager.treeshell_functions import create_skillset 98 # equip_skillset not exposed directly, use equip on the skillset 99 return equip(name) 100 101 else: 102 raise ToolError( 103 f"Unknown action '{action}'. Valid: list, equip, get, get_equipped, " 104 f"search, list_personas, equip_persona, list_skillsets, equip_skillset" 105 )
Execute a skill manager action.
args_schema =
<class 'SkillToolArgsSchema'>