mirror of
https://github.com/FuQuan233/nonebot-plugin-llmchat.git
synced 2026-02-05 03:28:05 +00:00
Compare commits
4 commits
21421c4754
...
2f62365460
| Author | SHA1 | Date | |
|---|---|---|---|
| 2f62365460 | |||
| 8f7adbd176 | |||
| 0943b7077f | |||
| ca1b5e75ec |
3 changed files with 89 additions and 51 deletions
38
README.md
38
README.md
|
|
@ -196,23 +196,41 @@ LLMCHAT__MCP_SERVERS同样为一个dict,key为服务器名称,value配置的
|
||||||
"support_image": true
|
"support_image": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
'
|
||||||
LLMCHAT__MCP_SERVERS='
|
LLMCHAT__MCP_SERVERS='
|
||||||
{
|
{
|
||||||
"AISearch": {
|
"brave-search": {
|
||||||
"friendly_name": "百度搜索",
|
"friendly_name": "Brave搜索",
|
||||||
"additional_prompt": "遇到你不知道的问题或者时效性比较强的问题时,可以使用AISearch搜索,在使用AISearch时不要使用其他AI模型。",
|
"additional_prompt": "遇到你不知道的问题或者时效性比较强的问题时,请使用brave-search搜索。",
|
||||||
"url": "http://appbuilder.baidu.com/v2/ai_search/mcp/sse?api_key=Bearer+<your-api-key>",
|
"command": "npx",
|
||||||
"headers": {
|
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
|
||||||
"Authorization": "<some-api-key>"
|
"env": {
|
||||||
|
"BRAVE_API_KEY": "<your-api-key>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"fetch": {
|
"fetch": {
|
||||||
"friendly_name": "网页浏览",
|
"friendly_name": "浏览网页",
|
||||||
|
"additional_prompt": "搜索到的链接可以通过fetch打开进一步了解。",
|
||||||
"command": "uvx",
|
"command": "uvx",
|
||||||
"args": ["mcp-server-fetch"]
|
"args": ["mcp-server-fetch", "--ignore-robots-txt", "--user-agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\""]
|
||||||
|
},
|
||||||
|
"hefeng-weather": {
|
||||||
|
"friendly_name": "和风天气",
|
||||||
|
"command": "npx",
|
||||||
|
"args": ["hefeng-mcp-weather@latest", "--apiKey=<your-api-key>"]
|
||||||
|
},
|
||||||
|
"mcp-server-code-runner": {
|
||||||
|
"friendly_name": "代码运行器",
|
||||||
|
"additional_prompt": "在使用的时候你需要将你需要的结果输出出来,用户看不到你的代码,如果你需要给用户展示,你需要将代码以文字的形式发送出来。",
|
||||||
|
"command": "docker",
|
||||||
|
"args": [
|
||||||
|
"run",
|
||||||
|
"--rm",
|
||||||
|
"-i",
|
||||||
|
"formulahendry/mcp-server-code-runner"
|
||||||
|
]
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
|
||||||
'
|
|
||||||
'
|
'
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
||||||
|
|
@ -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("清除工具列表缓存")
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "nonebot-plugin-llmchat"
|
name = "nonebot-plugin-llmchat"
|
||||||
version = "0.4.0"
|
version = "0.4.1"
|
||||||
description = "Nonebot AI group chat plugin supporting multiple API preset configurations"
|
description = "Nonebot AI group chat plugin supporting multiple API preset configurations"
|
||||||
license = "GPL"
|
license = "GPL"
|
||||||
authors = ["FuQuan i@fuquan.moe"]
|
authors = ["FuQuan i@fuquan.moe"]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue