modal 1.5.4.dev8__tar.gz → 1.5.4.dev9__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 (236) hide show
  1. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/PKG-INFO +1 -1
  2. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/rich.py +12 -2
  3. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/task_command_router_client.py +13 -3
  4. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/client.pyi +2 -2
  5. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/functions.pyi +6 -6
  6. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/sandbox.py +11 -1
  7. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/sandbox.pyi +2 -0
  8. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/PKG-INFO +1 -1
  9. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_grpc.py +16 -0
  10. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_pb2.py +912 -902
  11. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_pb2.pyi +54 -9
  12. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_pb2_grpc.py +33 -0
  13. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/api_pb2_grpc.pyi +10 -0
  14. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/modal_api_grpc.py +1 -0
  15. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_version/__init__.py +1 -1
  16. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/LICENSE +0 -0
  17. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/README.md +0 -0
  18. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/__init__.py +0 -0
  19. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/__main__.py +0 -0
  20. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_billing.py +0 -0
  21. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_clustered_functions.py +0 -0
  22. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_clustered_functions.pyi +0 -0
  23. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_container_entrypoint.py +0 -0
  24. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_environments.py +0 -0
  25. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_function_variants.py +0 -0
  26. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_functions.py +0 -0
  27. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_grpc_client.py +0 -0
  28. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_image.py +0 -0
  29. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_ipython.py +0 -0
  30. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_load_context.py +0 -0
  31. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_location.py +0 -0
  32. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_logs.py +0 -0
  33. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_logs_manager.py +0 -0
  34. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_logs_manager.pyi +0 -0
  35. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_object.py +0 -0
  36. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/__init__.py +0 -0
  37. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/manager.py +0 -0
  38. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/pty.py +0 -0
  39. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_output/status.py +0 -0
  40. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_partial_function.py +0 -0
  41. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_resolver.py +0 -0
  42. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_resources.py +0 -0
  43. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/__init__.py +0 -0
  44. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/asgi.py +0 -0
  45. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/container_io_manager.py +0 -0
  46. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/container_io_manager.pyi +0 -0
  47. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/execution_context.py +0 -0
  48. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/execution_context.pyi +0 -0
  49. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  50. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/task_lifecycle_manager.py +0 -0
  51. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  52. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/telemetry.py +0 -0
  53. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/user_code_event_loop.py +0 -0
  54. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_runtime/user_code_imports.py +0 -0
  55. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_serialization.py +0 -0
  56. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_server.py +0 -0
  57. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_supports_logs.py +0 -0
  58. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_traceback.py +0 -0
  59. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_tunnel.py +0 -0
  60. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_tunnel.pyi +0 -0
  61. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_type_manager.py +0 -0
  62. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/__init__.py +0 -0
  63. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/app_utils.py +0 -0
  64. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/async_utils.py +0 -0
  65. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/auth_token_manager.py +0 -0
  66. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/blob_utils.py +0 -0
  67. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/browser_utils.py +0 -0
  68. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/bytes_io_segment_payload.py +0 -0
  69. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/curl_utils.py +0 -0
  70. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/deprecation.py +0 -0
  71. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/display_utils.py +0 -0
  72. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/docker_utils.py +0 -0
  73. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/function_utils.py +0 -0
  74. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/git_utils.py +0 -0
  75. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/grpc_testing.py +0 -0
  76. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/grpc_utils.py +0 -0
  77. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/hash_utils.py +0 -0
  78. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/http_utils.py +0 -0
  79. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/jwt_utils.py +0 -0
  80. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/logger.py +0 -0
  81. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/mount_utils.py +0 -0
  82. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/name_utils.py +0 -0
  83. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/package_utils.py +0 -0
  84. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/pattern_utils.py +0 -0
  85. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/proxy_support.py +0 -0
  86. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/rand_pb_testing.py +0 -0
  87. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/sandbox_fs_utils.py +0 -0
  88. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/shell_utils.py +0 -0
  89. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_utils/time_utils.py +0 -0
  90. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/__init__.py +0 -0
  91. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  92. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/cloudpickle.py +0 -0
  93. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/tblib.py +0 -0
  94. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_vendor/version.py +0 -0
  95. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_watcher.py +0 -0
  96. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/_workspace.py +0 -0
  97. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/app.py +0 -0
  98. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/app.pyi +0 -0
  99. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/billing.py +0 -0
  100. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/billing.pyi +0 -0
  101. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2023.12.312.txt +0 -0
  102. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2023.12.txt +0 -0
  103. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2024.04.txt +0 -0
  104. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2024.10.txt +0 -0
  105. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/2025.06.txt +0 -0
  106. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/PREVIEW.txt +0 -0
  107. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/README.md +0 -0
  108. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/builder/base-images.json +0 -0
  109. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/call_graph.py +0 -0
  110. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/__init__.py +0 -0
  111. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/_download.py +0 -0
  112. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/_help.py +0 -0
  113. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/_traceback.py +0 -0
  114. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/app.py +0 -0
  115. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/billing.py +0 -0
  116. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/bootstrap.py +0 -0
  117. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/changelog.py +0 -0
  118. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/cluster.py +0 -0
  119. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/config.py +0 -0
  120. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/container.py +0 -0
  121. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/curl.py +0 -0
  122. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/dashboard.py +0 -0
  123. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/dict.py +0 -0
  124. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/endpoint.py +0 -0
  125. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/entry_point.py +0 -0
  126. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/environment.py +0 -0
  127. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/image.py +0 -0
  128. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/import_refs.py +0 -0
  129. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/launch.py +0 -0
  130. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/logo.py +0 -0
  131. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/network_file_system.py +0 -0
  132. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/profile.py +0 -0
  133. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/programs/__init__.py +0 -0
  134. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/programs/run_jupyter.py +0 -0
  135. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/programs/vscode.py +0 -0
  136. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/queues.py +0 -0
  137. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/run.py +0 -0
  138. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/secret.py +0 -0
  139. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/selector.py +0 -0
  140. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/shell.py +0 -0
  141. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/skills.py +0 -0
  142. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/token.py +0 -0
  143. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/utils.py +0 -0
  144. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/volume.py +0 -0
  145. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cli/workspace.py +0 -0
  146. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/client.py +0 -0
  147. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cloud_bucket_mount.py +0 -0
  148. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cloud_bucket_mount.pyi +0 -0
  149. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cls.py +0 -0
  150. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/cls.pyi +0 -0
  151. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/config.py +0 -0
  152. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/container_process.py +0 -0
  153. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/container_process.pyi +0 -0
  154. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/dict.py +0 -0
  155. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/dict.pyi +0 -0
  156. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/environments.py +0 -0
  157. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/environments.pyi +0 -0
  158. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/exception.py +0 -0
  159. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/experimental/__init__.py +0 -0
  160. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/experimental/flash.py +0 -0
  161. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/experimental/flash.pyi +0 -0
  162. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/experimental/ipython.py +0 -0
  163. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/file_io.py +0 -0
  164. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/file_io.pyi +0 -0
  165. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/file_pattern_matcher.py +0 -0
  166. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/functions.py +0 -0
  167. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/image.py +0 -0
  168. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/image.pyi +0 -0
  169. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/io_streams.py +0 -0
  170. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/io_streams.pyi +0 -0
  171. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/mount.py +0 -0
  172. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/mount.pyi +0 -0
  173. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/network_file_system.py +0 -0
  174. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/network_file_system.pyi +0 -0
  175. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/object.py +0 -0
  176. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/object.pyi +0 -0
  177. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/output.py +0 -0
  178. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/parallel_map.py +0 -0
  179. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/parallel_map.pyi +0 -0
  180. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/partial_function.py +0 -0
  181. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/partial_function.pyi +0 -0
  182. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/proxy.py +0 -0
  183. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/proxy.pyi +0 -0
  184. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/py.typed +0 -0
  185. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/queue.py +0 -0
  186. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/queue.pyi +0 -0
  187. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/retries.py +0 -0
  188. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/runner.py +0 -0
  189. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/runner.pyi +0 -0
  190. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/running_app.py +0 -0
  191. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/sandbox_fs.py +0 -0
  192. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/sandbox_fs.pyi +0 -0
  193. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/schedule.py +0 -0
  194. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/scheduler_placement.py +0 -0
  195. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/secret.py +0 -0
  196. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/secret.pyi +0 -0
  197. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/server.py +0 -0
  198. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/server.pyi +0 -0
  199. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/serving.py +0 -0
  200. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/serving.pyi +0 -0
  201. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/skills/modal/SKILL.md +0 -0
  202. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/snapshot.py +0 -0
  203. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/snapshot.pyi +0 -0
  204. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/stream_type.py +0 -0
  205. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/token_flow.py +0 -0
  206. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/token_flow.pyi +0 -0
  207. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/types.py +0 -0
  208. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/volume.py +0 -0
  209. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/volume.pyi +0 -0
  210. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/workspace.py +0 -0
  211. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal/workspace.pyi +0 -0
  212. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/SOURCES.txt +0 -0
  213. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/dependency_links.txt +0 -0
  214. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/entry_points.txt +0 -0
  215. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/requires.txt +0 -0
  216. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal.egg-info/top_level.txt +0 -0
  217. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/__init__.py +0 -0
  218. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/gen_cli_docs.py +0 -0
  219. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/gen_cli_docs_main.py +0 -0
  220. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/gen_reference_docs.py +0 -0
  221. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/gen_reference_docs_main.py +0 -0
  222. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/mdmd/__init__.py +0 -0
  223. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/mdmd/mdmd.py +0 -0
  224. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/mdmd/signatures.py +0 -0
  225. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/mdmd/types.py +0 -0
  226. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_docs/reference_intro.md +0 -0
  227. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/__init__.py +0 -0
  228. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/py.typed +0 -0
  229. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_grpc.py +0 -0
  230. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_pb2.py +0 -0
  231. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_pb2.pyi +0 -0
  232. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  233. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  234. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/modal_version/__main__.py +0 -0
  235. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/pyproject.toml +0 -0
  236. {modal-1.5.4.dev8 → modal-1.5.4.dev9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.4.dev8
3
+ Version: 1.5.4.dev9
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -37,6 +37,7 @@ from rich.progress import (
37
37
  )
38
38
  from rich.spinner import Spinner
39
39
  from rich.status import Status
40
+ from rich.table import Column
40
41
  from rich.text import Text
41
42
  from rich.tree import Tree
42
43
 
@@ -476,7 +477,10 @@ class RichOutputManager(OutputManager):
476
477
  and adds it to the current render group."""
477
478
  if not self._function_queueing_progress:
478
479
  self._function_queueing_progress = Progress(
479
- TextColumn("[progress.description]{task.description}"),
480
+ TextColumn(
481
+ "[progress.description]{task.description}",
482
+ table_column=Column(no_wrap=False, overflow="fold"),
483
+ ),
480
484
  FunctionQueuingColumn(),
481
485
  console=self._console,
482
486
  transient=True,
@@ -581,11 +585,17 @@ class RichOutputManager(OutputManager):
581
585
  """Handle queueing updates, ignoring completion updates for functions that have no queue progress bar."""
582
586
  task_key = (function_id, api_pb2.FUNCTION_QUEUED)
583
587
  task_description = description or f"'{function_id}' function waiting on worker"
588
+ task_description = escape(task_description)
584
589
  task_desc = f"[yellow]{task_description}. Time in queue:"
585
590
  if task_key in self._task_progress_items:
586
591
  progress_task_id = self._task_progress_items[task_key]
587
592
  try:
588
- self._function_queueing_progress_bar.update(progress_task_id, completed=completed, total=total)
593
+ self._function_queueing_progress_bar.update(
594
+ progress_task_id,
595
+ description=task_desc if description else None,
596
+ completed=completed,
597
+ total=total,
598
+ )
589
599
  if completed == total:
590
600
  del self._task_progress_items[task_key]
591
601
  self._function_queueing_progress_bar.remove_task(progress_task_id)
@@ -288,11 +288,21 @@ class TaskCommandRouterClient:
288
288
  server_client,
289
289
  sandbox_id: str,
290
290
  task_id: str,
291
+ access: api_pb2.CommandRouterAccess | None = None,
291
292
  ) -> "TaskCommandRouterClient":
292
- """Initialize a TaskCommandRouterClient for a V2 sandbox."""
293
- resp = await fetch_command_router_access_v2(server_client, sandbox_id=sandbox_id)
293
+ """Initialize a TaskCommandRouterClient for a V2 sandbox.
294
+
295
+ `access` is the router access returned by SandboxCreateV2, which lets a
296
+ freshly created sandbox connect without a round-trip. When it is absent —
297
+ a re-attached sandbox, or the server could not mint a token — we ask for it.
298
+ """
299
+ if access is not None:
300
+ url, jwt = access.url, access.jwt
301
+ else:
302
+ resp = await fetch_command_router_access_v2(server_client, sandbox_id=sandbox_id)
303
+ url, jwt = resp.url, resp.jwt
294
304
  logger.debug(f"Using command router access for sandbox {sandbox_id}")
295
- return await cls._connect(server_client, task_id, resp.url, resp.jwt, sandbox_id=sandbox_id)
305
+ return await cls._connect(server_client, task_id, url, jwt, sandbox_id=sandbox_id)
296
306
 
297
307
  @classmethod
298
308
  async def init_v2_by_task_id(
@@ -37,7 +37,7 @@ class _Client:
37
37
  server_url: str,
38
38
  client_type: int,
39
39
  credentials: typing.Optional[tuple[str, str]],
40
- version: str = "1.5.4.dev8",
40
+ version: str = "1.5.4.dev9",
41
41
  ):
42
42
  """mdmd:hidden
43
43
  The Modal client object is not intended to be instantiated directly by users.
@@ -207,7 +207,7 @@ class Client:
207
207
  server_url: str,
208
208
  client_type: int,
209
209
  credentials: typing.Optional[tuple[str, str]],
210
- version: str = "1.5.4.dev8",
210
+ version: str = "1.5.4.dev9",
211
211
  ):
212
212
  """mdmd:hidden
213
213
  The Modal client object is not intended to be instantiated directly by users.
@@ -546,7 +546,7 @@ class Function(
546
546
 
547
547
  _call_generator: ___call_generator_spec
548
548
 
549
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
549
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
550
550
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
551
551
  """Calls the function remotely, executing it with the given arguments and returning the execution's result.
552
552
 
@@ -571,7 +571,7 @@ class Function(
571
571
  """
572
572
  ...
573
573
 
574
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
574
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
575
575
 
576
576
  class __remote_gen_spec(typing_extensions.Protocol):
577
577
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -621,7 +621,7 @@ class Function(
621
621
  """
622
622
  ...
623
623
 
624
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
624
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
625
625
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
626
626
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
627
627
 
@@ -654,7 +654,7 @@ class Function(
654
654
  """
655
655
  ...
656
656
 
657
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
657
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
658
658
 
659
659
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
660
660
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -662,7 +662,7 @@ class Function(
662
662
 
663
663
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
664
664
 
665
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
665
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
666
666
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
667
667
  """Calls the function with the given arguments, without waiting for the results.
668
668
 
@@ -695,7 +695,7 @@ class Function(
695
695
  """
696
696
  ...
697
697
 
698
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
698
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
699
699
 
700
700
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
701
701
  """Return the inner Python object wrapped by this Modal Function.
@@ -333,6 +333,7 @@ class _Sandbox(_Object, type_prefix="sb"):
333
333
  _tunnels: dict[int, Tunnel] | None
334
334
  _enable_snapshot: bool
335
335
  _command_router_client: TaskCommandRouterClient | None
336
+ _init_command_router_access: api_pb2.CommandRouterAccess | None
336
337
  _attached: bool
337
338
  _filesystem: _SandboxFilesystem | None
338
339
  _is_v2: bool = False
@@ -1034,6 +1035,10 @@ class _Sandbox(_Object, type_prefix="sb"):
1034
1035
  self._hydrate(sandbox_id, load_context.client, create_resp.metadata)
1035
1036
  self._is_v2 = True
1036
1037
  self._task_id = create_resp.task_id
1038
+ # An unset proto message reads as an empty one rather than None, so the
1039
+ # presence check is what distinguishes "no access" from "empty access".
1040
+ if create_resp.HasField("command_router_access"):
1041
+ self._init_command_router_access = create_resp.command_router_access
1037
1042
  self._hydrate_metadata_v2()
1038
1043
  # Unencrypted tunnel endpoints are not known at create time. Only
1039
1044
  # cache a complete set so tunnels() fetches the rest otherwise.
@@ -1121,6 +1126,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1121
1126
  self._tunnels = None
1122
1127
  self._enable_snapshot = False
1123
1128
  self._command_router_client = None
1129
+ self._init_command_router_access = None
1124
1130
  self._filesystem = None
1125
1131
  self._is_v2 = _is_v2_sandbox_id(self.object_id)
1126
1132
  if self._is_v2:
@@ -1912,8 +1918,12 @@ class _Sandbox(_Object, type_prefix="sb"):
1912
1918
  if self._command_router_client is None:
1913
1919
  try:
1914
1920
  if self._is_v2:
1921
+ # Consume the seeded access, so if connecting with it fails the
1922
+ # retry falls back to the authoritative RPC instead of
1923
+ # re-trying the same credentials forever.
1924
+ access, self._init_command_router_access = self._init_command_router_access, None
1915
1925
  self._command_router_client = await TaskCommandRouterClient.init_v2_by_sandbox_id(
1916
- self._client, self.object_id, task_id
1926
+ self._client, self.object_id, task_id, access
1917
1927
  )
1918
1928
  else:
1919
1929
  self._command_router_client = await TaskCommandRouterClient.init(self._client, task_id)
@@ -147,6 +147,7 @@ class _Sandbox(modal._object._Object):
147
147
  _tunnels: typing.Optional[dict[int, modal._tunnel.Tunnel]]
148
148
  _enable_snapshot: bool
149
149
  _command_router_client: typing.Optional[modal._utils.task_command_router_client.TaskCommandRouterClient]
150
+ _init_command_router_access: typing.Optional[modal_proto.api_pb2.CommandRouterAccess]
150
151
  _attached: bool
151
152
  _filesystem: typing.Optional[modal.sandbox_fs._SandboxFilesystem]
152
153
  _is_v2: bool
@@ -1454,6 +1455,7 @@ class Sandbox(modal.object.Object):
1454
1455
  _tunnels: typing.Optional[dict[int, modal._tunnel.Tunnel]]
1455
1456
  _enable_snapshot: bool
1456
1457
  _command_router_client: typing.Optional[modal._utils.task_command_router_client.TaskCommandRouterClient]
1458
+ _init_command_router_access: typing.Optional[modal_proto.api_pb2.CommandRouterAccess]
1457
1459
  _attached: bool
1458
1460
  _filesystem: typing.Optional[modal.sandbox_fs.SandboxFilesystem]
1459
1461
  _is_v2: bool
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.4.dev8
3
+ Version: 1.5.4.dev9
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -327,6 +327,10 @@ class ModalClientBase(abc.ABC):
327
327
  async def EnvironmentSetBudget(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetBudgetRequest, google.protobuf.empty_pb2.Empty]') -> None:
328
328
  pass
329
329
 
330
+ @abc.abstractmethod
331
+ async def EnvironmentSetDefaultMemberRole(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetDefaultMemberRoleRequest, google.protobuf.empty_pb2.Empty]') -> None:
332
+ pass
333
+
330
334
  @abc.abstractmethod
331
335
  async def EnvironmentSetManaged(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetManagedRequest, google.protobuf.empty_pb2.Empty]') -> None:
332
336
  pass
@@ -1419,6 +1423,12 @@ class ModalClientBase(abc.ABC):
1419
1423
  modal_proto.api_pb2.EnvironmentSetBudgetRequest,
1420
1424
  google.protobuf.empty_pb2.Empty,
1421
1425
  ),
1426
+ '/modal.client.ModalClient/EnvironmentSetDefaultMemberRole': grpclib.const.Handler(
1427
+ self.EnvironmentSetDefaultMemberRole,
1428
+ grpclib.const.Cardinality.UNARY_UNARY,
1429
+ modal_proto.api_pb2.EnvironmentSetDefaultMemberRoleRequest,
1430
+ google.protobuf.empty_pb2.Empty,
1431
+ ),
1422
1432
  '/modal.client.ModalClient/EnvironmentSetManaged': grpclib.const.Handler(
1423
1433
  self.EnvironmentSetManaged,
1424
1434
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -2829,6 +2839,12 @@ class ModalClientStub:
2829
2839
  modal_proto.api_pb2.EnvironmentSetBudgetRequest,
2830
2840
  google.protobuf.empty_pb2.Empty,
2831
2841
  )
2842
+ self.EnvironmentSetDefaultMemberRole = grpclib.client.UnaryUnaryMethod(
2843
+ channel,
2844
+ '/modal.client.ModalClient/EnvironmentSetDefaultMemberRole',
2845
+ modal_proto.api_pb2.EnvironmentSetDefaultMemberRoleRequest,
2846
+ google.protobuf.empty_pb2.Empty,
2847
+ )
2832
2848
  self.EnvironmentSetManaged = grpclib.client.UnaryUnaryMethod(
2833
2849
  channel,
2834
2850
  '/modal.client.ModalClient/EnvironmentSetManaged',