modal 1.6.1.dev3__tar.gz → 1.6.2.dev1__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 (241) hide show
  1. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/PKG-INFO +1 -1
  2. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/task_command_router_client.py +29 -8
  3. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/client.pyi +2 -2
  4. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/sandbox.py +24 -40
  5. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/sandbox.pyi +7 -0
  6. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_version/__init__.py +1 -1
  8. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/LICENSE +0 -0
  9. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/README.md +0 -0
  10. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/__init__.py +0 -0
  11. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/__main__.py +0 -0
  12. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_billing.py +0 -0
  13. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_cluster.py +0 -0
  14. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_cluster.pyi +0 -0
  15. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_container_entrypoint.py +0 -0
  16. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_environments.py +0 -0
  17. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_function_variants.py +0 -0
  18. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_functions.py +0 -0
  19. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_grpc_client.py +0 -0
  20. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_image.py +0 -0
  21. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_ipython.py +0 -0
  22. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_load_context.py +0 -0
  23. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_location.py +0 -0
  24. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_logs.py +0 -0
  25. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_logs_manager.py +0 -0
  26. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_logs_manager.pyi +0 -0
  27. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_object.py +0 -0
  28. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_outbound_policy.py +0 -0
  29. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_outbound_policy.pyi +0 -0
  30. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_output/__init__.py +0 -0
  31. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_output/manager.py +0 -0
  32. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_output/pty.py +0 -0
  33. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_output/rich.py +0 -0
  34. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_output/status.py +0 -0
  35. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_partial_function.py +0 -0
  36. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_resolver.py +0 -0
  37. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_resources.py +0 -0
  38. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/__init__.py +0 -0
  39. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/asgi.py +0 -0
  40. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/container_io_manager.py +0 -0
  41. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/container_io_manager.pyi +0 -0
  42. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/execution_context.py +0 -0
  43. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/execution_context.pyi +0 -0
  44. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  45. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/task_lifecycle_manager.py +0 -0
  46. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  47. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/telemetry.py +0 -0
  48. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/user_code_event_loop.py +0 -0
  49. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_runtime/user_code_imports.py +0 -0
  50. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_serialization.py +0 -0
  51. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_server.py +0 -0
  52. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_server.pyi +0 -0
  53. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_supports_logs.py +0 -0
  54. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_traceback.py +0 -0
  55. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_tunnel.py +0 -0
  56. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_tunnel.pyi +0 -0
  57. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_type_manager.py +0 -0
  58. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/__init__.py +0 -0
  59. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/app_utils.py +0 -0
  60. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/async_utils.py +0 -0
  61. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/auth_token_manager.py +0 -0
  62. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/blob_utils.py +0 -0
  63. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/browser_utils.py +0 -0
  64. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/bytes_io_segment_payload.py +0 -0
  65. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/curl_utils.py +0 -0
  66. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/deprecation.py +0 -0
  67. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/display_utils.py +0 -0
  68. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/docker_utils.py +0 -0
  69. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/function_utils.py +0 -0
  70. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/git_utils.py +0 -0
  71. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/grpc_testing.py +0 -0
  72. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/grpc_utils.py +0 -0
  73. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/hash_utils.py +0 -0
  74. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/http_utils.py +0 -0
  75. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/idle_countdown.py +0 -0
  76. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/jwt_utils.py +0 -0
  77. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/logger.py +0 -0
  78. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/mount_utils.py +0 -0
  79. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/name_utils.py +0 -0
  80. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/package_utils.py +0 -0
  81. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/pattern_utils.py +0 -0
  82. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/proxy_support.py +0 -0
  83. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/rand_pb_testing.py +0 -0
  84. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/sandbox_fs_utils.py +0 -0
  85. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/shell_utils.py +0 -0
  86. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_utils/time_utils.py +0 -0
  87. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_vendor/__init__.py +0 -0
  88. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  89. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_vendor/cloudpickle.py +0 -0
  90. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_vendor/tblib.py +0 -0
  91. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_vendor/version.py +0 -0
  92. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_watcher.py +0 -0
  93. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/_workspace.py +0 -0
  94. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/app.py +0 -0
  95. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/app.pyi +0 -0
  96. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/billing.py +0 -0
  97. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/billing.pyi +0 -0
  98. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/builder/2023.12.312.txt +0 -0
  99. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/builder/2023.12.txt +0 -0
  100. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/builder/2024.04.txt +0 -0
  101. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/builder/2024.10.txt +0 -0
  102. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/builder/2025.06.txt +0 -0
  103. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/builder/PREVIEW.txt +0 -0
  104. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/builder/README.md +0 -0
  105. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/builder/base-images.json +0 -0
  106. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/call_graph.py +0 -0
  107. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/__init__.py +0 -0
  108. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/_download.py +0 -0
  109. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/_help.py +0 -0
  110. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/_logs.py +0 -0
  111. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/_stats.py +0 -0
  112. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/_traceback.py +0 -0
  113. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/app.py +0 -0
  114. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/billing.py +0 -0
  115. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/changelog.py +0 -0
  116. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/config.py +0 -0
  117. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/container.py +0 -0
  118. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/curl.py +0 -0
  119. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/dashboard.py +0 -0
  120. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/dict.py +0 -0
  121. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/endpoint.py +0 -0
  122. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/entry_point.py +0 -0
  123. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/environment.py +0 -0
  124. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/function.py +0 -0
  125. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/image.py +0 -0
  126. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/import_refs.py +0 -0
  127. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/logo.py +0 -0
  128. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/network_file_system.py +0 -0
  129. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/profile.py +0 -0
  130. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/queues.py +0 -0
  131. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/run.py +0 -0
  132. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/secret.py +0 -0
  133. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/selector.py +0 -0
  134. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/server.py +0 -0
  135. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/shell.py +0 -0
  136. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/skills.py +0 -0
  137. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/token.py +0 -0
  138. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/utils.py +0 -0
  139. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/volume.py +0 -0
  140. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cli/workspace.py +0 -0
  141. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/client.py +0 -0
  142. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cloud_bucket_mount.py +0 -0
  143. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cloud_bucket_mount.pyi +0 -0
  144. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cls.py +0 -0
  145. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cls.pyi +0 -0
  146. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cluster.py +0 -0
  147. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/cluster.pyi +0 -0
  148. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/config.py +0 -0
  149. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/container_process.py +0 -0
  150. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/container_process.pyi +0 -0
  151. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/dict.py +0 -0
  152. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/dict.pyi +0 -0
  153. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/environments.py +0 -0
  154. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/environments.pyi +0 -0
  155. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/exception.py +0 -0
  156. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/experimental/__init__.py +0 -0
  157. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/experimental/_flash_container_entry.py +0 -0
  158. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/experimental/flash.py +0 -0
  159. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/experimental/flash.pyi +0 -0
  160. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/experimental/flash_server.py +0 -0
  161. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/experimental/flash_server.pyi +0 -0
  162. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/experimental/ipython.py +0 -0
  163. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/file_pattern_matcher.py +0 -0
  164. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/functions.py +0 -0
  165. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/functions.pyi +0 -0
  166. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/image.py +0 -0
  167. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/image.pyi +0 -0
  168. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/io_streams.py +0 -0
  169. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/io_streams.pyi +0 -0
  170. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/mount.py +0 -0
  171. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/mount.pyi +0 -0
  172. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/network_file_system.py +0 -0
  173. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/network_file_system.pyi +0 -0
  174. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/object.py +0 -0
  175. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/object.pyi +0 -0
  176. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/output.py +0 -0
  177. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/parallel_map.py +0 -0
  178. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/parallel_map.pyi +0 -0
  179. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/partial_function.py +0 -0
  180. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/partial_function.pyi +0 -0
  181. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/proxy.py +0 -0
  182. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/proxy.pyi +0 -0
  183. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/py.typed +0 -0
  184. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/queue.py +0 -0
  185. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/queue.pyi +0 -0
  186. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/retries.py +0 -0
  187. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/runner.py +0 -0
  188. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/runner.pyi +0 -0
  189. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/running_app.py +0 -0
  190. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/sandbox_fs.py +0 -0
  191. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/sandbox_fs.pyi +0 -0
  192. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/schedule.py +0 -0
  193. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/scheduler_placement.py +0 -0
  194. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/secret.py +0 -0
  195. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/secret.pyi +0 -0
  196. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/server.py +0 -0
  197. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/server.pyi +0 -0
  198. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/serving.py +0 -0
  199. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/serving.pyi +0 -0
  200. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/skills/modal/SKILL.md +0 -0
  201. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/snapshot.py +0 -0
  202. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/snapshot.pyi +0 -0
  203. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/stream_type.py +0 -0
  204. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/token_flow.py +0 -0
  205. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/token_flow.pyi +0 -0
  206. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/types.py +0 -0
  207. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/volume.py +0 -0
  208. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/volume.pyi +0 -0
  209. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/workspace.py +0 -0
  210. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal/workspace.pyi +0 -0
  211. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal.egg-info/SOURCES.txt +0 -0
  212. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal.egg-info/dependency_links.txt +0 -0
  213. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal.egg-info/entry_points.txt +0 -0
  214. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal.egg-info/requires.txt +0 -0
  215. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal.egg-info/top_level.txt +0 -0
  216. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/__init__.py +0 -0
  217. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/gen_cli_docs.py +0 -0
  218. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/gen_cli_docs_main.py +0 -0
  219. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/gen_reference_docs.py +0 -0
  220. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/gen_reference_docs_main.py +0 -0
  221. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/mdmd/__init__.py +0 -0
  222. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/mdmd/mdmd.py +0 -0
  223. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/mdmd/signatures.py +0 -0
  224. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/mdmd/types.py +0 -0
  225. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_docs/reference_intro.md +0 -0
  226. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/__init__.py +0 -0
  227. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/api_grpc.py +0 -0
  228. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/api_pb2.py +0 -0
  229. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/api_pb2.pyi +0 -0
  230. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/api_pb2_grpc.py +0 -0
  231. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/api_pb2_grpc.pyi +0 -0
  232. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/modal_api_grpc.py +0 -0
  233. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/py.typed +0 -0
  234. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/task_command_router_grpc.py +0 -0
  235. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/task_command_router_pb2.py +0 -0
  236. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/task_command_router_pb2.pyi +0 -0
  237. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  238. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  239. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/modal_version/__main__.py +0 -0
  240. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/pyproject.toml +0 -0
  241. {modal-1.6.1.dev3 → modal-1.6.2.dev1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.6.1.dev3
3
+ Version: 1.6.2.dev1
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -226,6 +226,7 @@ async def fetch_command_router_access_v2(
226
226
  *,
227
227
  sandbox_id: str | None = None,
228
228
  task_id: str | None = None,
229
+ sandbox_token: str | None = None,
229
230
  ) -> api_pb2.SandboxGetCommandRouterAccessResponse:
230
231
  """Fetch direct command router access info from Modal server for a V2 sandbox."""
231
232
  if sandbox_id is not None:
@@ -236,10 +237,10 @@ async def fetch_command_router_access_v2(
236
237
  raise ValueError("Either sandbox_id or task_id must be provided")
237
238
  assert server_client._auth_token_manager
238
239
  auth_token = await server_client._auth_token_manager.get_token()
239
- return await server_client._stub.SandboxGetCommandRouterAccess(
240
- request,
241
- metadata=[("x-modal-auth-token", auth_token)],
242
- )
240
+ metadata = [("x-modal-auth-token", auth_token)]
241
+ if sandbox_token:
242
+ metadata.append(("x-modal-sandbox-token", sandbox_token))
243
+ return await server_client._stub.SandboxGetCommandRouterAccess(request, metadata=metadata)
243
244
 
244
245
 
245
246
  def _finalize_channel(loop, channel):
@@ -267,6 +268,7 @@ class TaskCommandRouterClient:
267
268
  jwt: str,
268
269
  *,
269
270
  sandbox_id: str | None = None,
271
+ sandbox_token: str | None = None,
270
272
  ) -> "TaskCommandRouterClient":
271
273
  """Build a connected client from a jwt and url."""
272
274
  o = urllib.parse.urlparse(url)
@@ -315,7 +317,17 @@ class TaskCommandRouterClient:
315
317
  loop = asyncio.get_running_loop()
316
318
  jwt_refresh_lock = asyncio.Lock()
317
319
 
318
- client = cls(server_client, task_id, url, jwt, channel, loop, jwt_refresh_lock, sandbox_id=sandbox_id)
320
+ client = cls(
321
+ server_client,
322
+ task_id,
323
+ url,
324
+ jwt,
325
+ channel,
326
+ loop,
327
+ jwt_refresh_lock,
328
+ sandbox_id=sandbox_id,
329
+ sandbox_token=sandbox_token,
330
+ )
319
331
  # An unused client releases its connection too.
320
332
  client._arm_idle_release()
321
333
  return client
@@ -337,6 +349,8 @@ class TaskCommandRouterClient:
337
349
  sandbox_id: str,
338
350
  task_id: str,
339
351
  access: api_pb2.CommandRouterAccess | None = None,
352
+ *,
353
+ sandbox_token: str | None = None,
340
354
  ) -> "TaskCommandRouterClient":
341
355
  """Initialize a TaskCommandRouterClient for a V2 sandbox.
342
356
 
@@ -348,10 +362,12 @@ class TaskCommandRouterClient:
348
362
  if access is not None:
349
363
  url, jwt = access.url, access.jwt
350
364
  else:
351
- resp = await fetch_command_router_access_v2(server_client, sandbox_id=sandbox_id)
365
+ resp = await fetch_command_router_access_v2(
366
+ server_client, sandbox_id=sandbox_id, sandbox_token=sandbox_token
367
+ )
352
368
  url, jwt = resp.url, resp.jwt
353
369
  logger.debug(f"Using command router access for sandbox {sandbox_id}")
354
- return await cls._connect(server_client, task_id, url, jwt, sandbox_id=sandbox_id)
370
+ return await cls._connect(server_client, task_id, url, jwt, sandbox_id=sandbox_id, sandbox_token=sandbox_token)
355
371
 
356
372
  @classmethod
357
373
  async def init_v2_by_task_id(
@@ -375,6 +391,7 @@ class TaskCommandRouterClient:
375
391
  jwt_refresh_lock: asyncio.Lock,
376
392
  *,
377
393
  sandbox_id: str | None = None,
394
+ sandbox_token: str | None = None,
378
395
  stream_stdio_retry_delay_secs: float = 0.01,
379
396
  stream_stdio_retry_delay_factor: float = 2,
380
397
  stream_stdio_max_retries: int = 10,
@@ -388,6 +405,7 @@ class TaskCommandRouterClient:
388
405
  self._server_client = server_client
389
406
  self._task_id = task_id
390
407
  self._sandbox_id = sandbox_id
408
+ self._sandbox_token = sandbox_token
391
409
  self._server_url = server_url
392
410
  self._jwt = jwt
393
411
  self._channel = channel
@@ -902,7 +920,10 @@ class TaskCommandRouterClient:
902
920
  if self._is_v2_sandbox:
903
921
  logger.debug(f"Refreshing JWT for V2 exec with task ID {self._task_id}")
904
922
  v2_resp = await fetch_command_router_access_v2(
905
- self._server_client, sandbox_id=self._sandbox_id, task_id=self._task_id
923
+ self._server_client,
924
+ sandbox_id=self._sandbox_id,
925
+ task_id=self._task_id,
926
+ sandbox_token=self._sandbox_token,
906
927
  )
907
928
  logger.debug(f"Finished refreshing JWT for V2 exec with task ID {self._task_id}")
908
929
  jwt, url = v2_resp.jwt, v2_resp.url
@@ -80,7 +80,7 @@ class _Client:
80
80
  server_url: str,
81
81
  client_type: int,
82
82
  credentials: typing.Optional[tuple[str, str]],
83
- version: str = "1.6.1.dev3",
83
+ version: str = "1.6.2.dev1",
84
84
  *,
85
85
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
86
86
  ):
@@ -290,7 +290,7 @@ class Client:
290
290
  server_url: str,
291
291
  client_type: int,
292
292
  credentials: typing.Optional[tuple[str, str]],
293
- version: str = "1.6.1.dev3",
293
+ version: str = "1.6.2.dev1",
294
294
  *,
295
295
  oauth_credentials: typing.Optional[_OAuthCredentials] = None,
296
296
  ):
@@ -1180,6 +1180,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1180
1180
  self._hydrate(sandbox_id, load_context.client, create_resp.metadata)
1181
1181
  self._is_v2 = True
1182
1182
  self._task_id = create_resp.task_id
1183
+ self._sandbox_token = create_resp.sandbox_token or None
1183
1184
  # An unset proto message reads as an empty one rather than None, so the
1184
1185
  # presence check is what distinguishes "no access" from "empty access".
1185
1186
  if create_resp.HasField("command_router_access"):
@@ -1208,6 +1209,15 @@ class _Sandbox(_Object, type_prefix="sb"):
1208
1209
  await resolver.load(obj, load_context)
1209
1210
  return obj
1210
1211
 
1212
+ async def _v2_metadata(self, client: _Client | None = None) -> list[tuple[str, str]]:
1213
+ client = client if client is not None else self._client
1214
+ assert client._auth_token_manager
1215
+ auth_token = await client._auth_token_manager.get_token()
1216
+ metadata = [("x-modal-auth-token", auth_token)]
1217
+ if self._sandbox_token:
1218
+ metadata.append(("x-modal-sandbox-token", self._sandbox_token))
1219
+ return metadata
1220
+
1211
1221
  def _get_metadata(self) -> api_pb2.SandboxHandleMetadata:
1212
1222
  metadata = api_pb2.SandboxHandleMetadata(app_id=self._app_id or "")
1213
1223
  if hasattr(self, "_result") and self._result is not None:
@@ -1242,6 +1252,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1242
1252
  )
1243
1253
  self._stdin = StreamWriter(_StreamWriterThroughServerParams(object_id=self.object_id, client=self._client))
1244
1254
  self._task_id = None
1255
+ self._sandbox_token = None
1245
1256
  self._tunnels = None
1246
1257
  self._enable_snapshot = False
1247
1258
  self._command_router_client = None
@@ -1463,9 +1474,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1463
1474
  req = api_pb2.SandboxTagsGetRequest(sandbox_id=self.object_id)
1464
1475
  stub = self._client._stub
1465
1476
  if self._is_v2:
1466
- assert self._client._auth_token_manager
1467
- auth_token = await self._client._auth_token_manager.get_token()
1468
- resp = await stub.SandboxTagsGetV2(req, metadata=[("x-modal-auth-token", auth_token)])
1477
+ resp = await stub.SandboxTagsGetV2(req, metadata=await self._v2_metadata())
1469
1478
  else:
1470
1479
  resp = await stub.SandboxTagsGet(req)
1471
1480
 
@@ -1491,10 +1500,8 @@ class _Sandbox(_Object, type_prefix="sb"):
1491
1500
  tags_list = [api_pb2.SandboxTag(tag_name=name, tag_value=value) for name, value in tags.items()]
1492
1501
  stub = self._client._stub
1493
1502
  if self._is_v2:
1494
- assert self._client._auth_token_manager
1495
- auth_token = await self._client._auth_token_manager.get_token()
1496
1503
  req = api_pb2.SandboxTagsSetRequest(sandbox_id=self.object_id, tags=tags_list)
1497
- await stub.SandboxTagsSetV2(req, metadata=[("x-modal-auth-token", auth_token)])
1504
+ await stub.SandboxTagsSetV2(req, metadata=await self._v2_metadata())
1498
1505
  else:
1499
1506
  req = api_pb2.SandboxTagsSetRequest(
1500
1507
  environment_name=_get_environment_name(),
@@ -1526,9 +1533,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1526
1533
  check_object_name(name, "Sandbox")
1527
1534
 
1528
1535
  req = api_pb2.SandboxSetNameRequest(sandbox_id=self.object_id, name=name)
1529
- assert self._client._auth_token_manager
1530
- auth_token = await self._client._auth_token_manager.get_token()
1531
- await self._client._stub.SandboxSetName(req, metadata=[("x-modal-auth-token", auth_token)])
1536
+ await self._client._stub.SandboxSetName(req, metadata=await self._v2_metadata())
1532
1537
 
1533
1538
  async def _experimental_set_outbound_network_policy(
1534
1539
  self,
@@ -1643,13 +1648,10 @@ class _Sandbox(_Object, type_prefix="sb"):
1643
1648
  total_timeout=remaining,
1644
1649
  )
1645
1650
  resp: api_pb2.SandboxGetExitSnapshotResponse
1646
- if self._is_v2:
1647
- assert client._auth_token_manager
1648
- auth_token = await client._auth_token_manager.get_token()
1649
1651
  try:
1650
1652
  if self._is_v2:
1651
1653
  resp = await client._stub.SandboxGetExitSnapshotV2(
1652
- req, retry=poll_retry, metadata=[("x-modal-auth-token", auth_token)]
1654
+ req, retry=poll_retry, metadata=await self._v2_metadata(client)
1653
1655
  )
1654
1656
  else:
1655
1657
  resp = await client._stub.SandboxGetExitSnapshot(req, retry=poll_retry)
@@ -1876,9 +1878,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1876
1878
  # Use the private __client to allow `wait` to work with a detached sandbox
1877
1879
  stub = self.__client._stub
1878
1880
  if self._is_v2:
1879
- assert self.__client._auth_token_manager
1880
- auth_token = await self.__client._auth_token_manager.get_token()
1881
- resp = await stub.SandboxWaitV2(req, metadata=[("x-modal-auth-token", auth_token)])
1881
+ resp = await stub.SandboxWaitV2(req, metadata=await self._v2_metadata(self.__client))
1882
1882
  else:
1883
1883
  resp = await stub.SandboxWait(req)
1884
1884
  if resp.result.status:
@@ -1947,9 +1947,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1947
1947
  req = api_pb2.SandboxGetTunnelsRequest(sandbox_id=self.object_id, timeout=timeout)
1948
1948
  stub = self._client._stub
1949
1949
  if self._is_v2:
1950
- assert self._client._auth_token_manager
1951
- auth_token = await self._client._auth_token_manager.get_token()
1952
- resp = await stub.SandboxGetTunnelsV2(req, metadata=[("x-modal-auth-token", auth_token)])
1950
+ resp = await stub.SandboxGetTunnelsV2(req, metadata=await self._v2_metadata())
1953
1951
  else:
1954
1952
  resp = await stub.SandboxGetTunnels(req)
1955
1953
 
@@ -1993,11 +1991,7 @@ class _Sandbox(_Object, type_prefix="sb"):
1993
1991
  sandbox_id=self.object_id, user_metadata=user_metadata, port=port
1994
1992
  )
1995
1993
  if self._is_v2:
1996
- assert self._client._auth_token_manager
1997
- auth_token = await self._client._auth_token_manager.get_token()
1998
- resp = await self._client._stub.SandboxCreateConnectTokenV2(
1999
- req, metadata=[("x-modal-auth-token", auth_token)]
2000
- )
1994
+ resp = await self._client._stub.SandboxCreateConnectTokenV2(req, metadata=await self._v2_metadata())
2001
1995
  else:
2002
1996
  resp = await self._client._stub.SandboxCreateConnectToken(req)
2003
1997
  return SandboxConnectCredentials(resp.url, resp.token)
@@ -2055,9 +2049,7 @@ class _Sandbox(_Object, type_prefix="sb"):
2055
2049
  req = api_pb2.SandboxTerminateRequest(sandbox_id=self.object_id)
2056
2050
  stub = self._client._stub
2057
2051
  if self._is_v2:
2058
- assert self._client._auth_token_manager
2059
- auth_token = await self._client._auth_token_manager.get_token()
2060
- await stub.SandboxTerminateV2(req, metadata=[("x-modal-auth-token", auth_token)])
2052
+ await stub.SandboxTerminateV2(req, metadata=await self._v2_metadata())
2061
2053
  else:
2062
2054
  await stub.SandboxTerminate(req)
2063
2055
  if wait:
@@ -2074,9 +2066,7 @@ class _Sandbox(_Object, type_prefix="sb"):
2074
2066
  req = api_pb2.SandboxWaitRequest(sandbox_id=self.object_id, timeout=0)
2075
2067
  stub = self._client._stub
2076
2068
  if self._is_v2:
2077
- assert self._client._auth_token_manager
2078
- auth_token = await self._client._auth_token_manager.get_token()
2079
- resp = await stub.SandboxWaitV2(req, metadata=[("x-modal-auth-token", auth_token)])
2069
+ resp = await stub.SandboxWaitV2(req, metadata=await self._v2_metadata())
2080
2070
  else:
2081
2071
  resp = await stub.SandboxWait(req)
2082
2072
 
@@ -2094,9 +2084,7 @@ class _Sandbox(_Object, type_prefix="sb"):
2094
2084
  stub = self._client._stub
2095
2085
  try:
2096
2086
  if self._is_v2:
2097
- assert self._client._auth_token_manager
2098
- auth_token = await self._client._auth_token_manager.get_token()
2099
- resp = await stub.SandboxGetTaskIdV2(req, metadata=[("x-modal-auth-token", auth_token)])
2087
+ resp = await stub.SandboxGetTaskIdV2(req, metadata=await self._v2_metadata())
2100
2088
  else:
2101
2089
  resp = await stub.SandboxGetTaskId(req)
2102
2090
  except (ServiceError, InternalError, ConnectionError) as exc:
@@ -2136,9 +2124,7 @@ class _Sandbox(_Object, type_prefix="sb"):
2136
2124
  req = api_pb2.SandboxGetTaskIdRequest(sandbox_id=self.object_id)
2137
2125
  stub = self.__client._stub
2138
2126
  if self._is_v2:
2139
- assert self.__client._auth_token_manager
2140
- auth_token = await self.__client._auth_token_manager.get_token()
2141
- resp = await stub.SandboxGetTaskIdV2(req, metadata=[("x-modal-auth-token", auth_token)])
2127
+ resp = await stub.SandboxGetTaskIdV2(req, metadata=await self._v2_metadata(self.__client))
2142
2128
  else:
2143
2129
  resp = await stub.SandboxGetTaskId(req)
2144
2130
  if not resp.task_id:
@@ -2165,7 +2151,7 @@ class _Sandbox(_Object, type_prefix="sb"):
2165
2151
  # re-trying the same credentials forever.
2166
2152
  access, self._init_command_router_access = self._init_command_router_access, None
2167
2153
  command_router_client = await TaskCommandRouterClient.init_v2_by_sandbox_id(
2168
- self._client, self.object_id, task_id, access
2154
+ self._client, self.object_id, task_id, access, sandbox_token=self._sandbox_token
2169
2155
  )
2170
2156
  else:
2171
2157
  command_router_client = await TaskCommandRouterClient.init(self._client, task_id)
@@ -3289,10 +3275,8 @@ class _SidecarManager:
3289
3275
  cloud_bucket_mount_credentials=cloud_bucket_credentials,
3290
3276
  )
3291
3277
  client = self._sandbox._client
3292
- assert client._auth_token_manager
3293
- auth_token = await client._auth_token_manager.get_token()
3294
3278
  create_resp = await client._stub.SandboxContainerCreateV2(
3295
- create_req, metadata=[("x-modal-auth-token", auth_token)]
3279
+ create_req, metadata=await self._sandbox._v2_metadata(client)
3296
3280
  )
3297
3281
  else:
3298
3282
  task_id, command_router_client = await self._get_command_router()
@@ -466,6 +466,7 @@ class _Sandbox(modal._object._Object):
466
466
  """
467
467
  ...
468
468
 
469
+ async def _v2_metadata(self, client: typing.Optional[modal.client._Client] = None) -> list[tuple[str, str]]: ...
469
470
  def _get_metadata(self) -> modal_proto.api_pb2.SandboxHandleMetadata: ...
470
471
  def _hydrate_metadata(self, handle_metadata: typing.Optional[google.protobuf.message.Message]) -> None: ...
471
472
  def _hydrate_metadata_v2(self) -> None:
@@ -2492,6 +2493,12 @@ class Sandbox(modal.object.Object):
2492
2493
 
2493
2494
  _experimental_create: typing.ClassVar[___experimental_create_spec]
2494
2495
 
2496
+ class ___v2_metadata_spec(typing_extensions.Protocol):
2497
+ def __call__(self, /, client: typing.Optional[modal.client.Client] = None) -> list[tuple[str, str]]: ...
2498
+ async def aio(self, /, client: typing.Optional[modal.client.Client] = None) -> list[tuple[str, str]]: ...
2499
+
2500
+ _v2_metadata: ___v2_metadata_spec
2501
+
2495
2502
  def _get_metadata(self) -> modal_proto.api_pb2.SandboxHandleMetadata: ...
2496
2503
  def _hydrate_metadata(self, handle_metadata: typing.Optional[google.protobuf.message.Message]) -> None: ...
2497
2504
  def _hydrate_metadata_v2(self) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.6.1.dev3
3
+ Version: 1.6.2.dev1
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2026
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.6.1.dev3"
4
+ __version__ = "1.6.2.dev1"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes