update
This commit is contained in:
parent
6c6469d2ca
commit
d198031c55
|
|
@ -28,7 +28,7 @@ from core.llm_catalog import (
|
||||||
validate_request_can_use_provider,
|
validate_request_can_use_provider,
|
||||||
)
|
)
|
||||||
from core.database import get_db_pool, get_checkpointer, reset_db_pools_on_connection_error
|
from core.database import get_db_pool, get_checkpointer, reset_db_pools_on_connection_error
|
||||||
from core.mcp_client import get_mcp_client
|
from core.mcp_client import load_mcp_tools_safe
|
||||||
from core.dependencies import get_current_user, get_moderation_service
|
from core.dependencies import get_current_user, get_moderation_service
|
||||||
from core.exceptions import ModerationError
|
from core.exceptions import ModerationError
|
||||||
from models.user import User
|
from models.user import User
|
||||||
|
|
@ -771,9 +771,8 @@ async def _create_agent_for_request(
|
||||||
checkpointer=checkpointer
|
checkpointer=checkpointer
|
||||||
)
|
)
|
||||||
|
|
||||||
# 普通聊天模式
|
# 普通聊天模式(MCP 不可用时降级为无 MCP 工具,不阻断聊天)
|
||||||
mcp_client = await get_mcp_client()
|
mcp_tools = await load_mcp_tools_safe()
|
||||||
mcp_tools = await mcp_client.get_tools()
|
|
||||||
mcp_tools = [_wrap_mcp_tool_safe(t) for t in mcp_tools]
|
mcp_tools = [_wrap_mcp_tool_safe(t) for t in mcp_tools]
|
||||||
logger.info(f"成功加载 {len(mcp_tools)} 个 MCP 工具")
|
logger.info(f"成功加载 {len(mcp_tools)} 个 MCP 工具")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ MCP 客户端管理模块
|
||||||
"""
|
"""
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
from langchain_core.tools import BaseTool
|
||||||
from langchain_mcp_adapters.client import MultiServerMCPClient
|
from langchain_mcp_adapters.client import MultiServerMCPClient
|
||||||
|
|
||||||
from core.config import settings
|
from core.config import settings
|
||||||
|
|
@ -58,6 +59,44 @@ async def get_mcp_client() -> MultiServerMCPClient:
|
||||||
return _mcp_client
|
return _mcp_client
|
||||||
|
|
||||||
|
|
||||||
|
async def load_mcp_tools_safe() -> list[BaseTool]:
|
||||||
|
"""
|
||||||
|
加载 MCP 工具;单个服务器连接/鉴权失败时跳过并继续,不阻断聊天。
|
||||||
|
"""
|
||||||
|
if not is_mcp_enabled():
|
||||||
|
return []
|
||||||
|
|
||||||
|
client = await get_mcp_client()
|
||||||
|
if not client.connections:
|
||||||
|
return []
|
||||||
|
|
||||||
|
all_tools: list[BaseTool] = []
|
||||||
|
for server_name in client.connections:
|
||||||
|
conn = client.connections[server_name]
|
||||||
|
url = conn.get("url", "?")
|
||||||
|
try:
|
||||||
|
tools = await client.get_tools(server_name=server_name)
|
||||||
|
all_tools.extend(tools)
|
||||||
|
logger.info(
|
||||||
|
"MCP 服务器 {} ({}) 已加载 {} 个工具",
|
||||||
|
server_name,
|
||||||
|
url,
|
||||||
|
len(tools),
|
||||||
|
)
|
||||||
|
except Exception as exc:
|
||||||
|
logger.warning(
|
||||||
|
"MCP 服务器 {} ({}) 不可用,已跳过: {}",
|
||||||
|
server_name,
|
||||||
|
url,
|
||||||
|
exc,
|
||||||
|
)
|
||||||
|
|
||||||
|
if not all_tools and client.connections:
|
||||||
|
logger.warning("所有 MCP 服务器均不可用,聊天将继续但不提供 MCP 工具")
|
||||||
|
|
||||||
|
return all_tools
|
||||||
|
|
||||||
|
|
||||||
async def close_mcp_client():
|
async def close_mcp_client():
|
||||||
"""关闭 MCP 客户端"""
|
"""关闭 MCP 客户端"""
|
||||||
global _mcp_client
|
global _mcp_client
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue