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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: genkit-plugin-flask
3
- Version: 0.0.1.dev1
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.12
22
+ Requires-Python: >=3.10
21
23
  Requires-Dist: flask
22
- Requires-Dist: genkit-ai
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-ai",
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.12"
29
- version = "0.0.1-dev.1"
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
- def genkit_flask_handler(ai: Genkit) -> Callable:
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
- stream = request.headers.get('Accept') == 'text/event-stream' or request.args.get('stream') == 'true'
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