modal 1.1.4.dev28__tar.gz → 1.1.4.dev30__tar.gz

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.
Files changed (190) hide show
  1. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/PKG-INFO +1 -1
  2. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/client.pyi +2 -2
  3. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/experimental/flash.py +2 -2
  4. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/sandbox.py +16 -0
  5. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/sandbox.pyi +1 -0
  6. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_version/__init__.py +1 -1
  8. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/LICENSE +0 -0
  9. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/README.md +0 -0
  10. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/__init__.py +0 -0
  11. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/__main__.py +0 -0
  12. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_clustered_functions.py +0 -0
  13. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_clustered_functions.pyi +0 -0
  14. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_container_entrypoint.py +0 -0
  15. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_functions.py +0 -0
  16. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_ipython.py +0 -0
  17. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_location.py +0 -0
  18. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_object.py +0 -0
  19. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_output.py +0 -0
  20. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_partial_function.py +0 -0
  21. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_pty.py +0 -0
  22. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_resolver.py +0 -0
  23. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_resources.py +0 -0
  24. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_runtime/__init__.py +0 -0
  25. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_runtime/asgi.py +0 -0
  26. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_runtime/container_io_manager.py +0 -0
  27. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_runtime/container_io_manager.pyi +0 -0
  28. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_runtime/execution_context.py +0 -0
  29. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_runtime/execution_context.pyi +0 -0
  30. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  31. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_runtime/telemetry.py +0 -0
  32. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_runtime/user_code_imports.py +0 -0
  33. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_serialization.py +0 -0
  34. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_traceback.py +0 -0
  35. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_tunnel.py +0 -0
  36. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_tunnel.pyi +0 -0
  37. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_type_manager.py +0 -0
  38. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/__init__.py +0 -0
  39. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/app_utils.py +0 -0
  40. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/async_utils.py +0 -0
  41. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/auth_token_manager.py +0 -0
  42. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/blob_utils.py +0 -0
  43. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/bytes_io_segment_payload.py +0 -0
  44. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/deprecation.py +0 -0
  45. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/docker_utils.py +0 -0
  46. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/function_utils.py +0 -0
  47. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/git_utils.py +0 -0
  48. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/grpc_testing.py +0 -0
  49. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/grpc_utils.py +0 -0
  50. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/hash_utils.py +0 -0
  51. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/http_utils.py +0 -0
  52. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/jwt_utils.py +0 -0
  53. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/logger.py +0 -0
  54. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/mount_utils.py +0 -0
  55. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/name_utils.py +0 -0
  56. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/package_utils.py +0 -0
  57. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/pattern_utils.py +0 -0
  58. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/rand_pb_testing.py +0 -0
  59. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/shell_utils.py +0 -0
  60. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_utils/time_utils.py +0 -0
  61. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_vendor/__init__.py +0 -0
  62. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  63. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_vendor/cloudpickle.py +0 -0
  64. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_vendor/tblib.py +0 -0
  65. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/_watcher.py +0 -0
  66. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/app.py +0 -0
  67. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/app.pyi +0 -0
  68. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/builder/2023.12.312.txt +0 -0
  69. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/builder/2023.12.txt +0 -0
  70. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/builder/2024.04.txt +0 -0
  71. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/builder/2024.10.txt +0 -0
  72. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/builder/2025.06.txt +0 -0
  73. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/builder/PREVIEW.txt +0 -0
  74. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/builder/README.md +0 -0
  75. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/builder/base-images.json +0 -0
  76. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/call_graph.py +0 -0
  77. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/__init__.py +0 -0
  78. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/_download.py +0 -0
  79. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/_traceback.py +0 -0
  80. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/app.py +0 -0
  81. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/cluster.py +0 -0
  82. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/config.py +0 -0
  83. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/container.py +0 -0
  84. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/dict.py +0 -0
  85. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/entry_point.py +0 -0
  86. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/environment.py +0 -0
  87. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/import_refs.py +0 -0
  88. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/launch.py +0 -0
  89. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/network_file_system.py +0 -0
  90. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/profile.py +0 -0
  91. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/programs/__init__.py +0 -0
  92. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/programs/launch_instance_ssh.py +0 -0
  93. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/programs/run_jupyter.py +0 -0
  94. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/programs/run_marimo.py +0 -0
  95. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/programs/vscode.py +0 -0
  96. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/queues.py +0 -0
  97. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/run.py +0 -0
  98. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/secret.py +0 -0
  99. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/token.py +0 -0
  100. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/utils.py +0 -0
  101. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cli/volume.py +0 -0
  102. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/client.py +0 -0
  103. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cloud_bucket_mount.py +0 -0
  104. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cloud_bucket_mount.pyi +0 -0
  105. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cls.py +0 -0
  106. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/cls.pyi +0 -0
  107. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/config.py +0 -0
  108. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/container_process.py +0 -0
  109. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/container_process.pyi +0 -0
  110. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/dict.py +0 -0
  111. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/dict.pyi +0 -0
  112. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/environments.py +0 -0
  113. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/environments.pyi +0 -0
  114. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/exception.py +0 -0
  115. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/experimental/__init__.py +0 -0
  116. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/experimental/flash.pyi +0 -0
  117. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/experimental/ipython.py +0 -0
  118. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/file_io.py +0 -0
  119. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/file_io.pyi +0 -0
  120. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/file_pattern_matcher.py +0 -0
  121. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/functions.py +0 -0
  122. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/functions.pyi +0 -0
  123. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/gpu.py +0 -0
  124. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/image.py +0 -0
  125. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/image.pyi +0 -0
  126. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/io_streams.py +0 -0
  127. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/io_streams.pyi +0 -0
  128. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/mount.py +0 -0
  129. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/mount.pyi +0 -0
  130. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/network_file_system.py +0 -0
  131. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/network_file_system.pyi +0 -0
  132. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/object.py +0 -0
  133. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/object.pyi +0 -0
  134. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/output.py +0 -0
  135. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/parallel_map.py +0 -0
  136. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/parallel_map.pyi +0 -0
  137. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/partial_function.py +0 -0
  138. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/partial_function.pyi +0 -0
  139. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/proxy.py +0 -0
  140. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/proxy.pyi +0 -0
  141. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/py.typed +0 -0
  142. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/queue.py +0 -0
  143. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/queue.pyi +0 -0
  144. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/retries.py +0 -0
  145. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/runner.py +0 -0
  146. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/runner.pyi +0 -0
  147. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/running_app.py +0 -0
  148. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/schedule.py +0 -0
  149. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/scheduler_placement.py +0 -0
  150. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/secret.py +0 -0
  151. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/secret.pyi +0 -0
  152. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/serving.py +0 -0
  153. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/serving.pyi +0 -0
  154. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/snapshot.py +0 -0
  155. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/snapshot.pyi +0 -0
  156. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/stream_type.py +0 -0
  157. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/token_flow.py +0 -0
  158. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/token_flow.pyi +0 -0
  159. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/volume.py +0 -0
  160. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal/volume.pyi +0 -0
  161. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal.egg-info/SOURCES.txt +0 -0
  162. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal.egg-info/dependency_links.txt +0 -0
  163. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal.egg-info/entry_points.txt +0 -0
  164. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal.egg-info/requires.txt +0 -0
  165. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal.egg-info/top_level.txt +0 -0
  166. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_docs/__init__.py +0 -0
  167. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_docs/gen_cli_docs.py +0 -0
  168. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_docs/gen_reference_docs.py +0 -0
  169. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_docs/mdmd/__init__.py +0 -0
  170. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_docs/mdmd/mdmd.py +0 -0
  171. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_docs/mdmd/signatures.py +0 -0
  172. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/__init__.py +0 -0
  173. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/api.proto +0 -0
  174. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/api_grpc.py +0 -0
  175. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/api_pb2.py +0 -0
  176. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/api_pb2.pyi +0 -0
  177. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/api_pb2_grpc.py +0 -0
  178. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/api_pb2_grpc.pyi +0 -0
  179. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/modal_api_grpc.py +0 -0
  180. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/modal_options_grpc.py +0 -0
  181. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/options.proto +0 -0
  182. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/options_grpc.py +0 -0
  183. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/options_pb2.py +0 -0
  184. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/options_pb2.pyi +0 -0
  185. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/options_pb2_grpc.py +0 -0
  186. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/options_pb2_grpc.pyi +0 -0
  187. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_proto/py.typed +0 -0
  188. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/modal_version/__main__.py +0 -0
  189. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/pyproject.toml +0 -0
  190. {modal-1.1.4.dev28 → modal-1.1.4.dev30}/setup.cfg +0 -0
@@ -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
@@ -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:
@@ -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,
@@ -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
@@ -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"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes