fix(im_llm): 代理绕过Docker内部hostname
This commit is contained in:
1 parent
96aabc31f6
commit
9a43ee244d
24 files changed
+898
-129
No files matched your search
@@ -43,12 +43,14 @@ def _transport_cm(server: dict, timeout: float):
|
||||
|
||||
|
||||
async def _session_request(
|
||||
server: dict, method: str, params: dict, timeout: float = 30.0
|
||||
server: dict, method: str, params: dict, timeout: float = 30.0,
|
||||
raise_on_error: bool = False
|
||||
):
|
||||
"""用官方 ClientSession 完成一次标准 MCP 调用(initialize -> 目标请求)。
|
||||
|
||||
返回解析后的 dict:{"result": {...}} 或 None(失败)。
|
||||
协议版本由 SDK 自动协商,不再硬编码。
|
||||
raise_on_error=True 时连接/网络错误(如 ExceptionGroup)会向上抛,不再吞掉。
|
||||
"""
|
||||
url = (server.get("url") or "").strip()
|
||||
if not url:
|
||||
@@ -89,33 +91,40 @@ async def _session_request(
|
||||
}
|
||||
except Exception as e:
|
||||
logger.warning(f"[MCP] {method} 异常 {url}: {e}")
|
||||
if raise_on_error:
|
||||
raise
|
||||
return None
|
||||
return None
|
||||
|
||||
|
||||
async def list_mcp_tools(server: dict, timeout: float = 30.0) -> list:
|
||||
async def list_mcp_tools(server: dict, timeout: float = 30.0, raise_on_error: bool = False) -> list:
|
||||
"""
|
||||
拉取 MCP 服务器的工具列表。
|
||||
server: {url, transport_type, headers}
|
||||
返回 MCP tools 数组(每个含 name/description/inputSchema)。
|
||||
raise_on_error=True 时连接/网络错误不再吞掉,直接向上抛(供测试诊断用)。
|
||||
"""
|
||||
url = (server.get("url") or "").strip()
|
||||
if not url:
|
||||
return []
|
||||
# 缓存
|
||||
now = asyncio.get_event_loop().time()
|
||||
cached = _TOOLS_CACHE.get(url)
|
||||
if cached and (now - cached[0]) < _TOOLS_CACHE_TTL:
|
||||
return cached[1]
|
||||
# 缓存(仅在正常返回 tools 时缓存;raise_on_error 模式不缓存,便于实时重试)
|
||||
if not raise_on_error:
|
||||
now = asyncio.get_event_loop().time()
|
||||
cached = _TOOLS_CACHE.get(url)
|
||||
if cached and (now - cached[0]) < _TOOLS_CACHE_TTL:
|
||||
return cached[1]
|
||||
try:
|
||||
data = await _session_request(server, "tools/list", {}, timeout)
|
||||
data = await _session_request(server, "tools/list", {}, timeout, raise_on_error=raise_on_error)
|
||||
tools = []
|
||||
if data and "result" in data:
|
||||
tools = data["result"].get("tools", []) or []
|
||||
_TOOLS_CACHE[url] = (now, tools)
|
||||
if not raise_on_error:
|
||||
_TOOLS_CACHE[url] = (asyncio.get_event_loop().time(), tools)
|
||||
return tools
|
||||
except Exception as e:
|
||||
logger.warning(f"[MCP] 拉取工具失败 {url}: {e}")
|
||||
if raise_on_error:
|
||||
raise
|
||||
return []
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user