modal 1.5.3.dev1__tar.gz → 1.5.3.dev2__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 (231) hide show
  1. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/PKG-INFO +1 -1
  2. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_functions.py +3 -0
  3. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_partial_function.py +14 -2
  4. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/app.py +10 -0
  5. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/client.pyi +2 -2
  6. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/functions.pyi +1 -0
  7. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_pb2.py +923 -916
  9. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_pb2.pyi +32 -3
  10. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_version/__init__.py +1 -1
  11. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/LICENSE +0 -0
  12. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/README.md +0 -0
  13. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/__init__.py +0 -0
  14. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/__main__.py +0 -0
  15. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_billing.py +0 -0
  16. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_clustered_functions.py +0 -0
  17. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_clustered_functions.pyi +0 -0
  18. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_container_entrypoint.py +0 -0
  19. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_environments.py +0 -0
  20. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_function_variants.py +0 -0
  21. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_grpc_client.py +0 -0
  22. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_image.py +0 -0
  23. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_ipython.py +0 -0
  24. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_load_context.py +0 -0
  25. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_location.py +0 -0
  26. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_logs.py +0 -0
  27. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_object.py +0 -0
  28. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/__init__.py +0 -0
  29. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/manager.py +0 -0
  30. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/pty.py +0 -0
  31. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/rich.py +0 -0
  32. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_output/status.py +0 -0
  33. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_resolver.py +0 -0
  34. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_resources.py +0 -0
  35. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/__init__.py +0 -0
  36. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/asgi.py +0 -0
  37. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/container_io_manager.py +0 -0
  38. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/container_io_manager.pyi +0 -0
  39. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/execution_context.py +0 -0
  40. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/execution_context.pyi +0 -0
  41. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  42. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/task_lifecycle_manager.py +0 -0
  43. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  44. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/telemetry.py +0 -0
  45. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/user_code_event_loop.py +0 -0
  46. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_runtime/user_code_imports.py +0 -0
  47. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_serialization.py +0 -0
  48. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_server.py +0 -0
  49. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_traceback.py +0 -0
  50. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_tunnel.py +0 -0
  51. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_tunnel.pyi +0 -0
  52. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_type_manager.py +0 -0
  53. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/__init__.py +0 -0
  54. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/app_utils.py +0 -0
  55. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/async_utils.py +0 -0
  56. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/auth_token_manager.py +0 -0
  57. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/blob_utils.py +0 -0
  58. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/browser_utils.py +0 -0
  59. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/bytes_io_segment_payload.py +0 -0
  60. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/curl_utils.py +0 -0
  61. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/deprecation.py +0 -0
  62. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/docker_utils.py +0 -0
  63. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/function_utils.py +0 -0
  64. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/git_utils.py +0 -0
  65. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/grpc_testing.py +0 -0
  66. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/grpc_utils.py +0 -0
  67. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/hash_utils.py +0 -0
  68. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/http_utils.py +0 -0
  69. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/jwt_utils.py +0 -0
  70. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/logger.py +0 -0
  71. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/mount_utils.py +0 -0
  72. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/name_utils.py +0 -0
  73. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/package_utils.py +0 -0
  74. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/pattern_utils.py +0 -0
  75. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/proxy_support.py +0 -0
  76. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/rand_pb_testing.py +0 -0
  77. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/sandbox_fs_utils.py +0 -0
  78. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/shell_utils.py +0 -0
  79. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/task_command_router_client.py +0 -0
  80. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_utils/time_utils.py +0 -0
  81. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/__init__.py +0 -0
  82. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  83. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/cloudpickle.py +0 -0
  84. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/tblib.py +0 -0
  85. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_vendor/version.py +0 -0
  86. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_watcher.py +0 -0
  87. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/_workspace.py +0 -0
  88. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/app.pyi +0 -0
  89. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/billing.py +0 -0
  90. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/billing.pyi +0 -0
  91. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2023.12.312.txt +0 -0
  92. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2023.12.txt +0 -0
  93. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2024.04.txt +0 -0
  94. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2024.10.txt +0 -0
  95. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/2025.06.txt +0 -0
  96. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/PREVIEW.txt +0 -0
  97. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/README.md +0 -0
  98. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/builder/base-images.json +0 -0
  99. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/call_graph.py +0 -0
  100. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/__init__.py +0 -0
  101. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/_download.py +0 -0
  102. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/_help.py +0 -0
  103. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/_traceback.py +0 -0
  104. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/app.py +0 -0
  105. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/billing.py +0 -0
  106. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/bootstrap.py +0 -0
  107. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/changelog.py +0 -0
  108. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/cluster.py +0 -0
  109. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/config.py +0 -0
  110. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/container.py +0 -0
  111. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/curl.py +0 -0
  112. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/dashboard.py +0 -0
  113. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/dict.py +0 -0
  114. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/endpoint.py +0 -0
  115. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/entry_point.py +0 -0
  116. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/environment.py +0 -0
  117. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/image.py +0 -0
  118. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/import_refs.py +0 -0
  119. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/launch.py +0 -0
  120. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/logo.py +0 -0
  121. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/network_file_system.py +0 -0
  122. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/profile.py +0 -0
  123. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/programs/__init__.py +0 -0
  124. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/programs/run_jupyter.py +0 -0
  125. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/programs/vscode.py +0 -0
  126. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/queues.py +0 -0
  127. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/run.py +0 -0
  128. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/secret.py +0 -0
  129. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/selector.py +0 -0
  130. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/shell.py +0 -0
  131. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/skills.py +0 -0
  132. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/token.py +0 -0
  133. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/utils.py +0 -0
  134. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/volume.py +0 -0
  135. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cli/workspace.py +0 -0
  136. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/client.py +0 -0
  137. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cloud_bucket_mount.py +0 -0
  138. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cloud_bucket_mount.pyi +0 -0
  139. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cls.py +0 -0
  140. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/cls.pyi +0 -0
  141. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/config.py +0 -0
  142. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/container_process.py +0 -0
  143. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/container_process.pyi +0 -0
  144. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/dict.py +0 -0
  145. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/dict.pyi +0 -0
  146. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/environments.py +0 -0
  147. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/environments.pyi +0 -0
  148. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/exception.py +0 -0
  149. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/experimental/__init__.py +0 -0
  150. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/experimental/flash.py +0 -0
  151. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/experimental/flash.pyi +0 -0
  152. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/experimental/ipython.py +0 -0
  153. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/file_io.py +0 -0
  154. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/file_io.pyi +0 -0
  155. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/file_pattern_matcher.py +0 -0
  156. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/functions.py +0 -0
  157. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/image.py +0 -0
  158. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/image.pyi +0 -0
  159. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/io_streams.py +0 -0
  160. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/io_streams.pyi +0 -0
  161. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/mount.py +0 -0
  162. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/mount.pyi +0 -0
  163. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/network_file_system.py +0 -0
  164. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/network_file_system.pyi +0 -0
  165. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/object.py +0 -0
  166. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/object.pyi +0 -0
  167. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/output.py +0 -0
  168. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/parallel_map.py +0 -0
  169. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/parallel_map.pyi +0 -0
  170. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/partial_function.py +0 -0
  171. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/partial_function.pyi +0 -0
  172. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/proxy.py +0 -0
  173. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/proxy.pyi +0 -0
  174. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/py.typed +0 -0
  175. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/queue.py +0 -0
  176. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/queue.pyi +0 -0
  177. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/retries.py +0 -0
  178. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/runner.py +0 -0
  179. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/runner.pyi +0 -0
  180. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/running_app.py +0 -0
  181. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/sandbox.py +0 -0
  182. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/sandbox.pyi +0 -0
  183. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/sandbox_fs.py +0 -0
  184. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/sandbox_fs.pyi +0 -0
  185. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/schedule.py +0 -0
  186. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/scheduler_placement.py +0 -0
  187. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/secret.py +0 -0
  188. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/secret.pyi +0 -0
  189. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/server.py +0 -0
  190. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/server.pyi +0 -0
  191. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/serving.py +0 -0
  192. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/serving.pyi +0 -0
  193. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/skills/modal/SKILL.md +0 -0
  194. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/snapshot.py +0 -0
  195. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/snapshot.pyi +0 -0
  196. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/stream_type.py +0 -0
  197. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/token_flow.py +0 -0
  198. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/token_flow.pyi +0 -0
  199. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/types.py +0 -0
  200. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/volume.py +0 -0
  201. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/volume.pyi +0 -0
  202. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/workspace.py +0 -0
  203. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal/workspace.pyi +0 -0
  204. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/SOURCES.txt +0 -0
  205. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/dependency_links.txt +0 -0
  206. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/entry_points.txt +0 -0
  207. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/requires.txt +0 -0
  208. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal.egg-info/top_level.txt +0 -0
  209. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/__init__.py +0 -0
  210. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/gen_cli_docs.py +0 -0
  211. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/gen_cli_docs_main.py +0 -0
  212. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/gen_reference_docs.py +0 -0
  213. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/gen_reference_docs_main.py +0 -0
  214. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/mdmd/__init__.py +0 -0
  215. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/mdmd/mdmd.py +0 -0
  216. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/mdmd/signatures.py +0 -0
  217. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_docs/mdmd/types.py +0 -0
  218. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/__init__.py +0 -0
  219. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_grpc.py +0 -0
  220. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_pb2_grpc.py +0 -0
  221. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/api_pb2_grpc.pyi +0 -0
  222. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/modal_api_grpc.py +0 -0
  223. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/py.typed +0 -0
  224. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_grpc.py +0 -0
  225. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_pb2.py +0 -0
  226. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_pb2.pyi +0 -0
  227. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  228. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  229. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/modal_version/__main__.py +0 -0
  230. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/pyproject.toml +0 -0
  231. {modal-1.5.3.dev1 → modal-1.5.3.dev2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.3.dev1
3
+ Version: 1.5.3.dev2
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -671,6 +671,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
671
671
  # Experimental: Clustered functions
672
672
  cluster_size: int | None = None,
673
673
  rdma: bool | None = None,
674
+ fabric_size: int | None = None,
674
675
  single_use_containers: bool = False,
675
676
  ephemeral_disk: int | None = None,
676
677
  include_source: bool = True,
@@ -1009,6 +1010,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1009
1010
  mount_client_dependencies=mount_client_dependencies,
1010
1011
  # ---
1011
1012
  _experimental_group_size=cluster_size or 0, # Experimental: Clustered functions
1013
+ _experimental_fabric_size=fabric_size or 0, # Experimental: Clustered functions
1012
1014
  _experimental_concurrent_cancellations=True,
1013
1015
  # --- These are deprecated in favor of autoscaler_settings
1014
1016
  warm_pool_size=min_containers or 0,
@@ -1051,6 +1053,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1051
1053
  method_definitions_set=function_definition.method_definitions_set,
1052
1054
  experimental_options=experimental_options or {},
1053
1055
  _experimental_group_size=function_definition._experimental_group_size,
1056
+ _experimental_fabric_size=function_definition._experimental_fabric_size,
1054
1057
  _experimental_buffer_containers=function_definition._experimental_buffer_containers,
1055
1058
  _experimental_custom_scaling=function_definition._experimental_custom_scaling,
1056
1059
  snapshot_debug=function_definition.snapshot_debug,
@@ -74,6 +74,7 @@ class _PartialFunctionParams:
74
74
  target_concurrent_inputs: int | None = None
75
75
  build_timeout: int | None = None
76
76
  rdma: bool | None = None
77
+ fabric_size: int | None = None
77
78
  http_config: api_pb2.HTTPConfig | None = None
78
79
 
79
80
  def update(self, other: "_PartialFunctionParams") -> None:
@@ -777,7 +778,7 @@ def _concurrent(
777
778
 
778
779
  # NOTE: clustered is currently exposed through modal.experimental, not the top-level namespace
779
780
  def _clustered(
780
- size: int, broadcast: bool = True, rdma: bool = False
781
+ size: int, broadcast: bool = True, rdma: bool = False, fabric_size: int | None = None
781
782
  ) -> Callable[
782
783
  [Callable[P, ReturnType] | _PartialFunction[P, ReturnType, ReturnType]],
783
784
  _PartialFunction[P, ReturnType, ReturnType],
@@ -791,6 +792,11 @@ def _clustered(
791
792
  If True, inputs will be sent simultaneously to each container. Otherwise,
792
793
  inputs will be sent only to the rank-0 container, which is responsible for
793
794
  delegating to the workers.
795
+ fabric_size: int | None = None
796
+ Experimental: constrains placement across GPU-memory fabrics. The cluster
797
+ is placed in co-fabric blocks of `fabric_size` containers, so every block
798
+ of `fabric_size` consecutive ranks shares a fabric (the scale-up domain)
799
+ and communicates over cross-node NVLink. Must evenly divide `size`.
794
800
  """
795
801
 
796
802
  assert broadcast, "broadcast=False has not been implemented yet!"
@@ -798,8 +804,14 @@ def _clustered(
798
804
  if size <= 0:
799
805
  raise ValueError("cluster size must be greater than 0")
800
806
 
807
+ if fabric_size is not None:
808
+ if not isinstance(fabric_size, int) or fabric_size <= 0:
809
+ raise ValueError("fabric_size must be a positive integer")
810
+ if size % fabric_size != 0:
811
+ raise ValueError(f"fabric_size must evenly divide the cluster size ({size} % {fabric_size} != 0)")
812
+
801
813
  flags = _PartialFunctionFlags.CLUSTERED
802
- params = _PartialFunctionParams(cluster_size=size, rdma=rdma)
814
+ params = _PartialFunctionParams(cluster_size=size, rdma=rdma, fabric_size=fabric_size)
803
815
 
804
816
  def wrapper(
805
817
  obj: _PartialFunction[P, ReturnType, ReturnType] | Callable[P, ReturnType],
@@ -920,6 +920,7 @@ class _App:
920
920
  i6pn_enabled = i6pn or (f.flags & _PartialFunctionFlags.CLUSTERED)
921
921
  cluster_size = f.params.cluster_size # Experimental: Clustered functions
922
922
  rdma = f.params.rdma
923
+ fabric_size = f.params.fabric_size
923
924
 
924
925
  info = FunctionInfo(f.raw_f, serialized=serialized, name_override=name)
925
926
  raw_f = f.raw_f
@@ -974,6 +975,7 @@ class _App:
974
975
 
975
976
  cluster_size = None # Experimental: Clustered functions
976
977
  rdma = None
978
+ fabric_size = None
977
979
  i6pn_enabled = i6pn
978
980
 
979
981
  if is_generator is None:
@@ -1016,6 +1018,7 @@ class _App:
1016
1018
  i6pn_enabled=i6pn_enabled,
1017
1019
  cluster_size=cluster_size, # Experimental: Clustered functions
1018
1020
  rdma=rdma,
1021
+ fabric_size=fabric_size, # Experimental: Clustered functions
1019
1022
  include_source=include_source if include_source is not None else local_state.include_source_default,
1020
1023
  experimental_options={k: str(v) for k, v in (experimental_options or {}).items()},
1021
1024
  restrict_output=_experimental_restrict_output,
@@ -1151,16 +1154,19 @@ class _App:
1151
1154
  if wrapped_cls.flags & _PartialFunctionFlags.CLUSTERED:
1152
1155
  cluster_size = wrapped_cls.params.cluster_size
1153
1156
  rdma = wrapped_cls.params.rdma
1157
+ fabric_size = wrapped_cls.params.fabric_size
1154
1158
 
1155
1159
  else:
1156
1160
  cluster_size = None
1157
1161
  rdma = None
1162
+ fabric_size = None
1158
1163
  else:
1159
1164
  user_cls = wrapped_cls
1160
1165
  max_concurrent_inputs = None
1161
1166
  target_concurrent_inputs = None
1162
1167
  cluster_size = None
1163
1168
  rdma = None
1169
+ fabric_size = None
1164
1170
  if not inspect.isclass(user_cls):
1165
1171
  raise TypeError("The @app.cls decorator must be used on a class.")
1166
1172
 
@@ -1246,6 +1252,7 @@ class _App:
1246
1252
  i6pn_enabled=i6pn_enabled,
1247
1253
  cluster_size=cluster_size,
1248
1254
  rdma=rdma,
1255
+ fabric_size=fabric_size,
1249
1256
  include_source=include_source if include_source is not None else local_state.include_source_default,
1250
1257
  experimental_options={k: str(v) for k, v in (experimental_options or {}).items()},
1251
1258
  restrict_output=_experimental_restrict_output,
@@ -1403,6 +1410,7 @@ class _App:
1403
1410
  # Extract the underlying class if wrapped in a _PartialFunction (e.g., from @modal.clustered())
1404
1411
  cluster_size = None
1405
1412
  rdma = None
1413
+ fabric_size = None
1406
1414
  user_cls = wrapped_user_cls
1407
1415
 
1408
1416
  if isinstance(wrapped_user_cls, _PartialFunction):
@@ -1410,6 +1418,7 @@ class _App:
1410
1418
  if wrapped_user_cls.flags & _PartialFunctionFlags.CLUSTERED:
1411
1419
  cluster_size = wrapped_user_cls.params.cluster_size
1412
1420
  rdma = wrapped_user_cls.params.rdma
1421
+ fabric_size = wrapped_user_cls.params.fabric_size
1413
1422
 
1414
1423
  local_state = self._local_state
1415
1424
 
@@ -1449,6 +1458,7 @@ class _App:
1449
1458
  i6pn_enabled=i6pn or (cluster_size is not None),
1450
1459
  cluster_size=cluster_size,
1451
1460
  rdma=rdma,
1461
+ fabric_size=fabric_size,
1452
1462
  include_source=include_source if include_source is not None else local_state.include_source_default,
1453
1463
  experimental_options={k: str(v) for k, v in (experimental_options or {}).items()},
1454
1464
  restrict_output=False,
@@ -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.5.3.dev1",
38
+ version: str = "1.5.3.dev2",
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.5.3.dev1",
208
+ version: str = "1.5.3.dev2",
209
209
  ):
210
210
  """mdmd:hidden
211
211
  The Modal client object is not intended to be instantiated directly by users.
@@ -109,6 +109,7 @@ class Function(
109
109
  i6pn_enabled: bool = False,
110
110
  cluster_size: typing.Optional[int] = None,
111
111
  rdma: typing.Optional[bool] = None,
112
+ fabric_size: typing.Optional[int] = None,
112
113
  single_use_containers: bool = False,
113
114
  ephemeral_disk: typing.Optional[int] = None,
114
115
  include_source: bool = True,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.3.dev1
3
+ Version: 1.5.3.dev2
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0