抽象基类 + ToolCard 元数据,元类织入生命周期
工具是一个类:继承 Tool,用 ToolCard 声明元数据,实现 invoke 与 stream 两个抽象方法。关键在 _ToolMeta 这个元类——它在实例化时把 invoke/stream 包进 _lifecycle_invoke / _lifecycle_stream,于是权限检查、日志、异常处理这些横切关注点由框架统一织入,工具作者写不到也绕不过。另有 exposure.py 控制工具是否向模型暴露。
class Tool(metaclass=_ToolMeta):
"""tool class that defined the data types and content for LLM modules"""
def __init__(self, card: ToolCard):
...
@abstractmethod
async def invoke(self, inputs: Input, **kwargs) -> Output:
"""Execute the tool with provided inputs and return final result."""
@abstractmethod
async def stream(self, inputs: Input, **kwargs) -> AsyncIterator[Output]:
...
# _ToolMeta.__call__ 在实例化时把 invoke/stream 包进 _lifecycle_invoke /
# _lifecycle_stream(同文件 76-158 行),生命周期由框架织入而非工具自理。