modal 1.0.6.dev38__py3-none-any.whl → 1.0.6.dev41__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 modal might be problematic. Click here for more details.

@@ -0,0 +1,252 @@
1
+ import modal.client
2
+ import typing
3
+ import typing_extensions
4
+
5
+ class _FlashManager:
6
+ def __init__(self, client: modal.client._Client, port: int, health_check_url: typing.Optional[str] = None):
7
+ """Initialize self. See help(type(self)) for accurate signature."""
8
+ ...
9
+
10
+ async def _start(self): ...
11
+ async def _run_heartbeat(self, host: str, port: int): ...
12
+ def get_container_url(self): ...
13
+ async def stop(self): ...
14
+ async def close(self): ...
15
+
16
+ SUPERSELF = typing.TypeVar("SUPERSELF", covariant=True)
17
+
18
+ class FlashManager:
19
+ def __init__(self, client: modal.client.Client, port: int, health_check_url: typing.Optional[str] = None): ...
20
+
21
+ class ___start_spec(typing_extensions.Protocol[SUPERSELF]):
22
+ def __call__(self, /): ...
23
+ async def aio(self, /): ...
24
+
25
+ _start: ___start_spec[typing_extensions.Self]
26
+
27
+ class ___run_heartbeat_spec(typing_extensions.Protocol[SUPERSELF]):
28
+ def __call__(self, /, host: str, port: int): ...
29
+ async def aio(self, /, host: str, port: int): ...
30
+
31
+ _run_heartbeat: ___run_heartbeat_spec[typing_extensions.Self]
32
+
33
+ def get_container_url(self): ...
34
+
35
+ class __stop_spec(typing_extensions.Protocol[SUPERSELF]):
36
+ def __call__(self, /): ...
37
+ async def aio(self, /): ...
38
+
39
+ stop: __stop_spec[typing_extensions.Self]
40
+
41
+ class __close_spec(typing_extensions.Protocol[SUPERSELF]):
42
+ def __call__(self, /): ...
43
+ async def aio(self, /): ...
44
+
45
+ close: __close_spec[typing_extensions.Self]
46
+
47
+ class __flash_forward_spec(typing_extensions.Protocol):
48
+ def __call__(self, /, port: int, health_check_url: typing.Optional[str] = None) -> FlashManager:
49
+ """Forward a port to the Modal Flash service, exposing that port as a stable web endpoint.
50
+
51
+ This is a highly experimental method that can break or be removed at any time without warning.
52
+ Do not use this method unless explicitly instructed to do so by Modal support.
53
+ """
54
+ ...
55
+
56
+ async def aio(self, /, port: int, health_check_url: typing.Optional[str] = None) -> FlashManager:
57
+ """Forward a port to the Modal Flash service, exposing that port as a stable web endpoint.
58
+
59
+ This is a highly experimental method that can break or be removed at any time without warning.
60
+ Do not use this method unless explicitly instructed to do so by Modal support.
61
+ """
62
+ ...
63
+
64
+ flash_forward: __flash_forward_spec
65
+
66
+ class _FlashPrometheusAutoscaler:
67
+ def __init__(
68
+ self,
69
+ client: modal.client._Client,
70
+ app_name: str,
71
+ cls_name: str,
72
+ metrics_endpoint: str,
73
+ target_metric: str,
74
+ target_metric_value: float,
75
+ min_containers: typing.Optional[int],
76
+ max_containers: typing.Optional[int],
77
+ scale_up_tolerance: float,
78
+ scale_down_tolerance: float,
79
+ scale_up_stabilization_window_seconds: int,
80
+ scale_down_stabilization_window_seconds: int,
81
+ autoscaling_interval_seconds: int,
82
+ ):
83
+ """Initialize self. See help(type(self)) for accurate signature."""
84
+ ...
85
+
86
+ async def start(self): ...
87
+ async def _run_autoscaler_loop(self): ...
88
+ async def _compute_target_containers(self, current_replicas: int) -> int: ...
89
+ async def _get_metrics(self, url: str) -> typing.Optional[dict[str, list[typing.Any]]]: ...
90
+ async def _get_all_containers(self): ...
91
+ def _make_scaling_decision(
92
+ self,
93
+ current_replicas: int,
94
+ autoscaling_decisions: list[tuple[float, int]],
95
+ scale_up_stabilization_window_seconds: int = 0,
96
+ scale_down_stabilization_window_seconds: int = 300,
97
+ min_containers: typing.Optional[int] = None,
98
+ max_containers: typing.Optional[int] = None,
99
+ ) -> int:
100
+ """Return the target number of containers following (simplified) Kubernetes HPA
101
+ stabilization-window semantics.
102
+
103
+ Args:
104
+ current_replicas: Current number of running Pods/containers.
105
+ autoscaling_decisions: List of (timestamp, desired_replicas) pairs, where
106
+ timestamp is a UNIX epoch float (seconds).
107
+ The list *must* contain at least one entry and should
108
+ already include the most-recent measurement.
109
+ scale_up_stabilization_window_seconds: 0 disables the up-window.
110
+ scale_down_stabilization_window_seconds: 0 disables the down-window.
111
+ min_containers / max_containers: Clamp the final decision to this range.
112
+
113
+ Returns:
114
+ The target number of containers.
115
+ """
116
+ ...
117
+
118
+ async def stop(self): ...
119
+
120
+ class FlashPrometheusAutoscaler:
121
+ def __init__(
122
+ self,
123
+ client: modal.client.Client,
124
+ app_name: str,
125
+ cls_name: str,
126
+ metrics_endpoint: str,
127
+ target_metric: str,
128
+ target_metric_value: float,
129
+ min_containers: typing.Optional[int],
130
+ max_containers: typing.Optional[int],
131
+ scale_up_tolerance: float,
132
+ scale_down_tolerance: float,
133
+ scale_up_stabilization_window_seconds: int,
134
+ scale_down_stabilization_window_seconds: int,
135
+ autoscaling_interval_seconds: int,
136
+ ): ...
137
+
138
+ class __start_spec(typing_extensions.Protocol[SUPERSELF]):
139
+ def __call__(self, /): ...
140
+ async def aio(self, /): ...
141
+
142
+ start: __start_spec[typing_extensions.Self]
143
+
144
+ class ___run_autoscaler_loop_spec(typing_extensions.Protocol[SUPERSELF]):
145
+ def __call__(self, /): ...
146
+ async def aio(self, /): ...
147
+
148
+ _run_autoscaler_loop: ___run_autoscaler_loop_spec[typing_extensions.Self]
149
+
150
+ class ___compute_target_containers_spec(typing_extensions.Protocol[SUPERSELF]):
151
+ def __call__(self, /, current_replicas: int) -> int: ...
152
+ async def aio(self, /, current_replicas: int) -> int: ...
153
+
154
+ _compute_target_containers: ___compute_target_containers_spec[typing_extensions.Self]
155
+
156
+ class ___get_metrics_spec(typing_extensions.Protocol[SUPERSELF]):
157
+ def __call__(self, /, url: str) -> typing.Optional[dict[str, list[typing.Any]]]: ...
158
+ async def aio(self, /, url: str) -> typing.Optional[dict[str, list[typing.Any]]]: ...
159
+
160
+ _get_metrics: ___get_metrics_spec[typing_extensions.Self]
161
+
162
+ class ___get_all_containers_spec(typing_extensions.Protocol[SUPERSELF]):
163
+ def __call__(self, /): ...
164
+ async def aio(self, /): ...
165
+
166
+ _get_all_containers: ___get_all_containers_spec[typing_extensions.Self]
167
+
168
+ def _make_scaling_decision(
169
+ self,
170
+ current_replicas: int,
171
+ autoscaling_decisions: list[tuple[float, int]],
172
+ scale_up_stabilization_window_seconds: int = 0,
173
+ scale_down_stabilization_window_seconds: int = 300,
174
+ min_containers: typing.Optional[int] = None,
175
+ max_containers: typing.Optional[int] = None,
176
+ ) -> int:
177
+ """Return the target number of containers following (simplified) Kubernetes HPA
178
+ stabilization-window semantics.
179
+
180
+ Args:
181
+ current_replicas: Current number of running Pods/containers.
182
+ autoscaling_decisions: List of (timestamp, desired_replicas) pairs, where
183
+ timestamp is a UNIX epoch float (seconds).
184
+ The list *must* contain at least one entry and should
185
+ already include the most-recent measurement.
186
+ scale_up_stabilization_window_seconds: 0 disables the up-window.
187
+ scale_down_stabilization_window_seconds: 0 disables the down-window.
188
+ min_containers / max_containers: Clamp the final decision to this range.
189
+
190
+ Returns:
191
+ The target number of containers.
192
+ """
193
+ ...
194
+
195
+ class __stop_spec(typing_extensions.Protocol[SUPERSELF]):
196
+ def __call__(self, /): ...
197
+ async def aio(self, /): ...
198
+
199
+ stop: __stop_spec[typing_extensions.Self]
200
+
201
+ class __flash_prometheus_autoscaler_spec(typing_extensions.Protocol):
202
+ def __call__(
203
+ self,
204
+ /,
205
+ app_name: str,
206
+ cls_name: str,
207
+ metrics_endpoint: str,
208
+ target_metric: str,
209
+ target_metric_value: float,
210
+ min_containers: typing.Optional[int] = None,
211
+ max_containers: typing.Optional[int] = None,
212
+ scale_up_tolerance: float = 0.1,
213
+ scale_down_tolerance: float = 0.1,
214
+ scale_up_stabilization_window_seconds: int = 0,
215
+ scale_down_stabilization_window_seconds: int = 300,
216
+ autoscaling_interval_seconds: int = 15,
217
+ ) -> FlashPrometheusAutoscaler:
218
+ """Autoscale a Flash service based on containers' Prometheus metrics.
219
+
220
+ The package `prometheus_client` is required to use this method.
221
+
222
+ This is a highly experimental method that can break or be removed at any time without warning.
223
+ Do not use this method unless explicitly instructed to do so by Modal support.
224
+ """
225
+ ...
226
+
227
+ async def aio(
228
+ self,
229
+ /,
230
+ app_name: str,
231
+ cls_name: str,
232
+ metrics_endpoint: str,
233
+ target_metric: str,
234
+ target_metric_value: float,
235
+ min_containers: typing.Optional[int] = None,
236
+ max_containers: typing.Optional[int] = None,
237
+ scale_up_tolerance: float = 0.1,
238
+ scale_down_tolerance: float = 0.1,
239
+ scale_up_stabilization_window_seconds: int = 0,
240
+ scale_down_stabilization_window_seconds: int = 300,
241
+ autoscaling_interval_seconds: int = 15,
242
+ ) -> FlashPrometheusAutoscaler:
243
+ """Autoscale a Flash service based on containers' Prometheus metrics.
244
+
245
+ The package `prometheus_client` is required to use this method.
246
+
247
+ This is a highly experimental method that can break or be removed at any time without warning.
248
+ Do not use this method unless explicitly instructed to do so by Modal support.
249
+ """
250
+ ...
251
+
252
+ flash_prometheus_autoscaler: __flash_prometheus_autoscaler_spec
modal/image.py CHANGED
@@ -23,6 +23,7 @@ from typing import (
23
23
 
24
24
  from google.protobuf.message import Message
25
25
  from grpclib.exceptions import GRPCError, StreamTerminatedError
26
+ from typing_extensions import Self
26
27
 
27
28
  from modal_proto import api_pb2
28
29
 
@@ -42,7 +43,7 @@ from .client import _Client
42
43
  from .cloud_bucket_mount import _CloudBucketMount
43
44
  from .config import config, logger, user_config_path
44
45
  from .environments import _get_environment_cached
45
- from .exception import InvalidError, NotFoundError, RemoteError, VersionError
46
+ from .exception import ExecutionError, InvalidError, NotFoundError, RemoteError, VersionError
46
47
  from .file_pattern_matcher import NON_PYTHON_FILES, FilePatternMatcher, _ignore_fn
47
48
  from .gpu import GPU_T, parse_gpu_config
48
49
  from .mount import _Mount, python_standalone_mount_name
@@ -2295,5 +2296,15 @@ class _Image(_Object, type_prefix="im"):
2295
2296
  if task_log.data:
2296
2297
  yield task_log.data
2297
2298
 
2299
+ async def hydrate(self, client: Optional[_Client] = None) -> Self:
2300
+ """mdmd:hidden"""
2301
+ # Image inherits hydrate() from Object but can't be hydrated on demand
2302
+ # Overriding the method lets us hide it from the docs and raise a better error message
2303
+ if not self.is_hydrated:
2304
+ raise ExecutionError(
2305
+ "Images cannot currently be hydrated on demand; you can build an Image by running an App that uses it."
2306
+ )
2307
+ return self
2308
+
2298
2309
 
2299
2310
  Image = synchronize_api(_Image)
modal/image.pyi CHANGED
@@ -940,6 +940,10 @@ class _Image(modal._object._Object):
940
940
  """
941
941
  ...
942
942
 
943
+ async def hydrate(self, client: typing.Optional[modal.client._Client] = None) -> typing_extensions.Self:
944
+ """mdmd:hidden"""
945
+ ...
946
+
943
947
  SUPERSELF = typing.TypeVar("SUPERSELF", covariant=True)
944
948
 
945
949
  class Image(modal.object.Object):
@@ -1781,4 +1785,15 @@ class Image(modal.object.Object):
1781
1785
 
1782
1786
  _logs: ___logs_spec[typing_extensions.Self]
1783
1787
 
1788
+ class __hydrate_spec(typing_extensions.Protocol[SUPERSELF]):
1789
+ def __call__(self, /, client: typing.Optional[modal.client.Client] = None) -> SUPERSELF:
1790
+ """mdmd:hidden"""
1791
+ ...
1792
+
1793
+ async def aio(self, /, client: typing.Optional[modal.client.Client] = None) -> SUPERSELF:
1794
+ """mdmd:hidden"""
1795
+ ...
1796
+
1797
+ hydrate: __hydrate_spec[typing_extensions.Self]
1798
+
1784
1799
  SUPPORTED_PYTHON_SERIES: dict[typing.Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVIEW"], list[str]]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.0.6.dev38
3
+ Version: 1.0.6.dev41
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -22,7 +22,7 @@ modal/app.py,sha256=U0sPiHpphcRHLnoLYh2IrU2RSpRFX9BE5uHb7h42STs,47478
22
22
  modal/app.pyi,sha256=cXiSTu2bwu6csAUdkOlh7mr9tPvtaS2qWSEhlC1UxAg,43787
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=5QyM7VJjsFbHf6E91ar3A2KY9mx03wdtGlNJvfTKUVs,17087
25
- modal/client.pyi,sha256=gCZMiwKN6BYHj7_1UYSNCUe2FuQhvX1MWhI8HJnbotc,15270
25
+ modal/client.pyi,sha256=59uOX3OI2h90k_P5Ooi8Z33dOMmA92zQerIoMtK_NWA,15270
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
28
28
  modal/cls.py,sha256=B5EtzpBXemH718YvgXaYjuTKvairvqfXJ7IwLZ_6vVA,40034
@@ -41,8 +41,8 @@ modal/file_pattern_matcher.py,sha256=urAue8es8jxqX94k9EYoZxxhtfgOlsEES8lbFHOorzc
41
41
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
42
42
  modal/functions.pyi,sha256=FJe_91dSrMCRNVT-YV1UhtxFKzIvL_C5q8xdk08-wT8,34840
43
43
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
44
- modal/image.py,sha256=dqiVVxKTh77pM5I9M7ty5nFSBtd3JQME0_RAROIBJuw,101717
45
- modal/image.pyi,sha256=oJYcnVAY-hSLWlA_B4pFNDh3b6ss4wqGuHj9puPPnV4,67552
44
+ modal/image.py,sha256=qTJ6pTcLfYRh112wId7CCNWWmm077w6JoIqxE8BiCoo,102261
45
+ modal/image.pyi,sha256=TVy-rnSAP2WgQ5zf_sQLFzb-99Qg9LiQNGXR9psFA_o,68107
46
46
  modal/io_streams.py,sha256=FUDpBsVK8isqwyC7DtAcQZhaHlMFSaNZGhYJOg-SFW0,15590
47
47
  modal/io_streams.pyi,sha256=5b3b93ztZeR8IpJtNIGffX24QLPgocE4-gAps8y7CKU,13824
48
48
  modal/mount.py,sha256=q-pPeVxAmte-G_LDpbFwaNs2Rb2MIpscfnCXzkhxrOI,36734
@@ -139,7 +139,9 @@ modal/cli/volume.py,sha256=KJ4WKQYjRGsTERkwHE1HcRia9rWzLIDDnlc89QmTLvE,10960
139
139
  modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
140
140
  modal/cli/programs/run_jupyter.py,sha256=44Lpvqk2l3hH-uOkmAOzw60NEsfB5uaRDWDKVshvQhs,2682
141
141
  modal/cli/programs/vscode.py,sha256=KbTAaIXyQBVCDXxXjmBHmKpgXkUw0q4R4KkJvUjCYgk,3380
142
- modal/experimental/__init__.py,sha256=IT7Tq7nBR59_v5YjKoA5U0KXvMbv_kl5Cgw1jsnm-No,13836
142
+ modal/experimental/__init__.py,sha256=XhRr0QQds4fEAoILQFa0CQWUtQ76Gxioo88CupOxDvI,10847
143
+ modal/experimental/flash.py,sha256=xqfJLpdqaa7mgW8OgAFBfZV95PKzuTzevh7SOSVesnA,19055
144
+ modal/experimental/flash.pyi,sha256=1Nd31nYD8Eqi0BI63XuK6owXPGA0s9CgU_WOAzCQSQs,9957
143
145
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
144
146
  modal/requirements/2023.12.312.txt,sha256=zWWUVgVQ92GXBKNYYr2-5vn9rlnXcmkqlwlX5u1eTYw,400
145
147
  modal/requirements/2023.12.txt,sha256=OjsbXFkCSdkzzryZP82Q73osr5wxQ6EUzmGcK7twfkA,502
@@ -149,7 +151,7 @@ modal/requirements/2025.06.txt,sha256=KxDaVTOwatHvboDo4lorlgJ7-n-MfAwbPwxJ0zcJqr
149
151
  modal/requirements/PREVIEW.txt,sha256=KxDaVTOwatHvboDo4lorlgJ7-n-MfAwbPwxJ0zcJqrs,312
150
152
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
151
153
  modal/requirements/base-images.json,sha256=JYSDAgHTl-WrV_TZW5icY-IJEnbe2eQ4CZ_KN6EOZKU,1304
152
- modal-1.0.6.dev38.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
154
+ modal-1.0.6.dev41.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
153
155
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
154
156
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
155
157
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -157,10 +159,10 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
157
159
  modal_docs/mdmd/mdmd.py,sha256=eW5MzrEl7mSclDo4Uv64sQ1-4IyLggldbgUJdBVLDdI,6449
158
160
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
159
161
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
160
- modal_proto/api.proto,sha256=NxnajWiJMn8KuIYlM_Er-lgt2TZX5NDM7zQBriIo4e0,99354
162
+ modal_proto/api.proto,sha256=8gWPs6-uQ-6FzXsGoZfd0Thxn7M8HCGlJifgak-HuOc,99382
161
163
  modal_proto/api_grpc.py,sha256=F7Hu-1Yg7p5a2SbKw9yR4AgpyU0ntvgZTaVbIJMR0DE,122366
162
- modal_proto/api_pb2.py,sha256=IMsL_9MKeCNTaByHg-eH_6UqK8m3aSGUzJId6tCRPhQ,349638
163
- modal_proto/api_pb2.pyi,sha256=PUhlvse2LZV6v6rOEMyaPOlT852GWsy2P5SrLHiGAG8,476220
164
+ modal_proto/api_pb2.py,sha256=UkIGNmJulT5xRc0m6Yem28lW0NJOiPta0SzfiX6lNh8,349679
165
+ modal_proto/api_pb2.pyi,sha256=SOShNIPqZiOSqTgo18QkH6UCfAhLrGeMdIWs2hC8Sco,476375
164
166
  modal_proto/api_pb2_grpc.py,sha256=pIFrNmCOgRRcIW8A1Ekja9Po6fHcsj54ExDZFzTpYe4,264347
165
167
  modal_proto/api_pb2_grpc.pyi,sha256=vtxrQ9xnQG6ZRXjp2uk43Mb7wV7F4qGYuVl5JUBc8jI,61968
166
168
  modal_proto/modal_api_grpc.py,sha256=Yl_fGbSIuX2FAEnURkYpKqshs7kbNqtz5HlTJEXkbhE,18487
@@ -172,10 +174,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
172
174
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
173
175
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
174
176
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
175
- modal_version/__init__.py,sha256=3GMXwf5s3bwgivwCIexLbo7syja587KpYtNQgL-_FYU,121
177
+ modal_version/__init__.py,sha256=o2_TOOYQzVwzurP3BNmDktIpBKS1fw1A_18HSJsCKcg,121
176
178
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
177
- modal-1.0.6.dev38.dist-info/METADATA,sha256=6wAATmdVSi5pDGrujWiXbEdhl_5cgWAwsHn1tGYATOg,2462
178
- modal-1.0.6.dev38.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
179
- modal-1.0.6.dev38.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
180
- modal-1.0.6.dev38.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
181
- modal-1.0.6.dev38.dist-info/RECORD,,
179
+ modal-1.0.6.dev41.dist-info/METADATA,sha256=i4u_mrFwG5IBfWnQQ7bp99JIQnqaz7zPlnpteqBudDI,2462
180
+ modal-1.0.6.dev41.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
181
+ modal-1.0.6.dev41.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
182
+ modal-1.0.6.dev41.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
183
+ modal-1.0.6.dev41.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -1487,6 +1487,7 @@ message FunctionCallCancelRequest {
1487
1487
  message FunctionCallGetDataRequest {
1488
1488
  string function_call_id = 1;
1489
1489
  uint64 last_index = 2;
1490
+ string attempt_token = 3;
1490
1491
  }
1491
1492
 
1492
1493
  message FunctionCallInfo {