agentscope-chat / src /agentscope /tool /_tool_group.py
Akshay66777's picture
AgentScope Gradio chat app — ZeroGPU-ready
9792ea7 verified
Raw
History Blame Contribute Delete
3.93 kB
# -*- coding: utf-8 -*-
"""The tool group class."""
from typing import Literal, Sequence
from ..mcp import MCPClient
from ._base import ToolBase
from ..skill import SkillLoaderBase, Skill, LocalSkillLoader
class ToolGroup:
"""A group of related tools, mcps, and skills that an agent can activate,
deactivate and use together. The tool group is activated by the meta tool
`ResetTools`.
In high-code scenarios, the tools argument accepts any child classes for
ToolBase class, and the tool groups supports serialization.
"""
name: Literal["basic"] | str
"""Note the "basic" group is special and represents the default tool group
that will be always be activated for the agent."""
description: str
"""A description of the tool group from an agent-oriented perspective,
outlining its capabilities and the conditions under which it should be
activated."""
instructions: str | None
"""Instructions included in the meta tool's result upon activation of
this tool group, guiding the agent on how to properly use the meta tool."""
tools: list[ToolBase]
"""The tools in this group."""
skills_or_loaders: list[Skill | SkillLoaderBase]
"""The skills in this group."""
mcps: list[MCPClient]
"""The mcps in this group."""
def __init__(
self,
name: Literal["basic"] | str,
description: str | None = None,
instructions: str | None = None,
tools: list[ToolBase] | None = None,
skills_or_loaders: Sequence[str | Skill | SkillLoaderBase]
| None = None,
mcps: list[MCPClient] | None = None,
) -> None:
"""Initialize the tool group.
Args:
name (`Literal["basic"] | str):
The name of the tool group.
description (`str | None`):
The description of the tool group.
instructions (`str | None`, optional):
Instructions included in the meta tool's result upon
activation of this tool group, guiding the agent on how to
properly use the meta tool.
tools (`list[ToolBase] | None`, optional):
The tools in this group.
skills_or_loaders (`list[str | Skill | SkillLoaderBase] | None`, \
optional):
The skill paths, data, and loaders to access skills in this
group.
mcps (`list[MCPClient] | None`, optional):
The mcps in this group.
"""
if name != "basic" and description is None:
raise ValueError(
f"The tool group description is required for tool group "
f"'{name}' (Only the 'basic' tool group can have an optional "
f"description).",
)
self.name = name
self.description = description or ""
self.instructions = instructions
self.tools = tools or []
self.mcps = mcps or []
# Skill
self.skills_or_loaders = []
for _ in skills_or_loaders or []:
if isinstance(_, str):
self.skills_or_loaders.append(LocalSkillLoader(directory=_))
elif isinstance(_, (Skill, SkillLoaderBase)):
self.skills_or_loaders.append(_)
else:
raise TypeError(
f"Invalid skill or loader: {_}. Must be a skill, "
f"skill loader, or directory path.",
)
async def list_skills(self) -> list[Skill]:
"""List all the skills in this tool group."""
skills = []
for skill_or_loader in self.skills_or_loaders:
if isinstance(skill_or_loader, Skill):
skills.append(skill_or_loader)
elif isinstance(skill_or_loader, SkillLoaderBase):
skills.extend(await skill_or_loader.list_skills())
return skills