modal 0.67.11__py3-none-any.whl → 0.67.16__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.
modal/client.pyi CHANGED
@@ -26,7 +26,7 @@ class _Client:
26
26
  _stub: typing.Optional[modal_proto.api_grpc.ModalClientStub]
27
27
 
28
28
  def __init__(
29
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.67.11"
29
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.67.16"
30
30
  ): ...
31
31
  def is_closed(self) -> bool: ...
32
32
  @property
@@ -81,7 +81,7 @@ class Client:
81
81
  _stub: typing.Optional[modal_proto.api_grpc.ModalClientStub]
82
82
 
83
83
  def __init__(
84
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.67.11"
84
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.67.16"
85
85
  ): ...
86
86
  def is_closed(self) -> bool: ...
87
87
  @property
@@ -128,12 +128,16 @@ class _ContainerProcess(Generic[T]):
128
128
  on_connect = asyncio.Event()
129
129
 
130
130
  async def _write_to_fd_loop(stream: _StreamReader):
131
- async for line in stream:
131
+ # Don't skip empty messages so we can detect when the process has booted.
132
+ async for chunk in stream._get_logs(skip_empty_messages=False):
133
+ if chunk is None:
134
+ break
135
+
132
136
  if not on_connect.is_set():
133
137
  connecting_status.stop()
134
138
  on_connect.set()
135
139
 
136
- await write_to_fd(stream.file_descriptor, line.encode("utf-8"))
140
+ await write_to_fd(stream.file_descriptor, chunk)
137
141
 
138
142
  async def _handle_input(data: bytes, message_index: int):
139
143
  self.stdin.write(data)
modal/functions.pyi CHANGED
@@ -459,11 +459,11 @@ class Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.O
459
459
 
460
460
  _call_generator_nowait: ___call_generator_nowait_spec
461
461
 
462
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
462
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
463
463
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
464
464
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
465
465
 
466
- remote: __remote_spec[P, ReturnType]
466
+ remote: __remote_spec[ReturnType, P]
467
467
 
468
468
  class __remote_gen_spec(typing_extensions.Protocol):
469
469
  def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -475,17 +475,17 @@ class Function(typing.Generic[P, ReturnType, OriginalReturnType], modal.object.O
475
475
  def _get_obj(self) -> typing.Optional[modal.cls.Obj]: ...
476
476
  def local(self, *args: P.args, **kwargs: P.kwargs) -> OriginalReturnType: ...
477
477
 
478
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
478
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
479
479
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
480
480
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
481
481
 
482
- _experimental_spawn: ___experimental_spawn_spec[P, ReturnType]
482
+ _experimental_spawn: ___experimental_spawn_spec[ReturnType, P]
483
483
 
484
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
484
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
485
485
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
486
486
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
487
487
 
488
- spawn: __spawn_spec[P, ReturnType]
488
+ spawn: __spawn_spec[ReturnType, P]
489
489
 
490
490
  def get_raw_f(self) -> typing.Callable[..., typing.Any]: ...
491
491
 
modal/io_streams.py CHANGED
@@ -224,7 +224,7 @@ class _StreamReader(Generic[T]):
224
224
 
225
225
  entry_id += 1
226
226
 
227
- async def _get_logs(self) -> AsyncGenerator[Optional[bytes], None]:
227
+ async def _get_logs(self, skip_empty_messages: bool = True) -> AsyncGenerator[Optional[bytes], None]:
228
228
  """Streams sandbox or process logs from the server to the reader.
229
229
 
230
230
  Logs returned by this method may contain partial or multiple lines at a time.
@@ -253,6 +253,11 @@ class _StreamReader(Generic[T]):
253
253
 
254
254
  async for message, entry_id in iterator:
255
255
  self._last_entry_id = entry_id
256
+ # Empty messages are sent when the process boots up. Don't yield them unless
257
+ # we're using the empty message to signal process liveness.
258
+ if skip_empty_messages and message == b"":
259
+ continue
260
+
256
261
  yield message
257
262
  if message is None:
258
263
  completed = True
modal/io_streams.pyi CHANGED
@@ -31,7 +31,9 @@ class _StreamReader(typing.Generic[T]):
31
31
  async def read(self) -> T: ...
32
32
  async def _consume_container_process_stream(self): ...
33
33
  def _stream_container_process(self) -> collections.abc.AsyncGenerator[tuple[typing.Optional[bytes], str], None]: ...
34
- def _get_logs(self) -> collections.abc.AsyncGenerator[typing.Optional[bytes], None]: ...
34
+ def _get_logs(
35
+ self, skip_empty_messages: bool = True
36
+ ) -> collections.abc.AsyncGenerator[typing.Optional[bytes], None]: ...
35
37
  def _get_logs_by_line(self) -> collections.abc.AsyncGenerator[typing.Optional[bytes], None]: ...
36
38
  def __aiter__(self) -> collections.abc.AsyncIterator[T]: ...
37
39
  async def __anext__(self) -> T: ...
@@ -82,8 +84,12 @@ class StreamReader(typing.Generic[T]):
82
84
  _stream_container_process: ___stream_container_process_spec
83
85
 
84
86
  class ___get_logs_spec(typing_extensions.Protocol):
85
- def __call__(self) -> typing.Generator[typing.Optional[bytes], None, None]: ...
86
- def aio(self) -> collections.abc.AsyncGenerator[typing.Optional[bytes], None]: ...
87
+ def __call__(
88
+ self, skip_empty_messages: bool = True
89
+ ) -> typing.Generator[typing.Optional[bytes], None, None]: ...
90
+ def aio(
91
+ self, skip_empty_messages: bool = True
92
+ ) -> collections.abc.AsyncGenerator[typing.Optional[bytes], None]: ...
87
93
 
88
94
  _get_logs: ___get_logs_spec
89
95
 
modal/partial_function.py CHANGED
@@ -155,7 +155,7 @@ def _find_partial_methods_for_user_cls(user_cls: type[Any], flags: int) -> dict[
155
155
  deprecation_error((2024, 2, 21), message)
156
156
 
157
157
  partial_functions: dict[str, PartialFunction] = {}
158
- for parent_cls in user_cls.mro():
158
+ for parent_cls in reversed(user_cls.mro()):
159
159
  if parent_cls is not object:
160
160
  for k, v in parent_cls.__dict__.items():
161
161
  if isinstance(v, PartialFunction):
modal/sandbox.py CHANGED
@@ -28,6 +28,7 @@ from .io_streams import StreamReader, StreamWriter, _StreamReader, _StreamWriter
28
28
  from .mount import _Mount
29
29
  from .network_file_system import _NetworkFileSystem, network_file_system_mount_protos
30
30
  from .object import _get_environment_name, _Object
31
+ from .proxy import _Proxy
31
32
  from .scheduler_placement import SchedulerPlacement
32
33
  from .secret import _Secret
33
34
  from .stream_type import StreamType
@@ -73,6 +74,7 @@ class _Sandbox(_Object, type_prefix="sb"):
73
74
  pty_info: Optional[api_pb2.PTYInfo] = None,
74
75
  encrypted_ports: Sequence[int] = [],
75
76
  unencrypted_ports: Sequence[int] = [],
77
+ proxy: Optional[_Proxy] = None,
76
78
  _experimental_scheduler_placement: Optional[SchedulerPlacement] = None,
77
79
  ) -> "_Sandbox":
78
80
  """mdmd:hidden"""
@@ -166,6 +168,7 @@ class _Sandbox(_Object, type_prefix="sb"):
166
168
  worker_id=config.get("worker_id"),
167
169
  open_ports=api_pb2.PortSpecs(ports=open_ports),
168
170
  network_access=network_access,
171
+ proxy_id=(proxy.object_id if proxy else None),
169
172
  )
170
173
 
171
174
  # Note - `resolver.app_id` will be `None` for app-less sandboxes
@@ -208,6 +211,8 @@ class _Sandbox(_Object, type_prefix="sb"):
208
211
  encrypted_ports: Sequence[int] = [],
209
212
  # List of ports to tunnel into the sandbox without encryption.
210
213
  unencrypted_ports: Sequence[int] = [],
214
+ # Reference to a Modal Proxy to use in front of this Sandbox.
215
+ proxy: Optional[_Proxy] = None,
211
216
  _experimental_scheduler_placement: Optional[
212
217
  SchedulerPlacement
213
218
  ] = None, # Experimental controls over fine-grained scheduling (alpha).
@@ -243,6 +248,7 @@ class _Sandbox(_Object, type_prefix="sb"):
243
248
  pty_info=pty_info,
244
249
  encrypted_ports=encrypted_ports,
245
250
  unencrypted_ports=unencrypted_ports,
251
+ proxy=proxy,
246
252
  _experimental_scheduler_placement=_experimental_scheduler_placement,
247
253
  )
248
254
 
modal/sandbox.pyi CHANGED
@@ -11,6 +11,7 @@ import modal.io_streams
11
11
  import modal.mount
12
12
  import modal.network_file_system
13
13
  import modal.object
14
+ import modal.proxy
14
15
  import modal.scheduler_placement
15
16
  import modal.secret
16
17
  import modal.stream_type
@@ -51,6 +52,7 @@ class _Sandbox(modal.object._Object):
51
52
  pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
52
53
  encrypted_ports: collections.abc.Sequence[int] = [],
53
54
  unencrypted_ports: collections.abc.Sequence[int] = [],
55
+ proxy: typing.Optional[modal.proxy._Proxy] = None,
54
56
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
55
57
  ) -> _Sandbox: ...
56
58
  @staticmethod
@@ -78,6 +80,7 @@ class _Sandbox(modal.object._Object):
78
80
  pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
79
81
  encrypted_ports: collections.abc.Sequence[int] = [],
80
82
  unencrypted_ports: collections.abc.Sequence[int] = [],
83
+ proxy: typing.Optional[modal.proxy._Proxy] = None,
81
84
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
82
85
  client: typing.Optional[modal.client._Client] = None,
83
86
  ) -> _Sandbox: ...
@@ -165,6 +168,7 @@ class Sandbox(modal.object.Object):
165
168
  pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
166
169
  encrypted_ports: collections.abc.Sequence[int] = [],
167
170
  unencrypted_ports: collections.abc.Sequence[int] = [],
171
+ proxy: typing.Optional[modal.proxy.Proxy] = None,
168
172
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
169
173
  ) -> Sandbox: ...
170
174
 
@@ -196,6 +200,7 @@ class Sandbox(modal.object.Object):
196
200
  pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
197
201
  encrypted_ports: collections.abc.Sequence[int] = [],
198
202
  unencrypted_ports: collections.abc.Sequence[int] = [],
203
+ proxy: typing.Optional[modal.proxy.Proxy] = None,
199
204
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
200
205
  client: typing.Optional[modal.client.Client] = None,
201
206
  ) -> Sandbox: ...
@@ -226,6 +231,7 @@ class Sandbox(modal.object.Object):
226
231
  pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
227
232
  encrypted_ports: collections.abc.Sequence[int] = [],
228
233
  unencrypted_ports: collections.abc.Sequence[int] = [],
234
+ proxy: typing.Optional[modal.proxy.Proxy] = None,
229
235
  _experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
230
236
  client: typing.Optional[modal.client.Client] = None,
231
237
  ) -> Sandbox: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.67.11
3
+ Version: 0.67.16
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -19,13 +19,13 @@ modal/app.py,sha256=EJ7FUN6rWnSwLJoYJh8nmKg_t-8hdN8_rt0OrkP7JvQ,46084
19
19
  modal/app.pyi,sha256=BE5SlR5tRECuc6-e2lUuOknDdov3zxgZ4N0AsLb5ZVQ,25270
20
20
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
21
21
  modal/client.py,sha256=VMg_aIuo_LOEe2ttxBHEND3PLhTp5lo-onH4wELhIyY,16375
22
- modal/client.pyi,sha256=B7hnEwCh6sm4OeZ4kEeSBWemVRup_MP8GsTAuAXGZ5g,7354
22
+ modal/client.pyi,sha256=IJfwJhllWxKJfV38qk43KNNHSoo3HQAhUu6uqrIsCOo,7354
23
23
  modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
24
24
  modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
25
25
  modal/cls.py,sha256=F2jk5zFCAA8h-GfM0dbdBG3Mu5wiG9k9Z9JLYRYuT2Q,24758
26
26
  modal/cls.pyi,sha256=2_nbvSlkh2d0tfibTIxsThPiL0Xcrcosc5f_ET-i0sk,8147
27
27
  modal/config.py,sha256=1KhNJkjYsJkX1V8RPPdRYPlM2HE-ZZs0JVSxbiXjmrw,11010
28
- modal/container_process.py,sha256=c_jBPtyPeSxbIcbLfs_FzTrt-1eErtRSnsfxkDozFoY,5589
28
+ modal/container_process.py,sha256=YRCKjn56oqTtGjtLxpl_KSkOhYrcRitgF3LOI6o14Q4,5759
29
29
  modal/container_process.pyi,sha256=k2kClwaSzz11eci1pzFZgCm-ptXapHAyHTOENorlazA,2594
30
30
  modal/dict.py,sha256=RmJlEwFJOdSfAYcVa50hbbFccV8e7BvC5tc5g1HXF-c,12622
31
31
  modal/dict.pyi,sha256=2cYgOqBxYZih4BYgMV0c3rNPuxYR6-cB1GBXzFkHA5c,7265
@@ -34,12 +34,12 @@ modal/environments.pyi,sha256=XalNpiPkAtHWAvOU2Cotq0ozmtl-Jv0FDsR8h9mr27Q,3521
34
34
  modal/exception.py,sha256=EBkdWVved2XEPsXaoPRu56xfxFFHL9iuqvUsdj42WDA,6392
35
35
  modal/experimental.py,sha256=jFuNbwrNHos47viMB9q-cHJSvf2RDxDdoEcss9plaZE,2302
36
36
  modal/functions.py,sha256=Pwebl3aeEkNrniXCzuDdjfxgExykTWQo7o0VjFD4To8,69853
37
- modal/functions.pyi,sha256=qVcpwr9I48PGGDCshtkYxsesQrMdRgmleRvIXUtyAVk,25107
37
+ modal/functions.pyi,sha256=fifvDS5GDEYmXjko1UGZrKqmhfnQn6GRwCblM9hrRWo,25107
38
38
  modal/gpu.py,sha256=r4rL6uH3UJIQthzYvfWauXNyh01WqCPtKZCmmSX1fd4,6881
39
39
  modal/image.py,sha256=ZIC8tgjJnqWamN4sZ0Gch3x2VmcM671MWfRLR5SMmoc,79423
40
40
  modal/image.pyi,sha256=JjicLNuaBsfuPZ_xo_eN0zKZkDrEm2alYg-szENhJjM,24591
41
- modal/io_streams.py,sha256=gZPXD7unxRrxC4aroejKM1-pd4STg09JqLd0NRegAMs,14635
42
- modal/io_streams.pyi,sha256=QNvbZpm1qW6LkqCIcJ4Zprn_IW-ZVqt62KrpDP--_Co,4555
41
+ modal/io_streams.py,sha256=4pF2HumRK1pVnrx6S9UwGqJn69rQqyQqpe5X_nifny0,14943
42
+ modal/io_streams.pyi,sha256=An766S3JKP78b2A4RphjdVNR73yblDc5uG_xp5--6k4,4715
43
43
  modal/mount.py,sha256=_N_fd5NX_eWwmb_xh_X_28nNHW9upEDXDyXixZWnUiQ,27730
44
44
  modal/mount.pyi,sha256=3e4nkXUeeVmUmOyK8Tiyk_EQlHeWruN3yGJVnmDUVrI,9761
45
45
  modal/network_file_system.py,sha256=mwtYp25XtFaiGpSG7U0KSkiTzJWrxgGTcoxfPZ9yGR0,14141
@@ -49,7 +49,7 @@ modal/object.pyi,sha256=MO78H9yFSE5i1gExPEwyyQzLdlshkcGHN1aQ0ylyvq0,8802
49
49
  modal/output.py,sha256=N0xf4qeudEaYrslzdAl35VKV8rapstgIM2e9wO8_iy0,1967
50
50
  modal/parallel_map.py,sha256=4aoMXIrlG3wl5Ifk2YDNOQkXsGRsm6Xbfm6WtJ2t3WY,16002
51
51
  modal/parallel_map.pyi,sha256=pOhT0P3DDYlwLx0fR3PTsecA7DI8uOdXC1N8i-ZkyOY,2328
52
- modal/partial_function.py,sha256=onHBLCbQLJJu1h9--L7hw_gmvEdbLm-pNSa4xxk7ydA,28205
52
+ modal/partial_function.py,sha256=938kcVJHcdGXKWsO7NE_FBxPldZ304a_GyhjxD79wHE,28215
53
53
  modal/partial_function.pyi,sha256=EafGOzZdEq-yE5bYRoMfnMqw-o8Hk_So8MRPDSB99_0,8982
54
54
  modal/proxy.py,sha256=ZrOsuQP7dSZFq1OrIxalNnt0Zvsnp1h86Th679sSL40,1417
55
55
  modal/proxy.pyi,sha256=UvygdOYneLTuoDY6hVaMNCyZ947Tmx93IdLjErUqkvM,368
@@ -60,8 +60,8 @@ modal/retries.py,sha256=HKR2Q9aNPWkMjQ5nwobqYTuZaSuw0a8lI2zrtY5IW98,5230
60
60
  modal/runner.py,sha256=7obU-Gq1ocpBGCuR6pvn1T-D6ggg1T48qFo2TNUGWkU,24089
61
61
  modal/runner.pyi,sha256=RAtCvx_lXWjyFjIaZ3t9-X1c7rqpgAQlhl4Hww53OY8,5038
62
62
  modal/running_app.py,sha256=CshNvGDJtagOdKW54uYjY8HY73j2TpnsL9jkPFZAsfA,560
63
- modal/sandbox.py,sha256=5oDrV9XL8JkGl_gcbu5D20vbaxFRpWv_bCdw-Fo-qNE,24886
64
- modal/sandbox.pyi,sha256=FKdkLGmJrdRT0pHlhV_brxo1pvxr6uWZeL-zomLHSas,17366
63
+ modal/sandbox.py,sha256=25DvTWSgClANvk67HM3FHukRVLig_Fw_aQC1BLMCRhs,25150
64
+ modal/sandbox.pyi,sha256=JRh6Q-WdY6GgVSOGm0L_pgo5bfsi2UacsZezpT0-cDU,17685
65
65
  modal/schedule.py,sha256=0ZFpKs1bOxeo5n3HZjoL7OE2ktsb-_oGtq-WJEPO4tY,2615
66
66
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
67
67
  modal/secret.py,sha256=Y1WgybQIkfkxdzH9CQ1h-Wd1DJJpzipigMhyyvSxTww,10007
@@ -159,10 +159,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
159
159
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
160
  modal_version/__init__.py,sha256=3IY-AWLH55r35_mQXIaut0jrJvoPuf1NZJBQQfSbPuo,470
161
161
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
162
- modal_version/_version_generated.py,sha256=YsypBM6HmXq8DPKueY9FgGnZ2xdO5KF3g6dZfzBASeg,149
163
- modal-0.67.11.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
164
- modal-0.67.11.dist-info/METADATA,sha256=StjByc8ZnmcoGsEIpjloa7D5qiraqKpSoc5zvrmvT4o,2329
165
- modal-0.67.11.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
166
- modal-0.67.11.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
167
- modal-0.67.11.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
168
- modal-0.67.11.dist-info/RECORD,,
162
+ modal_version/_version_generated.py,sha256=YjVTHXgFgY_BKue5ypqLKUgLAOu2RSFr5ZWkU08vbx4,149
163
+ modal-0.67.16.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
164
+ modal-0.67.16.dist-info/METADATA,sha256=1mxQSL4rxUlG1ThKNOsKPg3DOWUK-HafKMRkUO9ibXg,2329
165
+ modal-0.67.16.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
166
+ modal-0.67.16.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
167
+ modal-0.67.16.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
168
+ modal-0.67.16.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2024
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 11 # git: d6fd2ae
4
+ build_number = 16 # git: 42ea3a6