Skip to content

Tool registry

ToolRegistry

Registry for tools that can be used by AI agents.

This registry converts tools defined in the Pydantic model into callables that can be used by AI agents.

Source code in light_agents/tool_registry.py
 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
class ToolRegistry:
    """Registry for tools that can be used by AI agents.

    This registry converts tools defined in the Pydantic model into
    callables that can be used by AI agents.
    """

    def __init__(self) -> None:
        """Initialize the ToolRegistry class."""
        self.tools: Dict[str, Callable[..., ToolResponseSchema]] = {}

    def register(self, tool: ToolBaseSchema) -> None:
        """Register a tool using its name and run method."""
        self.tools[tool.name] = tool.run

    def register_tools(self, tools: List[ToolBaseSchema]) -> None:
        """Register a list of tools."""
        for tool in tools:
            self.register(tool)

    def execute_tool(
        self, tool_name: str, args: Dict[str, Any], **kwargs: Any
    ) -> ToolResponseSchema:
        """Execute a tool with arguments given inside a dict.

        If any kwargs are given and they overlap with args, the args will be
        updated with the kwargs.
        """
        if tool_name not in self.tools:
            # To prevent error, tells the LLM that the tool wasn't available
            return ToolResponseSchema(
                content="<INTERNAL> This tool was not available </INTERNAL>",
                is_error=True,
            )

        tool = self.tools[tool_name]
        args.update(kwargs)

        if kwargs.get("verbose"):
            logger.debug(f"Executing tool '{tool_name}' with args: {args}")

        try:
            result = tool(**args)

            if not isinstance(result, ToolResponseSchema):
                raise ValueError(
                    f"Tool '{tool_name}' should return a ToolResponseSchema"
                )

            return result
        except Exception as e:
            logger.error(f"Error executing tool '{tool_name}': {e}")
            raise ValueError(f"Error executing tool '{tool_name}': {e}")

__init__()

Initialize the ToolRegistry class.

Source code in light_agents/tool_registry.py
16
17
18
def __init__(self) -> None:
    """Initialize the ToolRegistry class."""
    self.tools: Dict[str, Callable[..., ToolResponseSchema]] = {}

execute_tool(tool_name, args, **kwargs)

Execute a tool with arguments given inside a dict.

If any kwargs are given and they overlap with args, the args will be updated with the kwargs.

Source code in light_agents/tool_registry.py
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
def execute_tool(
    self, tool_name: str, args: Dict[str, Any], **kwargs: Any
) -> ToolResponseSchema:
    """Execute a tool with arguments given inside a dict.

    If any kwargs are given and they overlap with args, the args will be
    updated with the kwargs.
    """
    if tool_name not in self.tools:
        # To prevent error, tells the LLM that the tool wasn't available
        return ToolResponseSchema(
            content="<INTERNAL> This tool was not available </INTERNAL>",
            is_error=True,
        )

    tool = self.tools[tool_name]
    args.update(kwargs)

    if kwargs.get("verbose"):
        logger.debug(f"Executing tool '{tool_name}' with args: {args}")

    try:
        result = tool(**args)

        if not isinstance(result, ToolResponseSchema):
            raise ValueError(
                f"Tool '{tool_name}' should return a ToolResponseSchema"
            )

        return result
    except Exception as e:
        logger.error(f"Error executing tool '{tool_name}': {e}")
        raise ValueError(f"Error executing tool '{tool_name}': {e}")

register(tool)

Register a tool using its name and run method.

Source code in light_agents/tool_registry.py
20
21
22
def register(self, tool: ToolBaseSchema) -> None:
    """Register a tool using its name and run method."""
    self.tools[tool.name] = tool.run

register_tools(tools)

Register a list of tools.

Source code in light_agents/tool_registry.py
24
25
26
27
def register_tools(self, tools: List[ToolBaseSchema]) -> None:
    """Register a list of tools."""
    for tool in tools:
        self.register(tool)