modAL 1.3.6.dev5__tar.gz → 1.3.6.dev7__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 (209) hide show
  1. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/PKG-INFO +1 -1
  2. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/client.pyi +2 -2
  3. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/experimental/__init__.py +0 -128
  4. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/sandbox.py +10 -4
  5. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/sandbox.pyi +5 -5
  6. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/sandbox_fs.py +5 -9
  7. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/PKG-INFO +1 -1
  8. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_grpc.py +64 -0
  9. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_pb2.py +2 -2
  10. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_pb2_grpc.py +132 -0
  11. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_pb2_grpc.pyi +40 -0
  12. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/modal_api_grpc.py +4 -0
  13. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_version/__init__.py +1 -1
  14. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/LICENSE +0 -0
  15. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/README.md +0 -0
  16. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/__init__.py +0 -0
  17. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/__main__.py +0 -0
  18. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_billing.py +0 -0
  19. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_clustered_functions.py +0 -0
  20. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_clustered_functions.pyi +0 -0
  21. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_container_entrypoint.py +0 -0
  22. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_functions.py +0 -0
  23. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_grpc_client.py +0 -0
  24. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_ipython.py +0 -0
  25. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_load_context.py +0 -0
  26. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_location.py +0 -0
  27. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_object.py +0 -0
  28. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/__init__.py +0 -0
  29. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/manager.py +0 -0
  30. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/pty.py +0 -0
  31. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/rich.py +0 -0
  32. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_output/status.py +0 -0
  33. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_partial_function.py +0 -0
  34. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_resolver.py +0 -0
  35. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_resources.py +0 -0
  36. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/__init__.py +0 -0
  37. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/asgi.py +0 -0
  38. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/container_io_manager.py +0 -0
  39. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/container_io_manager.pyi +0 -0
  40. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/execution_context.py +0 -0
  41. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/execution_context.pyi +0 -0
  42. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  43. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/telemetry.py +0 -0
  44. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/user_code_event_loop.py +0 -0
  45. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_runtime/user_code_imports.py +0 -0
  46. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_serialization.py +0 -0
  47. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_server.py +0 -0
  48. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_traceback.py +0 -0
  49. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_tunnel.py +0 -0
  50. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_tunnel.pyi +0 -0
  51. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_type_manager.py +0 -0
  52. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/__init__.py +0 -0
  53. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/app_utils.py +0 -0
  54. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/async_utils.py +0 -0
  55. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/auth_token_manager.py +0 -0
  56. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/blob_utils.py +0 -0
  57. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/browser_utils.py +0 -0
  58. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/bytes_io_segment_payload.py +0 -0
  59. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/deprecation.py +0 -0
  60. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/docker_utils.py +0 -0
  61. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/function_utils.py +0 -0
  62. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/git_utils.py +0 -0
  63. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/grpc_testing.py +0 -0
  64. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/grpc_utils.py +0 -0
  65. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/hash_utils.py +0 -0
  66. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/http_utils.py +0 -0
  67. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/jwt_utils.py +0 -0
  68. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/logger.py +0 -0
  69. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/mount_utils.py +0 -0
  70. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/name_utils.py +0 -0
  71. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/package_utils.py +0 -0
  72. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/pattern_utils.py +0 -0
  73. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/rand_pb_testing.py +0 -0
  74. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/sandbox_fs_utils.py +0 -0
  75. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/shell_utils.py +0 -0
  76. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/task_command_router_client.py +0 -0
  77. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_utils/time_utils.py +0 -0
  78. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/__init__.py +0 -0
  79. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  80. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/cloudpickle.py +0 -0
  81. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/tblib.py +0 -0
  82. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_vendor/version.py +0 -0
  83. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/_watcher.py +0 -0
  84. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/app.py +0 -0
  85. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/app.pyi +0 -0
  86. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/billing.py +0 -0
  87. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2023.12.312.txt +0 -0
  88. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2023.12.txt +0 -0
  89. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2024.04.txt +0 -0
  90. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2024.10.txt +0 -0
  91. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/2025.06.txt +0 -0
  92. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/PREVIEW.txt +0 -0
  93. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/README.md +0 -0
  94. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/builder/base-images.json +0 -0
  95. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/call_graph.py +0 -0
  96. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/__init__.py +0 -0
  97. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/_download.py +0 -0
  98. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/_traceback.py +0 -0
  99. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/app.py +0 -0
  100. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/billing.py +0 -0
  101. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/changelog.py +0 -0
  102. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/cluster.py +0 -0
  103. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/config.py +0 -0
  104. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/container.py +0 -0
  105. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/dashboard.py +0 -0
  106. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/dict.py +0 -0
  107. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/entry_point.py +0 -0
  108. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/environment.py +0 -0
  109. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/import_refs.py +0 -0
  110. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/launch.py +0 -0
  111. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/network_file_system.py +0 -0
  112. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/profile.py +0 -0
  113. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/programs/__init__.py +0 -0
  114. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/programs/run_jupyter.py +0 -0
  115. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/programs/vscode.py +0 -0
  116. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/queues.py +0 -0
  117. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/run.py +0 -0
  118. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/secret.py +0 -0
  119. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/selector.py +0 -0
  120. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/shell.py +0 -0
  121. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/token.py +0 -0
  122. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/utils.py +0 -0
  123. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cli/volume.py +0 -0
  124. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/client.py +0 -0
  125. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cloud_bucket_mount.py +0 -0
  126. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cloud_bucket_mount.pyi +0 -0
  127. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cls.py +0 -0
  128. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/cls.pyi +0 -0
  129. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/config.py +0 -0
  130. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/container_process.py +0 -0
  131. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/container_process.pyi +0 -0
  132. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/dict.py +0 -0
  133. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/dict.pyi +0 -0
  134. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/environments.py +0 -0
  135. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/environments.pyi +0 -0
  136. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/exception.py +0 -0
  137. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/experimental/flash.py +0 -0
  138. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/experimental/flash.pyi +0 -0
  139. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/experimental/ipython.py +0 -0
  140. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/file_io.py +0 -0
  141. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/file_io.pyi +0 -0
  142. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/file_pattern_matcher.py +0 -0
  143. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/functions.py +0 -0
  144. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/functions.pyi +0 -0
  145. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/gpu.py +0 -0
  146. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/image.py +0 -0
  147. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/image.pyi +0 -0
  148. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/io_streams.py +0 -0
  149. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/io_streams.pyi +0 -0
  150. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/mount.py +0 -0
  151. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/mount.pyi +0 -0
  152. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/network_file_system.py +0 -0
  153. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/network_file_system.pyi +0 -0
  154. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/object.py +0 -0
  155. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/object.pyi +0 -0
  156. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/output.py +0 -0
  157. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/parallel_map.py +0 -0
  158. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/parallel_map.pyi +0 -0
  159. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/partial_function.py +0 -0
  160. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/partial_function.pyi +0 -0
  161. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/proxy.py +0 -0
  162. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/proxy.pyi +0 -0
  163. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/py.typed +0 -0
  164. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/queue.py +0 -0
  165. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/queue.pyi +0 -0
  166. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/retries.py +0 -0
  167. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/runner.py +0 -0
  168. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/runner.pyi +0 -0
  169. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/running_app.py +0 -0
  170. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/sandbox_fs.pyi +0 -0
  171. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/schedule.py +0 -0
  172. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/scheduler_placement.py +0 -0
  173. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/secret.py +0 -0
  174. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/secret.pyi +0 -0
  175. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/server.py +0 -0
  176. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/server.pyi +0 -0
  177. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/serving.py +0 -0
  178. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/serving.pyi +0 -0
  179. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/snapshot.py +0 -0
  180. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/snapshot.pyi +0 -0
  181. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/stream_type.py +0 -0
  182. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/token_flow.py +0 -0
  183. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/token_flow.pyi +0 -0
  184. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/volume.py +0 -0
  185. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal/volume.pyi +0 -0
  186. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/SOURCES.txt +0 -0
  187. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/dependency_links.txt +0 -0
  188. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/entry_points.txt +0 -0
  189. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/requires.txt +0 -0
  190. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal.egg-info/top_level.txt +0 -0
  191. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/__init__.py +0 -0
  192. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/gen_cli_docs.py +0 -0
  193. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/gen_cli_docs_main.py +0 -0
  194. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/gen_reference_docs.py +0 -0
  195. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/gen_reference_docs_main.py +0 -0
  196. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/mdmd/__init__.py +0 -0
  197. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/mdmd/mdmd.py +0 -0
  198. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_docs/mdmd/signatures.py +0 -0
  199. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/__init__.py +0 -0
  200. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/api_pb2.pyi +0 -0
  201. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/py.typed +0 -0
  202. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_grpc.py +0 -0
  203. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_pb2.py +0 -0
  204. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_pb2.pyi +0 -0
  205. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  206. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  207. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/modal_version/__main__.py +0 -0
  208. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/pyproject.toml +0 -0
  209. {modal-1.3.6.dev5 → modal-1.3.6.dev7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.3.6.dev5
3
+ Version: 1.3.6.dev7
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -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.3.6.dev5",
38
+ version: str = "1.3.6.dev7",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -171,7 +171,7 @@ class Client:
171
171
  server_url: str,
172
172
  client_type: int,
173
173
  credentials: typing.Optional[tuple[str, str]],
174
- version: str = "1.3.6.dev5",
174
+ version: str = "1.3.6.dev7",
175
175
  ):
176
176
  """mdmd:hidden
177
177
  The Modal client object is not intended to be instantiated directly by users.
@@ -1,6 +1,5 @@
1
1
  # Copyright Modal Labs 2025
2
2
  import os
3
- import shlex
4
3
  from dataclasses import dataclass
5
4
  from pathlib import Path
6
5
  from typing import Literal, Optional, Union
@@ -229,133 +228,6 @@ async def raw_registry_image(
229
228
  )
230
229
 
231
230
 
232
- def _install_cuda_command() -> str:
233
- """Command to install CUDA Toolkit (nvcc) inside a container."""
234
- arch = "x86_64" # instruction set architecture for the CPU, all Modal machines are x86_64
235
- distro = "debian12" # the distribution and version number of our OS (GNU/Linux)
236
- filename = "cuda-keyring_1.1-1_all.deb" # NVIDIA signing key file
237
- cuda_keyring_url = f"https://developer.download.nvidia.com/compute/cuda/repos/{distro}/{arch}/{filename}"
238
-
239
- major, minor = 12, 8
240
- max_cuda_version = f"{major}-{minor}"
241
-
242
- return (
243
- f"wget {cuda_keyring_url} && "
244
- + f"dpkg -i {filename} && "
245
- + f"rm -f {filename} && "
246
- + f"apt-get update && apt-get install -y cuda-nvcc-{max_cuda_version}"
247
- )
248
-
249
-
250
- @synchronizer.create_blocking
251
- async def notebook_base_image(*, python_version: Optional[str] = None, force_build: bool = False) -> _Image:
252
- """Default image used for Modal notebook kernels, with common libraries.
253
-
254
- This can be used to bootstrap development workflows quickly. We don't
255
- recommend using this image for production Modal Functions though, as it may
256
- change at any time in the future.
257
- """
258
- # Include several common packages, as well as kernelshim dependencies (except 'modal').
259
- # These packages aren't pinned, so they may change over time with builds.
260
- #
261
- # We plan to use `--exclude-newer` in the future, with date-specific image builds.
262
- base_image = _Image.debian_slim(python_version=python_version)
263
-
264
- environment_packages: list[str] = [
265
- "accelerate",
266
- "aiohttp",
267
- "altair",
268
- "anthropic",
269
- "asyncpg",
270
- "beautifulsoup4",
271
- "bokeh",
272
- "boto3[crt]",
273
- "click",
274
- "diffusers[torch,flax]",
275
- "dm-sonnet",
276
- "flax",
277
- "ftfy",
278
- "h5py",
279
- "urllib3",
280
- "httpx",
281
- "huggingface-hub",
282
- "ipywidgets",
283
- "jax[cuda12]",
284
- "keras",
285
- "matplotlib",
286
- "nbformat",
287
- "numba",
288
- "numpy",
289
- "openai",
290
- "optax",
291
- "pandas",
292
- "plotly[express]",
293
- "polars",
294
- "psycopg2",
295
- "requests",
296
- "safetensors",
297
- "scikit-image",
298
- "scikit-learn",
299
- "scipy",
300
- "seaborn",
301
- "sentencepiece",
302
- "sqlalchemy",
303
- "statsmodels",
304
- "sympy",
305
- "tabulate",
306
- "tensorboard",
307
- "toml",
308
- "transformers",
309
- "triton",
310
- "typer",
311
- "vega-datasets",
312
- "watchfiles",
313
- "websockets",
314
- ]
315
-
316
- # Kernelshim dependencies. (see NOTEBOOK_KERNELSHIM_DEPENDENCIES)
317
- kernelshim_packages: list[str] = [
318
- "authlib>=1.3",
319
- "basedpyright>=1.28",
320
- "fastapi>=0.100",
321
- "ipykernel>=6",
322
- "pydantic>=2",
323
- "pyzmq>=26",
324
- "ruff>=0.11",
325
- "uvicorn>=0.32",
326
- ]
327
-
328
- commands: list[str] = [
329
- "apt-get update",
330
- "apt-get install -y "
331
- + "libpq-dev pkg-config cmake git curl wget unzip zip libsqlite3-dev openssh-server vim ffmpeg",
332
- _install_cuda_command(),
333
- # Install uv since it's faster than pip for installing packages.
334
- "pip install uv",
335
- # https://github.com/astral-sh/uv/issues/11480
336
- "pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu129",
337
- f"uv pip install --system {shlex.join(sorted(environment_packages))}",
338
- f"uv pip install --system {shlex.join(sorted(kernelshim_packages))}",
339
- ]
340
-
341
- def build_dockerfile(version: ImageBuilderVersion) -> DockerfileSpec:
342
- return DockerfileSpec(
343
- commands=[
344
- "FROM base",
345
- *(f"RUN {cmd}" for cmd in commands),
346
- "ENV PATH=/usr/local/cuda/bin:$PATH",
347
- ],
348
- context_files={},
349
- )
350
-
351
- return _Image._from_args(
352
- base_images={"base": base_image},
353
- dockerfile_function=build_dockerfile,
354
- force_build=force_build,
355
- _namespace=api_pb2.DEPLOYMENT_NAMESPACE_GLOBAL,
356
- )
357
-
358
-
359
231
  @synchronizer.create_blocking
360
232
  async def image_delete(
361
233
  image_id: str,
@@ -35,7 +35,7 @@ from ._utils.name_utils import check_object_name
35
35
  from ._utils.task_command_router_client import TaskCommandRouterClient
36
36
  from .client import _Client
37
37
  from .container_process import _ContainerProcess
38
- from .exception import ClientClosed, ExecutionError, InvalidError, SandboxTerminatedError, SandboxTimeoutError
38
+ from .exception import ClientClosed, Error, ExecutionError, InvalidError, SandboxTerminatedError, SandboxTimeoutError
39
39
  from .file_io import FileWatchEvent, FileWatchEventType, _FileIO, ls, mkdir, rm, watch
40
40
  from .gpu import GPU_T
41
41
  from .image import _Image
@@ -549,7 +549,7 @@ class _Sandbox(_Object, type_prefix="sb"):
549
549
  self._attached = False
550
550
 
551
551
  @property
552
- def _client(self):
552
+ def _client(self) -> _Client:
553
553
  self._ensure_attached()
554
554
  return self.__client
555
555
 
@@ -883,9 +883,15 @@ class _Sandbox(_Object, type_prefix="sb"):
883
883
 
884
884
  return self.returncode
885
885
 
886
- async def _get_task_id(self) -> str:
886
+ async def _get_task_id(self, raise_if_task_complete=False) -> str:
887
887
  while not self._task_id:
888
888
  resp = await self._client.stub.SandboxGetTaskId(api_pb2.SandboxGetTaskIdRequest(sandbox_id=self.object_id))
889
+ # If the sandbox is terminated before it gets scheduled it can have a task result without a task_id
890
+ if not resp.task_id and raise_if_task_complete and resp.HasField("task_result"):
891
+ # When task_result is set, the task has finished, which could be any GenericResult.
892
+ # For now, we'll raise a generic Error and not be specific about the error type
893
+ msg = resp.task_result.exception or "Sandbox already finished"
894
+ raise Error(msg)
889
895
  self._task_id = resp.task_id
890
896
  if not self._task_id:
891
897
  await asyncio.sleep(0.5)
@@ -1017,7 +1023,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1017
1023
  secret_coros = [secret.hydrate(client=self._client) for secret in secrets]
1018
1024
  await TaskContext.gather(*secret_coros)
1019
1025
 
1020
- task_id = await self._get_task_id()
1026
+ task_id = await self._get_task_id(raise_if_task_complete=True)
1021
1027
  kwargs = {
1022
1028
  "task_id": task_id,
1023
1029
  "pty_info": pty_info,
@@ -237,7 +237,7 @@ class _Sandbox(modal._object._Object):
237
237
  ...
238
238
 
239
239
  @property
240
- def _client(self): ...
240
+ def _client(self) -> modal.client._Client: ...
241
241
  @_client.setter
242
242
  def _client(self, value): ...
243
243
  def _ensure_attached(self): ...
@@ -377,7 +377,7 @@ class _Sandbox(modal._object._Object):
377
377
  """
378
378
  ...
379
379
 
380
- async def _get_task_id(self) -> str: ...
380
+ async def _get_task_id(self, raise_if_task_complete=False) -> str: ...
381
381
  async def _get_command_router_client(
382
382
  self, task_id: str
383
383
  ) -> typing.Optional[modal._utils.task_command_router_client.TaskCommandRouterClient]: ...
@@ -844,7 +844,7 @@ class Sandbox(modal.object.Object):
844
844
  detach: __detach_spec
845
845
 
846
846
  @property
847
- def _client(self): ...
847
+ def _client(self) -> modal.client.Client: ...
848
848
  @_client.setter
849
849
  def _client(self, value): ...
850
850
  def _ensure_attached(self): ...
@@ -1164,8 +1164,8 @@ class Sandbox(modal.object.Object):
1164
1164
  poll: __poll_spec
1165
1165
 
1166
1166
  class ___get_task_id_spec(typing_extensions.Protocol):
1167
- def __call__(self, /) -> str: ...
1168
- async def aio(self, /) -> str: ...
1167
+ def __call__(self, /, raise_if_task_complete=False) -> str: ...
1168
+ async def aio(self, /, raise_if_task_complete=False) -> str: ...
1169
1169
 
1170
1170
  _get_task_id: ___get_task_id_spec
1171
1171
 
@@ -5,7 +5,6 @@ import random
5
5
  import string
6
6
  import time
7
7
  import weakref
8
- from contextlib import suppress
9
8
  from pathlib import Path
10
9
  from typing import Union, cast
11
10
 
@@ -284,14 +283,11 @@ class _SandboxFilesystem:
284
283
  with translate_exec_errors("copy_from_local", remote_path):
285
284
  process = await self._sandbox.exec(_SANDBOX_FS_TOOLS_PATH, make_write_file_command(remote_path))
286
285
  while True:
287
- try:
288
- chunk = file_obj.read(TASK_COMMAND_ROUTER_MAX_BUFFER_SIZE)
289
- except Exception:
290
- # Best-effort EOF so the container process doesn't hang.
291
- with suppress(Exception):
292
- process.stdin.write_eof()
293
- await process.stdin.drain()
294
- raise
286
+ # TODO(saltzm): If this fails, the ContainerProcess will remain alive indefinitely since
287
+ # stdin will remain open. Unfortunately we can't just call write_eof either, since that
288
+ # would lead to a partially written file being persisted. We should catch exceptions
289
+ # from this and kill the ContainerProcess when we have a way to do this.
290
+ chunk = file_obj.read(TASK_COMMAND_ROUTER_MAX_BUFFER_SIZE)
295
291
  if not chunk:
296
292
  break
297
293
  total_bytes += len(chunk)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.3.6.dev5
3
+ Version: 1.3.6.dev7
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -519,10 +519,18 @@ class ModalClientBase(abc.ABC):
519
519
  async def SandboxGetTaskId(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetTaskIdRequest, modal_proto.api_pb2.SandboxGetTaskIdResponse]') -> None:
520
520
  pass
521
521
 
522
+ @abc.abstractmethod
523
+ async def SandboxGetTaskIdV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetTaskIdRequest, modal_proto.api_pb2.SandboxGetTaskIdResponse]') -> None:
524
+ pass
525
+
522
526
  @abc.abstractmethod
523
527
  async def SandboxGetTunnels(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetTunnelsRequest, modal_proto.api_pb2.SandboxGetTunnelsResponse]') -> None:
524
528
  pass
525
529
 
530
+ @abc.abstractmethod
531
+ async def SandboxGetTunnelsV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxGetTunnelsRequest, modal_proto.api_pb2.SandboxGetTunnelsResponse]') -> None:
532
+ pass
533
+
526
534
  @abc.abstractmethod
527
535
  async def SandboxList(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxListRequest, modal_proto.api_pb2.SandboxListResponse]') -> None:
528
536
  pass
@@ -571,10 +579,18 @@ class ModalClientBase(abc.ABC):
571
579
  async def SandboxTerminate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxTerminateRequest, modal_proto.api_pb2.SandboxTerminateResponse]') -> None:
572
580
  pass
573
581
 
582
+ @abc.abstractmethod
583
+ async def SandboxTerminateV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxTerminateRequest, modal_proto.api_pb2.SandboxTerminateResponse]') -> None:
584
+ pass
585
+
574
586
  @abc.abstractmethod
575
587
  async def SandboxWait(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxWaitRequest, modal_proto.api_pb2.SandboxWaitResponse]') -> None:
576
588
  pass
577
589
 
590
+ @abc.abstractmethod
591
+ async def SandboxWaitV2(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SandboxWaitRequest, modal_proto.api_pb2.SandboxWaitResponse]') -> None:
592
+ pass
593
+
578
594
  @abc.abstractmethod
579
595
  async def SecretDelete(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.SecretDeleteRequest, google.protobuf.empty_pb2.Empty]') -> None:
580
596
  pass
@@ -1503,12 +1519,24 @@ class ModalClientBase(abc.ABC):
1503
1519
  modal_proto.api_pb2.SandboxGetTaskIdRequest,
1504
1520
  modal_proto.api_pb2.SandboxGetTaskIdResponse,
1505
1521
  ),
1522
+ '/modal.client.ModalClient/SandboxGetTaskIdV2': grpclib.const.Handler(
1523
+ self.SandboxGetTaskIdV2,
1524
+ grpclib.const.Cardinality.UNARY_UNARY,
1525
+ modal_proto.api_pb2.SandboxGetTaskIdRequest,
1526
+ modal_proto.api_pb2.SandboxGetTaskIdResponse,
1527
+ ),
1506
1528
  '/modal.client.ModalClient/SandboxGetTunnels': grpclib.const.Handler(
1507
1529
  self.SandboxGetTunnels,
1508
1530
  grpclib.const.Cardinality.UNARY_UNARY,
1509
1531
  modal_proto.api_pb2.SandboxGetTunnelsRequest,
1510
1532
  modal_proto.api_pb2.SandboxGetTunnelsResponse,
1511
1533
  ),
1534
+ '/modal.client.ModalClient/SandboxGetTunnelsV2': grpclib.const.Handler(
1535
+ self.SandboxGetTunnelsV2,
1536
+ grpclib.const.Cardinality.UNARY_UNARY,
1537
+ modal_proto.api_pb2.SandboxGetTunnelsRequest,
1538
+ modal_proto.api_pb2.SandboxGetTunnelsResponse,
1539
+ ),
1512
1540
  '/modal.client.ModalClient/SandboxList': grpclib.const.Handler(
1513
1541
  self.SandboxList,
1514
1542
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1581,12 +1609,24 @@ class ModalClientBase(abc.ABC):
1581
1609
  modal_proto.api_pb2.SandboxTerminateRequest,
1582
1610
  modal_proto.api_pb2.SandboxTerminateResponse,
1583
1611
  ),
1612
+ '/modal.client.ModalClient/SandboxTerminateV2': grpclib.const.Handler(
1613
+ self.SandboxTerminateV2,
1614
+ grpclib.const.Cardinality.UNARY_UNARY,
1615
+ modal_proto.api_pb2.SandboxTerminateRequest,
1616
+ modal_proto.api_pb2.SandboxTerminateResponse,
1617
+ ),
1584
1618
  '/modal.client.ModalClient/SandboxWait': grpclib.const.Handler(
1585
1619
  self.SandboxWait,
1586
1620
  grpclib.const.Cardinality.UNARY_UNARY,
1587
1621
  modal_proto.api_pb2.SandboxWaitRequest,
1588
1622
  modal_proto.api_pb2.SandboxWaitResponse,
1589
1623
  ),
1624
+ '/modal.client.ModalClient/SandboxWaitV2': grpclib.const.Handler(
1625
+ self.SandboxWaitV2,
1626
+ grpclib.const.Cardinality.UNARY_UNARY,
1627
+ modal_proto.api_pb2.SandboxWaitRequest,
1628
+ modal_proto.api_pb2.SandboxWaitResponse,
1629
+ ),
1590
1630
  '/modal.client.ModalClient/SecretDelete': grpclib.const.Handler(
1591
1631
  self.SecretDelete,
1592
1632
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -2607,12 +2647,24 @@ class ModalClientStub:
2607
2647
  modal_proto.api_pb2.SandboxGetTaskIdRequest,
2608
2648
  modal_proto.api_pb2.SandboxGetTaskIdResponse,
2609
2649
  )
2650
+ self.SandboxGetTaskIdV2 = grpclib.client.UnaryUnaryMethod(
2651
+ channel,
2652
+ '/modal.client.ModalClient/SandboxGetTaskIdV2',
2653
+ modal_proto.api_pb2.SandboxGetTaskIdRequest,
2654
+ modal_proto.api_pb2.SandboxGetTaskIdResponse,
2655
+ )
2610
2656
  self.SandboxGetTunnels = grpclib.client.UnaryUnaryMethod(
2611
2657
  channel,
2612
2658
  '/modal.client.ModalClient/SandboxGetTunnels',
2613
2659
  modal_proto.api_pb2.SandboxGetTunnelsRequest,
2614
2660
  modal_proto.api_pb2.SandboxGetTunnelsResponse,
2615
2661
  )
2662
+ self.SandboxGetTunnelsV2 = grpclib.client.UnaryUnaryMethod(
2663
+ channel,
2664
+ '/modal.client.ModalClient/SandboxGetTunnelsV2',
2665
+ modal_proto.api_pb2.SandboxGetTunnelsRequest,
2666
+ modal_proto.api_pb2.SandboxGetTunnelsResponse,
2667
+ )
2616
2668
  self.SandboxList = grpclib.client.UnaryUnaryMethod(
2617
2669
  channel,
2618
2670
  '/modal.client.ModalClient/SandboxList',
@@ -2685,12 +2737,24 @@ class ModalClientStub:
2685
2737
  modal_proto.api_pb2.SandboxTerminateRequest,
2686
2738
  modal_proto.api_pb2.SandboxTerminateResponse,
2687
2739
  )
2740
+ self.SandboxTerminateV2 = grpclib.client.UnaryUnaryMethod(
2741
+ channel,
2742
+ '/modal.client.ModalClient/SandboxTerminateV2',
2743
+ modal_proto.api_pb2.SandboxTerminateRequest,
2744
+ modal_proto.api_pb2.SandboxTerminateResponse,
2745
+ )
2688
2746
  self.SandboxWait = grpclib.client.UnaryUnaryMethod(
2689
2747
  channel,
2690
2748
  '/modal.client.ModalClient/SandboxWait',
2691
2749
  modal_proto.api_pb2.SandboxWaitRequest,
2692
2750
  modal_proto.api_pb2.SandboxWaitResponse,
2693
2751
  )
2752
+ self.SandboxWaitV2 = grpclib.client.UnaryUnaryMethod(
2753
+ channel,
2754
+ '/modal.client.ModalClient/SandboxWaitV2',
2755
+ modal_proto.api_pb2.SandboxWaitRequest,
2756
+ modal_proto.api_pb2.SandboxWaitResponse,
2757
+ )
2694
2758
  self.SecretDelete = grpclib.client.UnaryUnaryMethod(
2695
2759
  channel,
2696
2760
  '/modal.client.ModalClient/SecretDelete',