langgraph-api 0.4.48__py3-none-any.whl → 0.5.6__py3-none-any.whl

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.

Potentially problematic release.


This version of langgraph-api might be problematic. Click here for more details.

Files changed (33) hide show
  1. langgraph_api/__init__.py +1 -1
  2. langgraph_api/api/assistants.py +65 -61
  3. langgraph_api/api/meta.py +6 -0
  4. langgraph_api/api/threads.py +1 -1
  5. langgraph_api/auth/custom.py +29 -24
  6. langgraph_api/config.py +56 -1
  7. langgraph_api/graph.py +1 -1
  8. langgraph_api/{grpc_ops → grpc}/client.py +91 -0
  9. langgraph_api/grpc/config_conversion.py +225 -0
  10. langgraph_api/grpc/generated/core_api_pb2.py +275 -0
  11. langgraph_api/{grpc_ops → grpc}/generated/core_api_pb2.pyi +20 -31
  12. langgraph_api/{grpc_ops → grpc}/generated/core_api_pb2_grpc.py +2 -2
  13. langgraph_api/grpc/generated/engine_common_pb2.py +190 -0
  14. langgraph_api/grpc/generated/engine_common_pb2.pyi +634 -0
  15. langgraph_api/grpc/generated/engine_common_pb2_grpc.py +24 -0
  16. langgraph_api/{grpc_ops → grpc}/ops.py +75 -217
  17. langgraph_api/js/package.json +5 -5
  18. langgraph_api/js/src/graph.mts +20 -0
  19. langgraph_api/js/yarn.lock +137 -187
  20. langgraph_api/queue_entrypoint.py +2 -2
  21. langgraph_api/route.py +14 -4
  22. langgraph_api/schema.py +2 -2
  23. langgraph_api/self_hosted_metrics.py +48 -2
  24. langgraph_api/serde.py +58 -14
  25. langgraph_api/worker.py +1 -1
  26. {langgraph_api-0.4.48.dist-info → langgraph_api-0.5.6.dist-info}/METADATA +5 -5
  27. {langgraph_api-0.4.48.dist-info → langgraph_api-0.5.6.dist-info}/RECORD +32 -28
  28. langgraph_api/grpc_ops/generated/core_api_pb2.py +0 -276
  29. /langgraph_api/{grpc_ops → grpc}/__init__.py +0 -0
  30. /langgraph_api/{grpc_ops → grpc}/generated/__init__.py +0 -0
  31. {langgraph_api-0.4.48.dist-info → langgraph_api-0.5.6.dist-info}/WHEEL +0 -0
  32. {langgraph_api-0.4.48.dist-info → langgraph_api-0.5.6.dist-info}/entry_points.txt +0 -0
  33. {langgraph_api-0.4.48.dist-info → langgraph_api-0.5.6.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,634 @@
1
+ from google.protobuf import struct_pb2 as _struct_pb2
2
+ from google.protobuf import wrappers_pb2 as _wrappers_pb2
3
+ from google.protobuf import empty_pb2 as _empty_pb2
4
+ from google.protobuf.internal import containers as _containers
5
+ from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import message as _message
8
+ from collections.abc import Iterable as _Iterable, Mapping as _Mapping
9
+ from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union
10
+
11
+ DESCRIPTOR: _descriptor.FileDescriptor
12
+
13
+ class Durability(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
14
+ __slots__ = ()
15
+ UNKNOWN: _ClassVar[Durability]
16
+ ASYNC: _ClassVar[Durability]
17
+ SYNC: _ClassVar[Durability]
18
+ EXIT: _ClassVar[Durability]
19
+ UNKNOWN: Durability
20
+ ASYNC: Durability
21
+ SYNC: Durability
22
+ EXIT: Durability
23
+
24
+ class ChannelValue(_message.Message):
25
+ __slots__ = ("serialized_value", "sends", "missing")
26
+ SERIALIZED_VALUE_FIELD_NUMBER: _ClassVar[int]
27
+ SENDS_FIELD_NUMBER: _ClassVar[int]
28
+ MISSING_FIELD_NUMBER: _ClassVar[int]
29
+ serialized_value: SerializedValue
30
+ sends: Sends
31
+ missing: _empty_pb2.Empty
32
+ def __init__(self, serialized_value: _Optional[_Union[SerializedValue, _Mapping]] = ..., sends: _Optional[_Union[Sends, _Mapping]] = ..., missing: _Optional[_Union[_empty_pb2.Empty, _Mapping]] = ...) -> None: ...
33
+
34
+ class SerializedValue(_message.Message):
35
+ __slots__ = ("encoding", "value")
36
+ ENCODING_FIELD_NUMBER: _ClassVar[int]
37
+ VALUE_FIELD_NUMBER: _ClassVar[int]
38
+ encoding: str
39
+ value: bytes
40
+ def __init__(self, encoding: _Optional[str] = ..., value: _Optional[bytes] = ...) -> None: ...
41
+
42
+ class ResponseChunk(_message.Message):
43
+ __slots__ = ("namespaces", "mode", "payload")
44
+ NAMESPACES_FIELD_NUMBER: _ClassVar[int]
45
+ MODE_FIELD_NUMBER: _ClassVar[int]
46
+ PAYLOAD_FIELD_NUMBER: _ClassVar[int]
47
+ namespaces: _containers.RepeatedScalarFieldContainer[str]
48
+ mode: str
49
+ payload: SerializedValue
50
+ def __init__(self, namespaces: _Optional[_Iterable[str]] = ..., mode: _Optional[str] = ..., payload: _Optional[_Union[SerializedValue, _Mapping]] = ...) -> None: ...
51
+
52
+ class ResponseChunkList(_message.Message):
53
+ __slots__ = ("responses",)
54
+ RESPONSES_FIELD_NUMBER: _ClassVar[int]
55
+ responses: _containers.RepeatedCompositeFieldContainer[ResponseChunk]
56
+ def __init__(self, responses: _Optional[_Iterable[_Union[ResponseChunk, _Mapping]]] = ...) -> None: ...
57
+
58
+ class MessageIds(_message.Message):
59
+ __slots__ = ("message_ids",)
60
+ MESSAGE_IDS_FIELD_NUMBER: _ClassVar[int]
61
+ message_ids: _containers.RepeatedScalarFieldContainer[str]
62
+ def __init__(self, message_ids: _Optional[_Iterable[str]] = ...) -> None: ...
63
+
64
+ class Channels(_message.Message):
65
+ __slots__ = ("channels",)
66
+ class ChannelsEntry(_message.Message):
67
+ __slots__ = ("key", "value")
68
+ KEY_FIELD_NUMBER: _ClassVar[int]
69
+ VALUE_FIELD_NUMBER: _ClassVar[int]
70
+ key: str
71
+ value: Channel
72
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[Channel, _Mapping]] = ...) -> None: ...
73
+ CHANNELS_FIELD_NUMBER: _ClassVar[int]
74
+ channels: _containers.MessageMap[str, Channel]
75
+ def __init__(self, channels: _Optional[_Mapping[str, Channel]] = ...) -> None: ...
76
+
77
+ class Channel(_message.Message):
78
+ __slots__ = ("get_result", "is_available_result", "checkpoint_result")
79
+ GET_RESULT_FIELD_NUMBER: _ClassVar[int]
80
+ IS_AVAILABLE_RESULT_FIELD_NUMBER: _ClassVar[int]
81
+ CHECKPOINT_RESULT_FIELD_NUMBER: _ClassVar[int]
82
+ get_result: ChannelValue
83
+ is_available_result: bool
84
+ checkpoint_result: ChannelValue
85
+ def __init__(self, get_result: _Optional[_Union[ChannelValue, _Mapping]] = ..., is_available_result: bool = ..., checkpoint_result: _Optional[_Union[ChannelValue, _Mapping]] = ...) -> None: ...
86
+
87
+ class Sends(_message.Message):
88
+ __slots__ = ("sends",)
89
+ SENDS_FIELD_NUMBER: _ClassVar[int]
90
+ sends: _containers.RepeatedCompositeFieldContainer[Send]
91
+ def __init__(self, sends: _Optional[_Iterable[_Union[Send, _Mapping]]] = ...) -> None: ...
92
+
93
+ class Send(_message.Message):
94
+ __slots__ = ("node", "arg")
95
+ NODE_FIELD_NUMBER: _ClassVar[int]
96
+ ARG_FIELD_NUMBER: _ClassVar[int]
97
+ node: str
98
+ arg: SerializedValue
99
+ def __init__(self, node: _Optional[str] = ..., arg: _Optional[_Union[SerializedValue, _Mapping]] = ...) -> None: ...
100
+
101
+ class Command(_message.Message):
102
+ __slots__ = ("graph", "update", "resume", "gotos")
103
+ class UpdateEntry(_message.Message):
104
+ __slots__ = ("key", "value")
105
+ KEY_FIELD_NUMBER: _ClassVar[int]
106
+ VALUE_FIELD_NUMBER: _ClassVar[int]
107
+ key: str
108
+ value: SerializedValue
109
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[SerializedValue, _Mapping]] = ...) -> None: ...
110
+ GRAPH_FIELD_NUMBER: _ClassVar[int]
111
+ UPDATE_FIELD_NUMBER: _ClassVar[int]
112
+ RESUME_FIELD_NUMBER: _ClassVar[int]
113
+ GOTOS_FIELD_NUMBER: _ClassVar[int]
114
+ graph: str
115
+ update: _containers.MessageMap[str, SerializedValue]
116
+ resume: Resume
117
+ gotos: _containers.RepeatedCompositeFieldContainer[Goto]
118
+ def __init__(self, graph: _Optional[str] = ..., update: _Optional[_Mapping[str, SerializedValue]] = ..., resume: _Optional[_Union[Resume, _Mapping]] = ..., gotos: _Optional[_Iterable[_Union[Goto, _Mapping]]] = ...) -> None: ...
119
+
120
+ class Resume(_message.Message):
121
+ __slots__ = ("value", "values")
122
+ VALUE_FIELD_NUMBER: _ClassVar[int]
123
+ VALUES_FIELD_NUMBER: _ClassVar[int]
124
+ value: SerializedValue
125
+ values: InterruptValues
126
+ def __init__(self, value: _Optional[_Union[SerializedValue, _Mapping]] = ..., values: _Optional[_Union[InterruptValues, _Mapping]] = ...) -> None: ...
127
+
128
+ class InterruptValues(_message.Message):
129
+ __slots__ = ("values",)
130
+ class ValuesEntry(_message.Message):
131
+ __slots__ = ("key", "value")
132
+ KEY_FIELD_NUMBER: _ClassVar[int]
133
+ VALUE_FIELD_NUMBER: _ClassVar[int]
134
+ key: str
135
+ value: SerializedValue
136
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[SerializedValue, _Mapping]] = ...) -> None: ...
137
+ VALUES_FIELD_NUMBER: _ClassVar[int]
138
+ values: _containers.MessageMap[str, SerializedValue]
139
+ def __init__(self, values: _Optional[_Mapping[str, SerializedValue]] = ...) -> None: ...
140
+
141
+ class Goto(_message.Message):
142
+ __slots__ = ("node_name", "send")
143
+ NODE_NAME_FIELD_NUMBER: _ClassVar[int]
144
+ SEND_FIELD_NUMBER: _ClassVar[int]
145
+ node_name: str
146
+ send: Send
147
+ def __init__(self, node_name: _Optional[str] = ..., send: _Optional[_Union[Send, _Mapping]] = ...) -> None: ...
148
+
149
+ class GraphBubbleUp(_message.Message):
150
+ __slots__ = ()
151
+ def __init__(self) -> None: ...
152
+
153
+ class UserCodeExecutionError(_message.Message):
154
+ __slots__ = ("error_type", "error_message", "traceback")
155
+ ERROR_TYPE_FIELD_NUMBER: _ClassVar[int]
156
+ ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int]
157
+ TRACEBACK_FIELD_NUMBER: _ClassVar[int]
158
+ error_type: str
159
+ error_message: str
160
+ traceback: str
161
+ def __init__(self, error_type: _Optional[str] = ..., error_message: _Optional[str] = ..., traceback: _Optional[str] = ...) -> None: ...
162
+
163
+ class GraphInterrupt(_message.Message):
164
+ __slots__ = ("interrupts",)
165
+ INTERRUPTS_FIELD_NUMBER: _ClassVar[int]
166
+ interrupts: _containers.RepeatedCompositeFieldContainer[Interrupt]
167
+ def __init__(self, interrupts: _Optional[_Iterable[_Union[Interrupt, _Mapping]]] = ...) -> None: ...
168
+
169
+ class Interrupt(_message.Message):
170
+ __slots__ = ("value", "id")
171
+ VALUE_FIELD_NUMBER: _ClassVar[int]
172
+ ID_FIELD_NUMBER: _ClassVar[int]
173
+ value: SerializedValue
174
+ id: str
175
+ def __init__(self, value: _Optional[_Union[SerializedValue, _Mapping]] = ..., id: _Optional[str] = ...) -> None: ...
176
+
177
+ class WrappedInterrupt(_message.Message):
178
+ __slots__ = ("interrupt", "serialized_interrupt")
179
+ INTERRUPT_FIELD_NUMBER: _ClassVar[int]
180
+ SERIALIZED_INTERRUPT_FIELD_NUMBER: _ClassVar[int]
181
+ interrupt: Interrupt
182
+ serialized_interrupt: SerializedValue
183
+ def __init__(self, interrupt: _Optional[_Union[Interrupt, _Mapping]] = ..., serialized_interrupt: _Optional[_Union[SerializedValue, _Mapping]] = ...) -> None: ...
184
+
185
+ class Write(_message.Message):
186
+ __slots__ = ("channel", "value")
187
+ CHANNEL_FIELD_NUMBER: _ClassVar[int]
188
+ VALUE_FIELD_NUMBER: _ClassVar[int]
189
+ channel: str
190
+ value: ChannelValue
191
+ def __init__(self, channel: _Optional[str] = ..., value: _Optional[_Union[ChannelValue, _Mapping]] = ...) -> None: ...
192
+
193
+ class PendingWrite(_message.Message):
194
+ __slots__ = ("task_id", "channel", "value")
195
+ TASK_ID_FIELD_NUMBER: _ClassVar[int]
196
+ CHANNEL_FIELD_NUMBER: _ClassVar[int]
197
+ VALUE_FIELD_NUMBER: _ClassVar[int]
198
+ task_id: str
199
+ channel: str
200
+ value: ChannelValue
201
+ def __init__(self, task_id: _Optional[str] = ..., channel: _Optional[str] = ..., value: _Optional[_Union[ChannelValue, _Mapping]] = ...) -> None: ...
202
+
203
+ class ChannelVersions(_message.Message):
204
+ __slots__ = ("channel_versions",)
205
+ class ChannelVersionsEntry(_message.Message):
206
+ __slots__ = ("key", "value")
207
+ KEY_FIELD_NUMBER: _ClassVar[int]
208
+ VALUE_FIELD_NUMBER: _ClassVar[int]
209
+ key: str
210
+ value: str
211
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ...
212
+ CHANNEL_VERSIONS_FIELD_NUMBER: _ClassVar[int]
213
+ channel_versions: _containers.ScalarMap[str, str]
214
+ def __init__(self, channel_versions: _Optional[_Mapping[str, str]] = ...) -> None: ...
215
+
216
+ class EngineRunnableConfig(_message.Message):
217
+ __slots__ = ("tags", "metadata_json", "run_name", "max_concurrency", "recursion_limit", "run_id", "extra_configurable_json", "extra_json", "runtime", "resuming", "task_id", "thread_id", "checkpoint_map", "checkpoint_id", "checkpoint_ns", "durability", "resume_map", "graph_id", "run_attempt", "server_run_id")
218
+ class MetadataJsonEntry(_message.Message):
219
+ __slots__ = ("key", "value")
220
+ KEY_FIELD_NUMBER: _ClassVar[int]
221
+ VALUE_FIELD_NUMBER: _ClassVar[int]
222
+ key: str
223
+ value: bytes
224
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[bytes] = ...) -> None: ...
225
+ class ExtraConfigurableJsonEntry(_message.Message):
226
+ __slots__ = ("key", "value")
227
+ KEY_FIELD_NUMBER: _ClassVar[int]
228
+ VALUE_FIELD_NUMBER: _ClassVar[int]
229
+ key: str
230
+ value: bytes
231
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[bytes] = ...) -> None: ...
232
+ class ExtraJsonEntry(_message.Message):
233
+ __slots__ = ("key", "value")
234
+ KEY_FIELD_NUMBER: _ClassVar[int]
235
+ VALUE_FIELD_NUMBER: _ClassVar[int]
236
+ key: str
237
+ value: bytes
238
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[bytes] = ...) -> None: ...
239
+ class CheckpointMapEntry(_message.Message):
240
+ __slots__ = ("key", "value")
241
+ KEY_FIELD_NUMBER: _ClassVar[int]
242
+ VALUE_FIELD_NUMBER: _ClassVar[int]
243
+ key: str
244
+ value: str
245
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ...
246
+ class ResumeMapEntry(_message.Message):
247
+ __slots__ = ("key", "value")
248
+ KEY_FIELD_NUMBER: _ClassVar[int]
249
+ VALUE_FIELD_NUMBER: _ClassVar[int]
250
+ key: str
251
+ value: SerializedValue
252
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[SerializedValue, _Mapping]] = ...) -> None: ...
253
+ TAGS_FIELD_NUMBER: _ClassVar[int]
254
+ METADATA_JSON_FIELD_NUMBER: _ClassVar[int]
255
+ RUN_NAME_FIELD_NUMBER: _ClassVar[int]
256
+ MAX_CONCURRENCY_FIELD_NUMBER: _ClassVar[int]
257
+ RECURSION_LIMIT_FIELD_NUMBER: _ClassVar[int]
258
+ RUN_ID_FIELD_NUMBER: _ClassVar[int]
259
+ EXTRA_CONFIGURABLE_JSON_FIELD_NUMBER: _ClassVar[int]
260
+ EXTRA_JSON_FIELD_NUMBER: _ClassVar[int]
261
+ RUNTIME_FIELD_NUMBER: _ClassVar[int]
262
+ RESUMING_FIELD_NUMBER: _ClassVar[int]
263
+ TASK_ID_FIELD_NUMBER: _ClassVar[int]
264
+ THREAD_ID_FIELD_NUMBER: _ClassVar[int]
265
+ CHECKPOINT_MAP_FIELD_NUMBER: _ClassVar[int]
266
+ CHECKPOINT_ID_FIELD_NUMBER: _ClassVar[int]
267
+ CHECKPOINT_NS_FIELD_NUMBER: _ClassVar[int]
268
+ DURABILITY_FIELD_NUMBER: _ClassVar[int]
269
+ RESUME_MAP_FIELD_NUMBER: _ClassVar[int]
270
+ GRAPH_ID_FIELD_NUMBER: _ClassVar[int]
271
+ RUN_ATTEMPT_FIELD_NUMBER: _ClassVar[int]
272
+ SERVER_RUN_ID_FIELD_NUMBER: _ClassVar[int]
273
+ tags: _containers.RepeatedScalarFieldContainer[str]
274
+ metadata_json: _containers.ScalarMap[str, bytes]
275
+ run_name: str
276
+ max_concurrency: int
277
+ recursion_limit: int
278
+ run_id: str
279
+ extra_configurable_json: _containers.ScalarMap[str, bytes]
280
+ extra_json: _containers.ScalarMap[str, bytes]
281
+ runtime: Runtime
282
+ resuming: bool
283
+ task_id: str
284
+ thread_id: str
285
+ checkpoint_map: _containers.ScalarMap[str, str]
286
+ checkpoint_id: str
287
+ checkpoint_ns: str
288
+ durability: Durability
289
+ resume_map: _containers.MessageMap[str, SerializedValue]
290
+ graph_id: str
291
+ run_attempt: int
292
+ server_run_id: str
293
+ def __init__(self, tags: _Optional[_Iterable[str]] = ..., metadata_json: _Optional[_Mapping[str, bytes]] = ..., run_name: _Optional[str] = ..., max_concurrency: _Optional[int] = ..., recursion_limit: _Optional[int] = ..., run_id: _Optional[str] = ..., extra_configurable_json: _Optional[_Mapping[str, bytes]] = ..., extra_json: _Optional[_Mapping[str, bytes]] = ..., runtime: _Optional[_Union[Runtime, _Mapping]] = ..., resuming: bool = ..., task_id: _Optional[str] = ..., thread_id: _Optional[str] = ..., checkpoint_map: _Optional[_Mapping[str, str]] = ..., checkpoint_id: _Optional[str] = ..., checkpoint_ns: _Optional[str] = ..., durability: _Optional[_Union[Durability, str]] = ..., resume_map: _Optional[_Mapping[str, SerializedValue]] = ..., graph_id: _Optional[str] = ..., run_attempt: _Optional[int] = ..., server_run_id: _Optional[str] = ...) -> None: ...
294
+
295
+ class Runtime(_message.Message):
296
+ __slots__ = ("langgraph_context_json",)
297
+ LANGGRAPH_CONTEXT_JSON_FIELD_NUMBER: _ClassVar[int]
298
+ langgraph_context_json: bytes
299
+ def __init__(self, langgraph_context_json: _Optional[bytes] = ...) -> None: ...
300
+
301
+ class Task(_message.Message):
302
+ __slots__ = ("name", "input", "writes", "config", "triggers", "id", "task_path", "writers", "graph_name", "pending_writes", "messages", "stream_subgraphs", "has_subgraphs")
303
+ class InputEntry(_message.Message):
304
+ __slots__ = ("key", "value")
305
+ KEY_FIELD_NUMBER: _ClassVar[int]
306
+ VALUE_FIELD_NUMBER: _ClassVar[int]
307
+ key: str
308
+ value: ChannelValue
309
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ChannelValue, _Mapping]] = ...) -> None: ...
310
+ NAME_FIELD_NUMBER: _ClassVar[int]
311
+ INPUT_FIELD_NUMBER: _ClassVar[int]
312
+ WRITES_FIELD_NUMBER: _ClassVar[int]
313
+ CONFIG_FIELD_NUMBER: _ClassVar[int]
314
+ TRIGGERS_FIELD_NUMBER: _ClassVar[int]
315
+ ID_FIELD_NUMBER: _ClassVar[int]
316
+ TASK_PATH_FIELD_NUMBER: _ClassVar[int]
317
+ WRITERS_FIELD_NUMBER: _ClassVar[int]
318
+ GRAPH_NAME_FIELD_NUMBER: _ClassVar[int]
319
+ PENDING_WRITES_FIELD_NUMBER: _ClassVar[int]
320
+ MESSAGES_FIELD_NUMBER: _ClassVar[int]
321
+ STREAM_SUBGRAPHS_FIELD_NUMBER: _ClassVar[int]
322
+ HAS_SUBGRAPHS_FIELD_NUMBER: _ClassVar[int]
323
+ name: str
324
+ input: _containers.MessageMap[str, ChannelValue]
325
+ writes: _containers.RepeatedCompositeFieldContainer[Write]
326
+ config: EngineRunnableConfig
327
+ triggers: _containers.RepeatedScalarFieldContainer[str]
328
+ id: str
329
+ task_path: _containers.RepeatedCompositeFieldContainer[PathSegment]
330
+ writers: _containers.RepeatedScalarFieldContainer[str]
331
+ graph_name: str
332
+ pending_writes: _containers.RepeatedCompositeFieldContainer[PendingWrite]
333
+ messages: _containers.RepeatedCompositeFieldContainer[ChatMessageEnvelope]
334
+ stream_subgraphs: bool
335
+ has_subgraphs: bool
336
+ def __init__(self, name: _Optional[str] = ..., input: _Optional[_Mapping[str, ChannelValue]] = ..., writes: _Optional[_Iterable[_Union[Write, _Mapping]]] = ..., config: _Optional[_Union[EngineRunnableConfig, _Mapping]] = ..., triggers: _Optional[_Iterable[str]] = ..., id: _Optional[str] = ..., task_path: _Optional[_Iterable[_Union[PathSegment, _Mapping]]] = ..., writers: _Optional[_Iterable[str]] = ..., graph_name: _Optional[str] = ..., pending_writes: _Optional[_Iterable[_Union[PendingWrite, _Mapping]]] = ..., messages: _Optional[_Iterable[_Union[ChatMessageEnvelope, _Mapping]]] = ..., stream_subgraphs: bool = ..., has_subgraphs: bool = ...) -> None: ...
337
+
338
+ class PregelTaskSnapshot(_message.Message):
339
+ __slots__ = ("id", "name", "path", "interrupts", "state", "result", "error")
340
+ ID_FIELD_NUMBER: _ClassVar[int]
341
+ NAME_FIELD_NUMBER: _ClassVar[int]
342
+ PATH_FIELD_NUMBER: _ClassVar[int]
343
+ INTERRUPTS_FIELD_NUMBER: _ClassVar[int]
344
+ STATE_FIELD_NUMBER: _ClassVar[int]
345
+ RESULT_FIELD_NUMBER: _ClassVar[int]
346
+ ERROR_FIELD_NUMBER: _ClassVar[int]
347
+ id: str
348
+ name: str
349
+ path: _containers.RepeatedCompositeFieldContainer[PathSegment]
350
+ interrupts: _containers.RepeatedCompositeFieldContainer[Interrupt]
351
+ state: _struct_pb2.Struct
352
+ result: _struct_pb2.Struct
353
+ error: SerializedValue
354
+ def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., path: _Optional[_Iterable[_Union[PathSegment, _Mapping]]] = ..., interrupts: _Optional[_Iterable[_Union[Interrupt, _Mapping]]] = ..., state: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., result: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., error: _Optional[_Union[SerializedValue, _Mapping]] = ...) -> None: ...
355
+
356
+ class Checkpoint(_message.Message):
357
+ __slots__ = ("v", "id", "channel_values", "channel_versions", "versions_seen", "ts")
358
+ class ChannelValuesEntry(_message.Message):
359
+ __slots__ = ("key", "value")
360
+ KEY_FIELD_NUMBER: _ClassVar[int]
361
+ VALUE_FIELD_NUMBER: _ClassVar[int]
362
+ key: str
363
+ value: ChannelValue
364
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ChannelValue, _Mapping]] = ...) -> None: ...
365
+ class ChannelVersionsEntry(_message.Message):
366
+ __slots__ = ("key", "value")
367
+ KEY_FIELD_NUMBER: _ClassVar[int]
368
+ VALUE_FIELD_NUMBER: _ClassVar[int]
369
+ key: str
370
+ value: str
371
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ...
372
+ class VersionsSeenEntry(_message.Message):
373
+ __slots__ = ("key", "value")
374
+ KEY_FIELD_NUMBER: _ClassVar[int]
375
+ VALUE_FIELD_NUMBER: _ClassVar[int]
376
+ key: str
377
+ value: ChannelVersions
378
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[_Union[ChannelVersions, _Mapping]] = ...) -> None: ...
379
+ V_FIELD_NUMBER: _ClassVar[int]
380
+ ID_FIELD_NUMBER: _ClassVar[int]
381
+ CHANNEL_VALUES_FIELD_NUMBER: _ClassVar[int]
382
+ CHANNEL_VERSIONS_FIELD_NUMBER: _ClassVar[int]
383
+ VERSIONS_SEEN_FIELD_NUMBER: _ClassVar[int]
384
+ TS_FIELD_NUMBER: _ClassVar[int]
385
+ v: int
386
+ id: str
387
+ channel_values: _containers.MessageMap[str, ChannelValue]
388
+ channel_versions: _containers.ScalarMap[str, str]
389
+ versions_seen: _containers.MessageMap[str, ChannelVersions]
390
+ ts: str
391
+ def __init__(self, v: _Optional[int] = ..., id: _Optional[str] = ..., channel_values: _Optional[_Mapping[str, ChannelValue]] = ..., channel_versions: _Optional[_Mapping[str, str]] = ..., versions_seen: _Optional[_Mapping[str, ChannelVersions]] = ..., ts: _Optional[str] = ...) -> None: ...
392
+
393
+ class CheckpointMetadata(_message.Message):
394
+ __slots__ = ("source", "step", "parents", "run_id")
395
+ class CheckpointSource(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
396
+ __slots__ = ()
397
+ unknown: _ClassVar[CheckpointMetadata.CheckpointSource]
398
+ loop: _ClassVar[CheckpointMetadata.CheckpointSource]
399
+ input: _ClassVar[CheckpointMetadata.CheckpointSource]
400
+ update: _ClassVar[CheckpointMetadata.CheckpointSource]
401
+ fork: _ClassVar[CheckpointMetadata.CheckpointSource]
402
+ unknown: CheckpointMetadata.CheckpointSource
403
+ loop: CheckpointMetadata.CheckpointSource
404
+ input: CheckpointMetadata.CheckpointSource
405
+ update: CheckpointMetadata.CheckpointSource
406
+ fork: CheckpointMetadata.CheckpointSource
407
+ class ParentsEntry(_message.Message):
408
+ __slots__ = ("key", "value")
409
+ KEY_FIELD_NUMBER: _ClassVar[int]
410
+ VALUE_FIELD_NUMBER: _ClassVar[int]
411
+ key: str
412
+ value: str
413
+ def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ...
414
+ SOURCE_FIELD_NUMBER: _ClassVar[int]
415
+ STEP_FIELD_NUMBER: _ClassVar[int]
416
+ PARENTS_FIELD_NUMBER: _ClassVar[int]
417
+ RUN_ID_FIELD_NUMBER: _ClassVar[int]
418
+ source: CheckpointMetadata.CheckpointSource
419
+ step: int
420
+ parents: _containers.ScalarMap[str, str]
421
+ run_id: str
422
+ def __init__(self, source: _Optional[_Union[CheckpointMetadata.CheckpointSource, str]] = ..., step: _Optional[int] = ..., parents: _Optional[_Mapping[str, str]] = ..., run_id: _Optional[str] = ...) -> None: ...
423
+
424
+ class CheckpointTuple(_message.Message):
425
+ __slots__ = ("config", "checkpoint", "metadata", "parent_config", "pending_writes")
426
+ CONFIG_FIELD_NUMBER: _ClassVar[int]
427
+ CHECKPOINT_FIELD_NUMBER: _ClassVar[int]
428
+ METADATA_FIELD_NUMBER: _ClassVar[int]
429
+ PARENT_CONFIG_FIELD_NUMBER: _ClassVar[int]
430
+ PENDING_WRITES_FIELD_NUMBER: _ClassVar[int]
431
+ config: EngineRunnableConfig
432
+ checkpoint: Checkpoint
433
+ metadata: CheckpointMetadata
434
+ parent_config: EngineRunnableConfig
435
+ pending_writes: _containers.RepeatedCompositeFieldContainer[PendingWrite]
436
+ def __init__(self, config: _Optional[_Union[EngineRunnableConfig, _Mapping]] = ..., checkpoint: _Optional[_Union[Checkpoint, _Mapping]] = ..., metadata: _Optional[_Union[CheckpointMetadata, _Mapping]] = ..., parent_config: _Optional[_Union[EngineRunnableConfig, _Mapping]] = ..., pending_writes: _Optional[_Iterable[_Union[PendingWrite, _Mapping]]] = ...) -> None: ...
437
+
438
+ class Updates(_message.Message):
439
+ __slots__ = ("checkpoint", "channels", "updated_channels")
440
+ CHECKPOINT_FIELD_NUMBER: _ClassVar[int]
441
+ CHANNELS_FIELD_NUMBER: _ClassVar[int]
442
+ UPDATED_CHANNELS_FIELD_NUMBER: _ClassVar[int]
443
+ checkpoint: Checkpoint
444
+ channels: Channels
445
+ updated_channels: _containers.RepeatedScalarFieldContainer[str]
446
+ def __init__(self, checkpoint: _Optional[_Union[Checkpoint, _Mapping]] = ..., channels: _Optional[_Union[Channels, _Mapping]] = ..., updated_channels: _Optional[_Iterable[str]] = ...) -> None: ...
447
+
448
+ class ToolCall(_message.Message):
449
+ __slots__ = ("name", "args", "id")
450
+ NAME_FIELD_NUMBER: _ClassVar[int]
451
+ ARGS_FIELD_NUMBER: _ClassVar[int]
452
+ ID_FIELD_NUMBER: _ClassVar[int]
453
+ name: str
454
+ args: _struct_pb2.Struct
455
+ id: _wrappers_pb2.StringValue
456
+ def __init__(self, name: _Optional[str] = ..., args: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., id: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ...) -> None: ...
457
+
458
+ class ToolCallChunk(_message.Message):
459
+ __slots__ = ("name", "args_json", "id", "index")
460
+ NAME_FIELD_NUMBER: _ClassVar[int]
461
+ ARGS_JSON_FIELD_NUMBER: _ClassVar[int]
462
+ ID_FIELD_NUMBER: _ClassVar[int]
463
+ INDEX_FIELD_NUMBER: _ClassVar[int]
464
+ name: _wrappers_pb2.StringValue
465
+ args_json: _wrappers_pb2.StringValue
466
+ id: _wrappers_pb2.StringValue
467
+ index: _wrappers_pb2.Int32Value
468
+ def __init__(self, name: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ..., args_json: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ..., id: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ..., index: _Optional[_Union[_wrappers_pb2.Int32Value, _Mapping]] = ...) -> None: ...
469
+
470
+ class InvalidToolCall(_message.Message):
471
+ __slots__ = ("name", "args", "id", "error")
472
+ NAME_FIELD_NUMBER: _ClassVar[int]
473
+ ARGS_FIELD_NUMBER: _ClassVar[int]
474
+ ID_FIELD_NUMBER: _ClassVar[int]
475
+ ERROR_FIELD_NUMBER: _ClassVar[int]
476
+ name: _wrappers_pb2.StringValue
477
+ args: _wrappers_pb2.StringValue
478
+ id: _wrappers_pb2.StringValue
479
+ error: _wrappers_pb2.StringValue
480
+ def __init__(self, name: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ..., args: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ..., id: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ..., error: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ...) -> None: ...
481
+
482
+ class InputTokenDetails(_message.Message):
483
+ __slots__ = ("audio", "cache_creation", "cache_read")
484
+ AUDIO_FIELD_NUMBER: _ClassVar[int]
485
+ CACHE_CREATION_FIELD_NUMBER: _ClassVar[int]
486
+ CACHE_READ_FIELD_NUMBER: _ClassVar[int]
487
+ audio: _wrappers_pb2.Int64Value
488
+ cache_creation: _wrappers_pb2.Int64Value
489
+ cache_read: _wrappers_pb2.Int64Value
490
+ def __init__(self, audio: _Optional[_Union[_wrappers_pb2.Int64Value, _Mapping]] = ..., cache_creation: _Optional[_Union[_wrappers_pb2.Int64Value, _Mapping]] = ..., cache_read: _Optional[_Union[_wrappers_pb2.Int64Value, _Mapping]] = ...) -> None: ...
491
+
492
+ class OutputTokenDetails(_message.Message):
493
+ __slots__ = ("audio", "reasoning")
494
+ AUDIO_FIELD_NUMBER: _ClassVar[int]
495
+ REASONING_FIELD_NUMBER: _ClassVar[int]
496
+ audio: _wrappers_pb2.Int64Value
497
+ reasoning: _wrappers_pb2.Int64Value
498
+ def __init__(self, audio: _Optional[_Union[_wrappers_pb2.Int64Value, _Mapping]] = ..., reasoning: _Optional[_Union[_wrappers_pb2.Int64Value, _Mapping]] = ...) -> None: ...
499
+
500
+ class UsageMetadata(_message.Message):
501
+ __slots__ = ("input_tokens", "output_tokens", "total_tokens", "input_token_details", "output_token_details")
502
+ INPUT_TOKENS_FIELD_NUMBER: _ClassVar[int]
503
+ OUTPUT_TOKENS_FIELD_NUMBER: _ClassVar[int]
504
+ TOTAL_TOKENS_FIELD_NUMBER: _ClassVar[int]
505
+ INPUT_TOKEN_DETAILS_FIELD_NUMBER: _ClassVar[int]
506
+ OUTPUT_TOKEN_DETAILS_FIELD_NUMBER: _ClassVar[int]
507
+ input_tokens: int
508
+ output_tokens: int
509
+ total_tokens: int
510
+ input_token_details: InputTokenDetails
511
+ output_token_details: OutputTokenDetails
512
+ def __init__(self, input_tokens: _Optional[int] = ..., output_tokens: _Optional[int] = ..., total_tokens: _Optional[int] = ..., input_token_details: _Optional[_Union[InputTokenDetails, _Mapping]] = ..., output_token_details: _Optional[_Union[OutputTokenDetails, _Mapping]] = ...) -> None: ...
513
+
514
+ class ResponseMetadata(_message.Message):
515
+ __slots__ = ("data",)
516
+ DATA_FIELD_NUMBER: _ClassVar[int]
517
+ data: _struct_pb2.Struct
518
+ def __init__(self, data: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ...) -> None: ...
519
+
520
+ class AIFields(_message.Message):
521
+ __slots__ = ("usage_metadata", "response_metadata", "tool_calls", "tool_call_chunks", "invalid_tool_calls", "reasoning_content")
522
+ USAGE_METADATA_FIELD_NUMBER: _ClassVar[int]
523
+ RESPONSE_METADATA_FIELD_NUMBER: _ClassVar[int]
524
+ TOOL_CALLS_FIELD_NUMBER: _ClassVar[int]
525
+ TOOL_CALL_CHUNKS_FIELD_NUMBER: _ClassVar[int]
526
+ INVALID_TOOL_CALLS_FIELD_NUMBER: _ClassVar[int]
527
+ REASONING_CONTENT_FIELD_NUMBER: _ClassVar[int]
528
+ usage_metadata: UsageMetadata
529
+ response_metadata: ResponseMetadata
530
+ tool_calls: _containers.RepeatedCompositeFieldContainer[ToolCall]
531
+ tool_call_chunks: _containers.RepeatedCompositeFieldContainer[ToolCallChunk]
532
+ invalid_tool_calls: _containers.RepeatedCompositeFieldContainer[InvalidToolCall]
533
+ reasoning_content: _wrappers_pb2.StringValue
534
+ def __init__(self, usage_metadata: _Optional[_Union[UsageMetadata, _Mapping]] = ..., response_metadata: _Optional[_Union[ResponseMetadata, _Mapping]] = ..., tool_calls: _Optional[_Iterable[_Union[ToolCall, _Mapping]]] = ..., tool_call_chunks: _Optional[_Iterable[_Union[ToolCallChunk, _Mapping]]] = ..., invalid_tool_calls: _Optional[_Iterable[_Union[InvalidToolCall, _Mapping]]] = ..., reasoning_content: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ...) -> None: ...
535
+
536
+ class ToolFields(_message.Message):
537
+ __slots__ = ("tool_call_id", "status")
538
+ TOOL_CALL_ID_FIELD_NUMBER: _ClassVar[int]
539
+ STATUS_FIELD_NUMBER: _ClassVar[int]
540
+ tool_call_id: _wrappers_pb2.StringValue
541
+ status: str
542
+ def __init__(self, tool_call_id: _Optional[_Union[_wrappers_pb2.StringValue, _Mapping]] = ..., status: _Optional[str] = ...) -> None: ...
543
+
544
+ class HumanFields(_message.Message):
545
+ __slots__ = ()
546
+ def __init__(self) -> None: ...
547
+
548
+ class ChatMessage(_message.Message):
549
+ __slots__ = ("id", "name", "type", "content", "additional_kwargs", "ai", "tool", "human", "extensions")
550
+ ID_FIELD_NUMBER: _ClassVar[int]
551
+ NAME_FIELD_NUMBER: _ClassVar[int]
552
+ TYPE_FIELD_NUMBER: _ClassVar[int]
553
+ CONTENT_FIELD_NUMBER: _ClassVar[int]
554
+ ADDITIONAL_KWARGS_FIELD_NUMBER: _ClassVar[int]
555
+ AI_FIELD_NUMBER: _ClassVar[int]
556
+ TOOL_FIELD_NUMBER: _ClassVar[int]
557
+ HUMAN_FIELD_NUMBER: _ClassVar[int]
558
+ EXTENSIONS_FIELD_NUMBER: _ClassVar[int]
559
+ id: str
560
+ name: str
561
+ type: str
562
+ content: _struct_pb2.Value
563
+ additional_kwargs: _struct_pb2.Struct
564
+ ai: AIFields
565
+ tool: ToolFields
566
+ human: HumanFields
567
+ extensions: _struct_pb2.Struct
568
+ def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., type: _Optional[str] = ..., content: _Optional[_Union[_struct_pb2.Value, _Mapping]] = ..., additional_kwargs: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., ai: _Optional[_Union[AIFields, _Mapping]] = ..., tool: _Optional[_Union[ToolFields, _Mapping]] = ..., human: _Optional[_Union[HumanFields, _Mapping]] = ..., extensions: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ...) -> None: ...
569
+
570
+ class ChatMessageEnvelope(_message.Message):
571
+ __slots__ = ("is_streaming_chunk", "namespace", "message", "metadata")
572
+ IS_STREAMING_CHUNK_FIELD_NUMBER: _ClassVar[int]
573
+ NAMESPACE_FIELD_NUMBER: _ClassVar[int]
574
+ MESSAGE_FIELD_NUMBER: _ClassVar[int]
575
+ METADATA_FIELD_NUMBER: _ClassVar[int]
576
+ is_streaming_chunk: bool
577
+ namespace: _containers.RepeatedScalarFieldContainer[str]
578
+ message: ChatMessage
579
+ metadata: bytes
580
+ def __init__(self, is_streaming_chunk: bool = ..., namespace: _Optional[_Iterable[str]] = ..., message: _Optional[_Union[ChatMessage, _Mapping]] = ..., metadata: _Optional[bytes] = ...) -> None: ...
581
+
582
+ class StateSnapshot(_message.Message):
583
+ __slots__ = ("values", "next", "config", "metadata", "created_at", "parent_config", "tasks", "interrupts")
584
+ VALUES_FIELD_NUMBER: _ClassVar[int]
585
+ NEXT_FIELD_NUMBER: _ClassVar[int]
586
+ CONFIG_FIELD_NUMBER: _ClassVar[int]
587
+ METADATA_FIELD_NUMBER: _ClassVar[int]
588
+ CREATED_AT_FIELD_NUMBER: _ClassVar[int]
589
+ PARENT_CONFIG_FIELD_NUMBER: _ClassVar[int]
590
+ TASKS_FIELD_NUMBER: _ClassVar[int]
591
+ INTERRUPTS_FIELD_NUMBER: _ClassVar[int]
592
+ values: _struct_pb2.Struct
593
+ next: _containers.RepeatedScalarFieldContainer[str]
594
+ config: EngineRunnableConfig
595
+ metadata: CheckpointMetadata
596
+ created_at: str
597
+ parent_config: EngineRunnableConfig
598
+ tasks: _containers.RepeatedCompositeFieldContainer[PregelTaskSnapshot]
599
+ interrupts: _containers.RepeatedCompositeFieldContainer[Interrupt]
600
+ def __init__(self, values: _Optional[_Union[_struct_pb2.Struct, _Mapping]] = ..., next: _Optional[_Iterable[str]] = ..., config: _Optional[_Union[EngineRunnableConfig, _Mapping]] = ..., metadata: _Optional[_Union[CheckpointMetadata, _Mapping]] = ..., created_at: _Optional[str] = ..., parent_config: _Optional[_Union[EngineRunnableConfig, _Mapping]] = ..., tasks: _Optional[_Iterable[_Union[PregelTaskSnapshot, _Mapping]]] = ..., interrupts: _Optional[_Iterable[_Union[Interrupt, _Mapping]]] = ...) -> None: ...
601
+
602
+ class StateUpdate(_message.Message):
603
+ __slots__ = ("values", "as_node", "task_id")
604
+ VALUES_FIELD_NUMBER: _ClassVar[int]
605
+ AS_NODE_FIELD_NUMBER: _ClassVar[int]
606
+ TASK_ID_FIELD_NUMBER: _ClassVar[int]
607
+ values: SerializedValue
608
+ as_node: str
609
+ task_id: str
610
+ def __init__(self, values: _Optional[_Union[SerializedValue, _Mapping]] = ..., as_node: _Optional[str] = ..., task_id: _Optional[str] = ...) -> None: ...
611
+
612
+ class SuperstepUpdates(_message.Message):
613
+ __slots__ = ("updates",)
614
+ UPDATES_FIELD_NUMBER: _ClassVar[int]
615
+ updates: _containers.RepeatedCompositeFieldContainer[StateUpdate]
616
+ def __init__(self, updates: _Optional[_Iterable[_Union[StateUpdate, _Mapping]]] = ...) -> None: ...
617
+
618
+ class StringOrSlice(_message.Message):
619
+ __slots__ = ("values", "is_string")
620
+ VALUES_FIELD_NUMBER: _ClassVar[int]
621
+ IS_STRING_FIELD_NUMBER: _ClassVar[int]
622
+ values: _containers.RepeatedScalarFieldContainer[str]
623
+ is_string: bool
624
+ def __init__(self, values: _Optional[_Iterable[str]] = ..., is_string: bool = ...) -> None: ...
625
+
626
+ class PathSegment(_message.Message):
627
+ __slots__ = ("string_value", "int_value", "bool_value")
628
+ STRING_VALUE_FIELD_NUMBER: _ClassVar[int]
629
+ INT_VALUE_FIELD_NUMBER: _ClassVar[int]
630
+ BOOL_VALUE_FIELD_NUMBER: _ClassVar[int]
631
+ string_value: str
632
+ int_value: int
633
+ bool_value: bool
634
+ def __init__(self, string_value: _Optional[str] = ..., int_value: _Optional[int] = ..., bool_value: bool = ...) -> None: ...
@@ -0,0 +1,24 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+ import warnings
5
+
6
+
7
+ GRPC_GENERATED_VERSION = '1.75.1'
8
+ GRPC_VERSION = grpc.__version__
9
+ _version_not_supported = False
10
+
11
+ try:
12
+ from grpc._utilities import first_version_is_lower
13
+ _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
14
+ except ImportError:
15
+ _version_not_supported = True
16
+
17
+ if _version_not_supported:
18
+ raise RuntimeError(
19
+ f'The grpc package installed is at version {GRPC_VERSION},'
20
+ + f' but the generated code in engine_common_pb2_grpc.py depends on'
21
+ + f' grpcio>={GRPC_GENERATED_VERSION}.'
22
+ + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
23
+ + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
24
+ )