工具与 ToolManager

Tools 模块提供了抽象工具接口和中央工具分发器(ToolManager),用于 Agentic 多轮 rollout。工具遵循 OpenAI function-calling schema,与 LLM 工具调用能力无缝集成。

Tool 基类

from abc import ABC, abstractmethod
from twinkle.data_format import Tool as ToolInfo

class Tool(ABC):

    @abstractmethod
    def __call__(self, tool_name: str, arguments: Dict[str, Any]) -> str:
        """执行工具并返回字符串结果。"""
        raise NotImplementedError

    @abstractmethod
    def tool_info(self) -> ToolInfo:
        """返回 OpenAI 兼容的工具 schema。"""
        raise NotImplementedError

实现自定义工具

from twinkle_agentic.tools.base import Tool

class SearchTool(Tool):

    def __call__(self, tool_name: str, arguments: dict) -> str:
        query = arguments.get('query', '')
        # 执行搜索逻辑
        return f'搜索结果:{query}'

    def tool_info(self):
        return {
            'type': 'function',
            'function': {
                'name': 'search',
                'description': '搜索网络信息。',
                'parameters': {
                    'type': 'object',
                    'properties': {
                        'query': {
                            'type': 'string',
                            'description': '搜索查询。',
                        },
                    },
                    'required': ['query'],
                },
            },
        }

ToolManager

ToolManager 是工具的注册中心和分发器。它解析 LLM 结构化输出中的工具调用,并路由到正确的工具实现。

from twinkle_agentic.tools.tool_manager import ToolManager

# 通过 Tool 实例列表初始化
manager = ToolManager([search_tool, calculator_tool])

# 或通过字典初始化
manager = ToolManager({'search': search_tool, 'calc': calculator_tool})

# 或动态注册
manager = ToolManager()
manager.register(search_tool)
manager.register(calculator_tool)

核心方法

方法 说明
register(tool) 注册工具(名称从 tool_info() 提取)。
unregister(name) 按名称移除工具。
names() 列出所有已注册的工具名称。
copy() 创建管理器的浅拷贝。
tool_infos() 返回所有工具 schema 列表(用于 API 请求)。
__call__(tool_call) 分发工具调用并返回结果字符串。

分发工具调用

ToolManager 接受 OpenAI 格式的工具调用字典:

tool_call = {
    'id': 'call_1',
    'type': 'function',
    'function': {
        'name': 'search',
        'arguments': '{"query": "Python 教程"}',
    },
}

result = manager(tool_call)
# result: '搜索结果:Python 教程'

错误处理: 如果工具名未知、参数是无效 JSON 或工具抛出异常,ToolManager 返回描述性错误字符串而不是抛出异常——这保证了 rollout 循环的持续运行。

与 Rollout 集成

from twinkle_agentic.rollout.multi_turn import MultiTurnRollout

rollout = MultiTurnRollout(
    sampler=sampler,
    template=template,
    tool_manager=manager,  # 传入工具管理器
    max_turns=6,
)

Rollout 引擎对模型生成的每个工具调用执行 manager(tool_call),并将结果作为 {'role': 'tool', 'content': result} 消息追加。