modal 1.1.4.dev28__py3-none-any.whl → 1.1.4.dev30__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
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.1.4.dev28",
36
+ version: str = "1.1.4.dev30",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.1.4.dev28",
167
+ version: str = "1.1.4.dev30",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -256,7 +256,7 @@ class _FlashPrometheusAutoscaler:
256
256
 
257
257
  internal_metrics_list = []
258
258
  for container in containers:
259
- internal_metric = await self._get_container_metrics(container.id)
259
+ internal_metric = await self._get_container_metrics(container.task_id)
260
260
  if internal_metric is None:
261
261
  continue
262
262
  internal_metrics_list.append(getattr(internal_metric.metrics, self.target_metric))
@@ -282,7 +282,7 @@ class _FlashPrometheusAutoscaler:
282
282
  f"desired replicas: {desired_replicas}"
283
283
  )
284
284
 
285
- desired_replicas = max(1, desired_replicas)
285
+ desired_replicas = max(1, min(desired_replicas, self.max_containers or 1000))
286
286
  return desired_replicas
287
287
 
288
288
  async def _compute_target_containers_prometheus(self, current_replicas: int) -> int:
modal/sandbox.py CHANGED
@@ -24,6 +24,7 @@ from ._utils.async_utils import TaskContext, synchronize_api
24
24
  from ._utils.deprecation import deprecation_warning
25
25
  from ._utils.grpc_utils import retry_transient_errors
26
26
  from ._utils.mount_utils import validate_network_file_systems, validate_volumes
27
+ from ._utils.name_utils import is_valid_object_name
27
28
  from .client import _Client
28
29
  from .config import config
29
30
  from .container_process import _ContainerProcess
@@ -73,6 +74,16 @@ def _validate_exec_args(args: Sequence[str]) -> None:
73
74
  )
74
75
 
75
76
 
77
+ def _warn_if_invalid_name(name: str) -> None:
78
+ if not is_valid_object_name(name):
79
+ deprecation_warning(
80
+ (2025, 9, 3),
81
+ f"Sandbox name '{name}' will be considered invalid in a future release."
82
+ "\n\nNames may contain only alphanumeric characters, dashes, periods, and underscores,"
83
+ " must be shorter than 64 characters, and cannot conflict with App ID strings.",
84
+ )
85
+
86
+
76
87
  class DefaultSandboxNameOverride(str):
77
88
  """A singleton class that represents the default sandbox name override.
78
89
 
@@ -404,6 +415,8 @@ class _Sandbox(_Object, type_prefix="sb"):
404
415
  from .app import _App
405
416
 
406
417
  _validate_exec_args(args)
418
+ if name is not None:
419
+ _warn_if_invalid_name(name)
407
420
 
408
421
  if block_network and (encrypted_ports or h2_ports or unencrypted_ports):
409
422
  raise InvalidError("Cannot specify open ports when `block_network` is enabled")
@@ -787,6 +800,9 @@ class _Sandbox(_Object, type_prefix="sb"):
787
800
  ):
788
801
  client = client or await _Client.from_env()
789
802
 
803
+ if name is not None and name != _DEFAULT_SANDBOX_NAME_OVERRIDE:
804
+ _warn_if_invalid_name(name)
805
+
790
806
  if name is _DEFAULT_SANDBOX_NAME_OVERRIDE:
791
807
  restore_req = api_pb2.SandboxRestoreRequest(
792
808
  snapshot_id=snapshot.object_id,
modal/sandbox.pyi CHANGED
@@ -26,6 +26,7 @@ import typing
26
26
  import typing_extensions
27
27
 
28
28
  def _validate_exec_args(args: collections.abc.Sequence[str]) -> None: ...
29
+ def _warn_if_invalid_name(name: str) -> None: ...
29
30
 
30
31
  class DefaultSandboxNameOverride(str):
31
32
  """A singleton class that represents the default sandbox name override.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.4.dev28
3
+ Version: 1.1.4.dev30
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -22,7 +22,7 @@ modal/app.py,sha256=F4baVULljFq0CwC_7U-EKNRNx7CYeWBKudjjYUuWc4U,48416
22
22
  modal/app.pyi,sha256=AbXJCBkyt2rI_-M3VbTBYb32at0P6iRZuoC87xY_JrQ,43591
23
23
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
24
24
  modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
25
- modal/client.pyi,sha256=uDYc9D-M2scJv1Ur0rIAugWT8G0EVI6vbcL3XwlY5g8,15831
25
+ modal/client.pyi,sha256=8BYRC3a6lliz1evOa4F_WCEmeVFjvaIsI2klW1RvcJY,15831
26
26
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
27
27
  modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
28
28
  modal/cls.py,sha256=pTEO7pHjlO7taMbIqs4oI9ZZgKDJpVKyGkO5ZT0w6tQ,40934
@@ -65,8 +65,8 @@ modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
65
65
  modal/runner.py,sha256=ostdzYpQb-20tlD6dIq7bpWTkZkOhjJBNuMNektqnJA,24068
66
66
  modal/runner.pyi,sha256=lbwLljm1cC8d6PcNvmYQhkE8501V9fg0bYqqKX6G4r4,8489
67
67
  modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
68
- modal/sandbox.py,sha256=oCBh5FXe6A53sVkrsD04SEWW4rQSB8xviBfDunZxxgw,41500
69
- modal/sandbox.pyi,sha256=wZGFhGzLcj7BRWzHWofjA5Z7NFrAkVxqgdjkVWK2pX8,41999
68
+ modal/sandbox.py,sha256=uqihD69r_hin4XEGBNUnO8hITkP856HviL3Y1xV6B6k,42164
69
+ modal/sandbox.pyi,sha256=mOyungHDDmUrg7jLmJpWuoUEbA4z6TUaVx291hndPmI,42049
70
70
  modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
71
71
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
72
72
  modal/secret.py,sha256=jcNJKc4ZB2nvAn7HJFawInqE-_7sbB43IWLZwyLBQ28,19308
@@ -150,10 +150,10 @@ modal/cli/programs/run_jupyter.py,sha256=44Lpvqk2l3hH-uOkmAOzw60NEsfB5uaRDWDKVsh
150
150
  modal/cli/programs/run_marimo.py,sha256=HyZ2za0NYqg31-mGxFQxUIAJ3Q-jRaMocEwWwI5-cdw,2887
151
151
  modal/cli/programs/vscode.py,sha256=KbTAaIXyQBVCDXxXjmBHmKpgXkUw0q4R4KkJvUjCYgk,3380
152
152
  modal/experimental/__init__.py,sha256=aWDb1VO9s4D-5Ktw_kYQSqoCp1W8S7lhns-5l7S1l-8,15102
153
- modal/experimental/flash.py,sha256=Sxzx6WXOJSYAwKn3ZMyPWSroudQTPeHVpCEWbSPKD3A,24124
153
+ modal/experimental/flash.py,sha256=das7DK9m3PVyCEF9WhxXYDpqyB8x5yp6Z17TX-4b36M,24163
154
154
  modal/experimental/flash.pyi,sha256=bCH9OgSzwJPo_s5-ObqlNBQUziZ7p5m5_zh0aQTA7sg,12216
155
155
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
156
- modal-1.1.4.dev28.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
156
+ modal-1.1.4.dev30.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
157
157
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
158
158
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
159
159
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -176,10 +176,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
176
176
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
177
177
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
178
178
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- modal_version/__init__.py,sha256=U3zYvussyhm4LpBPEvSAIV24lwpJWrSVmQVc7rel01g,121
179
+ modal_version/__init__.py,sha256=Fc2fNsiO6vGtFrDt74uH2WMbtkqcG1uNRwMGmokhpRU,121
180
180
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
181
- modal-1.1.4.dev28.dist-info/METADATA,sha256=l4cMEFeTe6dLilwhAxwXXJArJwHRgcLudcpc6Ck8-n0,2460
182
- modal-1.1.4.dev28.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
- modal-1.1.4.dev28.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
- modal-1.1.4.dev28.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
- modal-1.1.4.dev28.dist-info/RECORD,,
181
+ modal-1.1.4.dev30.dist-info/METADATA,sha256=-yL2glfKcCNqhFTQO_7VSHm43rSCAjOTMjqpOmJX-oQ,2460
182
+ modal-1.1.4.dev30.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
+ modal-1.1.4.dev30.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
+ modal-1.1.4.dev30.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
+ modal-1.1.4.dev30.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.1.4.dev28"
4
+ __version__ = "1.1.4.dev30"