modal 1.4.4.dev16__tar.gz → 1.4.4.dev17__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 (223) hide show
  1. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/PKG-INFO +1 -1
  2. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_functions.py +13 -1
  3. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_image.py +8 -3
  4. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_object.py +0 -18
  5. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/grpc_utils.py +4 -1
  6. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/client.pyi +2 -2
  7. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cls.py +8 -0
  8. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cls.pyi +14 -0
  9. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/dict.py +0 -21
  10. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/dict.pyi +0 -56
  11. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/functions.pyi +15 -1
  12. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/object.pyi +0 -6
  13. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/queue.py +0 -18
  14. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/queue.pyi +0 -56
  15. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/sandbox.py +19 -9
  16. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/sandbox.pyi +14 -0
  17. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/secret.py +0 -18
  18. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/secret.pyi +0 -41
  19. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/volume.py +0 -54
  20. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/volume.pyi +0 -124
  21. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal.egg-info/PKG-INFO +1 -1
  22. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/api_grpc.py +16 -0
  23. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/api_pb2.py +526 -526
  24. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/api_pb2.pyi +9 -2
  25. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/api_pb2_grpc.py +33 -0
  26. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/api_pb2_grpc.pyi +10 -0
  27. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/modal_api_grpc.py +1 -0
  28. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_version/__init__.py +1 -1
  29. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/LICENSE +0 -0
  30. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/README.md +0 -0
  31. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/__init__.py +0 -0
  32. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/__main__.py +0 -0
  33. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_billing.py +0 -0
  34. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_clustered_functions.py +0 -0
  35. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_clustered_functions.pyi +0 -0
  36. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_container_entrypoint.py +0 -0
  37. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_environments.py +0 -0
  38. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_function_variants.py +0 -0
  39. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_grpc_client.py +0 -0
  40. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_ipython.py +0 -0
  41. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_load_context.py +0 -0
  42. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_location.py +0 -0
  43. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_logs.py +0 -0
  44. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_output/__init__.py +0 -0
  45. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_output/manager.py +0 -0
  46. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_output/pty.py +0 -0
  47. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_output/rich.py +0 -0
  48. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_output/status.py +0 -0
  49. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_partial_function.py +0 -0
  50. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_resolver.py +0 -0
  51. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_resources.py +0 -0
  52. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/__init__.py +0 -0
  53. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/asgi.py +0 -0
  54. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/container_io_manager.py +0 -0
  55. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/container_io_manager.pyi +0 -0
  56. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/execution_context.py +0 -0
  57. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/execution_context.pyi +0 -0
  58. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  59. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/task_lifecycle_manager.py +0 -0
  60. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  61. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/telemetry.py +0 -0
  62. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/user_code_event_loop.py +0 -0
  63. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_runtime/user_code_imports.py +0 -0
  64. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_serialization.py +0 -0
  65. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_server.py +0 -0
  66. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_traceback.py +0 -0
  67. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_tunnel.py +0 -0
  68. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_tunnel.pyi +0 -0
  69. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_type_manager.py +0 -0
  70. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/__init__.py +0 -0
  71. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/app_utils.py +0 -0
  72. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/async_utils.py +0 -0
  73. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/auth_token_manager.py +0 -0
  74. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/blob_utils.py +0 -0
  75. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/browser_utils.py +0 -0
  76. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/bytes_io_segment_payload.py +0 -0
  77. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/deprecation.py +0 -0
  78. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/docker_utils.py +0 -0
  79. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/function_utils.py +0 -0
  80. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/git_utils.py +0 -0
  81. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/grpc_testing.py +0 -0
  82. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/hash_utils.py +0 -0
  83. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/http_utils.py +0 -0
  84. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/jwt_utils.py +0 -0
  85. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/logger.py +0 -0
  86. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/mount_utils.py +0 -0
  87. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/name_utils.py +0 -0
  88. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/package_utils.py +0 -0
  89. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/pattern_utils.py +0 -0
  90. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/rand_pb_testing.py +0 -0
  91. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/sandbox_fs_utils.py +0 -0
  92. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/shell_utils.py +0 -0
  93. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/task_command_router_client.py +0 -0
  94. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_utils/time_utils.py +0 -0
  95. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_vendor/__init__.py +0 -0
  96. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  97. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_vendor/cloudpickle.py +0 -0
  98. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_vendor/tblib.py +0 -0
  99. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_vendor/version.py +0 -0
  100. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_watcher.py +0 -0
  101. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/_workspace.py +0 -0
  102. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/app.py +0 -0
  103. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/app.pyi +0 -0
  104. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/billing.py +0 -0
  105. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/builder/2023.12.312.txt +0 -0
  106. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/builder/2023.12.txt +0 -0
  107. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/builder/2024.04.txt +0 -0
  108. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/builder/2024.10.txt +0 -0
  109. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/builder/2025.06.txt +0 -0
  110. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/builder/PREVIEW.txt +0 -0
  111. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/builder/README.md +0 -0
  112. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/builder/base-images.json +0 -0
  113. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/call_graph.py +0 -0
  114. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/__init__.py +0 -0
  115. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/_download.py +0 -0
  116. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/_help.py +0 -0
  117. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/_traceback.py +0 -0
  118. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/app.py +0 -0
  119. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/billing.py +0 -0
  120. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/bootstrap.py +0 -0
  121. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/changelog.py +0 -0
  122. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/cluster.py +0 -0
  123. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/config.py +0 -0
  124. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/container.py +0 -0
  125. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/dashboard.py +0 -0
  126. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/dict.py +0 -0
  127. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/entry_point.py +0 -0
  128. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/environment.py +0 -0
  129. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/import_refs.py +0 -0
  130. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/launch.py +0 -0
  131. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/logo.py +0 -0
  132. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/network_file_system.py +0 -0
  133. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/profile.py +0 -0
  134. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/programs/__init__.py +0 -0
  135. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/programs/run_jupyter.py +0 -0
  136. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/programs/vscode.py +0 -0
  137. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/queues.py +0 -0
  138. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/run.py +0 -0
  139. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/secret.py +0 -0
  140. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/selector.py +0 -0
  141. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/shell.py +0 -0
  142. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/skills.py +0 -0
  143. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/token.py +0 -0
  144. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/utils.py +0 -0
  145. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cli/volume.py +0 -0
  146. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/client.py +0 -0
  147. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cloud_bucket_mount.py +0 -0
  148. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/cloud_bucket_mount.pyi +0 -0
  149. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/config.py +0 -0
  150. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/container_process.py +0 -0
  151. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/container_process.pyi +0 -0
  152. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/environments.py +0 -0
  153. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/environments.pyi +0 -0
  154. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/exception.py +0 -0
  155. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/experimental/__init__.py +0 -0
  156. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/experimental/flash.py +0 -0
  157. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/experimental/flash.pyi +0 -0
  158. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/experimental/ipython.py +0 -0
  159. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/file_io.py +0 -0
  160. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/file_io.pyi +0 -0
  161. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/file_pattern_matcher.py +0 -0
  162. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/functions.py +0 -0
  163. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/image.py +0 -0
  164. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/image.pyi +0 -0
  165. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/io_streams.py +0 -0
  166. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/io_streams.pyi +0 -0
  167. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/mount.py +0 -0
  168. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/mount.pyi +0 -0
  169. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/network_file_system.py +0 -0
  170. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/network_file_system.pyi +0 -0
  171. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/object.py +0 -0
  172. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/output.py +0 -0
  173. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/parallel_map.py +0 -0
  174. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/parallel_map.pyi +0 -0
  175. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/partial_function.py +0 -0
  176. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/partial_function.pyi +0 -0
  177. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/proxy.py +0 -0
  178. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/proxy.pyi +0 -0
  179. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/py.typed +0 -0
  180. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/retries.py +0 -0
  181. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/runner.py +0 -0
  182. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/runner.pyi +0 -0
  183. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/running_app.py +0 -0
  184. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/sandbox_fs.py +0 -0
  185. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/sandbox_fs.pyi +0 -0
  186. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/schedule.py +0 -0
  187. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/scheduler_placement.py +0 -0
  188. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/server.py +0 -0
  189. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/server.pyi +0 -0
  190. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/serving.py +0 -0
  191. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/serving.pyi +0 -0
  192. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/skills/modal/SKILL.md +0 -0
  193. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/snapshot.py +0 -0
  194. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/snapshot.pyi +0 -0
  195. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/stream_type.py +0 -0
  196. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/token_flow.py +0 -0
  197. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/token_flow.pyi +0 -0
  198. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/workspace.py +0 -0
  199. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal/workspace.pyi +0 -0
  200. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal.egg-info/SOURCES.txt +0 -0
  201. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal.egg-info/dependency_links.txt +0 -0
  202. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal.egg-info/entry_points.txt +0 -0
  203. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal.egg-info/requires.txt +0 -0
  204. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal.egg-info/top_level.txt +0 -0
  205. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_docs/__init__.py +0 -0
  206. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_docs/gen_cli_docs.py +0 -0
  207. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_docs/gen_cli_docs_main.py +0 -0
  208. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_docs/gen_reference_docs.py +0 -0
  209. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_docs/gen_reference_docs_main.py +0 -0
  210. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_docs/mdmd/__init__.py +0 -0
  211. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_docs/mdmd/mdmd.py +0 -0
  212. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_docs/mdmd/signatures.py +0 -0
  213. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_docs/mdmd/types.py +0 -0
  214. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/__init__.py +0 -0
  215. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/py.typed +0 -0
  216. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/task_command_router_grpc.py +0 -0
  217. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/task_command_router_pb2.py +0 -0
  218. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/task_command_router_pb2.pyi +0 -0
  219. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  220. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  221. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/modal_version/__main__.py +0 -0
  222. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/pyproject.toml +0 -0
  223. {modal-1.4.4.dev16 → modal-1.4.4.dev17}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.4.dev16
3
+ Version: 1.4.4.dev17
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -1208,6 +1208,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1208
1208
  app_name: str,
1209
1209
  name: str,
1210
1210
  *,
1211
+ version: int | None = None,
1211
1212
  load_context_overrides: LoadContext,
1212
1213
  ):
1213
1214
  # internal function lookup implementation that allows lookup of class "service functions"
@@ -1219,6 +1220,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1219
1220
  app_name=app_name,
1220
1221
  object_tag=name,
1221
1222
  environment_name=load_context.environment_name,
1223
+ app_version=version or 0,
1222
1224
  )
1223
1225
  try:
1224
1226
  response = await load_context.client.stub.FunctionGet(request)
@@ -1251,6 +1253,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1251
1253
  app_name: str,
1252
1254
  name: str,
1253
1255
  *,
1256
+ version: int | None = None,
1254
1257
  environment_name: str | None = None,
1255
1258
  client: _Client | None = None,
1256
1259
  ) -> "_Function":
@@ -1273,6 +1276,12 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1273
1276
  ```python
1274
1277
  f = modal.Function.from_name("other-app", "function")
1275
1278
  ```
1279
+
1280
+ The `version` parameter allows you to invoke a version-pinned function:
1281
+
1282
+ ```python
1283
+ f_v3 = modal.Function.from_name("other-app", "function", version=3)
1284
+ ```
1276
1285
  """
1277
1286
  if "." in name:
1278
1287
  raise InvalidError(
@@ -1281,7 +1290,10 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1281
1290
  )
1282
1291
 
1283
1292
  return cls._from_name(
1284
- app_name, name, load_context_overrides=LoadContext(environment_name=environment_name, client=client)
1293
+ app_name,
1294
+ name,
1295
+ load_context_overrides=LoadContext(environment_name=environment_name, client=client),
1296
+ version=version,
1285
1297
  )
1286
1298
 
1287
1299
  @property
@@ -60,6 +60,7 @@ from .secret import _Secret
60
60
  from .volume import _Volume, _volume_to_mount_proto
61
61
 
62
62
  if typing.TYPE_CHECKING:
63
+ import modal
63
64
  import modal._functions
64
65
  import modal.client
65
66
 
@@ -531,7 +532,7 @@ class _Image(_Object, type_prefix="im"):
531
532
 
532
533
  for secret in secrets:
533
534
  if not isinstance(secret, _Secret):
534
- raise InvalidError("All secrets of an image needs to be modal.Secret/AioSecret instances")
535
+ raise InvalidError("All secrets of an Image need to be modal.Secret instances.")
535
536
 
536
537
  if build_function and len(base_images) != 1:
537
538
  raise InvalidError("Cannot run a build function with multiple base images!")
@@ -2763,7 +2764,7 @@ class _Image(_Object, type_prefix="im"):
2763
2764
 
2764
2765
  def pipe(
2765
2766
  self,
2766
- func: Callable[Concatenate["_Image", P], "_Image"],
2767
+ func: Callable[Concatenate["modal.Image", P], "modal.Image"],
2767
2768
  *args: P.args,
2768
2769
  **kwargs: P.kwargs,
2769
2770
  ) -> "_Image":
@@ -2785,7 +2786,11 @@ class _Image(_Object, type_prefix="im"):
2785
2786
  )
2786
2787
  ```
2787
2788
  """
2788
- return func(self, *args, **kwargs)
2789
+ # Typing here is complicated because user callables accept the public
2790
+ # Image type, but `self` is an instance of the internal _Image type.
2791
+ self_ = synchronizer._translate_out(self)
2792
+ res = func(self_, *args, **kwargs) # type: ignore[reportUnknownReturnType]
2793
+ return typing.cast(_Image, synchronizer._translate_in(res))
2789
2794
 
2790
2795
  # Live handle methods
2791
2796
 
@@ -14,7 +14,6 @@ from modal._traceback import suppress_tb_frame
14
14
  from ._load_context import LoadContext
15
15
  from ._resolver import Resolver
16
16
  from ._utils.async_utils import TaskContext, aclosing
17
- from ._utils.deprecation import deprecation_warning
18
17
  from .client import _Client
19
18
  from .config import config, logger
20
19
  from .exception import ExecutionError, InvalidError
@@ -196,23 +195,6 @@ class _Object:
196
195
  f"{object_type} has not been hydrated with the metadata it needs to run on Modal{reason}."
197
196
  )
198
197
 
199
- def clone(self) -> Self:
200
- """mdmd:hidden Clone a given hydrated object.
201
-
202
- Note: This is not intended to be public API and has no public use. It will be removed in a future release.
203
- """
204
- object_class = self.__class__.__name__.strip("_")
205
- deprecation_warning(
206
- (2025, 6, 30),
207
- f"{object_class}.clone() is not intended to be public API and will be removed in a future release.",
208
- )
209
-
210
- # Object to clone must already be hydrated, otherwise from_loader is more suitable.
211
- self._validate_is_hydrated()
212
- obj = type(self).__new__(type(self))
213
- obj._initialize_from_other(self)
214
- return obj
215
-
216
198
  @classmethod
217
199
  def _from_loader(
218
200
  cls,
@@ -153,7 +153,10 @@ class CustomProtoStatusDetailsCodec(StatusDetailsCodecBase):
153
153
  if details is not None:
154
154
  for detail in details:
155
155
  detail_container = details_proto.details.add()
156
- detail_container.Pack(detail)
156
+ if detail.DESCRIPTOR.full_name.startswith("modal."):
157
+ detail_container.Pack(detail, type_url_prefix="type.modal.com/")
158
+ else:
159
+ detail_container.Pack(detail)
157
160
  return details_proto.SerializeToString()
158
161
 
159
162
  def decode(
@@ -35,7 +35,7 @@ class _Client:
35
35
  server_url: str,
36
36
  client_type: int,
37
37
  credentials: typing.Optional[tuple[str, str]],
38
- version: str = "1.4.4.dev16",
38
+ version: str = "1.4.4.dev17",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -205,7 +205,7 @@ class Client:
205
205
  server_url: str,
206
206
  client_type: int,
207
207
  credentials: typing.Optional[tuple[str, str]],
208
- version: str = "1.4.4.dev16",
208
+ version: str = "1.4.4.dev17",
209
209
  ):
210
210
  """mdmd:hidden
211
211
  The Modal client object is not intended to be instantiated directly by users.
@@ -641,6 +641,7 @@ More information on class parameterization can be found here: https://modal.com/
641
641
  app_name: str,
642
642
  name: str,
643
643
  *,
644
+ version: int | None = None,
644
645
  environment_name: str | None = None,
645
646
  client: "_Client | None" = None,
646
647
  ) -> "_Cls":
@@ -663,6 +664,12 @@ More information on class parameterization can be found here: https://modal.com/
663
664
  ```python
664
665
  Model = modal.Cls.from_name("other-app", "Model")
665
666
  ```
667
+
668
+ The `version` parameter constructs a version-pinned Cls:
669
+
670
+ ```python
671
+ Modelv3 = modal.Cls.from_name("other-app", "Model", version=3)
672
+ ```
666
673
  """
667
674
 
668
675
  async def _load_remote(
@@ -705,6 +712,7 @@ More information on class parameterization can be found here: https://modal.com/
705
712
  app_name,
706
713
  class_service_name,
707
714
  load_context_overrides=load_context_overrides,
715
+ version=version,
708
716
  )
709
717
  cls._name = name
710
718
  return cls
@@ -291,6 +291,7 @@ class _Cls(modal._object._Object):
291
291
  app_name: str,
292
292
  name: str,
293
293
  *,
294
+ version: typing.Optional[int] = None,
294
295
  environment_name: typing.Optional[str] = None,
295
296
  client: typing.Optional[modal.client._Client] = None,
296
297
  ) -> _Cls:
@@ -313,6 +314,12 @@ class _Cls(modal._object._Object):
313
314
  ```python
314
315
  Model = modal.Cls.from_name("other-app", "Model")
315
316
  ```
317
+
318
+ The `version` parameter constructs a version-pinned Cls:
319
+
320
+ ```python
321
+ Modelv3 = modal.Cls.from_name("other-app", "Model", version=3)
322
+ ```
316
323
  """
317
324
  ...
318
325
 
@@ -498,6 +505,7 @@ class Cls(modal.object.Object):
498
505
  app_name: str,
499
506
  name: str,
500
507
  *,
508
+ version: typing.Optional[int] = None,
501
509
  environment_name: typing.Optional[str] = None,
502
510
  client: typing.Optional[modal.client.Client] = None,
503
511
  ) -> Cls:
@@ -520,6 +528,12 @@ class Cls(modal.object.Object):
520
528
  ```python
521
529
  Model = modal.Cls.from_name("other-app", "Model")
522
530
  ```
531
+
532
+ The `version` parameter constructs a version-pinned Cls:
533
+
534
+ ```python
535
+ Modelv3 = modal.Cls.from_name("other-app", "Model", version=3)
536
+ ```
523
537
  """
524
538
  ...
525
539
 
@@ -23,7 +23,6 @@ from ._object import (
23
23
  from ._resolver import Resolver
24
24
  from ._serialization import deserialize, serialize
25
25
  from ._utils.async_utils import TaskContext, synchronize_api
26
- from ._utils.deprecation import deprecation_warning
27
26
  from ._utils.name_utils import check_object_name
28
27
  from ._utils.time_utils import as_timestamp, timestamp_to_localized_dt
29
28
  from .client import _Client
@@ -482,26 +481,6 @@ class _Dict(_Object, type_prefix="di"):
482
481
  load_context_overrides=LoadContext(client=client),
483
482
  )
484
483
 
485
- @staticmethod
486
- async def delete(
487
- name: str,
488
- *,
489
- client: _Client | None = None,
490
- environment_name: str | None = None,
491
- ):
492
- """mdmd:hidden
493
- Delete a named Dict object.
494
-
495
- Warning: This deletes an *entire Dict*, not just a specific key.
496
- Deletion is irreversible and will affect any Apps currently using the Dict.
497
-
498
- DEPRECATED: This method is deprecated; we recommend using `modal.Dict.objects.delete` instead.
499
- """
500
- deprecation_warning(
501
- (2025, 8, 6), "`modal.Dict.delete` is deprecated; we recommend using `modal.Dict.objects.delete` instead."
502
- )
503
- await _Dict.objects.delete(name, environment_name=environment_name, client=client)
504
-
505
484
  @live_method
506
485
  async def info(self) -> DictInfo:
507
486
  """Return information about the Dict object."""
@@ -576,23 +576,6 @@ class _Dict(modal._object._Object):
576
576
  """
577
577
  ...
578
578
 
579
- @staticmethod
580
- async def delete(
581
- name: str,
582
- *,
583
- client: typing.Optional[modal.client._Client] = None,
584
- environment_name: typing.Optional[str] = None,
585
- ):
586
- """mdmd:hidden
587
- Delete a named Dict object.
588
-
589
- Warning: This deletes an *entire Dict*, not just a specific key.
590
- Deletion is irreversible and will affect any Apps currently using the Dict.
591
-
592
- DEPRECATED: This method is deprecated; we recommend using `modal.Dict.objects.delete` instead.
593
- """
594
- ...
595
-
596
579
  async def info(self) -> DictInfo:
597
580
  """Return information about the Dict object."""
598
581
  ...
@@ -877,45 +860,6 @@ class Dict(modal.object.Object):
877
860
  """
878
861
  ...
879
862
 
880
- class __delete_spec(typing_extensions.Protocol):
881
- def __call__(
882
- self,
883
- /,
884
- name: str,
885
- *,
886
- client: typing.Optional[modal.client.Client] = None,
887
- environment_name: typing.Optional[str] = None,
888
- ):
889
- """mdmd:hidden
890
- Delete a named Dict object.
891
-
892
- Warning: This deletes an *entire Dict*, not just a specific key.
893
- Deletion is irreversible and will affect any Apps currently using the Dict.
894
-
895
- DEPRECATED: This method is deprecated; we recommend using `modal.Dict.objects.delete` instead.
896
- """
897
- ...
898
-
899
- async def aio(
900
- self,
901
- /,
902
- name: str,
903
- *,
904
- client: typing.Optional[modal.client.Client] = None,
905
- environment_name: typing.Optional[str] = None,
906
- ):
907
- """mdmd:hidden
908
- Delete a named Dict object.
909
-
910
- Warning: This deletes an *entire Dict*, not just a specific key.
911
- Deletion is irreversible and will affect any Apps currently using the Dict.
912
-
913
- DEPRECATED: This method is deprecated; we recommend using `modal.Dict.objects.delete` instead.
914
- """
915
- ...
916
-
917
- delete: typing.ClassVar[__delete_spec]
918
-
919
863
  class __info_spec(typing_extensions.Protocol):
920
864
  def __call__(self, /) -> DictInfo:
921
865
  """Return information about the Dict object."""
@@ -205,13 +205,21 @@ class Function(
205
205
  update_autoscaler: __update_autoscaler_spec
206
206
 
207
207
  @classmethod
208
- def _from_name(cls, app_name: str, name: str, *, load_context_overrides: modal._load_context.LoadContext): ...
208
+ def _from_name(
209
+ cls,
210
+ app_name: str,
211
+ name: str,
212
+ *,
213
+ version: typing.Optional[int] = None,
214
+ load_context_overrides: modal._load_context.LoadContext,
215
+ ): ...
209
216
  @classmethod
210
217
  def from_name(
211
218
  cls: type[Function],
212
219
  app_name: str,
213
220
  name: str,
214
221
  *,
222
+ version: typing.Optional[int] = None,
215
223
  environment_name: typing.Optional[str] = None,
216
224
  client: typing.Optional[modal.client.Client] = None,
217
225
  ) -> Function:
@@ -234,6 +242,12 @@ class Function(
234
242
  ```python
235
243
  f = modal.Function.from_name("other-app", "function")
236
244
  ```
245
+
246
+ The `version` parameter allows you to invoke a version-pinned function:
247
+
248
+ ```python
249
+ f_v3 = modal.Function.from_name("other-app", "function", version=3)
250
+ ```
237
251
  """
238
252
  ...
239
253
 
@@ -85,12 +85,6 @@ class Object:
85
85
  def _hydrate_metadata(self, metadata: typing.Optional[google.protobuf.message.Message]): ...
86
86
  def _get_metadata(self) -> typing.Optional[google.protobuf.message.Message]: ...
87
87
  def _validate_is_hydrated(self): ...
88
- def clone(self) -> typing_extensions.Self:
89
- """mdmd:hidden Clone a given hydrated object.
90
-
91
- Note: This is not intended to be public API and has no public use. It will be removed in a future release.
92
- """
93
- ...
94
88
 
95
89
  class ___from_loader_spec(typing_extensions.Protocol):
96
90
  def __call__(
@@ -26,7 +26,6 @@ from ._object import (
26
26
  from ._resolver import Resolver
27
27
  from ._serialization import deserialize, serialize
28
28
  from ._utils.async_utils import TaskContext, synchronize_api, warn_if_generator_is_not_consumed
29
- from ._utils.deprecation import deprecation_warning
30
29
  from ._utils.grpc_utils import Retry
31
30
  from ._utils.name_utils import check_object_name
32
31
  from ._utils.time_utils import as_timestamp, timestamp_to_localized_dt
@@ -472,23 +471,6 @@ class _Queue(_Object, type_prefix="qu"):
472
471
  load_context_overrides=LoadContext(client=client),
473
472
  )
474
473
 
475
- @staticmethod
476
- async def delete(name: str, *, client: _Client | None = None, environment_name: str | None = None):
477
- """mdmd:hidden
478
- Delete a named Queue.
479
-
480
- Warning: This deletes an *entire Queue*, not just a specific entry or partition.
481
- Deletion is irreversible and will affect any Apps currently using the Queue.
482
-
483
- DEPRECATED: This method is deprecated; we recommend using `modal.Queue.objects.delete` instead.
484
-
485
- """
486
- deprecation_warning(
487
- (2025, 8, 6),
488
- "`modal.Queue.delete` is deprecated; we recommend using `modal.Queue.objects.delete` instead.",
489
- )
490
- await _Queue.objects.delete(name, environment_name=environment_name, client=client)
491
-
492
474
  @live_method
493
475
  async def info(self) -> QueueInfo:
494
476
  """Return information about the Queue object."""
@@ -588,23 +588,6 @@ class _Queue(modal._object._Object):
588
588
  """
589
589
  ...
590
590
 
591
- @staticmethod
592
- async def delete(
593
- name: str,
594
- *,
595
- client: typing.Optional[modal.client._Client] = None,
596
- environment_name: typing.Optional[str] = None,
597
- ):
598
- """mdmd:hidden
599
- Delete a named Queue.
600
-
601
- Warning: This deletes an *entire Queue*, not just a specific entry or partition.
602
- Deletion is irreversible and will affect any Apps currently using the Queue.
603
-
604
- DEPRECATED: This method is deprecated; we recommend using `modal.Queue.objects.delete` instead.
605
- """
606
- ...
607
-
608
591
  async def info(self) -> QueueInfo:
609
592
  """Return information about the Queue object."""
610
593
  ...
@@ -975,45 +958,6 @@ class Queue(modal.object.Object):
975
958
  """
976
959
  ...
977
960
 
978
- class __delete_spec(typing_extensions.Protocol):
979
- def __call__(
980
- self,
981
- /,
982
- name: str,
983
- *,
984
- client: typing.Optional[modal.client.Client] = None,
985
- environment_name: typing.Optional[str] = None,
986
- ):
987
- """mdmd:hidden
988
- Delete a named Queue.
989
-
990
- Warning: This deletes an *entire Queue*, not just a specific entry or partition.
991
- Deletion is irreversible and will affect any Apps currently using the Queue.
992
-
993
- DEPRECATED: This method is deprecated; we recommend using `modal.Queue.objects.delete` instead.
994
- """
995
- ...
996
-
997
- async def aio(
998
- self,
999
- /,
1000
- name: str,
1001
- *,
1002
- client: typing.Optional[modal.client.Client] = None,
1003
- environment_name: typing.Optional[str] = None,
1004
- ):
1005
- """mdmd:hidden
1006
- Delete a named Queue.
1007
-
1008
- Warning: This deletes an *entire Queue*, not just a specific entry or partition.
1009
- Deletion is irreversible and will affect any Apps currently using the Queue.
1010
-
1011
- DEPRECATED: This method is deprecated; we recommend using `modal.Queue.objects.delete` instead.
1012
- """
1013
- ...
1014
-
1015
- delete: typing.ClassVar[__delete_spec]
1016
-
1017
961
  class __info_spec(typing_extensions.Protocol):
1018
962
  def __call__(self, /) -> QueueInfo:
1019
963
  """Return information about the Queue object."""
@@ -305,6 +305,7 @@ class _Sandbox(_Object, type_prefix="sb"):
305
305
  network_file_systems: dict[str | os.PathLike, _NetworkFileSystem] = {},
306
306
  block_network: bool = False,
307
307
  outbound_cidr_allowlist: Sequence[str] | None = None,
308
+ outbound_domain_allowlist: Sequence[str] | None = None,
308
309
  inbound_cidr_allowlist: Sequence[str] | None = None,
309
310
  volumes: dict[str | os.PathLike, _Volume | _CloudBucketMount] = {},
310
311
  pty: bool = False,
@@ -385,21 +386,24 @@ class _Sandbox(_Object, type_prefix="sb"):
385
386
  if block_network:
386
387
  if outbound_cidr_allowlist is not None:
387
388
  raise InvalidError("`outbound_cidr_allowlist` cannot be used when `block_network` is enabled")
389
+ if outbound_domain_allowlist is not None:
390
+ raise InvalidError("`outbound_domain_allowlist` cannot be used when `block_network` is enabled")
388
391
  if inbound_cidr_allowlist is not None:
389
392
  raise InvalidError("`inbound_cidr_allowlist` cannot be used when `block_network` is enabled")
390
393
  network_access = api_pb2.NetworkAccess(
391
394
  network_access_type=api_pb2.NetworkAccess.NetworkAccessType.BLOCKED,
392
395
  )
393
- elif outbound_cidr_allowlist is None:
394
- # If the allowlist is empty, we allow all network access.
395
- network_access = api_pb2.NetworkAccess(
396
- network_access_type=api_pb2.NetworkAccess.NetworkAccessType.OPEN,
397
- )
398
396
  else:
399
- network_access = api_pb2.NetworkAccess(
400
- network_access_type=api_pb2.NetworkAccess.NetworkAccessType.ALLOWLIST,
401
- allowed_cidrs=outbound_cidr_allowlist,
402
- )
397
+ if outbound_domain_allowlist is None and outbound_cidr_allowlist is None:
398
+ network_access = api_pb2.NetworkAccess(
399
+ network_access_type=api_pb2.NetworkAccess.NetworkAccessType.OPEN,
400
+ )
401
+ else:
402
+ network_access = api_pb2.NetworkAccess(
403
+ network_access_type=api_pb2.NetworkAccess.NetworkAccessType.ALLOWLIST,
404
+ allowed_cidrs=list(outbound_cidr_allowlist or []),
405
+ allowed_domains=list(outbound_domain_allowlist or []),
406
+ )
403
407
 
404
408
  ephemeral_disk = None # Ephemeral disk requests not supported on Sandboxes.
405
409
  definition = api_pb2.Sandbox(
@@ -466,6 +470,7 @@ class _Sandbox(_Object, type_prefix="sb"):
466
470
  memory: int | tuple[int, int] | None = None,
467
471
  block_network: bool = False,
468
472
  outbound_cidr_allowlist: Sequence[str] | None = None,
473
+ outbound_domain_allowlist: Sequence[str] | None = None,
469
474
  inbound_cidr_allowlist: Sequence[str] | None = None,
470
475
  volumes: dict[str | os.PathLike, _Volume | _CloudBucketMount] = {},
471
476
  pty: bool = False,
@@ -513,6 +518,8 @@ class _Sandbox(_Object, type_prefix="sb"):
513
518
  additionally specify a hard limit in MiB.
514
519
  block_network: Whether to block network access.
515
520
  outbound_cidr_allowlist: List of CIDRs the sandbox is allowed to access. If None, all CIDRs are allowed.
521
+ outbound_domain_allowlist: List of domain names the sandbox is allowed to access. Supports
522
+ wildcard prefixes (``*.``).
516
523
  inbound_cidr_allowlist:
517
524
  List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
518
525
  all CIDRs are allowed.
@@ -596,6 +603,7 @@ class _Sandbox(_Object, type_prefix="sb"):
596
603
  memory=memory,
597
604
  block_network=block_network,
598
605
  outbound_cidr_allowlist=outbound_cidr_allowlist,
606
+ outbound_domain_allowlist=outbound_domain_allowlist,
599
607
  inbound_cidr_allowlist=inbound_cidr_allowlist,
600
608
  volumes=volumes,
601
609
  pty=pty,
@@ -635,6 +643,7 @@ class _Sandbox(_Object, type_prefix="sb"):
635
643
  memory: int | tuple[int, int] | None = None,
636
644
  block_network: bool = False,
637
645
  outbound_cidr_allowlist: Sequence[str] | None = None,
646
+ outbound_domain_allowlist: Sequence[str] | None = None,
638
647
  inbound_cidr_allowlist: Sequence[str] | None = None,
639
648
  volumes: dict[str | os.PathLike, _Volume | _CloudBucketMount] = {},
640
649
  pty: bool = False,
@@ -688,6 +697,7 @@ class _Sandbox(_Object, type_prefix="sb"):
688
697
  network_file_systems=network_file_systems,
689
698
  block_network=block_network,
690
699
  outbound_cidr_allowlist=outbound_cidr_allowlist,
700
+ outbound_domain_allowlist=outbound_domain_allowlist,
691
701
  inbound_cidr_allowlist=inbound_cidr_allowlist,
692
702
  volumes=volumes,
693
703
  pty=pty,
@@ -187,6 +187,7 @@ class _Sandbox(modal._object._Object):
187
187
  network_file_systems: dict[typing.Union[str, os.PathLike], modal.network_file_system._NetworkFileSystem] = {},
188
188
  block_network: bool = False,
189
189
  outbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
190
+ outbound_domain_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
190
191
  inbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
191
192
  volumes: dict[
192
193
  typing.Union[str, os.PathLike],
@@ -229,6 +230,7 @@ class _Sandbox(modal._object._Object):
229
230
  memory: typing.Union[int, tuple[int, int], None] = None,
230
231
  block_network: bool = False,
231
232
  outbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
233
+ outbound_domain_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
232
234
  inbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
233
235
  volumes: dict[
234
236
  typing.Union[str, os.PathLike],
@@ -278,6 +280,8 @@ class _Sandbox(modal._object._Object):
278
280
  additionally specify a hard limit in MiB.
279
281
  block_network: Whether to block network access.
280
282
  outbound_cidr_allowlist: List of CIDRs the sandbox is allowed to access. If None, all CIDRs are allowed.
283
+ outbound_domain_allowlist: List of domain names the sandbox is allowed to access. Supports
284
+ wildcard prefixes (``*.``).
281
285
  inbound_cidr_allowlist:
282
286
  List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
283
287
  all CIDRs are allowed.
@@ -339,6 +343,7 @@ class _Sandbox(modal._object._Object):
339
343
  memory: typing.Union[int, tuple[int, int], None] = None,
340
344
  block_network: bool = False,
341
345
  outbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
346
+ outbound_domain_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
342
347
  inbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
343
348
  volumes: dict[
344
349
  typing.Union[str, os.PathLike],
@@ -1199,6 +1204,7 @@ class Sandbox(modal.object.Object):
1199
1204
  network_file_systems: dict[typing.Union[str, os.PathLike], modal.network_file_system.NetworkFileSystem] = {},
1200
1205
  block_network: bool = False,
1201
1206
  outbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1207
+ outbound_domain_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1202
1208
  inbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1203
1209
  volumes: dict[
1204
1210
  typing.Union[str, os.PathLike], typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount]
@@ -1244,6 +1250,7 @@ class Sandbox(modal.object.Object):
1244
1250
  memory: typing.Union[int, tuple[int, int], None] = None,
1245
1251
  block_network: bool = False,
1246
1252
  outbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1253
+ outbound_domain_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1247
1254
  inbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1248
1255
  volumes: dict[
1249
1256
  typing.Union[str, os.PathLike],
@@ -1293,6 +1300,8 @@ class Sandbox(modal.object.Object):
1293
1300
  additionally specify a hard limit in MiB.
1294
1301
  block_network: Whether to block network access.
1295
1302
  outbound_cidr_allowlist: List of CIDRs the sandbox is allowed to access. If None, all CIDRs are allowed.
1303
+ outbound_domain_allowlist: List of domain names the sandbox is allowed to access. Supports
1304
+ wildcard prefixes (``*.``).
1296
1305
  inbound_cidr_allowlist:
1297
1306
  List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
1298
1307
  all CIDRs are allowed.
@@ -1356,6 +1365,7 @@ class Sandbox(modal.object.Object):
1356
1365
  memory: typing.Union[int, tuple[int, int], None] = None,
1357
1366
  block_network: bool = False,
1358
1367
  outbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1368
+ outbound_domain_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1359
1369
  inbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1360
1370
  volumes: dict[
1361
1371
  typing.Union[str, os.PathLike],
@@ -1405,6 +1415,8 @@ class Sandbox(modal.object.Object):
1405
1415
  additionally specify a hard limit in MiB.
1406
1416
  block_network: Whether to block network access.
1407
1417
  outbound_cidr_allowlist: List of CIDRs the sandbox is allowed to access. If None, all CIDRs are allowed.
1418
+ outbound_domain_allowlist: List of domain names the sandbox is allowed to access. Supports
1419
+ wildcard prefixes (``*.``).
1408
1420
  inbound_cidr_allowlist:
1409
1421
  List of CIDRs allowed to connect inbound to the sandbox (tunnels and connection tokens). If None,
1410
1422
  all CIDRs are allowed.
@@ -1472,6 +1484,7 @@ class Sandbox(modal.object.Object):
1472
1484
  memory: typing.Union[int, tuple[int, int], None] = None,
1473
1485
  block_network: bool = False,
1474
1486
  outbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1487
+ outbound_domain_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1475
1488
  inbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1476
1489
  volumes: dict[
1477
1490
  typing.Union[str, os.PathLike],
@@ -1523,6 +1536,7 @@ class Sandbox(modal.object.Object):
1523
1536
  memory: typing.Union[int, tuple[int, int], None] = None,
1524
1537
  block_network: bool = False,
1525
1538
  outbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1539
+ outbound_domain_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1526
1540
  inbound_cidr_allowlist: typing.Optional[collections.abc.Sequence[str]] = None,
1527
1541
  volumes: dict[
1528
1542
  typing.Union[str, os.PathLike],