|
13 | 13 | class ToolMap: |
14 | 14 | port_client: PortClient |
15 | 15 | tools: dict[str, Tool] = field(default_factory=dict) |
| 16 | + _dynamic_tools_loaded: bool = field(default=False, init=False) |
16 | 17 |
|
17 | 18 | def __post_init__(self): |
18 | 19 | # Register static tools |
19 | 20 | for tool in mcp_tools.__all__: |
20 | 21 | module = mcp_tools.__dict__[tool] |
21 | 22 | self.register_tool(module(self.port_client)) |
22 | 23 | logger.info(f"ToolMap initialized with {len(self.tools)} static tools") |
23 | | - self._register_dynamic_action_tools() |
| 24 | + # Don't load dynamic tools here - they'll be loaded lazily when needed |
| 25 | + |
| 26 | + async def ensure_dynamic_tools_loaded(self) -> None: |
| 27 | + """Ensure dynamic action tools are loaded (async version).""" |
| 28 | + if self._dynamic_tools_loaded: |
| 29 | + return |
| 30 | + |
| 31 | + try: |
| 32 | + logger.info("Loading dynamic action tools asynchronously...") |
| 33 | + dynamic_manager = DynamicActionToolsManager(self.port_client) |
| 34 | + dynamic_tools = await dynamic_manager.get_dynamic_action_tools() |
| 35 | + |
| 36 | + for tool in dynamic_tools: |
| 37 | + self.register_tool(tool) |
| 38 | + |
| 39 | + logger.info(f"Successfully registered {len(dynamic_tools)} dynamic action tools") |
| 40 | + if len(dynamic_tools) == 0: |
| 41 | + logger.warning("No dynamic action tools were registered - this may indicate a configuration or network issue") |
| 42 | + |
| 43 | + self._dynamic_tools_loaded = True |
| 44 | + except Exception as e: |
| 45 | + logger.error(f"Failed to register dynamic action tools: {e}") |
| 46 | + logger.exception("Full traceback for dynamic action tools registration failure:") |
| 47 | + # Mark as loaded even if failed to avoid repeated attempts |
| 48 | + self._dynamic_tools_loaded = True |
24 | 49 |
|
25 | 50 | def _register_dynamic_action_tools(self) -> None: |
26 | | - """Register dynamic tools for each Port action.""" |
| 51 | + """Register dynamic tools for each Port action (legacy sync version).""" |
27 | 52 | try: |
28 | 53 | logger.info("Starting dynamic action tools registration...") |
29 | 54 | dynamic_manager = DynamicActionToolsManager(self.port_client) |
|
0 commit comments