修改工具名称格式,优化OneBot和MCP工具的调用逻辑,增强错误处理

This commit is contained in:
FuQuan233 2025-11-01 23:23:23 +08:00
parent 21421c4754
commit ca1b5e75ec

View file

@ -132,7 +132,7 @@ class MCPClient:
{ {
"type": "function", "type": "function",
"function": { "function": {
"name": f"{server_name}___{tool.name}", "name": f"mcp__{server_name}__{tool.name}",
"description": tool.description, "description": tool.description,
"parameters": tool.inputSchema, "parameters": tool.inputSchema,
}, },
@ -148,15 +148,22 @@ class MCPClient:
async def call_tool(self, tool_name: str, tool_args: dict, group_id: int | None = None, bot_id: str | None = None): async def call_tool(self, tool_name: str, tool_args: dict, group_id: int | None = None, bot_id: str | None = None):
"""按需连接调用工具,调用后立即断开""" """按需连接调用工具,调用后立即断开"""
# 检查是否是QQ工具 # 检查是否是OneBot内置工具
if tool_name.startswith("ob__"): if tool_name.startswith("ob__"):
if group_id is None or bot_id is None: if group_id is None or bot_id is None:
return "QQ工具需要提供group_id和bot_id参数" return "QQ工具需要提供group_id和bot_id参数"
logger.info(f"调用OneBot工具[{tool_name}]") logger.info(f"调用OneBot工具[{tool_name}]")
return await self.onebot_tools.call_tool(tool_name, tool_args, group_id, bot_id) return await self.onebot_tools.call_tool(tool_name, tool_args, group_id, bot_id)
# MCP工具处理 # 检查是否是MCP工具
server_name, real_tool_name = tool_name.split("___") if tool_name.startswith("mcp__"):
# MCP工具处理mcp__server_name__tool_name
parts = tool_name.split("__")
if len(parts) != 3 or parts[0] != "mcp":
return f"MCP工具名称格式错误: {tool_name}"
server_name = parts[1]
real_tool_name = parts[2]
logger.info(f"按需连接到服务器[{server_name}]调用工具[{real_tool_name}]") logger.info(f"按需连接到服务器[{server_name}]调用工具[{real_tool_name}]")
async with self._create_session_context(server_name) as session: async with self._create_session_context(server_name) as session:
@ -168,16 +175,29 @@ class MCPClient:
logger.error(f"调用工具[{real_tool_name}]超时") logger.error(f"调用工具[{real_tool_name}]超时")
return f"调用工具[{real_tool_name}]超时" return f"调用工具[{real_tool_name}]超时"
# 未知工具类型
return f"未知的工具类型: {tool_name}"
def get_friendly_name(self, tool_name: str): def get_friendly_name(self, tool_name: str):
logger.debug(tool_name) logger.debug(tool_name)
# 检查是否是OneBot工具 # 检查是否是OneBot内置工具
if tool_name.startswith("ob__"): if tool_name.startswith("ob__"):
return self.onebot_tools.get_friendly_name(tool_name) return self.onebot_tools.get_friendly_name(tool_name)
# MCP工具处理 # 检查是否是MCP工具
server_name, real_tool_name = tool_name.split("___") if tool_name.startswith("mcp__"):
# MCP工具处理mcp__server_name__tool_name
parts = tool_name.split("__")
if len(parts) != 3 or parts[0] != "mcp":
return tool_name # 格式错误时返回原名称
server_name = parts[1]
real_tool_name = parts[2]
return (self.server_config[server_name].friendly_name or server_name) + " - " + real_tool_name return (self.server_config[server_name].friendly_name or server_name) + " - " + real_tool_name
# 未知工具类型,返回原名称
return tool_name
def clear_tools_cache(self): def clear_tools_cache(self):
"""清除工具列表缓存""" """清除工具列表缓存"""
logger.info("清除工具列表缓存") logger.info("清除工具列表缓存")