MCPcopy Create free account
hub / github.com/astercloud/aster / call_tool

Method call_tool

client-sdks/python-bridge/aster.py:72–161  ·  view source on GitHub ↗

调用工具(带重试逻辑) Args: name: 工具名称 **kwargs: 工具输入参数 Returns: 工具执行结果 Raises: ToolExecutionError: 工具执行失败 NetworkError: 网络错误(重试后仍失败)

(self, name: str, **kwargs)

Source from the content-addressed store, hash-verified

70 return self._session
71
72 async def call_tool(self, name: str, **kwargs) -> Any:
73 """
74 调用工具(带重试逻辑)
75
76 Args:
77 name: 工具名称
78 **kwargs: 工具输入参数
79
80 Returns:
81 工具执行结果
82
83 Raises:
84 ToolExecutionError: 工具执行失败
85 NetworkError: 网络错误(重试后仍失败)
86 """
87 last_error = None
88
89 for attempt in range(self.max_retries):
90 try:
91 session = await self._get_session()
92
93 async with session.post(
94 f"{self.base_url}/tools/call",
95 json={"tool": name, "input": kwargs},
96 timeout=aiohttp.ClientTimeout(total=60),
97 ) as resp:
98 # 检查 HTTP 状态码
99 if resp.status >= 500:
100 # 服务器错误,可以重试
101 error_text = await resp.text()
102 last_error = NetworkError(
103 f"Server error (HTTP {resp.status}): {error_text}"
104 )
105 if attempt < self.max_retries - 1:
106 await asyncio.sleep(self.retry_delay * (2 ** attempt))
107 continue
108 raise last_error
109
110 if resp.status >= 400:
111 # 客户端错误,不重试
112 error_text = await resp.text()
113 raise NetworkError(
114 f"Client error (HTTP {resp.status}): {error_text}"
115 )
116
117 # 解析响应
118 result = await resp.json()
119
120 # 检查工具执行结果
121 if not result.get("success"):
122 error_msg = result.get("error", "Unknown error")
123 raise ToolExecutionError(name, error_msg)
124
125 return result.get("result")
126
127 except aiohttp.ClientConnectorError as e:
128 # 连接错误,可以重试
129 last_error = NetworkError(

Callers 6

ReadFunction · 0.80
WriteFunction · 0.80
GlobFunction · 0.80
GrepFunction · 0.80
BashFunction · 0.80
tool_funcFunction · 0.80

Calls 4

_get_sessionMethod · 0.95
NetworkErrorClass · 0.85
ToolExecutionErrorClass · 0.85
getMethod · 0.45

Tested by

no test coverage detected