modal 0.73.4__py3-none-any.whl → 0.73.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.
modal/_functions.py CHANGED
@@ -397,7 +397,9 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
397
397
  _use_method_name: str = ""
398
398
 
399
399
  _class_parameter_info: Optional["api_pb2.ClassParameterInfo"] = None
400
- _method_handle_metadata: Optional[dict[str, "api_pb2.FunctionHandleMetadata"]] = None
400
+ _method_handle_metadata: Optional[
401
+ dict[str, "api_pb2.FunctionHandleMetadata"]
402
+ ] = None # set for 0.67+ class service functions
401
403
 
402
404
  def _bind_method(
403
405
  self,
@@ -1026,16 +1028,17 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1026
1028
 
1027
1029
  # Usage on a parametrized function.
1028
1030
  Model = modal.Cls.from_name("my-app", "Model")
1029
- Model("fine-tuned-model").keep_warm(2)
1031
+ Model("fine-tuned-model").keep_warm(2) # note that this applies to the class instance, not a method
1030
1032
  ```
1031
1033
  """
1032
1034
  if self._is_method:
1033
1035
  raise InvalidError(
1034
1036
  textwrap.dedent(
1035
1037
  """
1036
- The `.keep_warm()` method can not be used on Modal class *methods* deployed using Modal >v0.63.
1038
+ The `.keep_warm()` method can not be used on Modal class *methods*.
1037
1039
 
1038
- Call `.keep_warm()` on the class *instance* instead.
1040
+ Call `.keep_warm()` on the class *instance* instead. All methods of a class are run by the same
1041
+ container pool, and this method applies to the size of that container pool.
1039
1042
  """
1040
1043
  )
1041
1044
  )
@@ -1055,7 +1058,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1055
1058
  ) -> "_Function":
1056
1059
  """Reference a Function from a deployed App by its name.
1057
1060
 
1058
- In contast to `modal.Function.lookup`, this is a lazy method
1061
+ In contrast to `modal.Function.lookup`, this is a lazy method
1059
1062
  that defers hydrating the local object with metadata from
1060
1063
  Modal servers until the first time it is actually used.
1061
1064
 
@@ -1084,7 +1087,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1084
1087
 
1085
1088
  self._hydrate(response.function_id, resolver.client, response.handle_metadata)
1086
1089
 
1087
- rep = f"Ref({app_name})"
1090
+ rep = f"Function.from_name({app_name}, {name})"
1088
1091
  return cls._from_loader(_load_remote, rep, is_another_app=True, hydrate_lazily=True)
1089
1092
 
1090
1093
  @staticmethod
@@ -255,7 +255,8 @@ def import_single_function_service(
255
255
  else:
256
256
  user_defined_callable = f
257
257
  elif len(parts) == 2:
258
- # As of v0.63 - this path should only be triggered by @build class builder methods
258
+ # This path should only be triggered by @build class builder methods and can be removed
259
+ # once @build is deprecated.
259
260
  assert not function_def.use_method_name # new "placeholder methods" should not be invoked directly!
260
261
  assert function_def.is_builder_function
261
262
  cls_name, fun_name = parts
modal/client.pyi CHANGED
@@ -27,7 +27,7 @@ class _Client:
27
27
  _snapshotted: bool
28
28
 
29
29
  def __init__(
30
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.4"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.6"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -85,7 +85,7 @@ class Client:
85
85
  _snapshotted: bool
86
86
 
87
87
  def __init__(
88
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.4"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.6"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
modal/cls.py CHANGED
@@ -12,7 +12,7 @@ from modal._utils.function_utils import CLASS_PARAM_TYPE_MAP
12
12
  from modal_proto import api_pb2
13
13
 
14
14
  from ._functions import _Function, _parse_retries
15
- from ._object import _get_environment_name, _Object
15
+ from ._object import _Object
16
16
  from ._resolver import Resolver
17
17
  from ._resources import convert_fn_config_to_resources_config
18
18
  from ._serialization import check_valid_cls_constructor_arg
@@ -22,7 +22,8 @@ from ._utils.deprecation import deprecation_warning, renamed_parameter
22
22
  from ._utils.grpc_utils import retry_transient_errors
23
23
  from ._utils.mount_utils import validate_volumes
24
24
  from .client import _Client
25
- from .exception import ExecutionError, InvalidError, NotFoundError, VersionError
25
+ from .config import config
26
+ from .exception import ExecutionError, InvalidError, NotFoundError
26
27
  from .gpu import GPU_T
27
28
  from .partial_function import (
28
29
  _find_callables_for_obj,
@@ -145,10 +146,6 @@ class _Obj:
145
146
 
146
147
  _instance_service_function: Optional[_Function] = None # this gets set lazily
147
148
 
148
- def _uses_common_service_function(self):
149
- # Used for backwards compatibility checks with pre v0.63 classes
150
- return self._cls._class_service_function is not None
151
-
152
149
  def __init__(
153
150
  self,
154
151
  cls: "_Cls",
@@ -175,8 +172,6 @@ class _Obj:
175
172
  def _cached_service_function(self) -> "modal.functions._Function":
176
173
  # Returns a service function for this _Obj, serving all its methods
177
174
  # In case of methods without parameters or options, this is simply proxying to the class service function
178
-
179
- # only safe to call for 0.63+ classes (before then, all methods had their own services)
180
175
  if not self._instance_service_function:
181
176
  assert self._cls._class_service_function
182
177
  self._instance_service_function = self._cls._class_service_function._bind_parameters(
@@ -232,10 +227,6 @@ class _Obj:
232
227
  Model("fine-tuned-model").keep_warm(2)
233
228
  ```
234
229
  """
235
- if not self._uses_common_service_function():
236
- raise VersionError(
237
- "Class instance `.keep_warm(...)` can't be used on classes deployed using client version <v0.63"
238
- )
239
230
  await self._cached_service_function().keep_warm(warm_pool_size)
240
231
 
241
232
  def _cached_user_cls_instance(self):
@@ -284,7 +275,6 @@ class _Obj:
284
275
 
285
276
  def __getattr__(self, k):
286
277
  # This is a bit messy and branchy because:
287
- # * Support for pre-0.63 lookups *and* newer classes
288
278
  # * Support .remote() on both hydrated (local or remote classes) or unhydrated classes (remote classes only)
289
279
  # * Support .local() on both hydrated and unhydrated classes (assuming local access to code)
290
280
  # * Support attribute access (when local cls is available)
@@ -305,11 +295,7 @@ class _Obj:
305
295
  # doesn't require a local instance.
306
296
  # As long as we have the service function or params, we can do remote calls
307
297
  # without calling the constructor of the class in the calling context.
308
- if self._cls._class_service_function is None:
309
- # a <v0.63 lookup
310
- return class_bound_method._bind_parameters(self, self._options, self._args, self._kwargs)
311
- else:
312
- return _bind_instance_method(self._cached_service_function(), class_bound_method)
298
+ return _bind_instance_method(self._cached_service_function(), class_bound_method)
313
299
 
314
300
  return None # The attribute isn't a method
315
301
 
@@ -366,9 +352,7 @@ class _Cls(_Object, type_prefix="cs"):
366
352
  """
367
353
 
368
354
  _user_cls: Optional[type]
369
- _class_service_function: Optional[
370
- _Function
371
- ] # The _Function serving *all* methods of the class, used for version >=v0.63
355
+ _class_service_function: Optional[_Function] # The _Function (read "service") serving *all* methods of the class
372
356
  _method_functions: Optional[dict[str, _Function]] = None # Placeholder _Functions for each method
373
357
  _options: Optional[api_pb2.FunctionOptions]
374
358
  _callables: dict[str, Callable[..., Any]]
@@ -414,15 +398,15 @@ class _Cls(_Object, type_prefix="cs"):
414
398
 
415
399
  def _hydrate_metadata(self, metadata: Message):
416
400
  assert isinstance(metadata, api_pb2.ClassHandleMetadata)
417
- if (
418
- self._class_service_function
419
- and self._class_service_function._method_handle_metadata
420
- and len(self._class_service_function._method_handle_metadata)
401
+ assert self._class_service_function.is_hydrated
402
+
403
+ if self._class_service_function._method_handle_metadata and len(
404
+ self._class_service_function._method_handle_metadata
421
405
  ):
422
- # The class only has a class service function and no method placeholders (v0.67+)
406
+ # Method metadata stored on the backend Function object (v0.67+)
423
407
  if self._method_functions:
424
408
  # We're here when the Cls is loaded locally (e.g. _Cls.from_local) so the _method_functions mapping is
425
- # populated with (un-hydrated) _Function objects
409
+ # populated with (un-hydrated) _Function objects - hydrate using function method metadata
426
410
  for (
427
411
  method_name,
428
412
  method_handle_metadata,
@@ -430,9 +414,10 @@ class _Cls(_Object, type_prefix="cs"):
430
414
  self._method_functions[method_name]._hydrate(
431
415
  self._class_service_function.object_id, self._client, method_handle_metadata
432
416
  )
433
-
434
417
  else:
435
- # We're here when the function is loaded remotely (e.g. _Cls.from_name)
418
+ # We're here when the function is loaded remotely (e.g. _Cls.from_name),
419
+ # same as above, but we create the method "Functions" from scratch rather
420
+ # than hydrate existing ones. TODO(elias): feels complicated - refactor?
436
421
  self._method_functions = {}
437
422
  for (
438
423
  method_name,
@@ -441,19 +426,13 @@ class _Cls(_Object, type_prefix="cs"):
441
426
  self._method_functions[method_name] = _Function._new_hydrated(
442
427
  self._class_service_function.object_id, self._client, method_handle_metadata
443
428
  )
444
- elif self._class_service_function and self._class_service_function.object_id:
445
- # A class with a class service function and method placeholder functions
446
- self._method_functions = {}
447
- for method in metadata.methods:
448
- self._method_functions[method.function_name] = _Function._new_hydrated(
449
- self._class_service_function.object_id, self._client, method.function_handle_metadata
450
- )
451
429
  else:
452
- # pre 0.63 class that does not have a class service function and only method functions
430
+ # Method metadata stored on the backend Cls object - pre 0.67
431
+ # Can be removed when v0.67 is least supported version (all metadata is on the function)
453
432
  self._method_functions = {}
454
433
  for method in metadata.methods:
455
434
  self._method_functions[method.function_name] = _Function._new_hydrated(
456
- method.function_id, self._client, method.function_handle_metadata
435
+ self._class_service_function.object_id, self._client, method.function_handle_metadata
457
436
  )
458
437
 
459
438
  @staticmethod
@@ -528,11 +507,6 @@ class _Cls(_Object, type_prefix="cs"):
528
507
  cls._name = user_cls.__name__
529
508
  return cls
530
509
 
531
- def _uses_common_service_function(self):
532
- # Used for backwards compatibility with version < 0.63
533
- # where methods had individual top level functions
534
- return self._class_service_function is not None
535
-
536
510
  @classmethod
537
511
  @renamed_parameter((2024, 12, 18), "tag", "name")
538
512
  def from_name(
@@ -553,9 +527,9 @@ class _Cls(_Object, type_prefix="cs"):
553
527
  Model = modal.Cls.from_name("other-app", "Model")
554
528
  ```
555
529
  """
530
+ _environment_name = environment_name or config.get("environment")
556
531
 
557
- async def _load_remote(obj: _Object, resolver: Resolver, existing_object_id: Optional[str]):
558
- _environment_name = _get_environment_name(environment_name, resolver)
532
+ async def _load_remote(self: _Cls, resolver: Resolver, existing_object_id: Optional[str]):
559
533
  request = api_pb2.ClassGetRequest(
560
534
  app_name=app_name,
561
535
  object_tag=name,
@@ -576,26 +550,18 @@ class _Cls(_Object, type_prefix="cs"):
576
550
  raise
577
551
 
578
552
  print_server_warnings(response.server_warnings)
579
-
580
- class_service_name = f"{name}.*" # special name of the base service function for the class
581
-
582
- class_service_function = _Function.from_name(
583
- app_name,
584
- class_service_name,
585
- environment_name=_environment_name,
586
- )
587
- try:
588
- obj._class_service_function = await resolver.load(class_service_function)
589
- except modal.exception.NotFoundError:
590
- # this happens when looking up classes deployed using <v0.63
591
- # This try-except block can be removed when min supported version >= 0.63
592
- pass
593
-
594
- obj._hydrate(response.class_id, resolver.client, response.handle_metadata)
553
+ await resolver.load(self._class_service_function)
554
+ self._hydrate(response.class_id, resolver.client, response.handle_metadata)
595
555
 
596
556
  rep = f"Ref({app_name})"
597
557
  cls = cls._from_loader(_load_remote, rep, is_another_app=True, hydrate_lazily=True)
598
- # TODO: when pre 0.63 is phased out, we can set class_service_function here instead
558
+
559
+ class_service_name = f"{name}.*" # special name of the base service function for the class
560
+ cls._class_service_function = _Function.from_name(
561
+ app_name,
562
+ class_service_name,
563
+ environment_name=_environment_name,
564
+ )
599
565
  cls._name = name
600
566
  return cls
601
567
 
modal/cls.pyi CHANGED
@@ -34,7 +34,6 @@ class _Obj:
34
34
  _kwargs: dict[str, typing.Any]
35
35
  _instance_service_function: typing.Optional[modal._functions._Function]
36
36
 
37
- def _uses_common_service_function(self): ...
38
37
  def __init__(
39
38
  self,
40
39
  cls: _Cls,
@@ -75,7 +74,6 @@ class Obj:
75
74
  args,
76
75
  kwargs,
77
76
  ): ...
78
- def _uses_common_service_function(self): ...
79
77
  def _cached_service_function(self) -> modal.functions.Function: ...
80
78
  def _get_parameter_values(self) -> dict[str, typing.Any]: ...
81
79
  def _new_user_cls_instance(self): ...
@@ -117,7 +115,6 @@ class _Cls(modal._object._Object):
117
115
  def validate_construction_mechanism(user_cls): ...
118
116
  @staticmethod
119
117
  def from_local(user_cls, app: modal.app._App, class_service_function: modal._functions._Function) -> _Cls: ...
120
- def _uses_common_service_function(self): ...
121
118
  @classmethod
122
119
  def from_name(
123
120
  cls: type[_Cls],
@@ -176,7 +173,6 @@ class Cls(modal.object.Object):
176
173
  def validate_construction_mechanism(user_cls): ...
177
174
  @staticmethod
178
175
  def from_local(user_cls, app: modal.app.App, class_service_function: modal.functions.Function) -> Cls: ...
179
- def _uses_common_service_function(self): ...
180
176
  @classmethod
181
177
  def from_name(
182
178
  cls: type[Cls],
modal/partial_function.py CHANGED
@@ -261,7 +261,7 @@ def _web_endpoint(
261
261
  custom_domains: Optional[
262
262
  Iterable[str]
263
263
  ] = None, # Create an endpoint using a custom domain fully-qualified domain name (FQDN).
264
- requires_proxy_auth: bool = False, # Require Proxy-Authorization HTTP Headers on requests
264
+ requires_proxy_auth: bool = False, # Require Modal-Key and Modal-Secret HTTP Headers on requests.
265
265
  wait_for_response: bool = True, # DEPRECATED: this must always be True now
266
266
  ) -> Callable[[Callable[P, ReturnType]], _PartialFunction[P, ReturnType, ReturnType]]:
267
267
  """Register a basic web endpoint with this application.
@@ -324,7 +324,7 @@ def _asgi_app(
324
324
  *,
325
325
  label: Optional[str] = None, # Label for created endpoint. Final subdomain will be <workspace>--<label>.modal.run.
326
326
  custom_domains: Optional[Iterable[str]] = None, # Deploy this endpoint on a custom domain.
327
- requires_proxy_auth: bool = False, # Require Proxy-Authorization HTTP Headers on requests
327
+ requires_proxy_auth: bool = False, # Require Modal-Key and Modal-Secret HTTP Headers on requests.
328
328
  wait_for_response: bool = True, # DEPRECATED: this must always be True now
329
329
  ) -> Callable[[Callable[..., Any]], _PartialFunction]:
330
330
  """Decorator for registering an ASGI app with a Modal function.
@@ -400,7 +400,7 @@ def _wsgi_app(
400
400
  *,
401
401
  label: Optional[str] = None, # Label for created endpoint. Final subdomain will be <workspace>--<label>.modal.run.
402
402
  custom_domains: Optional[Iterable[str]] = None, # Deploy this endpoint on a custom domain.
403
- requires_proxy_auth: bool = False, # Require Proxy-Authorization HTTP Headers on requests
403
+ requires_proxy_auth: bool = False, # Require Modal-Key and Modal-Secret HTTP Headers on requests.
404
404
  wait_for_response: bool = True, # DEPRECATED: this must always be True now
405
405
  ) -> Callable[[Callable[..., Any]], _PartialFunction]:
406
406
  """Decorator for registering a WSGI app with a Modal function.
@@ -477,7 +477,7 @@ def _web_server(
477
477
  startup_timeout: float = 5.0, # Maximum number of seconds to wait for the web server to start.
478
478
  label: Optional[str] = None, # Label for created endpoint. Final subdomain will be <workspace>--<label>.modal.run.
479
479
  custom_domains: Optional[Iterable[str]] = None, # Deploy this endpoint on a custom domain.
480
- requires_proxy_auth: bool = False, # Require Proxy-Authorization HTTP Headers on requests
480
+ requires_proxy_auth: bool = False, # Require Modal-Key and Modal-Secret HTTP Headers on requests.
481
481
  ) -> Callable[[Callable[..., Any]], _PartialFunction]:
482
482
  """Decorator that registers an HTTP web server inside the container.
483
483
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.73.4
3
+ Version: 0.73.6
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -3,7 +3,7 @@ modal/__main__.py,sha256=scYhGFqh8OJcVDo-VOxIT6CCwxOgzgflYWMnIZiMRqE,2871
3
3
  modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
4
4
  modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
5
5
  modal/_container_entrypoint.py,sha256=qahIuJvaMmWG85N5vNS1yuAQ9XZoo1ftzfatkos_q7I,29553
6
- modal/_functions.py,sha256=7dbpSbYutt2jmYsbSnsdSwcx1GJCNsuheOPZRN3dVis,69865
6
+ modal/_functions.py,sha256=4-CRh1Hgi508tEZRFaSRYdS1Oki0MPgAhnUYcEckMe4,70113
7
7
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
8
8
  modal/_location.py,sha256=S3lSxIU3h9HkWpkJ3Pwo0pqjIOSB1fjeSgUsY3x7eec,1202
9
9
  modal/_object.py,sha256=ItQcsMNkz9Y3kdTsvfNarbW-paJ2qabDyQ7njaqY0XI,11359
@@ -21,11 +21,11 @@ modal/app.py,sha256=4tHmc1hFAL9uGj9wp-u7AOPp2mWfu4wJ-633ghFePIY,44248
21
21
  modal/app.pyi,sha256=ppb3UmJU4oX-Ptd5v_SOQJBP1309qovKaJnH5844pFI,25885
22
22
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
23
23
  modal/client.py,sha256=8SQawr7P1PNUCq1UmJMUQXG2jIo4Nmdcs311XqrNLRE,15276
24
- modal/client.pyi,sha256=_DPcB70mcNFS68EcUV2uIjtkWwSp4fakXp7xoSFCD0w,7591
24
+ modal/client.pyi,sha256=sPu1B0hPiIx00baPmkWSaUgJPpL49fxe1-jyFrktW30,7591
25
25
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
26
26
  modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
27
- modal/cls.py,sha256=yMNL9gE7YeuUukKog_6lSKxjgZlmbGz_w87Oh6SatyQ,32681
28
- modal/cls.pyi,sha256=Lxc9bbFCVaq_FqpFYIc9Lt9TAU-uyFbqJARwx-aW0vs,9073
27
+ modal/cls.py,sha256=kNnZrBYVXOhgEXU0rDWk2Hr-bQRrsZkMKDgC-TD_6Bs,31063
28
+ modal/cls.pyi,sha256=gb6QNwfX3HSJfcZXPY36N9ywF7aBJTwwtoARnf3G1HQ,8877
29
29
  modal/config.py,sha256=BzhZYUUwOmvVwf6x5kf0ywMC257s648dmuhsnB6g3gk,11041
30
30
  modal/container_process.py,sha256=WTqLn01dJPVkPpwR_0w_JH96ceN5mV4TGtiu1ZR2RRA,6108
31
31
  modal/container_process.pyi,sha256=Hf0J5JyDdCCXBJSKx6gvkPOo0XrztCm78xzxamtzUjQ,2828
@@ -55,7 +55,7 @@ modal/object.pyi,sha256=kyJkRQcVv3ct7zSAxvvXcuhBVeH914v80uSlqeS7cA4,5632
55
55
  modal/output.py,sha256=N0xf4qeudEaYrslzdAl35VKV8rapstgIM2e9wO8_iy0,1967
56
56
  modal/parallel_map.py,sha256=POBTyiWabe2e4qBNlsjjksiu1AAPEsNqI-mM8cgNFco,16042
57
57
  modal/parallel_map.pyi,sha256=-YKY_bVuQv8B4gtFrHnXtuNV0_JpmU9vqMJzR7beeCU,2524
58
- modal/partial_function.py,sha256=YE4qt8PQSpyxmaC7aSYOs0My4RWj7P-nyeNOz4OVsyc,28711
58
+ modal/partial_function.py,sha256=0KRvTMTVPycaxX1iq-QbH21Wnf7Gzu2JHp6FYp0OdLs,28743
59
59
  modal/partial_function.pyi,sha256=pgKMv28XYy8-y-Li1ciX7aqud3ICCB0-nVr9Gh2G-ZA,9930
60
60
  modal/proxy.py,sha256=NrOevrWxG3G7-zlyRzG6BcIvop7AWLeyahZxitbBaOk,1418
61
61
  modal/proxy.pyi,sha256=1OEKIVUyC-xb7fHMzngakQso0nTsK60TVhXtlcMj6Wk,390
@@ -86,7 +86,7 @@ modal/_runtime/asgi.py,sha256=c4hmaMW1pLo-cm7ouriJjieuFm4ZF6D2LMy0638sfOs,22139
86
86
  modal/_runtime/container_io_manager.py,sha256=2WmFnErVZyfyw3P6iiv1N6FskxZGsiUHrJe7nJ_-iTs,43161
87
87
  modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
88
88
  modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
89
- modal/_runtime/user_code_imports.py,sha256=t_VfGXxKH67IQ-r17I1-rBiNs9yJWm4_jR657IHO8Eg,14700
89
+ modal/_runtime/user_code_imports.py,sha256=zl_Mq9dsrVF62x3w-iNK1YAhZKYAXeFaGpd4G7AySTc,14746
90
90
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
91
91
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
92
92
  modal/_utils/async_utils.py,sha256=9ubwMkwiDB4gzOYG2jL9j7Fs-5dxHjcifZe3r7JRg-k,25091
@@ -170,10 +170,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
170
170
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
171
  modal_version/__init__.py,sha256=wiJQ53c-OMs0Xf1UeXOxQ7FwlV1VzIjnX6o-pRYZ_Pk,470
172
172
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
173
- modal_version/_version_generated.py,sha256=iH3sZ3nuHQKpcuBj2avbkSJ6xUPHOCWlRP5WKSahg_I,148
174
- modal-0.73.4.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
175
- modal-0.73.4.dist-info/METADATA,sha256=aiQ_FR-jJx-P0YXE2-wRpJrEk90e5x9EUenqoqgMA-4,2329
176
- modal-0.73.4.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
177
- modal-0.73.4.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
- modal-0.73.4.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
179
- modal-0.73.4.dist-info/RECORD,,
173
+ modal_version/_version_generated.py,sha256=7azKeX1fgq54JQqB_4NQJ1XHMuNths4pNX416I_0x_c,148
174
+ modal-0.73.6.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
175
+ modal-0.73.6.dist-info/METADATA,sha256=ZX7n8GW67cApJpWw-ikTDQVUDBCPdDjcuRds5WiZngU,2329
176
+ modal-0.73.6.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
177
+ modal-0.73.6.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
+ modal-0.73.6.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
179
+ modal-0.73.6.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 4 # git: 6c60d79
4
+ build_number = 6 # git: d683623
File without changes