From b416cf75bdb050b4f20514fe8f7f0447dd575f12 Mon Sep 17 00:00:00 2001 From: Pavel Jbanov <pavelj@google.com> Date: Tue, 1 Apr 2025 13:55:14 -0400 Subject: [PATCH 1/2] fix(py/core): introduced `ai.run_main` method that executes async fn and blocks main thread from shutting down --- py/packages/genkit-ai/src/genkit/ai/veneer.py | 11 ++++++++++- .../hello-google-genai/src/hello_google_genai.py | 7 +------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/py/packages/genkit-ai/src/genkit/ai/veneer.py b/py/packages/genkit-ai/src/genkit/ai/veneer.py index 28aed060be..aae833876d 100644 --- a/py/packages/genkit-ai/src/genkit/ai/veneer.py +++ b/py/packages/genkit-ai/src/genkit/ai/veneer.py @@ -96,7 +96,7 @@ async def foo(...): from collections.abc import AsyncIterator from http.server import HTTPServer from typing import Any - +from genkit.aio.loop import run_async from genkit.ai import server from genkit.ai.plugin import Plugin from genkit.ai.registry import GenkitRegistry @@ -190,6 +190,15 @@ def join(self): if self.thread and self.loop: self.thread.join() + def run_main(self, main): + if self.loop: + async def run(): + return await main + run_async(self.loop, run) + else: + asyncio.run(main) + self.join() + def start_server(self, spec: server.ServerSpec, loop: asyncio.AbstractEventLoop) -> None: """Start the HTTP server for handling requests. diff --git a/py/samples/hello-google-genai/src/hello_google_genai.py b/py/samples/hello-google-genai/src/hello_google_genai.py index db85c6b391..33fcf100ea 100644 --- a/py/samples/hello-google-genai/src/hello_google_genai.py +++ b/py/samples/hello-google-genai/src/hello_google_genai.py @@ -310,9 +310,4 @@ async def main() -> None: if __name__ == '__main__': - asyncio.run(main()) - - -# prevent app from exiting when genkit is running in dev mode -# TODO: Clean this up. -ai.join() + ai.run_main(main()) From 5d802ece5385c25177465bb70e4597ab7dde5447 Mon Sep 17 00:00:00 2001 From: Pavel Jbanov <pavelj@google.com> Date: Tue, 1 Apr 2025 13:55:40 -0400 Subject: [PATCH 2/2] fmt --- py/packages/genkit-ai/src/genkit/ai/veneer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/py/packages/genkit-ai/src/genkit/ai/veneer.py b/py/packages/genkit-ai/src/genkit/ai/veneer.py index aae833876d..d206ab27f2 100644 --- a/py/packages/genkit-ai/src/genkit/ai/veneer.py +++ b/py/packages/genkit-ai/src/genkit/ai/veneer.py @@ -96,12 +96,12 @@ async def foo(...): from collections.abc import AsyncIterator from http.server import HTTPServer from typing import Any -from genkit.aio.loop import run_async + from genkit.ai import server from genkit.ai.plugin import Plugin from genkit.ai.registry import GenkitRegistry from genkit.aio import Channel -from genkit.aio.loop import create_loop +from genkit.aio.loop import create_loop, run_async from genkit.blocks.document import Document from genkit.blocks.embedding import EmbedRequest, EmbedResponse from genkit.blocks.formats import built_in_formats @@ -192,8 +192,10 @@ def join(self): def run_main(self, main): if self.loop: + async def run(): return await main + run_async(self.loop, run) else: asyncio.run(main)