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)