modAL 1.2.5.dev14__py3-none-any.whl → 1.2.5.dev16__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
@@ -988,6 +988,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
988
988
  function_definition = api_pb2.Function(
989
989
  module_name=info.module_name or "",
990
990
  function_name=info.function_name,
991
+ implementation_name=info.implementation_name,
991
992
  mount_ids=loaded_mount_ids,
992
993
  secret_ids=[secret.object_id for secret in secrets],
993
994
  image_id=(image.object_id if image else ""),
@@ -1054,6 +1055,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1054
1055
  function_data = api_pb2.FunctionData(
1055
1056
  module_name=function_definition.module_name,
1056
1057
  function_name=function_definition.function_name,
1058
+ implementation_name=function_definition.implementation_name,
1057
1059
  function_type=function_definition.function_type,
1058
1060
  warm_pool_size=function_definition.warm_pool_size,
1059
1061
  concurrency_limit=function_definition.concurrency_limit,
@@ -160,9 +160,8 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
160
160
  raise InvalidError("Interface decorators cannot be combined with lifecycle decorators.")
161
161
 
162
162
  has_web_interface = self.flags & _PartialFunctionFlags.WEB_INTERFACE
163
- has_http_web_interface = self.flags & _PartialFunctionFlags.HTTP_WEB_INTERFACE
164
163
  has_callable_interface = self.flags & _PartialFunctionFlags.CALLABLE_INTERFACE
165
- if (has_web_interface or has_http_web_interface) and has_callable_interface:
164
+ if has_web_interface and has_callable_interface:
166
165
  self.registered = True # Hacky, avoid false-positive warning
167
166
  raise InvalidError("Callable decorators cannot be combined with web interface decorators.")
168
167
 
@@ -30,6 +30,7 @@ from modal._utils.function_utils import (
30
30
  from modal.app import _App
31
31
  from modal.config import logger
32
32
  from modal.exception import ExecutionError, InvalidError
33
+ from modal.experimental.flash import _FlashContainerEntry
33
34
  from modal_proto import api_pb2
34
35
 
35
36
  if typing.TYPE_CHECKING:
@@ -392,18 +393,22 @@ class ImportedClass(Service):
392
393
  event_loop: UserCodeEventLoop,
393
394
  container_io_manager: "modal._runtime.container_io_manager.ContainerIOManager",
394
395
  ):
396
+ flash_entry = _FlashContainerEntry(self.function_def.http_config)
395
397
  # Identify the "enter" methods to run after resuming from a snapshot.
396
398
  if not self.function_def.is_auto_snapshot:
397
399
  post_snapshot_methods = _find_callables_for_obj(
398
400
  self.user_cls_instance, _PartialFunctionFlags.ENTER_POST_SNAPSHOT
399
401
  )
400
402
  call_lifecycle_functions(event_loop, container_io_manager, list(post_snapshot_methods.values()))
403
+ flash_entry.enter()
401
404
  try:
402
405
  yield
403
406
  finally:
404
407
  if not self.function_def.is_auto_snapshot:
408
+ flash_entry.stop()
405
409
  exit_methods = _find_callables_for_obj(self.user_cls_instance, _PartialFunctionFlags.EXIT)
406
410
  call_lifecycle_functions(event_loop, container_io_manager, list(exit_methods.values()))
411
+ flash_entry.close()
407
412
 
408
413
 
409
414
  def get_user_class_instance(_cls: modal.cls._Cls, args: tuple[Any, ...], kwargs: dict[str, Any]) -> typing.Any:
@@ -460,7 +465,7 @@ def import_single_function_service(
460
465
  else:
461
466
  # Load the module dynamically
462
467
  module = importlib.import_module(function_def.module_name)
463
- qual_name: str = function_def.function_name
468
+ qual_name: str = function_def.implementation_name
464
469
 
465
470
  if not is_global_object(qual_name):
466
471
  raise LocalFunctionError("Attempted to load a function defined in a function scope")
@@ -129,6 +129,7 @@ class FunctionInfo:
129
129
 
130
130
  raw_f: Optional[Callable[..., Any]] # if None - this is a "class service function"
131
131
  function_name: str
132
+ implementation_name: str
132
133
  user_cls: Optional[type[Any]]
133
134
  module_name: Optional[str]
134
135
 
@@ -160,20 +161,16 @@ class FunctionInfo:
160
161
  self.raw_f = f
161
162
  self.user_cls = user_cls
162
163
 
163
- if name_override is not None:
164
- if not serialized:
165
- # We may relax this constraint in the future, but currently we don't track the distinction between
166
- # the Function's name inside modal and the name of the object that we need to import in a container.
167
- raise InvalidError("Setting a custom `name=` also requires setting `serialized=True`")
168
- self.function_name = name_override
169
- elif f is None and user_cls:
164
+ if f is None and user_cls:
170
165
  # "service function" for running all methods of a class
171
- self.function_name = f"{user_cls.__name__}.*"
166
+ self.implementation_name = f"{user_cls.__name__}.*"
172
167
  elif f and user_cls:
173
168
  # Method may be defined on superclass of the wrapped class
174
- self.function_name = f"{user_cls.__name__}.{f.__name__}"
169
+ self.implementation_name = f"{user_cls.__name__}.{f.__name__}"
175
170
  else:
176
- self.function_name = f.__qualname__
171
+ self.implementation_name = f.__qualname__
172
+
173
+ self.function_name = name_override or self.implementation_name
177
174
 
178
175
  # If it's a cls, the @method could be defined in a base class in a different file.
179
176
  if user_cls is not None:
modal/app.py CHANGED
@@ -1098,6 +1098,13 @@ class _App:
1098
1098
  "The `@modal.http_server` decorator cannot be used on methods; decorate the class instead."
1099
1099
  )
1100
1100
 
1101
+ if http_config is not None:
1102
+ for method in _find_partial_methods_for_user_cls(
1103
+ user_cls, _PartialFunctionFlags.CALLABLE_INTERFACE
1104
+ ).values():
1105
+ method.registered = True # Avoid warning about not registering the method (hacky!)
1106
+ raise InvalidError("Callable decorators cannot be combined with web interface decorators.")
1107
+
1101
1108
  info = FunctionInfo(None, serialized=serialized, user_cls=user_cls)
1102
1109
 
1103
1110
  i6pn_enabled = i6pn or cluster_size is not None
modal/client.pyi CHANGED
@@ -32,7 +32,7 @@ class _Client:
32
32
  server_url: str,
33
33
  client_type: int,
34
34
  credentials: typing.Optional[tuple[str, str]],
35
- version: str = "1.2.5.dev14",
35
+ version: str = "1.2.5.dev16",
36
36
  ):
37
37
  """mdmd:hidden
38
38
  The Modal client object is not intended to be instantiated directly by users.
@@ -163,7 +163,7 @@ class Client:
163
163
  server_url: str,
164
164
  client_type: int,
165
165
  credentials: typing.Optional[tuple[str, str]],
166
- version: str = "1.2.5.dev14",
166
+ version: str = "1.2.5.dev16",
167
167
  ):
168
168
  """mdmd:hidden
169
169
  The Modal client object is not intended to be instantiated directly by users.
@@ -32,6 +32,7 @@ class _FlashManager:
32
32
  process: Optional[subprocess.Popen] = None, # to be deprecated
33
33
  health_check_url: Optional[str] = None,
34
34
  startup_timeout: int = 30,
35
+ exit_grace_period: int = 0,
35
36
  h2_enabled: bool = False,
36
37
  ):
37
38
  self.client = client
@@ -40,6 +41,7 @@ class _FlashManager:
40
41
  # Health check is not currently being used
41
42
  self.health_check_url = health_check_url
42
43
  self.startup_timeout = startup_timeout
44
+ self.exit_grace_period = exit_grace_period
43
45
  self.tunnel_manager = _forward_tunnel(port, h2_enabled=h2_enabled, client=client)
44
46
  self.stopped = False
45
47
  self.num_failures = 0
@@ -158,9 +160,12 @@ class _FlashManager:
158
160
  return self.tunnel.url
159
161
 
160
162
  async def stop(self):
161
- self.heartbeat_task.cancel()
162
- await self.client.stub.FlashContainerDeregister(api_pb2.FlashContainerDeregisterRequest())
163
+ try:
164
+ self.heartbeat_task.cancel()
165
+ except Exception as e:
166
+ logger.error(f"[Modal Flash] Error stopping: {e}")
163
167
 
168
+ await self.client.stub.FlashContainerDeregister(api_pb2.FlashContainerDeregisterRequest())
164
169
  self.stopped = True
165
170
  logger.warning(f"[Modal Flash] No longer accepting new requests on {self.tunnel.url}.")
166
171
 
@@ -171,19 +176,22 @@ class _FlashManager:
171
176
  if not self.stopped:
172
177
  await self.stop()
173
178
 
179
+ await asyncio.sleep(self.exit_grace_period)
180
+
174
181
  logger.warning(f"[Modal Flash] Closing tunnel on {self.tunnel.url}.")
175
182
  await self.tunnel_manager.__aexit__(*sys.exc_info())
176
183
 
177
184
 
178
- FlashManager = synchronize_api(_FlashManager)
185
+ FlashManager = synchronize_api(_FlashManager, target_module=__name__)
179
186
 
180
187
 
181
188
  @synchronizer.create_blocking
182
189
  async def flash_forward(
183
190
  port: int,
184
- process: Optional[subprocess.Popen] = None,
191
+ process: Optional[subprocess.Popen] = None, # to be deprecated
185
192
  health_check_url: Optional[str] = None,
186
193
  startup_timeout: int = 30,
194
+ exit_grace_period: int = 0,
187
195
  h2_enabled: bool = False,
188
196
  ) -> _FlashManager:
189
197
  """
@@ -199,6 +207,7 @@ async def flash_forward(
199
207
  process=process,
200
208
  health_check_url=health_check_url,
201
209
  startup_timeout=startup_timeout,
210
+ exit_grace_period=exit_grace_period,
202
211
  h2_enabled=h2_enabled,
203
212
  )
204
213
  await manager._start()
@@ -692,3 +701,33 @@ def _http_server(
692
701
 
693
702
 
694
703
  http_server = synchronize_api(_http_server, target_module=__name__)
704
+
705
+
706
+ class _FlashContainerEntry:
707
+ """
708
+ A class that manages the lifecycle of Flash manager for Flash containers.
709
+
710
+ It is intentional that stop() runs before exit handlers and close().
711
+ This ensures the container is deregistered first, preventing new requests from being routed to it
712
+ while exit handlers execute and the exit grace period elapses, before finally closing the tunnel.
713
+ """
714
+
715
+ def __init__(self, http_config: api_pb2.HTTPConfig):
716
+ self.http_config: api_pb2.HTTPConfig = http_config
717
+ self.flash_manager: Optional[FlashManager] = None # type: ignore
718
+
719
+ def enter(self):
720
+ if self.http_config != api_pb2.HTTPConfig():
721
+ self.flash_manager = flash_forward(
722
+ self.http_config.port,
723
+ startup_timeout=self.http_config.startup_timeout,
724
+ exit_grace_period=self.http_config.exit_grace_period,
725
+ )
726
+
727
+ def stop(self):
728
+ if self.flash_manager:
729
+ self.flash_manager.stop()
730
+
731
+ def close(self):
732
+ if self.flash_manager:
733
+ self.flash_manager.close()
@@ -1,4 +1,5 @@
1
1
  import modal.client
2
+ import modal_proto.api_pb2
2
3
  import subprocess
3
4
  import typing
4
5
  import typing_extensions
@@ -11,6 +12,7 @@ class _FlashManager:
11
12
  process: typing.Optional[subprocess.Popen] = None,
12
13
  health_check_url: typing.Optional[str] = None,
13
14
  startup_timeout: int = 30,
15
+ exit_grace_period: int = 0,
14
16
  h2_enabled: bool = False,
15
17
  ):
16
18
  """Initialize self. See help(type(self)) for accurate signature."""
@@ -39,6 +41,7 @@ class FlashManager:
39
41
  process: typing.Optional[subprocess.Popen] = None,
40
42
  health_check_url: typing.Optional[str] = None,
41
43
  startup_timeout: int = 30,
44
+ exit_grace_period: int = 0,
42
45
  h2_enabled: bool = False,
43
46
  ): ...
44
47
 
@@ -97,6 +100,7 @@ class __flash_forward_spec(typing_extensions.Protocol):
97
100
  process: typing.Optional[subprocess.Popen] = None,
98
101
  health_check_url: typing.Optional[str] = None,
99
102
  startup_timeout: int = 30,
103
+ exit_grace_period: int = 0,
100
104
  h2_enabled: bool = False,
101
105
  ) -> FlashManager:
102
106
  """Forward a port to the Modal Flash service, exposing that port as a stable web endpoint.
@@ -112,6 +116,7 @@ class __flash_forward_spec(typing_extensions.Protocol):
112
116
  process: typing.Optional[subprocess.Popen] = None,
113
117
  health_check_url: typing.Optional[str] = None,
114
118
  startup_timeout: int = 30,
119
+ exit_grace_period: int = 0,
115
120
  h2_enabled: bool = False,
116
121
  ) -> FlashManager:
117
122
  """Forward a port to the Modal Flash service, exposing that port as a stable web endpoint.
@@ -420,3 +425,18 @@ def http_server(
420
425
  exit_grace_period: The time to wait for the HTTP server to exit gracefully.
421
426
  """
422
427
  ...
428
+
429
+ class _FlashContainerEntry:
430
+ """A class that manages the lifecycle of Flash manager for Flash containers.
431
+
432
+ It is intentional that stop() runs before exit handlers and close().
433
+ This ensures the container is deregistered first, preventing new requests from being routed to it
434
+ while exit handlers execute and the exit grace period elapses, before finally closing the tunnel.
435
+ """
436
+ def __init__(self, http_config: modal_proto.api_pb2.HTTPConfig):
437
+ """Initialize self. See help(type(self)) for accurate signature."""
438
+ ...
439
+
440
+ def enter(self): ...
441
+ def stop(self): ...
442
+ def close(self): ...
modal/functions.pyi CHANGED
@@ -409,7 +409,7 @@ class Function(
409
409
 
410
410
  _call_generator: ___call_generator_spec[typing_extensions.Self]
411
411
 
412
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
412
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
413
413
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
414
414
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
415
415
  ...
@@ -418,7 +418,7 @@ class Function(
418
418
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
419
419
  ...
420
420
 
421
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
421
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
422
422
 
423
423
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
424
424
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -445,7 +445,7 @@ class Function(
445
445
  """
446
446
  ...
447
447
 
448
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
448
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
449
449
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
450
450
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
451
451
 
@@ -469,7 +469,7 @@ class Function(
469
469
  ...
470
470
 
471
471
  _experimental_spawn: ___experimental_spawn_spec[
472
- modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
472
+ modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
473
473
  ]
474
474
 
475
475
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -478,7 +478,7 @@ class Function(
478
478
 
479
479
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
480
480
 
481
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
481
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
482
482
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
483
483
  """Calls the function with the given arguments, without waiting for the results.
484
484
 
@@ -499,7 +499,7 @@ class Function(
499
499
  """
500
500
  ...
501
501
 
502
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
502
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
503
503
 
504
504
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
505
505
  """Return the inner Python object wrapped by this Modal Function."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.5.dev14
3
+ Version: 1.2.5.dev16
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -4,14 +4,14 @@ modal/_billing.py,sha256=C1jUN9f_1WqozSZAt9EOk1nImXUdiLrgFeeAu3R23cI,3012
4
4
  modal/_clustered_functions.py,sha256=7amiOxErtlciWeBJBL2KvaxerUomJpTAJ3qElflFHQA,2884
5
5
  modal/_clustered_functions.pyi,sha256=JmYwAGOLEnD5AF-gYF9O5tu-SgGjeoJz-X1j48b1Ijg,1157
6
6
  modal/_container_entrypoint.py,sha256=aRuWG1xl3kDy28CfQrqQ-LU8liX2W_bwm2avVOE63Tw,19812
7
- modal/_functions.py,sha256=rfypQ0YyonKkgGeETGI3rY39WT_VoTrOR6Ra8c6v-hc,91651
7
+ modal/_functions.py,sha256=4s-lq4eY58VZimdErW3nezsz6R-VUcy2jW2IESLjKjI,91802
8
8
  modal/_grpc_client.py,sha256=KZcggVNvFL5jRQkFumshMppeFHMbaZI9Dzf13run6As,6083
9
9
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
10
10
  modal/_load_context.py,sha256=P7bMvu-_E1YXWhunYU46EqQX78r4D3b05YGz9blSsy8,3786
11
11
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
12
12
  modal/_object.py,sha256=kRTugj_eB4lD6bcVIo57hQ12Dho8KEdCWhURrOd6KVE,13232
13
13
  modal/_output.py,sha256=eikFqD82RA8uwF-LLVzO-A9EtmoVLnqg0X5nZE5hdLA,26852
14
- modal/_partial_function.py,sha256=x96mWHQ8Vk6Np4nnepd2YGLliDakScL6BQ8Dm8NSiA8,38799
14
+ modal/_partial_function.py,sha256=xRaU_A5SE30jywgU_-S1kV2y9WUrm0S906T5OWpS2Vg,38684
15
15
  modal/_pty.py,sha256=E58MQ8d5-wkbMatRKpQR-G9FdbCRcZGiZxOpGy__VuY,1481
16
16
  modal/_resolver.py,sha256=j_nhDXxT2gbmNEx5b0B8An4ZEt4EKdVLncIj8zF9-nU,7241
17
17
  modal/_resources.py,sha256=NMAp0GCLutiZI4GuKSIVnRHVlstoD3hNGUabjTUtzf4,1794
@@ -21,12 +21,12 @@ modal/_tunnel.py,sha256=hWTfAwrepjAEDjfsYvTWBpucVRZt78NJjwWDZBwyk_Y,6676
21
21
  modal/_tunnel.pyi,sha256=FoedJzHymbPk4Bmnbszm6uhay2rMq1JS9mIiHELYf3k,13804
22
22
  modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
23
23
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
24
- modal/app.py,sha256=BLXBoq_0jpq6c0CjlJg4hVaI6Hfmd-0wZoP7okS5d6o,57451
24
+ modal/app.py,sha256=e85FmS4GspHYbSXlPoiqk3mMIoYQo6ALn3VbinsvqiI,57873
25
25
  modal/app.pyi,sha256=nI_Tibj-rI5I7dJFJnczbHvcmVzCvvCih0tMzoQlr_Y,50835
26
26
  modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
27
27
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
28
28
  modal/client.py,sha256=k1CqQ_0t4-vHylkqYZgYCnClg-FT0QrTPAKivL01A_k,14354
29
- modal/client.pyi,sha256=azciWBxVdBHu_1MmaHmKA_YVd5LOjkyD8YKK5ejJkGw,13148
29
+ modal/client.pyi,sha256=QsIUix9KbQIp6l_Q6NZBwUTliUa1nQB_OuZufHrKpH8,13148
30
30
  modal/cloud_bucket_mount.py,sha256=cvVj5Rt4nDHoQbTneoJPTaAcnl_Ab_mrsjnnzd0v9OI,6013
31
31
  modal/cloud_bucket_mount.pyi,sha256=vXusGMOUk9HjCs4lhxteuCK4xLQclPfugGWKo7LECEA,7539
32
32
  modal/cls.py,sha256=4T__mtYlQUnkatif1Wnr8Ld9DN_ySydHj2UwhRg89ok,41984
@@ -43,7 +43,7 @@ modal/file_io.py,sha256=Whs3QSl3pQbSoLzSRIIWfK4XyP-kwgyZmWgx3bhJ9u0,20933
43
43
  modal/file_io.pyi,sha256=xtO6Glf_BFwDE7QiQQo24QqcMf_Vv-iz7WojcGVlLBU,15932
44
44
  modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
45
45
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
46
- modal/functions.pyi,sha256=iaFyXiAZEdzd2e7vwB5sLzoLB1kSWCQrIiqmTaczFgQ,38111
46
+ modal/functions.pyi,sha256=Gyb8fhedU4BlEXIlgSBdDpQKNL-QIYvRxuf50WrN04k,38111
47
47
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
48
48
  modal/image.py,sha256=Pi1tpi41rklU-7PvXyJxPBYKdG3FcW-H_2pWjjeLYzs,108165
49
49
  modal/image.pyi,sha256=grkqK9BfyKDXmJYNme-lGa0O3u7pOU5GifyLOAhG3sc,78202
@@ -93,7 +93,7 @@ modal/_runtime/execution_context.pyi,sha256=FVzakehz72ndL-ufe8-EC7TM4IHO_MEBcAdg
93
93
  modal/_runtime/gpu_memory_snapshot.py,sha256=8T85kyfGJ11AnhFRCZTeWj9zin9e9f5XbrRqU8_WjAk,11955
94
94
  modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
95
95
  modal/_runtime/user_code_event_loop.py,sha256=HwOuDyCZLOakr_DG7p2MrcscjSQNheIhBBuLgB5I3Cc,3014
96
- modal/_runtime/user_code_imports.py,sha256=fUR8TXvEsUz3nU80jru9tlUHXN89P2ZcLdoFepIGZPE,25571
96
+ modal/_runtime/user_code_imports.py,sha256=A3BFLbm6SeuJkQYRLQTNYW9bty9u2C7eKdK5fGUFxbw,25812
97
97
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
98
98
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
99
99
  modal/_utils/async_utils.py,sha256=PnwHfaHcqjLwMnlGC2kn8nqubxpXcSKcy4jHx6477dg,30625
@@ -102,7 +102,7 @@ modal/_utils/blob_utils.py,sha256=NoAWDqYQsqAjievWmH5mCFSXA6XxQStDt9otT-Nh7_g,22
102
102
  modal/_utils/bytes_io_segment_payload.py,sha256=vaXPq8b52-x6G2hwE7SrjS58pg_aRm7gV3bn3yjmTzQ,4261
103
103
  modal/_utils/deprecation.py,sha256=-Bgg7jZdcJU8lROy18YyVnQYbM8hue-hVmwJqlWAGH0,5504
104
104
  modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
105
- modal/_utils/function_utils.py,sha256=H2dUgV3pAyAzDzdFXiqCZnQ2cgO1tyl9GcHqAP6o_-U,28695
105
+ modal/_utils/function_utils.py,sha256=kBMS4tGarKSKomp4BoxnmaNQ3nu72nodZ05Puqq5gUs,28361
106
106
  modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
107
107
  modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
108
108
  modal/_utils/grpc_utils.py,sha256=mCFloLzXzK3nMyQ2lE6rvMX_7bWBl5TV0YQU6kDDRvA,16468
@@ -157,10 +157,10 @@ modal/cli/programs/run_jupyter.py,sha256=IJw8nds8Cjl9j4dxBqMGxhz-bIyVX0kle7jbt8H
157
157
  modal/cli/programs/run_marimo.py,sha256=QlCGPkwQ0XLajt2LtujR_BGsRV1AZ3OCUgZxkkM1lug,2893
158
158
  modal/cli/programs/vscode.py,sha256=E1aJPU7b8RWWj-JX71DifsCoLYsCAnre7lATiBJjUms,3386
159
159
  modal/experimental/__init__.py,sha256=ls4ScjJOdCXW0HagDOrNTTnkP4_N7y93HUl10jNDrD8,14554
160
- modal/experimental/flash.py,sha256=vIZ9qO5-Hb-QViVOAFsY1nfr3vh2yOZQwn-4vTQrOY4,29645
161
- modal/experimental/flash.pyi,sha256=26YB9wCeAkjykwFJ4ppmWzVF0L8MJw5VW68w-Wi1-as,16105
160
+ modal/experimental/flash.py,sha256=ue2lL7W7QNTFOTL7hAPkMe5uy4GD2N2Ae6xTt0oXjPM,31104
161
+ modal/experimental/flash.pyi,sha256=i03XOnaqrBK6zcvLdJW1KFbv2H9Pv6DxKZOw5kMzaCw,16905
162
162
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
163
- modal-1.2.5.dev14.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
163
+ modal-1.2.5.dev16.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
164
164
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
165
165
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
166
166
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -188,10 +188,10 @@ modal_proto/task_command_router_pb2.py,sha256=_pD2ZpU0bNzhwBdzmLoLyLtAtftI_Agxwn
188
188
  modal_proto/task_command_router_pb2.pyi,sha256=EyDgXPLr7alqjXYERV8w_MPuO404x0uCppmSkrfE9IE,14589
189
189
  modal_proto/task_command_router_pb2_grpc.py,sha256=uEQ0HdrCp8v-9bB5yIic9muA8spCShLHY6Bz9cCgOUE,10114
190
190
  modal_proto/task_command_router_pb2_grpc.pyi,sha256=s3Yxsrawdj4nr8vqQqsAxyX6ilWaGbdECy425KKbLIA,3301
191
- modal_version/__init__.py,sha256=YUTdAZQGcnN6xZUTCYOdmQWRCiuTULleQNELoYW1rho,121
191
+ modal_version/__init__.py,sha256=k6d4JTmiOIEJJwn366V7UjpFYGRNXc3j229gQzyWTds,121
192
192
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
193
- modal-1.2.5.dev14.dist-info/METADATA,sha256=VCL6LSlrcktL6BpOAlXaogrsGBwyIX7ewdfb8Eq00lM,2490
194
- modal-1.2.5.dev14.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
195
- modal-1.2.5.dev14.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
196
- modal-1.2.5.dev14.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
197
- modal-1.2.5.dev14.dist-info/RECORD,,
193
+ modal-1.2.5.dev16.dist-info/METADATA,sha256=dDTsexjZSzPDgGEF0R2A-xWuUtb97mBX0QQlo90ywoM,2490
194
+ modal-1.2.5.dev16.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
195
+ modal-1.2.5.dev16.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
196
+ modal-1.2.5.dev16.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
197
+ modal-1.2.5.dev16.dist-info/RECORD,,
modal_version/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.2.5.dev14"
4
+ __version__ = "1.2.5.dev16"