"""统一工具管理器"""
|
|
from typing import Dict, List, Optional, Any
|
from config.logger import setup_logging
|
from plugins_func.register import Action, ActionResponse
|
from .base import ToolType, ToolDefinition, ToolExecutor
|
|
|
class ToolManager:
|
"""统一工具管理器,管理所有类型的工具"""
|
|
def __init__(self, conn):
|
self.conn = conn
|
self.logger = setup_logging()
|
self.executors: Dict[ToolType, ToolExecutor] = {}
|
self._cached_tools: Optional[Dict[str, ToolDefinition]] = None
|
self._cached_function_descriptions: Optional[List[Dict[str, Any]]] = None
|
|
def register_executor(self, tool_type: ToolType, executor: ToolExecutor):
|
"""注册工具执行器"""
|
self.executors[tool_type] = executor
|
self._invalidate_cache()
|
self.logger.debug(f"注册工具执行器: {tool_type.value}")
|
|
def _invalidate_cache(self):
|
"""使缓存失效"""
|
self._cached_tools = None
|
self._cached_function_descriptions = None
|
|
def get_all_tools(self) -> Dict[str, ToolDefinition]:
|
"""获取所有工具定义"""
|
if self._cached_tools is not None:
|
return self._cached_tools
|
|
all_tools = {}
|
for tool_type, executor in self.executors.items():
|
try:
|
tools = executor.get_tools()
|
for name, definition in tools.items():
|
if name in all_tools:
|
self.logger.warning(f"工具名称冲突: {name}")
|
all_tools[name] = definition
|
except Exception as e:
|
self.logger.error(f"获取{tool_type.value}工具时出错: {e}")
|
|
try:
|
from core.app_runtime.runtime import filter_tools
|
|
all_tools = filter_tools(self.conn, all_tools)
|
except Exception as e:
|
self.logger.error(f"按 App 过滤工具失败: {e}")
|
|
self._cached_tools = all_tools
|
return all_tools
|
|
def get_function_descriptions(self) -> List[Dict[str, Any]]:
|
"""获取所有工具的函数描述(OpenAI格式)"""
|
if self._cached_function_descriptions is not None:
|
return self._cached_function_descriptions
|
|
descriptions = []
|
tools = self.get_all_tools()
|
for tool_definition in tools.values():
|
descriptions.append(tool_definition.description)
|
|
self._cached_function_descriptions = descriptions
|
return descriptions
|
|
def has_tool(self, tool_name: str) -> bool:
|
"""检查是否存在指定工具"""
|
tools = self.get_all_tools()
|
return tool_name in tools
|
|
def get_tool_type(self, tool_name: str) -> Optional[ToolType]:
|
"""获取工具类型"""
|
tools = self.get_all_tools()
|
tool_def = tools.get(tool_name)
|
return tool_def.tool_type if tool_def else None
|
|
async def execute_tool(
|
self, tool_name: str, arguments: Dict[str, Any]
|
) -> ActionResponse:
|
"""执行工具调用"""
|
try:
|
# 查找工具类型
|
tool_type = self.get_tool_type(tool_name)
|
if not tool_type:
|
return ActionResponse(
|
action=Action.NOTFOUND,
|
response=f"工具 {tool_name} 不存在",
|
)
|
|
# 获取对应的执行器
|
executor = self.executors.get(tool_type)
|
if not executor:
|
return ActionResponse(
|
action=Action.ERROR,
|
response=f"工具类型 {tool_type.value} 的执行器未注册",
|
)
|
|
# 执行工具
|
self.logger.info(f"执行工具: {tool_name},参数: {arguments}")
|
result = await executor.execute(self.conn, tool_name, arguments)
|
self.logger.debug(f"工具执行结果: {result}")
|
return result
|
|
except Exception as e:
|
self.logger.error(f"执行工具 {tool_name} 时出错: {e}")
|
return ActionResponse(action=Action.ERROR, response=str(e))
|
|
def get_supported_tool_names(self) -> List[str]:
|
"""获取所有支持的工具名称"""
|
tools = self.get_all_tools()
|
return list(tools.keys())
|
|
def refresh_tools(self):
|
"""刷新工具缓存"""
|
self._invalidate_cache()
|
self.logger.debug("工具缓存已刷新")
|
|
def get_tool_statistics(self) -> Dict[str, int]:
|
"""获取工具统计信息"""
|
stats = {}
|
for tool_type, executor in self.executors.items():
|
try:
|
tools = executor.get_tools()
|
stats[tool_type.value] = len(tools)
|
except Exception as e:
|
self.logger.error(f"获取{tool_type.value}工具统计时出错: {e}")
|
stats[tool_type.value] = 0
|
return stats
|