feat(tools): 增强工具注册表与内置工具能力
This commit is contained in:
@@ -1,40 +1,70 @@
|
||||
from collections.abc import Callable
|
||||
|
||||
from .tools.builtin_tools import BUILTIN_TOOLS
|
||||
|
||||
|
||||
def run_declared_tools(tool_names: list[str], user_input: str) -> list[dict]:
|
||||
results = []
|
||||
for tool_name in tool_names:
|
||||
tool = BUILTIN_TOOLS.get(tool_name)
|
||||
class ToolRegistry:
|
||||
"""
|
||||
统一管理工具注册、查询和执行。
|
||||
|
||||
设计目标:
|
||||
- 让 Orchestrator 只关心“声明了哪些工具”,不关心工具如何存放。
|
||||
- 固化统一的工具调用结果结构,便于页面展示和审计日志保存。
|
||||
- 后续新增业务工具时,只需要注册函数,不必改调用协议。
|
||||
"""
|
||||
|
||||
def __init__(self, initial_tools: dict[str, Callable] | None = None):
|
||||
self._tools: dict[str, Callable] = dict(initial_tools or {})
|
||||
|
||||
def register(self, tool_name: str, tool_func: Callable) -> None:
|
||||
"""注册一个可通过名称调用的工具函数。"""
|
||||
self._tools[tool_name] = tool_func
|
||||
|
||||
def get(self, tool_name: str) -> Callable | None:
|
||||
"""按名称返回工具函数;未注册时返回 None。"""
|
||||
return self._tools.get(tool_name)
|
||||
|
||||
def run(self, tool_name: str, **kwargs) -> dict:
|
||||
"""
|
||||
执行单个工具,并返回统一结果结构。
|
||||
|
||||
统一返回值是审计日志、页面展示和后续 Agent 编排共享的协议。
|
||||
即使工具不存在或执行失败,也返回可消费的失败结果,而不是抛异常。
|
||||
"""
|
||||
tool = self.get(tool_name)
|
||||
if tool is None:
|
||||
results.append(
|
||||
{
|
||||
"tool_name": tool_name,
|
||||
"success": False,
|
||||
"arguments": {"user_input": user_input},
|
||||
"result": {},
|
||||
"error": "工具未注册",
|
||||
}
|
||||
)
|
||||
continue
|
||||
return {
|
||||
"tool_name": tool_name,
|
||||
"success": False,
|
||||
"arguments": kwargs,
|
||||
"result": {},
|
||||
"error": "工具未注册",
|
||||
}
|
||||
try:
|
||||
result = tool(user_input=user_input)
|
||||
results.append(
|
||||
{
|
||||
"tool_name": tool_name,
|
||||
"success": True,
|
||||
"arguments": {"user_input": user_input},
|
||||
"result": result,
|
||||
"error": "",
|
||||
}
|
||||
)
|
||||
return {
|
||||
"tool_name": tool_name,
|
||||
"success": True,
|
||||
"arguments": kwargs,
|
||||
"result": tool(**kwargs),
|
||||
"error": "",
|
||||
}
|
||||
except Exception as exc:
|
||||
results.append(
|
||||
{
|
||||
"tool_name": tool_name,
|
||||
"success": False,
|
||||
"arguments": {"user_input": user_input},
|
||||
"result": {},
|
||||
"error": str(exc),
|
||||
}
|
||||
)
|
||||
return results
|
||||
return {
|
||||
"tool_name": tool_name,
|
||||
"success": False,
|
||||
"arguments": kwargs,
|
||||
"result": {},
|
||||
"error": str(exc),
|
||||
}
|
||||
|
||||
|
||||
# 默认注册表承载项目内置工具,便于当前 V1 直接复用。
|
||||
DEFAULT_TOOL_REGISTRY = ToolRegistry(BUILTIN_TOOLS)
|
||||
|
||||
|
||||
def run_declared_tools(tool_names: list[str], user_input: str) -> list[dict]:
|
||||
"""按场景声明顺序执行工具,保证结果顺序与配置顺序一致。"""
|
||||
return [
|
||||
DEFAULT_TOOL_REGISTRY.run(tool_name, user_input=user_input)
|
||||
for tool_name in tool_names
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user