Shortcuts

Source code for agentlego.apis.tool

import importlib
import inspect
from typing import Optional, Union

import agentlego.tools
from agentlego.tools import BaseTool
from agentlego.tools.func import _FuncToolType
from agentlego.utils.cache import load_or_build_object

NAMES2TOOLS = {}


def extract_all_tools(module):
    if isinstance(module, str):
        module = importlib.import_module(module)

    tools = {}
    for k, v in module.__dict__.items():
        if (isinstance(v, type) and issubclass(v, BaseTool) and (v is not BaseTool)):
            tools[k] = v
        elif isinstance(v, _FuncToolType):
            tools[k] = v
    return tools


def register_all_tools(module):
    NAMES2TOOLS.update(extract_all_tools(module))


register_all_tools(agentlego.tools)


[docs]def list_tools(with_description=False): """List all the registered tools. Args: with_description (bool): Whether to return the description of tools. Defaults to False. Returns: list: list of tool names by default, or list of tuples `(tool_name, description)` if ``with_description=True``. Examples: >>> from agentlego import list_tools >>> # list all tools with description >>> for name, description in list_tools(with_description=True): ... print(name, description) """ if with_description: return list((name, cls.get_default_toolmeta().description) for name, cls in NAMES2TOOLS.items()) else: return list(NAMES2TOOLS.keys())
[docs]def load_tool(tool_type: str, name: Optional[str] = None, description: Optional[str] = None, device=None, **kwargs) -> BaseTool: """Load a configurable callable tool for different task. Args: tool_name (str): tool name for specific task. You can find more description about supported tools by :func:`~agentlego.apis.list_tools`. name (str | None): The name to override the default name. Defaults to None. description (str): The description to override the default description. Defaults to None. device (str): The device to load the tool. Defaults to None. **kwargs: key-word arguments to build the specific tools. These arguments are related ``tool``. You can find the arguments of the specific tool type according to the given tool in the documentations of the tools. Returns: BaseTool: The constructed tool. Examples: >>> from agentlego import load_tool >>> # load tool with tool name >>> tool, meta = load_tool('GoogleSearch', with_url=True) """ if tool_type not in NAMES2TOOLS: # Using ValueError to show error msg cross lines. raise ValueError(f'{tool_type} is not supported now, the available ' 'tools are:\n' + '\n'.join(NAMES2TOOLS.keys())) constructor: Union[type, _FuncToolType] = NAMES2TOOLS[tool_type] if 'device' in inspect.getfullargspec(constructor).args: kwargs['device'] = device if name or description or isinstance(constructor, _FuncToolType): tool_obj = constructor(**kwargs) if name: tool_obj.name = name if description: tool_obj.description = description else: # Only enable cache if no overrode attribution # to avoid the cached tool is changed. tool_obj = load_or_build_object(constructor, **kwargs) return tool_obj