From 1699b12f5baffde25440dc8a1111d033614ffba4 Mon Sep 17 00:00:00 2001 From: goulustis Date: Sat, 8 Nov 2025 00:25:09 +0800 Subject: [PATCH] event loop handling --- lang_agent/client_tool_manager.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/lang_agent/client_tool_manager.py b/lang_agent/client_tool_manager.py index c94de45..17c4e28 100644 --- a/lang_agent/client_tool_manager.py +++ b/lang_agent/client_tool_manager.py @@ -44,12 +44,32 @@ class ClientToolManager: return tools def get_tools(self): - tools = asyncio.run(self.aget_tools()) - return tools + try: + loop = asyncio.get_running_loop() + # Event loop is already running, we need to run in a thread + import concurrent.futures + + def run_in_thread(): + # Create a new event loop in this thread + new_loop = asyncio.new_event_loop() + asyncio.set_event_loop(new_loop) + try: + return new_loop.run_until_complete(self.aget_tools()) + finally: + new_loop.close() + + with concurrent.futures.ThreadPoolExecutor() as executor: + future = executor.submit(run_in_thread) + tools = future.result() + return tools + except RuntimeError: + # No event loop running, safe to use asyncio.run() + tools = asyncio.run(self.aget_tools()) + return tools if __name__ == "__main__": # NOTE: Simple test config = ClientToolManagerConfig() tool_manager = ClientToolManager(config) tools = tool_manager.get_tools() - print(tools) \ No newline at end of file + [print(e.name) for e in tools] \ No newline at end of file