genkit-plugin-flask 0.0.1.dev1__tar.gz → 0.3.0.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {genkit_plugin_flask-0.0.1.dev1 → genkit_plugin_flask-0.3.0.dev1}/PKG-INFO +5 -3
- {genkit_plugin_flask-0.0.1.dev1 → genkit_plugin_flask-0.3.0.dev1}/pyproject.toml +6 -4
- {genkit_plugin_flask-0.0.1.dev1 → genkit_plugin_flask-0.3.0.dev1}/src/genkit/plugins/flask/handler.py +28 -4
- {genkit_plugin_flask-0.0.1.dev1 → genkit_plugin_flask-0.3.0.dev1}/.gitignore +0 -0
- {genkit_plugin_flask-0.0.1.dev1 → genkit_plugin_flask-0.3.0.dev1}/LICENSE +0 -0
- {genkit_plugin_flask-0.0.1.dev1 → genkit_plugin_flask-0.3.0.dev1}/README.md +0 -0
- {genkit_plugin_flask-0.0.1.dev1 → genkit_plugin_flask-0.3.0.dev1}/src/genkit/plugins/flask/__init__.py +0 -0
- {genkit_plugin_flask-0.0.1.dev1 → genkit_plugin_flask-0.3.0.dev1}/src/genkit/py.typed +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: genkit-plugin-flask
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.3.0.dev1
|
|
4
4
|
Summary: Genkit Firebase Plugin
|
|
5
5
|
Author: Google
|
|
6
6
|
License: Apache-2.0
|
|
@@ -13,13 +13,15 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
13
13
|
Classifier: Operating System :: OS Independent
|
|
14
14
|
Classifier: Programming Language :: Python
|
|
15
15
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
18
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
19
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
20
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
21
|
Classifier: Topic :: Software Development :: Libraries
|
|
20
|
-
Requires-Python: >=3.
|
|
22
|
+
Requires-Python: >=3.10
|
|
21
23
|
Requires-Dist: flask
|
|
22
|
-
Requires-Dist: genkit
|
|
24
|
+
Requires-Dist: genkit
|
|
23
25
|
Requires-Dist: genkit-plugin-flask
|
|
24
26
|
Requires-Dist: genkit-plugin-google-genai
|
|
25
27
|
Requires-Dist: pydantic>=2.10.5
|
|
@@ -8,14 +8,16 @@ classifiers = [
|
|
|
8
8
|
"Operating System :: OS Independent",
|
|
9
9
|
"License :: OSI Approved :: Apache Software License",
|
|
10
10
|
"Programming Language :: Python",
|
|
11
|
+
"Programming Language :: Python :: 3 :: Only",
|
|
12
|
+
"Programming Language :: Python :: 3.10",
|
|
13
|
+
"Programming Language :: Python :: 3.11",
|
|
11
14
|
"Programming Language :: Python :: 3.12",
|
|
12
15
|
"Programming Language :: Python :: 3.13",
|
|
13
|
-
"Programming Language :: Python :: 3 :: Only",
|
|
14
16
|
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
15
17
|
"Topic :: Software Development :: Libraries",
|
|
16
18
|
]
|
|
17
19
|
dependencies = [
|
|
18
|
-
"genkit
|
|
20
|
+
"genkit",
|
|
19
21
|
"genkit-plugin-google-genai",
|
|
20
22
|
"genkit-plugin-flask",
|
|
21
23
|
"pydantic>=2.10.5",
|
|
@@ -25,8 +27,8 @@ description = "Genkit Firebase Plugin"
|
|
|
25
27
|
license = { text = "Apache-2.0" }
|
|
26
28
|
name = "genkit-plugin-flask"
|
|
27
29
|
readme = "README.md"
|
|
28
|
-
requires-python = ">=3.
|
|
29
|
-
version = "0.0.
|
|
30
|
+
requires-python = ">=3.10"
|
|
31
|
+
version = "0.3.0.dev1"
|
|
30
32
|
|
|
31
33
|
[build-system]
|
|
32
34
|
build-backend = "hatchling.build"
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
"""Genkit Flask plugin."""
|
|
18
18
|
|
|
19
|
+
import asyncio
|
|
19
20
|
from collections.abc import Callable
|
|
20
21
|
|
|
21
22
|
from flask import Response, request
|
|
@@ -23,10 +24,26 @@ from genkit.ai import Genkit
|
|
|
23
24
|
from genkit.ai.registry import FlowWrapper
|
|
24
25
|
from genkit.aio.loop import create_loop, iter_over_async
|
|
25
26
|
from genkit.codec import dump_dict, dump_json
|
|
27
|
+
from genkit.core.context import ContextProvider, RequestData
|
|
26
28
|
from genkit.core.error import GenkitError, get_callable_json
|
|
27
29
|
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
class _FlaskRequestData(RequestData):
|
|
32
|
+
def __init__(self):
|
|
33
|
+
self.method = request.method
|
|
34
|
+
|
|
35
|
+
self.headers = {}
|
|
36
|
+
for key, value in request.headers:
|
|
37
|
+
self.headers[key.lower()] = value
|
|
38
|
+
|
|
39
|
+
input_data = request.get_json()
|
|
40
|
+
if 'data' not in input_data:
|
|
41
|
+
return Response(status=400, response='flow request must be wrapped in {"data": data} object')
|
|
42
|
+
|
|
43
|
+
self.input = input_data.get('data')
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def genkit_flask_handler(ai: Genkit, context_provider: ContextProvider | None = None) -> Callable:
|
|
30
47
|
"""A decorator for serving Genkit flows via a flask sever.
|
|
31
48
|
|
|
32
49
|
```python
|
|
@@ -57,12 +74,19 @@ def genkit_flask_handler(ai: Genkit) -> Callable:
|
|
|
57
74
|
if 'data' not in input_data:
|
|
58
75
|
return Response(status=400, response='flow request must be wrapped in {"data": data} object')
|
|
59
76
|
|
|
60
|
-
|
|
77
|
+
request_data = _FlaskRequestData()
|
|
78
|
+
context = None
|
|
79
|
+
if context_provider:
|
|
80
|
+
context = context_provider(request_data)
|
|
81
|
+
if asyncio.iscoroutine(context):
|
|
82
|
+
context = await context
|
|
83
|
+
|
|
84
|
+
stream = request_data.headers.get('accept') == 'text/event-stream' or request.args.get('stream') == 'true'
|
|
61
85
|
if stream:
|
|
62
86
|
|
|
63
87
|
async def async_gen():
|
|
64
88
|
try:
|
|
65
|
-
stream, response = flow._action.stream(input_data.get('data'))
|
|
89
|
+
stream, response = flow._action.stream(input_data.get('data'), context=context)
|
|
66
90
|
async for chunk in stream:
|
|
67
91
|
yield f'data: {dump_json({"message": dump_dict(chunk)})}\n\n'
|
|
68
92
|
|
|
@@ -77,7 +101,7 @@ def genkit_flask_handler(ai: Genkit) -> Callable:
|
|
|
77
101
|
return iter
|
|
78
102
|
else:
|
|
79
103
|
try:
|
|
80
|
-
response = await flow._action.arun_raw(input_data.get('data'))
|
|
104
|
+
response = await flow._action.arun_raw(input_data.get('data'), context=context)
|
|
81
105
|
return {'result': dump_dict(response.response)}
|
|
82
106
|
except Exception as e:
|
|
83
107
|
ex = e
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|