Root cause: fal_client.AsyncClient uses @cached_property for its httpx.AsyncClient, creating it once and caching forever. In the gateway, the agent runs in a thread pool where _run_async() calls asyncio.run() which creates a temporary event loop. The first call works, but asyncio.run() closes that loop. On the next call, a new loop is created but the cached httpx.AsyncClient still references the old closed loop, causing 'Event loop is closed'. Fix: Switch from async fal_client API (submit_async/handler.get with await) to sync API (submit/handler.get). The sync API uses httpx.Client which has no event loop dependency. Since the tool already runs in a thread pool via the gateway, async adds no benefit here. Changes: - image_generate_tool: async def -> def - _upscale_image: async def -> def - fal_client.submit_async -> fal_client.submit - await handler.get() -> handler.get() - is_async=True -> is_async=False in registry - Remove unused asyncio import
21 KiB
21 KiB