🐛 更新工具列表缓存机制,修复工具调用问题

This commit is contained in:
FuQuan233 2025-11-07 16:59:19 +08:00
parent e082f7db9f
commit a47ae8ef16
2 changed files with 51 additions and 43 deletions

View file

@ -278,7 +278,7 @@ async def handle_message(event: GroupMessageEvent | PrivateMessageEvent):
task.add_done_callback(tasks.discard) task.add_done_callback(tasks.discard)
tasks.add(task) tasks.add(task)
async def process_images(event: GroupMessageEvent) -> list[str]: async def process_images(event: GroupMessageEvent | PrivateMessageEvent) -> list[str]:
base64_images = [] base64_images = []
for segement in event.get_message(): for segement in event.get_message():
if segement.type == "image": if segement.type == "image":
@ -478,12 +478,19 @@ async def process_messages(context_id: int, is_group: bool = True):
# 发送工具调用提示 # 发送工具调用提示
await handler.send(Message(f"正在使用{mcp_client.get_friendly_name(tool_name)}")) await handler.send(Message(f"正在使用{mcp_client.get_friendly_name(tool_name)}"))
result = await mcp_client.call_tool( if is_group:
tool_name, result = await mcp_client.call_tool(
tool_args, tool_name,
group_id=event.group_id, tool_args,
bot_id=str(event.self_id) group_id=event.group_id,
) bot_id=str(event.self_id)
)
else:
result = await mcp_client.call_tool(
tool_name,
tool_args,
bot_id=str(event.self_id)
)
new_messages.append({ new_messages.append({
"role": "tool", "role": "tool",

View file

@ -106,45 +106,46 @@ class MCPClient:
return SessionContext() return SessionContext()
async def init_tools_cache(self):
"""初始化工具列表缓存"""
if not self._cache_initialized:
available_tools = []
logger.info(f"初始化工具列表缓存,需要连接{len(self.server_config)}个服务器")
for server_name in self.server_config.keys():
logger.debug(f"正在从服务器[{server_name}]获取工具列表")
async with self._create_session_context(server_name) as session:
response = await session.list_tools()
tools = response.tools
logger.debug(f"在服务器[{server_name}]中找到{len(tools)}个工具")
available_tools.extend(
{
"type": "function",
"function": {
"name": f"mcp__{server_name}__{tool.name}",
"description": tool.description,
"parameters": tool.inputSchema,
},
}
for tool in tools
)
# 缓存工具列表
self._tools_cache = available_tools
self._cache_initialized = True
logger.info(f"工具列表缓存完成,共缓存{len(available_tools)}个工具")
async def get_available_tools(self, is_group: bool): async def get_available_tools(self, is_group: bool):
"""获取可用工具列表,使用缓存机制""" """获取可用工具列表,使用缓存机制"""
if self._tools_cache is not None: await self.init_tools_cache()
logger.debug("返回缓存的工具列表") available_tools = self._tools_cache.copy() if self._tools_cache else []
return self._tools_cache
logger.info(f"初始化工具列表缓存,需要连接{len(self.server_config)}个服务器")
available_tools = []
if is_group: if is_group:
# 添加OneBot内置工具仅在群聊中可用 # 群聊场景包含OneBot工具和MCP工具
onebot_tools = self.onebot_tools.get_available_tools() available_tools.extend(self.onebot_tools.get_available_tools())
available_tools.extend(onebot_tools) logger.debug(f"获取可用工具列表,共{len(available_tools)}个工具")
logger.debug(f"添加了{len(onebot_tools)}个OneBot内置工具")
# 添加MCP服务器工具
for server_name in self.server_config.keys():
logger.debug(f"正在从服务器[{server_name}]获取工具列表")
async with self._create_session_context(server_name) as session:
response = await session.list_tools()
tools = response.tools
logger.debug(f"在服务器[{server_name}]中找到{len(tools)}个工具")
available_tools.extend(
{
"type": "function",
"function": {
"name": f"mcp__{server_name}__{tool.name}",
"description": tool.description,
"parameters": tool.inputSchema,
},
}
for tool in tools
)
# 缓存工具列表
self._tools_cache = available_tools
self._cache_initialized = True
logger.info(f"工具列表缓存完成,共缓存{len(available_tools)}个工具")
return available_tools return available_tools
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):