modAL 1.6.2.dev12__py3-none-any.whl → 1.6.3.dev0__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.
@@ -98,8 +98,9 @@ class _AuthTokenManager:
98
98
  caller goes away.
99
99
  """
100
100
  if self._refresh_task is None:
101
- # Maybe another coroutine refreshed already, or we're cooling down after a failure.
102
- if self._token and not self._should_refresh():
101
+ # Maybe another coroutine refreshed already, or we're cooling down after a failure. The cooldown
102
+ # only applies while the cached token is still usable.
103
+ if self._has_valid_token() and not self._should_refresh():
103
104
  return
104
105
  # Note: the task is created in async code so it binds to the synchronicity event loop.
105
106
  self._refresh_task = asyncio.create_task(self._fetch_token())
@@ -121,12 +122,12 @@ class _AuthTokenManager:
121
122
  async def _fetch_token(self):
122
123
  """Fetch a new token and cache it, or arm the failure backoff."""
123
124
  try:
124
- # No cached token to fall back on, so a failure is user-visible: retry transient errors.
125
+ # Retry transient errors if the cached token is missing or expired.
125
126
  # Otherwise one attempt, and _retry_after handles the cooldown.
126
127
  retry = Retry(
127
128
  attempt_timeout=self.AUTH_TOKEN_TIMEOUT,
128
129
  total_timeout=self.AUTH_TOKEN_RETRY_TOTAL_TIMEOUT,
129
- max_retries=0 if self._token else DEFAULT_MAX_RETRIES,
130
+ max_retries=0 if self._has_valid_token() else DEFAULT_MAX_RETRIES,
130
131
  )
131
132
  token = await self._fetch(retry)
132
133
  if not token:
@@ -166,6 +167,9 @@ class _AuthTokenManager:
166
167
  except Exception as e:
167
168
  raise ValueError("Internal error: Cannot parse auth token. Please contact Modal support.") from e
168
169
 
170
+ def _has_valid_token(self):
171
+ return bool(self._token) and not self._is_expired()
172
+
169
173
  def _in_backoff(self):
170
174
  return time.time() < self._retry_after
171
175
 
modal/cli/dict.py CHANGED
@@ -8,7 +8,7 @@ from modal._load_context import LoadContext
8
8
  from modal._resolver import Resolver
9
9
  from modal._utils.async_utils import TaskContext, synchronizer
10
10
  from modal._utils.time_utils import timestamp_to_localized_str
11
- from modal.cli.utils import display_table, env_option, yes_option
11
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
12
12
  from modal.client import _Client
13
13
  from modal.dict import _Dict
14
14
  from modal.output import OutputManager
@@ -64,10 +64,8 @@ async def clear(name: str, *, yes: bool = False, env: str | None = None):
64
64
  """Clear the contents of a named Dict by deleting all of its data."""
65
65
  d = _Dict.from_name(name, environment_name=env)
66
66
  if not yes:
67
- click.confirm(
67
+ confirm_or_suggest_yes(
68
68
  f"Are you sure you want to irrevocably delete the contents of modal.Dict '{name}'?",
69
- default=False,
70
- abort=True,
71
69
  )
72
70
  await d.clear()
73
71
 
@@ -87,10 +85,8 @@ async def delete(
87
85
  ):
88
86
  """Delete a named Dict and all of its data."""
89
87
  if not yes:
90
- click.confirm(
88
+ confirm_or_suggest_yes(
91
89
  f"Are you sure you want to irrevocably delete the modal.Dict '{name}'?",
92
- default=False,
93
- abort=True,
94
90
  )
95
91
  await _Dict.objects.delete(name, environment_name=env, allow_missing=allow_missing)
96
92
 
@@ -14,7 +14,7 @@ from modal._location import display_location
14
14
  from modal._utils.async_utils import synchronizer
15
15
  from modal._utils.time_utils import timestamp_to_localized_str
16
16
  from modal.cli._download import _volume_download
17
- from modal.cli.utils import display_table, env_option, yes_option
17
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
18
18
  from modal.client import _Client
19
19
  from modal.network_file_system import _NetworkFileSystem
20
20
  from modal.output import OutputManager
@@ -86,10 +86,8 @@ async def delete(
86
86
  # Lookup first to validate the name, even though delete is a staticmethod
87
87
  await _NetworkFileSystem.from_name(nfs_name, environment_name=env).hydrate()
88
88
  if not yes:
89
- click.confirm(
89
+ confirm_or_suggest_yes(
90
90
  f"Are you sure you want to irrevocably delete the modal.NetworkFileSystem '{nfs_name}'?",
91
- default=False,
92
- abort=True,
93
91
  )
94
92
 
95
93
  await _NetworkFileSystem.delete(nfs_name, environment_name=env)
modal/cli/queues.py CHANGED
@@ -8,7 +8,7 @@ from modal._load_context import LoadContext
8
8
  from modal._resolver import Resolver
9
9
  from modal._utils.async_utils import TaskContext, synchronizer
10
10
  from modal._utils.time_utils import timestamp_to_localized_str
11
- from modal.cli.utils import display_table, env_option, yes_option
11
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
12
12
  from modal.client import _Client
13
13
  from modal.output import OutputManager
14
14
  from modal.queue import _Queue
@@ -127,10 +127,8 @@ async def clear(
127
127
  """Clear the contents of a Queue by removing all of its data."""
128
128
  q = _Queue.from_name(name, environment_name=env)
129
129
  if not yes:
130
- click.confirm(
130
+ confirm_or_suggest_yes(
131
131
  f"Are you sure you want to irrevocably delete the contents of modal.Queue '{name}'?",
132
- default=False,
133
- abort=True,
134
132
  )
135
133
  await q.clear(partition=partition, all=all)
136
134
 
@@ -151,10 +149,8 @@ async def delete(
151
149
  """Delete a named Queue and all of its data."""
152
150
  env = ensure_env(env)
153
151
  if not yes:
154
- click.confirm(
152
+ confirm_or_suggest_yes(
155
153
  f"Are you sure you want to irrevocably delete the modal.Queue '{name}'?",
156
- default=False,
157
- abort=True,
158
154
  )
159
155
  await _Queue.objects.delete(name, environment_name=env, allow_missing=allow_missing)
160
156
 
modal/cli/secret.py CHANGED
@@ -13,7 +13,7 @@ from rich.syntax import Syntax
13
13
  from modal._environments import ensure_env
14
14
  from modal._utils.async_utils import synchronizer
15
15
  from modal._utils.time_utils import timestamp_to_localized_str
16
- from modal.cli.utils import display_table, env_option, yes_option
16
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, yes_option
17
17
  from modal.client import _Client
18
18
  from modal.output import OutputManager
19
19
  from modal.secret import _Secret
@@ -194,10 +194,8 @@ async def delete(
194
194
  ):
195
195
  env = ensure_env(env)
196
196
  if not yes:
197
- click.confirm(
197
+ confirm_or_suggest_yes(
198
198
  f"Are you sure you want to irrevocably delete the modal.Secret '{name}'?",
199
- default=False,
200
- abort=True,
201
199
  )
202
200
  await _Secret.objects.delete(name, environment_name=env, allow_missing=allow_missing)
203
201
 
modal/cli/volume.py CHANGED
@@ -13,7 +13,7 @@ from modal._utils.async_utils import synchronizer
13
13
  from modal._utils.browser_utils import open_url_and_display
14
14
  from modal._utils.time_utils import timestamp_to_localized_str
15
15
  from modal.cli._download import _volume_download
16
- from modal.cli.utils import display_table, env_option, humanize_filesize, yes_option
16
+ from modal.cli.utils import confirm_or_suggest_yes, display_table, env_option, humanize_filesize, yes_option
17
17
  from modal.output import OutputManager
18
18
  from modal.volume import _AbstractVolumeUploadContextManager, _Volume
19
19
  from modal_proto import api_pb2
@@ -81,10 +81,8 @@ async def rename(
81
81
  env: str | None = None,
82
82
  ):
83
83
  if not yes:
84
- click.confirm(
84
+ confirm_or_suggest_yes(
85
85
  f"Are you sure you want rename the modal.Volume '{old_name}'? This may break any Apps currently using it.",
86
- default=False,
87
- abort=True,
88
86
  )
89
87
 
90
88
  await _Volume.rename(old_name, new_name, environment_name=env)
@@ -132,10 +130,8 @@ async def delete(
132
130
  ):
133
131
  env = ensure_env(env)
134
132
  if not yes:
135
- click.confirm(
133
+ confirm_or_suggest_yes(
136
134
  f"Are you sure you want to irrevocably delete the modal.Volume '{name}'?",
137
- default=False,
138
- abort=True,
139
135
  )
140
136
 
141
137
  await _Volume.objects.delete(name, environment_name=env, allow_missing=allow_missing)
modal/client.pyi CHANGED
@@ -80,7 +80,7 @@ class _Client:
80
80
  server_url: str,
81
81
  client_type: int,
82
82
  credentials: typing.Optional[tuple[str, str]],
83
- version: str = "1.6.2.dev12",
83
+ version: str = "1.6.3.dev0",
84
84
  *,
85
85
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
86
86
  ):
@@ -290,7 +290,7 @@ class Client:
290
290
  server_url: str,
291
291
  client_type: int,
292
292
  credentials: typing.Optional[tuple[str, str]],
293
- version: str = "1.6.2.dev12",
293
+ version: str = "1.6.3.dev0",
294
294
  *,
295
295
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
296
296
  ):
modal/functions.pyi CHANGED
@@ -619,7 +619,7 @@ class Function(
619
619
 
620
620
  _call_generator: ___call_generator_spec
621
621
 
622
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
622
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
623
623
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
624
624
  """Calls the function remotely, executing it with the given arguments and returning the execution's result.
625
625
 
@@ -644,7 +644,7 @@ class Function(
644
644
  """
645
645
  ...
646
646
 
647
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
647
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
648
648
 
649
649
  class __remote_gen_spec(typing_extensions.Protocol):
650
650
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -694,7 +694,7 @@ class Function(
694
694
  """
695
695
  ...
696
696
 
697
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
697
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
698
698
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
699
699
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
700
700
 
@@ -727,7 +727,7 @@ class Function(
727
727
  """
728
728
  ...
729
729
 
730
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
730
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
731
731
 
732
732
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
733
733
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -735,7 +735,7 @@ class Function(
735
735
 
736
736
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
737
737
 
738
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
738
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
739
739
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
740
740
  """Calls the function with the given arguments, without waiting for the results.
741
741
 
@@ -768,7 +768,7 @@ class Function(
768
768
  """
769
769
  ...
770
770
 
771
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
771
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
772
772
 
773
773
  @property
774
774
  def _raw_f_(self) -> collections.abc.Callable[..., typing.Any]: ...
modal/sandbox/_sandbox.py CHANGED
@@ -112,6 +112,11 @@ _EXIT_SNAPSHOT_LONG_POLL_TIMEOUT = 10.0
112
112
  # client-side deadline.
113
113
  _EXIT_SNAPSHOT_POLL_DEADLINE_MARGIN = 5.0
114
114
 
115
+ # `Sandbox.wait` re-polls a server-side long poll of this many seconds. Each poll gets a network deadline
116
+ # with a margin over the hold, so a poll the server never answers fails and is retried instead of hanging.
117
+ _WAIT_LONG_POLL_TIMEOUT = 10.0
118
+ _WAIT_POLL_DEADLINE_MARGIN = 5.0
119
+
115
120
  # How long `Sandbox.create` waits for capacity before giving up.
116
121
  _SANDBOX_SCHEDULING_TIMEOUT: float = 21 * 60
117
122
 
@@ -484,8 +489,8 @@ class _Sandbox(_Object, type_prefix="sb"):
484
489
  wildcard prefixes (``*.``); a bare ``"*"`` allows all domains. The outbound policy
485
490
  can be replaced later via `Sandbox._experimental_set_outbound_network_policy`.
486
491
  inbound_cidr_allowlist:
487
- List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
488
- all CIDRs are allowed.
492
+ List of CIDRs allowed to connect inbound to the sandbox (encrypted tunnels and connection tokens).
493
+ If None, all CIDRs are allowed.
489
494
  _experimental_outbound_policy: Configuration for replacing headers in outbound HTTPS requests from
490
495
  the Sandbox. Secrets referenced by the policy are resolved outside the Sandbox and are never
491
496
  visible to the workload. See `modal.experimental.OutboundPolicy`. This API is experimental and
@@ -1682,14 +1687,15 @@ class _Sandbox(_Object, type_prefix="sb"):
1682
1687
 
1683
1688
  """
1684
1689
 
1690
+ poll_retry = Retry(attempt_timeout=_WAIT_LONG_POLL_TIMEOUT + _WAIT_POLL_DEADLINE_MARGIN)
1685
1691
  while True:
1686
- req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=10)
1692
+ req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=_WAIT_LONG_POLL_TIMEOUT)
1687
1693
  # Use the private __client to allow `wait` to work with a detached sandbox
1688
1694
  stub = self.__client._stub
1689
1695
  if self._is_v2:
1690
- resp = await stub.SandboxWaitV2(req, metadata=await self._v2_metadata(self.__client))
1696
+ resp = await stub.SandboxWaitV2(req, retry=poll_retry, metadata=await self._v2_metadata(self.__client))
1691
1697
  else:
1692
- resp = await stub.SandboxWait(req)
1698
+ resp = await stub.SandboxWait(req, retry=poll_retry)
1693
1699
  if resp.result.status:
1694
1700
  logger.debug(f"Sandbox {self.object_id} wait completed with status {resp.result.status}")
1695
1701
  self._result = resp.result
modal/sandbox/sandbox.pyi CHANGED
@@ -1474,8 +1474,8 @@ class Sandbox(modal.object.Object):
1474
1474
  wildcard prefixes (``*.``); a bare ``"*"`` allows all domains. The outbound policy
1475
1475
  can be replaced later via `Sandbox._experimental_set_outbound_network_policy`.
1476
1476
  inbound_cidr_allowlist:
1477
- List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
1478
- all CIDRs are allowed.
1477
+ List of CIDRs allowed to connect inbound to the sandbox (encrypted tunnels and connection tokens).
1478
+ If None, all CIDRs are allowed.
1479
1479
  _experimental_outbound_policy: Configuration for replacing headers in outbound HTTPS requests from
1480
1480
  the Sandbox. Secrets referenced by the policy are resolved outside the Sandbox and are never
1481
1481
  visible to the workload. See `modal.experimental.OutboundPolicy`. This API is experimental and
@@ -1598,8 +1598,8 @@ class Sandbox(modal.object.Object):
1598
1598
  wildcard prefixes (``*.``); a bare ``"*"`` allows all domains. The outbound policy
1599
1599
  can be replaced later via `Sandbox._experimental_set_outbound_network_policy`.
1600
1600
  inbound_cidr_allowlist:
1601
- List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
1602
- all CIDRs are allowed.
1601
+ List of CIDRs allowed to connect inbound to the sandbox (encrypted tunnels and connection tokens).
1602
+ If None, all CIDRs are allowed.
1603
1603
  _experimental_outbound_policy: Configuration for replacing headers in outbound HTTPS requests from
1604
1604
  the Sandbox. Secrets referenced by the policy are resolved outside the Sandbox and are never
1605
1605
  visible to the workload. See `modal.experimental.OutboundPolicy`. This API is experimental and
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.6.2.dev12
3
+ Version: 1.6.3.dev0
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -39,7 +39,7 @@ modal/billing.py,sha256=E1-P_P8bJFLp-bTaggYd4BaaViImPB5UdtXiY8VeAZQ,390
39
39
  modal/billing.pyi,sha256=4m7VLYNS8IiJ2I3CJx0awvrOM6BILWRVLfdeqtAYr8M,7189
40
40
  modal/call_graph.py,sha256=XGALIDn1bLchWo_goyX23bcPjzCZcfqKUo8INIfDapo,1775
41
41
  modal/client.py,sha256=cstrL0wpXCZmcvRs7Sy3QRw9Vz8zkZy8NNk0tPe38sk,22852
42
- modal/client.pyi,sha256=kHcbwHUBUE95wrRsWhYh053X0rqZ4M3X7fxLKYSl57A,23490
42
+ modal/client.pyi,sha256=aias3HzoVskQUtjZODdTIfpfezZH7uPFQOwx1883HqI,23488
43
43
  modal/cloud_bucket_mount.py,sha256=ZOg69dhIFcJcwim4JP-6s1tqwOYAfgS9806jRpspifw,7511
44
44
  modal/cloud_bucket_mount.pyi,sha256=HoPe_NG5jYdVfmTNY-ZJ3-C8Eo_FzJovl9orJRjkGbE,10252
45
45
  modal/cls.py,sha256=JfDAUMrkhasm26lK7kDUNarXZA_7AvZrymf7XNSGTDM,41777
@@ -56,7 +56,7 @@ modal/environments.pyi,sha256=drmg6yVLjpPhGJ4byOrdBEp2KRLburPrKT-FYtgNPoM,23628
56
56
  modal/exception.py,sha256=L-dUKust6feZzn5qhTVusSAr0IBa4Wa3qIA225IT_lY,12334
57
57
  modal/file_pattern_matcher.py,sha256=CpaNNj7oBlOSewX-AAUZCF8KDxH0_DmgwzfpVGbPYJ4,8138
58
58
  modal/functions.py,sha256=-5aogviGxcNXX4qZ34GSBMKnLqH-WH0eb4cGbHpCYYw,382
59
- modal/functions.pyi,sha256=lnDLXYKS86J57g0gmNOWeY70KIyIho945CDSkPDN5lU,62671
59
+ modal/functions.pyi,sha256=33XS_ROlsagDDnVDCMIWUsuddB_CxhM4Di32gf_ZLx4,62671
60
60
  modal/image.py,sha256=c0lUSAoU-Ip3g5DGZ0uhdCzoWSQWh1g0i-7Rxo-Sz-I,160
61
61
  modal/image.pyi,sha256=R5rdY4P30IEm-F7A2S9CdXa6QYNk-pQwsEun9BKTyLw,61094
62
62
  modal/io_streams.py,sha256=iWwhGCcTwhNtIo2t2f-qVV3FBEK1DIi40Tm_Ai01eYA,32992
@@ -117,7 +117,7 @@ modal/_runtime/user_code_imports.py,sha256=wrz91UnALsWYOrFCIuOkjx3DwzWA_vrAR8q-7
117
117
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
118
118
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
119
119
  modal/_utils/async_utils.py,sha256=WexEdrhu2ojS7fOGlBJQv9PRqFxOLlUbygU8Gv_NOdY,46528
120
- modal/_utils/auth_token_manager.py,sha256=C8yZP4RtS_uy5erxVQNof-BYN1b3GbJAk-0nCwjuBuo,8932
120
+ modal/_utils/auth_token_manager.py,sha256=Vdt7Xm2oqrPqu_iQE8lJuNR8pmSF2k9CF0cfHogDydc,9108
121
121
  modal/_utils/blob_utils.py,sha256=OtYCIYFPtqG9JxtwZoSPNLN8HI-u0yWZD6u8d8F0rFg,26462
122
122
  modal/_utils/browser_utils.py,sha256=Yqq0qU4Id6oaDOdeT1JEmbCN7vj4baNJJraJhRWU8ZI,1085
123
123
  modal/_utils/bytes_io_segment_payload.py,sha256=2OrIrjrsJR38a9D7JCITLqGvIPaiWViTQhxtcZlFn_M,4328
@@ -169,7 +169,7 @@ modal/cli/config.py,sha256=mwV5maANztDnaIU44qN-Pwg2Z6hGPPeLjIQsWZr1fuY,2431
169
169
  modal/cli/container.py,sha256=uyRR08kwfeLwaItljxjZYO59KAEAYAWq6Tk9ZkG_Xjg,12479
170
170
  modal/cli/curl.py,sha256=FIT0wCwmpOt1AgGfKsSqWOnei-eDv-KMnt5hdg9_DUY,4524
171
171
  modal/cli/dashboard.py,sha256=6V8BLYIooToNRM83PRAWaw1imxED3AzmApYNNti-pJk,917
172
- modal/cli/dict.py,sha256=m6JL4QCcPjCidK-qonYvq97qzRRb-F5spUI5PvVCa3Y,5152
172
+ modal/cli/dict.py,sha256=BycKjj8sxnj0KbsTPXReUlTYsxTGiGxcwBKAHKLd7W4,5092
173
173
  modal/cli/endpoint.py,sha256=grS3cQCNw2qhnczirDoYCiBEnUXp3paPK_4MVSZk7gA,28642
174
174
  modal/cli/entry_point.py,sha256=Sy9w9C2RHG9XDalJ0Fjwr4yQc4dTEL9gVNQuDrj3woI,5050
175
175
  modal/cli/environment.py,sha256=rKnKQFsbcLXjBtYWLFRqhP1NeCjMnqvSPci7Md4ZjIM,18377
@@ -177,18 +177,18 @@ modal/cli/function.py,sha256=qb0XNM8w4KshpybqG5agnyEeMCJCgMw7boc0jS3tGW4,58481
177
177
  modal/cli/image.py,sha256=Ve-PDT4XTH9KEQrZxvUc2ocAW4mLI5QfwQssaajK4MI,8073
178
178
  modal/cli/import_refs.py,sha256=nWZfuGK-4QLCDiymj7zf2lKC416vd8W502I2-_z9GwM,19269
179
179
  modal/cli/logo.py,sha256=plv82syvPb8j3qrR1A_nojZwp823t3VEXaDlrx1jkt0,3221
180
- modal/cli/network_file_system.py,sha256=xNvau_6fziIfbPIlVGAh1-wOGVCNko28GweAjO51LCU,7681
180
+ modal/cli/network_file_system.py,sha256=rPTt5z2oZfWcurD942fghBbPfdIYTLqqRym6lMaXZTM,7663
181
181
  modal/cli/profile.py,sha256=JbpSo5bcK2gdVx3QDrGWwnfRRG-_QtrsLAaQXnwh4K0,4782
182
- modal/cli/queues.py,sha256=cpoza1mEwupQoaBy7kaTqsTaWPto9tHRQrOeLXxZAUU,6951
182
+ modal/cli/queues.py,sha256=G86q3QFYJjEbPF4TDF-dBtApnMDmuYQ5FWQ6QiUW4ZI,6891
183
183
  modal/cli/run.py,sha256=0RFMz4aD5KXnJqLBPfBEu8q6ZWdxn__7ekiAtYeLpgg,26563
184
- modal/cli/secret.py,sha256=lckWyas1J3uQm1f8D9nkWlRlmToNzmy5a-0q4IsJFCc,8254
184
+ modal/cli/secret.py,sha256=O_50rxLEzNGq10A_I9W7j_EDc5myTMaRBvuz5iVQyFI,8236
185
185
  modal/cli/selector.py,sha256=OJr9Ua3K_l-qu3N3-I8z8oVq8lBakws2-XgfheR5p-c,4741
186
186
  modal/cli/server.py,sha256=9O7gWWI4CjIOOwtie744GvefsmtC8ztmt9kGl7XwhqE,50230
187
187
  modal/cli/shell.py,sha256=WshDkcIn2WQCTfoKRR9X0fOko0re8OopW1DU9dTgZbU,17309
188
188
  modal/cli/skills.py,sha256=oniDafrmu_ARYTlButnlXbKE9XlEU1-EFz-eO4tdnFY,11954
189
189
  modal/cli/token.py,sha256=TOuauMzSe7PV1bMnmGQO7oJaAsYY03C1GY6Nww8ac8Y,4905
190
190
  modal/cli/utils.py,sha256=1tkDLqtVqYvj4xLoRaOuO_cl8WJxPpHQnIdTg5S2tjA,11670
191
- modal/cli/volume.py,sha256=nM5QKRjX-d6lQO4FPNDFbIZhuWfZ2O_RW8gtWWwgs4Q,11281
191
+ modal/cli/volume.py,sha256=nwlEpiFswxClhSrYNn_jNxC7IWOaRqcChdVm8KYFaBw,11221
192
192
  modal/cli/workspace.py,sha256=nANL1rJ3PgSf7L_Bk_cgE6p_x0DuOD11MwYaCn6mTX4,22643
193
193
  modal/experimental/__init__.py,sha256=iHj9XLSZ_J0ciUalr96hJ57GbOsi2v87u5QZ6mPiHtg,13205
194
194
  modal/experimental/_flash_container_entry.py,sha256=u0ciXgUain0tosulHFVh_Dp7vi51uHWWiThdQbj0whs,2318
@@ -200,14 +200,14 @@ modal/experimental/ipython.py,sha256=kJ6o9wkAY_MiSb7paewI7f1MJAeqdi8TX5pBdhr_mUI
200
200
  modal/sandbox/__init__.py,sha256=wHE5KCHUaMSK_nNGbn852PI423v3Q4UQEsFpoqNqMMI,203
201
201
  modal/sandbox/_common.py,sha256=fw_OiE-EBtluxDFaBKVmYflG-3bSRTjfY1Q_EGmQKz8,9397
202
202
  modal/sandbox/_filesystem.py,sha256=GdkMNVahPpUpfuY04HwWWwZyMID3bcut7PHXNWOIpYg,28299
203
- modal/sandbox/_sandbox.py,sha256=B88XGJmpRDJEr2hkLgZX8NLMvpd3EyneS8rkb7ZXL90,113287
203
+ modal/sandbox/_sandbox.py,sha256=StQldIqilL0y9sAqNN_tzQ6pV6GWmbP3k4dYHOs5YvQ,113729
204
204
  modal/sandbox/_sidecar.py,sha256=c_vbP_ORl7POIFw3rvDZsrkBy53oJ03RxgID243p8Cw,28069
205
205
  modal/sandbox/_snapshot.py,sha256=8mB6FOecXEbgTC9dyogIEGCxTdjemuFsyfVFQyQ2Cp8,3105
206
206
  modal/sandbox/_task_command_router_client.py,sha256=qhFXy8eyGIxwxRFZkTsxJVxsAc8cWPhovOwcrHSZFq0,56712
207
207
  modal/sandbox/sandbox.py,sha256=4ekghND9qUGf5wtIQH4mVa6PHGjHgY0UN5RKryOM05k,683
208
- modal/sandbox/sandbox.pyi,sha256=HYxopAUYMfMEVMWgzeb4qPATPFzLkTCnqpSl9lI-3ac,150321
208
+ modal/sandbox/sandbox.pyi,sha256=LWQq7mpZXYVQHKjWi9azwddlclONcdYGZ7EpPgDD0-Y,150341
209
209
  modal/skills/modal/SKILL.md,sha256=Bm-0BPTYppJoeQzA-N-Re8L6-nKnV6gspJXMl4cD0P0,5490
210
- modal-1.6.2.dev12.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
210
+ modal-1.6.3.dev0.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
211
211
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
212
212
  modal_docs/gen_cli_docs.py,sha256=9-b8vl2EsLWD9zJqpCK8IUi5h44Bjn3i3rSdedZV4bA,6415
213
213
  modal_docs/gen_cli_docs_main.py,sha256=UPGr7O1DYTIRLwfINe2rbdh89J3cPVTU1OWL-SjxnOQ,198
@@ -220,8 +220,8 @@ modal_docs/mdmd/signatures.py,sha256=OASroKle763Kfumn4Ek4PABJXEGP56JMCTug44QoBx4
220
220
  modal_docs/mdmd/types.py,sha256=tv7fvziPr-MeDzOp4e2pK5h3d1DXTUOO74rPqDoBn6g,736
221
221
  modal_proto/__init__.py,sha256=Hkou4lcD5tArEkW_9v9KZhLY7fl0fA9-O28beKU55pg,396
222
222
  modal_proto/api_grpc.py,sha256=2apBkgs2G86IrW4qJCxIGk7EOH-N99FrGuRdEZsG8mk,209554
223
- modal_proto/api_pb2.py,sha256=U6cfmb99L-rgsz2nkURGlYjpzbSzAv-xpUd6m7GdmWg,607279
224
- modal_proto/api_pb2.pyi,sha256=X6AFkCXfS9PAXkIY5VJg2v9jlt0tt4soNxdI67r10Pc,841121
223
+ modal_proto/api_pb2.py,sha256=WVqXaIN3OMJpInUbXj5qDvgJEl7cADa1kHfdEvzqozo,607556
224
+ modal_proto/api_pb2.pyi,sha256=ClMVnxVRcKY6PvV8zJtGGy1gh17daVJfQnpQiIbArkI,842160
225
225
  modal_proto/api_pb2_grpc.py,sha256=V8X-LVyMUUgK8_fz6l96LOtOwRtdxgDvNaPatgrKWu8,448419
226
226
  modal_proto/api_pb2_grpc.pyi,sha256=zPleMbOEfMvYo-bN3VOIjoOYgYL2uncDpPxXtC85g94,105391
227
227
  modal_proto/modal_api_grpc.py,sha256=70vJTOo756_hHoE_svqkbrqO-FnTAEJhQ-D6LANg43M,32964
@@ -231,10 +231,10 @@ modal_proto/task_command_router_pb2.py,sha256=ysC0d8p3YxwyOpP3B-qDlvE81Yo4ntQiwi
231
231
  modal_proto/task_command_router_pb2.pyi,sha256=FDcd5t3ZCmQHUjefOzg07iglrgKYcBrzFvdKIWsEMHI,50628
232
232
  modal_proto/task_command_router_pb2_grpc.py,sha256=8iGUGwEVbqOsZWPJ7OsQ9OKUGaSCf9Dr2tvb04Ww6d4,44620
233
233
  modal_proto/task_command_router_pb2_grpc.pyi,sha256=26Fq9RQo09B9KLHsgdpRuw-I6Z4-2jrXLQkuDzB-moI,15097
234
- modal_version/__init__.py,sha256=6MG52gmiua3bGpTyHLOCZ4zqf3GjvBg7j4_6B6-F3J8,121
234
+ modal_version/__init__.py,sha256=0ENr9taOwXPJzq_BPqFzHuKh6GA7vJ3v6pKBi7vxaaw,120
235
235
  modal_version/__main__.py,sha256=nLUbubxKx7GXNzJIkTB7M7_u8080LyLM0IS0rzFkC_c,119
236
- modal-1.6.2.dev12.dist-info/METADATA,sha256=j4FlLoXxTNFK1Jx6Z6ttq5TMmh4_NOlJL0FYto027zc,2578
237
- modal-1.6.2.dev12.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
238
- modal-1.6.2.dev12.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
239
- modal-1.6.2.dev12.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
240
- modal-1.6.2.dev12.dist-info/RECORD,,
236
+ modal-1.6.3.dev0.dist-info/METADATA,sha256=U7DKoUvOyFI0GPAoGErRi76HoSydPkrdgnP8yNq_HxI,2577
237
+ modal-1.6.3.dev0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
238
+ modal-1.6.3.dev0.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
239
+ modal-1.6.3.dev0.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
240
+ modal-1.6.3.dev0.dist-info/RECORD,,