MCP 客户端功能

This commit is contained in:
2025-09-05 20:37:15 +08:00
parent 7eb22743d8
commit b2914be3c1
18 changed files with 978 additions and 123 deletions

View File

@@ -31,6 +31,7 @@ from openai.types.chat import ChatCompletion, ChatCompletionChunk, ChatCompletio
from .config import config
from .constants import SUPPORT_IMAGE_MODELS
from .extensions.mcp_extension.client import handle_mcp_tool, is_mcp_tool
from .instances import target_list
from .models import MarshoContext
from .plugin.func_call.caller import get_function_calls
@@ -148,43 +149,56 @@ class MarshoHandler:
# pass
tool_msg.append(choice.message)
for tool_call in tool_calls: # type: ignore
tool_name = tool_call.function.name
tool_clean_name = tool_name.replace("-", ".")
try:
function_args = json.loads(tool_call.function.arguments)
except json.JSONDecodeError:
function_args = json.loads(
tool_call.function.arguments.replace("'", '"')
)
if await is_mcp_tool(tool_name):
tool_clean_name = tool_name # MCP 工具不需要替换
# 删除args的placeholder参数
if "placeholder" in function_args:
del function_args["placeholder"]
logger.info(
f"调用函数 {tool_call.function.name.replace('-', '.')}\n参数:"
f"调用工具 {tool_clean_name}参数:"
+ "\n".join([f"{k}={v}" for k, v in function_args.items()])
)
await UniMessage(
f"调用函数 {tool_call.function.name.replace('-', '.')}\n参数:"
f"调用工具 {tool_clean_name}\n参数:"
+ "\n".join([f"{k}={v}" for k, v in function_args.items()])
).send()
if caller := get_function_calls().get(tool_call.function.name):
logger.debug(f"调用插件函数 {caller.full_name}")
# 权限检查,规则检查 TODO
# 实现依赖注入检查函数参数及参数注解类型对Event类型的参数进行注入
func_return = await caller.with_ctx(
SessionContext(
bot=self.bot,
event=self.event,
matcher=self.matcher,
state=None,
if not await is_mcp_tool(tool_name):
if caller := get_function_calls().get(tool_call.function.name):
logger.debug(f"调用插件函数 {caller.full_name}")
# 权限检查,规则检查 TODO
# 实现依赖注入检查函数参数及参数注解类型对Event类型的参数进行注入
func_return = await caller.with_ctx(
SessionContext(
bot=self.bot,
event=self.event,
matcher=self.matcher,
state=None,
)
).call(**function_args)
else:
logger.error(
f"未找到函数 {tool_call.function.name.replace('-', '.')}"
)
).call(**function_args)
func_return = (
f"未找到函数 {tool_call.function.name.replace('-', '.')}"
)
tool_msg.append(
ToolMessage(tool_call_id=tool_call.id, content=func_return).as_dict() # type: ignore
)
else:
logger.error(f"未找到函数 {tool_call.function.name.replace('-', '.')}")
func_return = f"未找到函数 {tool_call.function.name.replace('-', '.')}"
tool_msg.append(
ToolMessage(tool_call_id=tool_call.id, content=func_return).as_dict() # type: ignore
)
# tool_msg[0]["tool_calls"][0]["type"] = "builtin_function"
# await UniMessage(str(tool_msg)).send()
func_return = await handle_mcp_tool(tool_name, function_args)
tool_msg.append(
ToolMessage(tool_call_id=tool_call.id, content=func_return).as_dict() # type: ignore
)
return await self.handle_common_chat(
user_message=user_message,
model_name=model_name,