Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 25 additions & 7 deletions libs/miroflow-tools/src/miroflow_tools/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,10 +105,14 @@ async def get_all_tool_definitions(self):
"""
Connect to all configured servers and get their tool definitions.
Returns a list suitable for passing to the Prompt generator.

Optimized to connect to servers in parallel using asyncio.gather(),
reducing initialization time from ~70s sequential to ~25s parallel.
"""
all_servers_for_prompt = []
# Process remote server tools
for config in self.server_configs:

async def _get_server_tools(config):
"""Fetch tool definitions from a single server."""
server_name = config["name"]
server_params = config["params"]
one_server_for_prompt = {"name": server_name, "tools": []}
Expand Down Expand Up @@ -153,9 +157,6 @@ async def get_all_tool_definitions(self):
await session.initialize()
tools_response = await session.list_tools()
for tool in tools_response.tools:
# Can add specific tool filtering logic here (if needed)
# if server_name == "tool-excel" and tool.name not in ["get_workbook_metadata", "read_data_from_excel"]:
# continue
one_server_for_prompt["tools"].append(
{
"name": tool.name,
Expand All @@ -178,7 +179,7 @@ async def get_all_tool_definitions(self):
"ToolManager | Tool Definitions Success",
f"Successfully obtained {len(one_server_for_prompt['tools'])} tool definitions from server '{server_name}'.",
)
all_servers_for_prompt.append(one_server_for_prompt)
return one_server_for_prompt

except Exception as e:
self._log(
Expand All @@ -190,7 +191,24 @@ async def get_all_tool_definitions(self):
one_server_for_prompt["tools"] = [
{"error": f"Unable to fetch tools: {e}"}
]
all_servers_for_prompt.append(one_server_for_prompt)
return one_server_for_prompt

# Connect to all servers in parallel for faster initialization
results = await asyncio.gather(
*[_get_server_tools(config) for config in self.server_configs],
return_exceptions=True
)

for result in results:
if isinstance(result, Exception):
# Log exception but continue with other servers
self._log(
"error",
"ToolManager | Parallel Init Error",
f"Unexpected error during parallel server initialization: {result}",
)
else:
all_servers_for_prompt.append(result)

return all_servers_for_prompt

Expand Down