modal 1.4.3.dev4__tar.gz → 1.4.3.dev6__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 (212) hide show
  1. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/PKG-INFO +1 -1
  2. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/client.pyi +2 -2
  3. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/exception.py +4 -4
  4. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/sandbox.py +29 -29
  5. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal.egg-info/PKG-INFO +1 -1
  6. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/api_pb2.py +662 -660
  7. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/api_pb2.pyi +19 -8
  8. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/task_command_router_pb2.py +14 -14
  9. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/task_command_router_pb2.pyi +5 -1
  10. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_version/__init__.py +1 -1
  11. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/LICENSE +0 -0
  12. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/README.md +0 -0
  13. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/__init__.py +0 -0
  14. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/__main__.py +0 -0
  15. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_billing.py +0 -0
  16. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_clustered_functions.py +0 -0
  17. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_clustered_functions.pyi +0 -0
  18. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_container_entrypoint.py +0 -0
  19. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_functions.py +0 -0
  20. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_grpc_client.py +0 -0
  21. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_ipython.py +0 -0
  22. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_load_context.py +0 -0
  23. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_location.py +0 -0
  24. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_logs.py +0 -0
  25. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_object.py +0 -0
  26. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_output/__init__.py +0 -0
  27. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_output/manager.py +0 -0
  28. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_output/pty.py +0 -0
  29. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_output/rich.py +0 -0
  30. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_output/status.py +0 -0
  31. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_partial_function.py +0 -0
  32. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_resolver.py +0 -0
  33. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_resources.py +0 -0
  34. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/__init__.py +0 -0
  35. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/asgi.py +0 -0
  36. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/container_io_manager.py +0 -0
  37. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/container_io_manager.pyi +0 -0
  38. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/execution_context.py +0 -0
  39. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/execution_context.pyi +0 -0
  40. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  41. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/telemetry.py +0 -0
  42. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/user_code_event_loop.py +0 -0
  43. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_runtime/user_code_imports.py +0 -0
  44. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_serialization.py +0 -0
  45. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_server.py +0 -0
  46. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_traceback.py +0 -0
  47. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_tunnel.py +0 -0
  48. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_tunnel.pyi +0 -0
  49. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_type_manager.py +0 -0
  50. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/__init__.py +0 -0
  51. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/app_utils.py +0 -0
  52. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/async_utils.py +0 -0
  53. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/auth_token_manager.py +0 -0
  54. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/blob_utils.py +0 -0
  55. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/browser_utils.py +0 -0
  56. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/bytes_io_segment_payload.py +0 -0
  57. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/deprecation.py +0 -0
  58. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/docker_utils.py +0 -0
  59. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/function_utils.py +0 -0
  60. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/git_utils.py +0 -0
  61. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/grpc_testing.py +0 -0
  62. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/grpc_utils.py +0 -0
  63. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/hash_utils.py +0 -0
  64. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/http_utils.py +0 -0
  65. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/jwt_utils.py +0 -0
  66. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/logger.py +0 -0
  67. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/mount_utils.py +0 -0
  68. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/name_utils.py +0 -0
  69. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/package_utils.py +0 -0
  70. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/pattern_utils.py +0 -0
  71. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/rand_pb_testing.py +0 -0
  72. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/sandbox_fs_utils.py +0 -0
  73. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/shell_utils.py +0 -0
  74. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/task_command_router_client.py +0 -0
  75. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_utils/time_utils.py +0 -0
  76. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_vendor/__init__.py +0 -0
  77. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  78. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_vendor/cloudpickle.py +0 -0
  79. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_vendor/tblib.py +0 -0
  80. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_vendor/version.py +0 -0
  81. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/_watcher.py +0 -0
  82. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/app.py +0 -0
  83. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/app.pyi +0 -0
  84. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/billing.py +0 -0
  85. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/builder/2023.12.312.txt +0 -0
  86. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/builder/2023.12.txt +0 -0
  87. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/builder/2024.04.txt +0 -0
  88. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/builder/2024.10.txt +0 -0
  89. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/builder/2025.06.txt +0 -0
  90. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/builder/PREVIEW.txt +0 -0
  91. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/builder/README.md +0 -0
  92. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/builder/base-images.json +0 -0
  93. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/call_graph.py +0 -0
  94. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/__init__.py +0 -0
  95. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/_download.py +0 -0
  96. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/_help.py +0 -0
  97. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/_traceback.py +0 -0
  98. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/app.py +0 -0
  99. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/billing.py +0 -0
  100. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/bootstrap.py +0 -0
  101. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/changelog.py +0 -0
  102. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/cluster.py +0 -0
  103. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/config.py +0 -0
  104. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/container.py +0 -0
  105. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/dashboard.py +0 -0
  106. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/dict.py +0 -0
  107. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/entry_point.py +0 -0
  108. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/environment.py +0 -0
  109. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/import_refs.py +0 -0
  110. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/launch.py +0 -0
  111. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/logo.py +0 -0
  112. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/network_file_system.py +0 -0
  113. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/profile.py +0 -0
  114. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/programs/__init__.py +0 -0
  115. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/programs/run_jupyter.py +0 -0
  116. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/programs/vscode.py +0 -0
  117. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/queues.py +0 -0
  118. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/run.py +0 -0
  119. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/secret.py +0 -0
  120. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/selector.py +0 -0
  121. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/shell.py +0 -0
  122. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/token.py +0 -0
  123. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/utils.py +0 -0
  124. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cli/volume.py +0 -0
  125. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/client.py +0 -0
  126. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cloud_bucket_mount.py +0 -0
  127. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cloud_bucket_mount.pyi +0 -0
  128. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cls.py +0 -0
  129. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/cls.pyi +0 -0
  130. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/config.py +0 -0
  131. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/container_process.py +0 -0
  132. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/container_process.pyi +0 -0
  133. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/dict.py +0 -0
  134. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/dict.pyi +0 -0
  135. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/environments.py +0 -0
  136. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/environments.pyi +0 -0
  137. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/experimental/__init__.py +0 -0
  138. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/experimental/flash.py +0 -0
  139. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/experimental/flash.pyi +0 -0
  140. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/experimental/ipython.py +0 -0
  141. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/file_io.py +0 -0
  142. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/file_io.pyi +0 -0
  143. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/file_pattern_matcher.py +0 -0
  144. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/functions.py +0 -0
  145. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/functions.pyi +0 -0
  146. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/image.py +0 -0
  147. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/image.pyi +0 -0
  148. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/io_streams.py +0 -0
  149. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/io_streams.pyi +0 -0
  150. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/mount.py +0 -0
  151. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/mount.pyi +0 -0
  152. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/network_file_system.py +0 -0
  153. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/network_file_system.pyi +0 -0
  154. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/object.py +0 -0
  155. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/object.pyi +0 -0
  156. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/output.py +0 -0
  157. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/parallel_map.py +0 -0
  158. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/parallel_map.pyi +0 -0
  159. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/partial_function.py +0 -0
  160. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/partial_function.pyi +0 -0
  161. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/proxy.py +0 -0
  162. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/proxy.pyi +0 -0
  163. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/py.typed +0 -0
  164. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/queue.py +0 -0
  165. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/queue.pyi +0 -0
  166. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/retries.py +0 -0
  167. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/runner.py +0 -0
  168. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/runner.pyi +0 -0
  169. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/running_app.py +0 -0
  170. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/sandbox.pyi +0 -0
  171. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/sandbox_fs.py +0 -0
  172. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/sandbox_fs.pyi +0 -0
  173. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/schedule.py +0 -0
  174. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/scheduler_placement.py +0 -0
  175. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/secret.py +0 -0
  176. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/secret.pyi +0 -0
  177. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/server.py +0 -0
  178. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/server.pyi +0 -0
  179. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/serving.py +0 -0
  180. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/serving.pyi +0 -0
  181. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/snapshot.py +0 -0
  182. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/snapshot.pyi +0 -0
  183. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/stream_type.py +0 -0
  184. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/token_flow.py +0 -0
  185. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/token_flow.pyi +0 -0
  186. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/volume.py +0 -0
  187. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal/volume.pyi +0 -0
  188. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal.egg-info/SOURCES.txt +0 -0
  189. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal.egg-info/dependency_links.txt +0 -0
  190. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal.egg-info/entry_points.txt +0 -0
  191. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal.egg-info/requires.txt +0 -0
  192. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal.egg-info/top_level.txt +0 -0
  193. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_docs/__init__.py +0 -0
  194. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_docs/gen_cli_docs.py +0 -0
  195. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_docs/gen_cli_docs_main.py +0 -0
  196. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_docs/gen_reference_docs.py +0 -0
  197. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_docs/gen_reference_docs_main.py +0 -0
  198. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_docs/mdmd/__init__.py +0 -0
  199. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_docs/mdmd/mdmd.py +0 -0
  200. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_docs/mdmd/signatures.py +0 -0
  201. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/__init__.py +0 -0
  202. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/api_grpc.py +0 -0
  203. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/api_pb2_grpc.py +0 -0
  204. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/api_pb2_grpc.pyi +0 -0
  205. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/modal_api_grpc.py +0 -0
  206. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/py.typed +0 -0
  207. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/task_command_router_grpc.py +0 -0
  208. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  209. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  210. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/modal_version/__main__.py +0 -0
  211. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/pyproject.toml +0 -0
  212. {modal-1.4.3.dev4 → modal-1.4.3.dev6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.3.dev4
3
+ Version: 1.4.3.dev6
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.4.3.dev4",
38
+ version: str = "1.4.3.dev6",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -175,7 +175,7 @@ class Client:
175
175
  server_url: str,
176
176
  client_type: int,
177
177
  credentials: typing.Optional[tuple[str, str]],
178
- version: str = "1.4.3.dev4",
178
+ version: str = "1.4.3.dev6",
179
179
  ):
180
180
  """mdmd:hidden
181
181
  The Modal client object is not intended to be instantiated directly by users.
@@ -90,7 +90,7 @@ class _GRPCErrorWrapper(grpclib.GRPCError):
90
90
  def __repr__(self) -> str:
91
91
  return f"{type(self).__name__}({self._message!r})"
92
92
 
93
- def _warn_on_grpc_error_attribute_access(self) -> None:
93
+ def _attribute_warning(self) -> None:
94
94
  from ._utils.deprecation import deprecation_warning # Avoid circular import
95
95
 
96
96
  exc_type = type(self).__name__
@@ -104,7 +104,7 @@ class _GRPCErrorWrapper(grpclib.GRPCError):
104
104
 
105
105
  @property
106
106
  def message(self) -> str:
107
- self._warn_on_grpc_error_attribute_access()
107
+ self._attribute_warning()
108
108
  return self._grpc_message
109
109
 
110
110
  @message.setter
@@ -113,7 +113,7 @@ class _GRPCErrorWrapper(grpclib.GRPCError):
113
113
 
114
114
  @property
115
115
  def status(self) -> grpclib.Status:
116
- self._warn_on_grpc_error_attribute_access()
116
+ self._attribute_warning()
117
117
  return self._grpc_status
118
118
 
119
119
  @status.setter
@@ -122,7 +122,7 @@ class _GRPCErrorWrapper(grpclib.GRPCError):
122
122
 
123
123
  @property
124
124
  def details(self) -> Any:
125
- self._warn_on_grpc_error_attribute_access()
125
+ self._attribute_warning()
126
126
  return self._grpc_details
127
127
 
128
128
  @details.setter
@@ -268,22 +268,28 @@ class _Sandbox(_Object, type_prefix="sb"):
268
268
  if pty:
269
269
  pty_info = _Sandbox._default_pty_info()
270
270
 
271
- def _deps() -> list[_Object]:
272
- deps: list[_Object] = [image] + list(mounts) + list(secrets)
271
+ async def _load(
272
+ self: _Sandbox, resolver: Resolver, load_context: LoadContext, _existing_object_id: Optional[str]
273
+ ):
274
+ # An already-hydrated image (e.g. one returned by
275
+ # `Sandbox.snapshot_directory`) is skipped — there's nothing to load.
276
+ dep_tasks: list = []
277
+ if not image._is_hydrated:
278
+ dep_tasks.append(resolver.load(image, load_context))
279
+ for dep in list(mounts) + list(secrets):
280
+ dep_tasks.append(resolver.load(dep, load_context))
273
281
  for _, vol in validated_network_file_systems:
274
- deps.append(vol)
282
+ dep_tasks.append(resolver.load(vol, load_context))
275
283
  for _, vol in validated_volumes:
276
- deps.append(vol)
284
+ dep_tasks.append(resolver.load(vol, load_context))
277
285
  for _, cloud_bucket_mount in cloud_bucket_mounts:
278
286
  if cloud_bucket_mount.secret:
279
- deps.append(cloud_bucket_mount.secret)
287
+ dep_tasks.append(resolver.load(cloud_bucket_mount.secret, load_context))
280
288
  if proxy:
281
- deps.append(proxy)
282
- return deps
289
+ dep_tasks.append(resolver.load(proxy, load_context))
290
+ if dep_tasks:
291
+ await asyncio.gather(*dep_tasks)
283
292
 
284
- async def _load(
285
- self: _Sandbox, resolver: Resolver, load_context: LoadContext, _existing_object_id: Optional[str]
286
- ):
287
293
  # Validate that the same volume (by object_id) isn't mounted at multiple paths
288
294
  validate_volumes_by_object_id(validated_volumes)
289
295
 
@@ -363,7 +369,7 @@ class _Sandbox(_Object, type_prefix="sb"):
363
369
  sandbox_id = create_resp.sandbox_id
364
370
  self._hydrate(sandbox_id, load_context.client, None)
365
371
 
366
- return _Sandbox._from_loader(_load, "Sandbox()", deps=_deps, load_context_overrides=LoadContext.empty())
372
+ return _Sandbox._from_loader(_load, "Sandbox()", load_context_overrides=LoadContext.empty())
367
373
 
368
374
  @staticmethod
369
375
  async def create(
@@ -689,12 +695,17 @@ class _Sandbox(_Object, type_prefix="sb"):
689
695
  allowed_cidrs=cidr_allowlist,
690
696
  )
691
697
 
692
- def _deps() -> list[_Object]:
693
- return [image] + list(secrets)
694
-
695
698
  async def _load(
696
699
  self: _Sandbox, resolver: Resolver, load_context: LoadContext, _existing_object_id: Optional[str]
697
700
  ):
701
+ dep_tasks: list = []
702
+ if not image._is_hydrated:
703
+ dep_tasks.append(resolver.load(image, load_context))
704
+ for secret in secrets:
705
+ dep_tasks.append(resolver.load(secret, load_context))
706
+ if dep_tasks:
707
+ await asyncio.gather(*dep_tasks)
708
+
698
709
  definition = api_pb2.Sandbox(
699
710
  entrypoint_args=args,
700
711
  image_id=image.object_id,
@@ -732,7 +743,7 @@ class _Sandbox(_Object, type_prefix="sb"):
732
743
  for t in create_resp.tunnels
733
744
  }
734
745
 
735
- obj = _Sandbox._from_loader(_load, "Sandbox()", deps=_deps, load_context_overrides=LoadContext.empty())
746
+ obj = _Sandbox._from_loader(_load, "Sandbox()", load_context_overrides=LoadContext.empty())
736
747
 
737
748
  app_id: Optional[str] = None
738
749
  app_client: Optional[_Client] = None
@@ -906,19 +917,7 @@ class _Sandbox(_Object, type_prefix="sb"):
906
917
  if resp.result.status != api_pb2.GenericResult.GENERIC_STATUS_SUCCESS:
907
918
  raise ExecutionError(resp.result.exception)
908
919
 
909
- image_id = resp.image_id
910
- metadata = resp.image_metadata
911
-
912
- async def _load(self: _Image, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]):
913
- # no need to hydrate again since we do it eagerly below
914
- pass
915
-
916
- rep = "Image()"
917
- # TODO: use ._new_hydrated instead
918
- image = _Image._from_loader(_load, rep, hydrate_lazily=True, load_context_overrides=LoadContext.empty())
919
- image._hydrate(image_id, self._client, metadata) # hydrating eagerly since we have all of the data
920
-
921
- return image
920
+ return _Image._new_hydrated(resp.image_id, self._client, resp.image_metadata)
922
921
 
923
922
  async def mount_image(self, path: Union[PurePosixPath, str], image: _Image):
924
923
  """Mount an Image at a specified path in a running Sandbox.
@@ -1032,7 +1031,8 @@ class _Sandbox(_Object, type_prefix="sb"):
1032
1031
  raise InvalidError(f"Snapshot path must be absolute; got: {posix_path}")
1033
1032
  path_bytes = posix_path.as_posix().encode("utf8")
1034
1033
 
1035
- req = sr_pb2.TaskSnapshotDirectoryRequest(task_id=task_id, path=path_bytes)
1034
+ snapshot_id = str(uuid.uuid4())
1035
+ req = sr_pb2.TaskSnapshotDirectoryRequest(task_id=task_id, path=path_bytes, snapshot_id=snapshot_id)
1036
1036
  res = await command_router_client.snapshot_directory(req)
1037
1037
  return _Image._new_hydrated(res.image_id, self._client, None)
1038
1038
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.4.3.dev4
3
+ Version: 1.4.3.dev6
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0