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
class SkillToolArgsSchema(heaven_base.baseheaventool.ToolArgsSchema):
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.

class SkillTool(heaven_base.baseheaventool.BaseHeavenTool):
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

name = 'SkillTool'
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'>
is_async = True