modal 1.2.1.dev3__tar.gz → 1.2.1.dev5__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.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

Files changed (197) hide show
  1. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/PKG-INFO +1 -1
  2. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_partial_function.py +6 -1
  3. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/run.py +6 -0
  4. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/client.pyi +2 -2
  5. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/config.py +12 -0
  6. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/sandbox.py +3 -3
  7. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/sandbox.pyi +6 -9
  8. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/api.proto +0 -1
  10. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_version/__init__.py +1 -1
  11. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/LICENSE +0 -0
  12. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/README.md +0 -0
  13. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/__init__.py +0 -0
  14. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/__main__.py +0 -0
  15. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_billing.py +0 -0
  16. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_clustered_functions.py +0 -0
  17. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_clustered_functions.pyi +0 -0
  18. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_container_entrypoint.py +0 -0
  19. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_functions.py +0 -0
  20. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_ipython.py +0 -0
  21. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_location.py +0 -0
  22. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_object.py +0 -0
  23. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_output.py +0 -0
  24. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_pty.py +0 -0
  25. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_resolver.py +0 -0
  26. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_resources.py +0 -0
  27. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_runtime/__init__.py +0 -0
  28. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_runtime/asgi.py +0 -0
  29. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_runtime/container_io_manager.py +0 -0
  30. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_runtime/container_io_manager.pyi +0 -0
  31. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_runtime/execution_context.py +0 -0
  32. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_runtime/execution_context.pyi +0 -0
  33. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  34. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_runtime/telemetry.py +0 -0
  35. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_runtime/user_code_imports.py +0 -0
  36. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_serialization.py +0 -0
  37. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_traceback.py +0 -0
  38. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_tunnel.py +0 -0
  39. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_tunnel.pyi +0 -0
  40. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_type_manager.py +0 -0
  41. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/__init__.py +0 -0
  42. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/app_utils.py +0 -0
  43. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/async_utils.py +0 -0
  44. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/auth_token_manager.py +0 -0
  45. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/blob_utils.py +0 -0
  46. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/bytes_io_segment_payload.py +0 -0
  47. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/deprecation.py +0 -0
  48. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/docker_utils.py +0 -0
  49. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/function_utils.py +0 -0
  50. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/git_utils.py +0 -0
  51. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/grpc_testing.py +0 -0
  52. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/grpc_utils.py +0 -0
  53. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/hash_utils.py +0 -0
  54. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/http_utils.py +0 -0
  55. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/jwt_utils.py +0 -0
  56. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/logger.py +0 -0
  57. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/mount_utils.py +0 -0
  58. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/name_utils.py +0 -0
  59. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/package_utils.py +0 -0
  60. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/pattern_utils.py +0 -0
  61. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/rand_pb_testing.py +0 -0
  62. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/shell_utils.py +0 -0
  63. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_utils/time_utils.py +0 -0
  64. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_vendor/__init__.py +0 -0
  65. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  66. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_vendor/cloudpickle.py +0 -0
  67. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_vendor/tblib.py +0 -0
  68. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/_watcher.py +0 -0
  69. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/app.py +0 -0
  70. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/app.pyi +0 -0
  71. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/billing.py +0 -0
  72. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/builder/2023.12.312.txt +0 -0
  73. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/builder/2023.12.txt +0 -0
  74. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/builder/2024.04.txt +0 -0
  75. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/builder/2024.10.txt +0 -0
  76. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/builder/2025.06.txt +0 -0
  77. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/builder/PREVIEW.txt +0 -0
  78. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/builder/README.md +0 -0
  79. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/builder/base-images.json +0 -0
  80. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/call_graph.py +0 -0
  81. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/__init__.py +0 -0
  82. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/_download.py +0 -0
  83. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/_traceback.py +0 -0
  84. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/app.py +0 -0
  85. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/cluster.py +0 -0
  86. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/config.py +0 -0
  87. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/container.py +0 -0
  88. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/dict.py +0 -0
  89. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/entry_point.py +0 -0
  90. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/environment.py +0 -0
  91. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/import_refs.py +0 -0
  92. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/launch.py +0 -0
  93. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/network_file_system.py +0 -0
  94. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/profile.py +0 -0
  95. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/programs/__init__.py +0 -0
  96. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/programs/launch_instance_ssh.py +0 -0
  97. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/programs/run_jupyter.py +0 -0
  98. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/programs/run_marimo.py +0 -0
  99. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/programs/vscode.py +0 -0
  100. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/queues.py +0 -0
  101. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/secret.py +0 -0
  102. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/token.py +0 -0
  103. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/utils.py +0 -0
  104. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cli/volume.py +0 -0
  105. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/client.py +0 -0
  106. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cloud_bucket_mount.py +0 -0
  107. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cloud_bucket_mount.pyi +0 -0
  108. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cls.py +0 -0
  109. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/cls.pyi +0 -0
  110. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/container_process.py +0 -0
  111. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/container_process.pyi +0 -0
  112. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/dict.py +0 -0
  113. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/dict.pyi +0 -0
  114. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/environments.py +0 -0
  115. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/environments.pyi +0 -0
  116. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/exception.py +0 -0
  117. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/experimental/__init__.py +0 -0
  118. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/experimental/flash.py +0 -0
  119. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/experimental/flash.pyi +0 -0
  120. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/experimental/ipython.py +0 -0
  121. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/file_io.py +0 -0
  122. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/file_io.pyi +0 -0
  123. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/file_pattern_matcher.py +0 -0
  124. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/functions.py +0 -0
  125. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/functions.pyi +0 -0
  126. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/gpu.py +0 -0
  127. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/image.py +0 -0
  128. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/image.pyi +0 -0
  129. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/io_streams.py +0 -0
  130. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/io_streams.pyi +0 -0
  131. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/mount.py +0 -0
  132. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/mount.pyi +0 -0
  133. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/network_file_system.py +0 -0
  134. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/network_file_system.pyi +0 -0
  135. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/object.py +0 -0
  136. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/object.pyi +0 -0
  137. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/output.py +0 -0
  138. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/parallel_map.py +0 -0
  139. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/parallel_map.pyi +0 -0
  140. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/partial_function.py +0 -0
  141. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/partial_function.pyi +0 -0
  142. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/proxy.py +0 -0
  143. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/proxy.pyi +0 -0
  144. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/py.typed +0 -0
  145. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/queue.py +0 -0
  146. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/queue.pyi +0 -0
  147. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/retries.py +0 -0
  148. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/runner.py +0 -0
  149. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/runner.pyi +0 -0
  150. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/running_app.py +0 -0
  151. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/schedule.py +0 -0
  152. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/scheduler_placement.py +0 -0
  153. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/secret.py +0 -0
  154. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/secret.pyi +0 -0
  155. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/serving.py +0 -0
  156. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/serving.pyi +0 -0
  157. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/snapshot.py +0 -0
  158. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/snapshot.pyi +0 -0
  159. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/stream_type.py +0 -0
  160. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/token_flow.py +0 -0
  161. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/token_flow.pyi +0 -0
  162. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/volume.py +0 -0
  163. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal/volume.pyi +0 -0
  164. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal.egg-info/SOURCES.txt +0 -0
  165. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal.egg-info/dependency_links.txt +0 -0
  166. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal.egg-info/entry_points.txt +0 -0
  167. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal.egg-info/requires.txt +0 -0
  168. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal.egg-info/top_level.txt +0 -0
  169. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_docs/__init__.py +0 -0
  170. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_docs/gen_cli_docs.py +0 -0
  171. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_docs/gen_reference_docs.py +0 -0
  172. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_docs/mdmd/__init__.py +0 -0
  173. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_docs/mdmd/mdmd.py +0 -0
  174. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_docs/mdmd/signatures.py +0 -0
  175. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/__init__.py +0 -0
  176. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/api_grpc.py +0 -0
  177. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/api_pb2.py +0 -0
  178. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/api_pb2.pyi +0 -0
  179. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/api_pb2_grpc.py +0 -0
  180. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/api_pb2_grpc.pyi +0 -0
  181. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/modal_api_grpc.py +0 -0
  182. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/py.typed +0 -0
  183. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/sandbox_router.proto +0 -0
  184. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/sandbox_router_grpc.py +0 -0
  185. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/sandbox_router_pb2.py +0 -0
  186. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/sandbox_router_pb2.pyi +0 -0
  187. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
  188. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
  189. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/task_command_router.proto +0 -0
  190. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/task_command_router_grpc.py +0 -0
  191. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/task_command_router_pb2.py +0 -0
  192. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/task_command_router_pb2.pyi +0 -0
  193. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  194. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  195. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/modal_version/__main__.py +0 -0
  196. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/pyproject.toml +0 -0
  197. {modal-1.2.1.dev3 → modal-1.2.1.dev5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.1.dev3
3
+ Version: 1.2.1.dev5
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -19,7 +19,7 @@ from ._functions import _Function
19
19
  from ._utils.async_utils import synchronizer
20
20
  from ._utils.deprecation import deprecation_warning
21
21
  from ._utils.function_utils import callable_has_non_self_params
22
- from .config import logger
22
+ from .config import config, logger
23
23
  from .exception import InvalidError
24
24
 
25
25
  MAX_MAX_BATCH_SIZE = 1000
@@ -378,6 +378,7 @@ def _fastapi_endpoint(
378
378
  method=method,
379
379
  web_endpoint_docs=docs,
380
380
  requested_suffix=label or "",
381
+ ephemeral_suffix=config.get("dev_suffix"),
381
382
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
382
383
  custom_domains=_parse_custom_domains(custom_domains),
383
384
  requires_proxy_auth=requires_proxy_auth,
@@ -446,6 +447,7 @@ def _web_endpoint(
446
447
  method=method,
447
448
  web_endpoint_docs=docs,
448
449
  requested_suffix=label or "",
450
+ ephemeral_suffix=config.get("dev_suffix"),
449
451
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
450
452
  custom_domains=_parse_custom_domains(custom_domains),
451
453
  requires_proxy_auth=requires_proxy_auth,
@@ -505,6 +507,7 @@ def _asgi_app(
505
507
  webhook_config = api_pb2.WebhookConfig(
506
508
  type=api_pb2.WEBHOOK_TYPE_ASGI_APP,
507
509
  requested_suffix=label or "",
510
+ ephemeral_suffix=config.get("dev_suffix"),
508
511
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
509
512
  custom_domains=_parse_custom_domains(custom_domains),
510
513
  requires_proxy_auth=requires_proxy_auth,
@@ -562,6 +565,7 @@ def _wsgi_app(
562
565
  webhook_config = api_pb2.WebhookConfig(
563
566
  type=api_pb2.WEBHOOK_TYPE_WSGI_APP,
564
567
  requested_suffix=label or "",
568
+ ephemeral_suffix=config.get("dev_suffix"),
565
569
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
566
570
  custom_domains=_parse_custom_domains(custom_domains),
567
571
  requires_proxy_auth=requires_proxy_auth,
@@ -623,6 +627,7 @@ def _web_server(
623
627
  webhook_config = api_pb2.WebhookConfig(
624
628
  type=api_pb2.WEBHOOK_TYPE_WEB_SERVER,
625
629
  requested_suffix=label or "",
630
+ ephemeral_suffix=config.get("dev_suffix"),
626
631
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
627
632
  custom_domains=_parse_custom_domains(custom_domains),
628
633
  web_server_port=port,
@@ -496,6 +496,12 @@ def serve(
496
496
  ```
497
497
  modal serve hello_world.py
498
498
  ```
499
+
500
+ Modal-generated URLs will have a `-dev` suffix appended to them when running with `modal serve`.
501
+ To customize this suffix (i.e., to avoid collisions with other users in your workspace who are
502
+ concurrently serving the App), you can set the `dev_suffix` in your `.modal.toml` file or the
503
+ `MODAL_DEV_SUFFIX` environment variable.
504
+
499
505
  """
500
506
  env = ensure_env(env)
501
507
  import_ref = parse_import_ref(app_ref, use_module_mode=use_module_mode)
@@ -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.2.1.dev3",
36
+ version: str = "1.2.1.dev5",
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.2.1.dev3",
167
+ version: str = "1.2.1.dev5",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -71,6 +71,10 @@ Other possible configuration options are:
71
71
  The log formatting pattern that will be used by the modal client itself.
72
72
  See https://docs.python.org/3/library/logging.html#logrecord-attributes for available
73
73
  log attributes.
74
+ * `dev_suffix` (in the .toml file) / `MODAL_DEV_SUFFIX` (as an env var).
75
+ Overrides the default `-dev` suffix added to URLs generated for web endpoints
76
+ when the App is ephemeral (i.e., created via `modal serve`). Must be a short
77
+ alphanumeric string.
74
78
 
75
79
  Meta-configuration
76
80
  ------------------
@@ -85,6 +89,7 @@ Some "meta-options" are set using environment variables only:
85
89
 
86
90
  import logging
87
91
  import os
92
+ import re
88
93
  import typing
89
94
  import warnings
90
95
  from typing import Any, Callable, Optional
@@ -206,6 +211,12 @@ def _check_value(options: list[str]) -> Callable[[str], str]:
206
211
  return checker
207
212
 
208
213
 
214
+ def _enforce_suffix_rules(x: str) -> str:
215
+ if x and not re.match(r"^[a-zA-Z0-9]{1,8}$", x):
216
+ raise ValueError("Suffix must be an alphanumeric string of no more than 8 characters.")
217
+ return x
218
+
219
+
209
220
  class _Setting(typing.NamedTuple):
210
221
  default: typing.Any = None
211
222
  transform: typing.Callable[[str], typing.Any] = lambda x: x # noqa: E731
@@ -244,6 +255,7 @@ _SETTINGS = {
244
255
  "pickle",
245
256
  transform=lambda s: _check_value(["pickle", "cbor"])(s.lower()),
246
257
  ),
258
+ "dev_suffix": _Setting("", transform=_enforce_suffix_rules),
247
259
  }
248
260
 
249
261
 
@@ -669,11 +669,11 @@ class _Sandbox(_Object, type_prefix="sb"):
669
669
  async def create_connect_token(
670
670
  self, user_metadata: Optional[Union[str, dict[str, Any]]] = None
671
671
  ) -> SandboxConnectCredentials:
672
- """mdmd:hidden
673
- [Alpha] Create a token for making HTTP connections to the sandbox.
672
+ """
673
+ [Alpha] Create a token for making HTTP connections to the Sandbox.
674
674
 
675
675
  Also accepts an optional user_metadata string or dict to associate with the token. This metadata
676
- will be added to the headers by the proxy when forwarding requests to the sandbox."""
676
+ will be added to the headers by the proxy when forwarding requests to the Sandbox."""
677
677
  if user_metadata is not None and isinstance(user_metadata, dict):
678
678
  try:
679
679
  user_metadata = json.dumps(user_metadata)
@@ -276,11 +276,10 @@ class _Sandbox(modal._object._Object):
276
276
  async def create_connect_token(
277
277
  self, user_metadata: typing.Union[str, dict[str, typing.Any], None] = None
278
278
  ) -> SandboxConnectCredentials:
279
- """mdmd:hidden
280
- [Alpha] Create a token for making HTTP connections to the sandbox.
279
+ """[Alpha] Create a token for making HTTP connections to the Sandbox.
281
280
 
282
281
  Also accepts an optional user_metadata string or dict to associate with the token. This metadata
283
- will be added to the headers by the proxy when forwarding requests to the sandbox.
282
+ will be added to the headers by the proxy when forwarding requests to the Sandbox.
284
283
  """
285
284
  ...
286
285
 
@@ -832,22 +831,20 @@ class Sandbox(modal.object.Object):
832
831
  def __call__(
833
832
  self, /, user_metadata: typing.Union[str, dict[str, typing.Any], None] = None
834
833
  ) -> SandboxConnectCredentials:
835
- """mdmd:hidden
836
- [Alpha] Create a token for making HTTP connections to the sandbox.
834
+ """[Alpha] Create a token for making HTTP connections to the Sandbox.
837
835
 
838
836
  Also accepts an optional user_metadata string or dict to associate with the token. This metadata
839
- will be added to the headers by the proxy when forwarding requests to the sandbox.
837
+ will be added to the headers by the proxy when forwarding requests to the Sandbox.
840
838
  """
841
839
  ...
842
840
 
843
841
  async def aio(
844
842
  self, /, user_metadata: typing.Union[str, dict[str, typing.Any], None] = None
845
843
  ) -> SandboxConnectCredentials:
846
- """mdmd:hidden
847
- [Alpha] Create a token for making HTTP connections to the sandbox.
844
+ """[Alpha] Create a token for making HTTP connections to the Sandbox.
848
845
 
849
846
  Also accepts an optional user_metadata string or dict to associate with the token. This metadata
850
- will be added to the headers by the proxy when forwarding requests to the sandbox.
847
+ will be added to the headers by the proxy when forwarding requests to the Sandbox.
851
848
  """
852
849
  ...
853
850
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.1.dev3
3
+ Version: 1.2.1.dev5
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -3575,7 +3575,6 @@ message WebhookConfig {
3575
3575
  string ephemeral_suffix = 11; // Additional URL suffix added for ephemeral Apps
3576
3576
  }
3577
3577
 
3578
-
3579
3578
  message WorkspaceBillingReportItem {
3580
3579
  string object_id = 1;
3581
3580
  string description = 2;
@@ -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.1.dev3"
4
+ __version__ = "1.2.1.dev5"
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
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