modal 1.5.1.dev0__tar.gz → 1.5.1.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 (224) hide show
  1. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/PKG-INFO +1 -1
  2. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_server.py +10 -8
  3. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/shell.py +5 -12
  4. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/client.pyi +2 -2
  5. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/functions.pyi +6 -6
  6. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/sandbox.py +16 -7
  7. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/sandbox.pyi +20 -14
  8. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/server.pyi +6 -4
  9. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal.egg-info/PKG-INFO +1 -1
  10. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/api_pb2.py +1034 -1034
  11. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/api_pb2.pyi +7 -7
  12. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/task_command_router_grpc.py +16 -0
  13. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/task_command_router_pb2.py +99 -79
  14. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/task_command_router_pb2.pyi +31 -0
  15. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/task_command_router_pb2_grpc.py +33 -0
  16. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/task_command_router_pb2_grpc.pyi +10 -0
  17. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_version/__init__.py +1 -1
  18. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/pyproject.toml +1 -5
  19. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/LICENSE +0 -0
  20. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/README.md +0 -0
  21. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/__init__.py +0 -0
  22. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/__main__.py +0 -0
  23. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_billing.py +0 -0
  24. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_clustered_functions.py +0 -0
  25. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_clustered_functions.pyi +0 -0
  26. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_container_entrypoint.py +0 -0
  27. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_environments.py +0 -0
  28. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_function_variants.py +0 -0
  29. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_functions.py +0 -0
  30. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_grpc_client.py +0 -0
  31. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_image.py +0 -0
  32. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_ipython.py +0 -0
  33. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_load_context.py +0 -0
  34. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_location.py +0 -0
  35. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_logs.py +0 -0
  36. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_object.py +0 -0
  37. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_output/__init__.py +0 -0
  38. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_output/manager.py +0 -0
  39. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_output/pty.py +0 -0
  40. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_output/rich.py +0 -0
  41. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_output/status.py +0 -0
  42. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_partial_function.py +0 -0
  43. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_resolver.py +0 -0
  44. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_resources.py +0 -0
  45. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/__init__.py +0 -0
  46. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/asgi.py +0 -0
  47. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/container_io_manager.py +0 -0
  48. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/container_io_manager.pyi +0 -0
  49. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/execution_context.py +0 -0
  50. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/execution_context.pyi +0 -0
  51. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  52. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/task_lifecycle_manager.py +0 -0
  53. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  54. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/telemetry.py +0 -0
  55. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/user_code_event_loop.py +0 -0
  56. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_runtime/user_code_imports.py +0 -0
  57. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_serialization.py +0 -0
  58. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_traceback.py +0 -0
  59. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_tunnel.py +0 -0
  60. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_tunnel.pyi +0 -0
  61. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_type_manager.py +0 -0
  62. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/__init__.py +0 -0
  63. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/app_utils.py +0 -0
  64. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/async_utils.py +0 -0
  65. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/auth_token_manager.py +0 -0
  66. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/blob_utils.py +0 -0
  67. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/browser_utils.py +0 -0
  68. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/bytes_io_segment_payload.py +0 -0
  69. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/deprecation.py +0 -0
  70. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/docker_utils.py +0 -0
  71. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/function_utils.py +0 -0
  72. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/git_utils.py +0 -0
  73. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/grpc_testing.py +0 -0
  74. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/grpc_utils.py +0 -0
  75. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/hash_utils.py +0 -0
  76. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/http_utils.py +0 -0
  77. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/jwt_utils.py +0 -0
  78. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/logger.py +0 -0
  79. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/mount_utils.py +0 -0
  80. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/name_utils.py +0 -0
  81. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/package_utils.py +0 -0
  82. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/pattern_utils.py +0 -0
  83. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/rand_pb_testing.py +0 -0
  84. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/sandbox_fs_utils.py +0 -0
  85. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/shell_utils.py +0 -0
  86. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/task_command_router_client.py +0 -0
  87. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_utils/time_utils.py +0 -0
  88. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_vendor/__init__.py +0 -0
  89. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  90. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_vendor/cloudpickle.py +0 -0
  91. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_vendor/tblib.py +0 -0
  92. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_vendor/version.py +0 -0
  93. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_watcher.py +0 -0
  94. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/_workspace.py +0 -0
  95. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/app.py +0 -0
  96. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/app.pyi +0 -0
  97. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/billing.py +0 -0
  98. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/builder/2023.12.312.txt +0 -0
  99. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/builder/2023.12.txt +0 -0
  100. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/builder/2024.04.txt +0 -0
  101. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/builder/2024.10.txt +0 -0
  102. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/builder/2025.06.txt +0 -0
  103. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/builder/PREVIEW.txt +0 -0
  104. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/builder/README.md +0 -0
  105. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/builder/base-images.json +0 -0
  106. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/call_graph.py +0 -0
  107. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/__init__.py +0 -0
  108. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/_download.py +0 -0
  109. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/_help.py +0 -0
  110. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/_traceback.py +0 -0
  111. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/app.py +0 -0
  112. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/billing.py +0 -0
  113. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/bootstrap.py +0 -0
  114. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/changelog.py +0 -0
  115. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/cluster.py +0 -0
  116. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/config.py +0 -0
  117. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/container.py +0 -0
  118. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/dashboard.py +0 -0
  119. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/dict.py +0 -0
  120. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/entry_point.py +0 -0
  121. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/environment.py +0 -0
  122. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/image.py +0 -0
  123. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/import_refs.py +0 -0
  124. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/launch.py +0 -0
  125. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/logo.py +0 -0
  126. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/network_file_system.py +0 -0
  127. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/profile.py +0 -0
  128. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/programs/__init__.py +0 -0
  129. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/programs/run_jupyter.py +0 -0
  130. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/programs/vscode.py +0 -0
  131. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/queues.py +0 -0
  132. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/run.py +0 -0
  133. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/secret.py +0 -0
  134. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/selector.py +0 -0
  135. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/skills.py +0 -0
  136. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/token.py +0 -0
  137. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/utils.py +0 -0
  138. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cli/volume.py +0 -0
  139. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/client.py +0 -0
  140. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cloud_bucket_mount.py +0 -0
  141. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cloud_bucket_mount.pyi +0 -0
  142. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cls.py +0 -0
  143. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/cls.pyi +0 -0
  144. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/config.py +0 -0
  145. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/container_process.py +0 -0
  146. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/container_process.pyi +0 -0
  147. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/dict.py +0 -0
  148. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/dict.pyi +0 -0
  149. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/environments.py +0 -0
  150. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/environments.pyi +0 -0
  151. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/exception.py +0 -0
  152. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/experimental/__init__.py +0 -0
  153. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/experimental/flash.py +0 -0
  154. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/experimental/flash.pyi +0 -0
  155. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/experimental/ipython.py +0 -0
  156. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/file_io.py +0 -0
  157. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/file_io.pyi +0 -0
  158. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/file_pattern_matcher.py +0 -0
  159. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/functions.py +0 -0
  160. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/image.py +0 -0
  161. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/image.pyi +0 -0
  162. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/io_streams.py +0 -0
  163. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/io_streams.pyi +0 -0
  164. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/mount.py +0 -0
  165. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/mount.pyi +0 -0
  166. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/network_file_system.py +0 -0
  167. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/network_file_system.pyi +0 -0
  168. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/object.py +0 -0
  169. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/object.pyi +0 -0
  170. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/output.py +0 -0
  171. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/parallel_map.py +0 -0
  172. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/parallel_map.pyi +0 -0
  173. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/partial_function.py +0 -0
  174. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/partial_function.pyi +0 -0
  175. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/proxy.py +0 -0
  176. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/proxy.pyi +0 -0
  177. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/py.typed +0 -0
  178. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/queue.py +0 -0
  179. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/queue.pyi +0 -0
  180. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/retries.py +0 -0
  181. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/runner.py +0 -0
  182. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/runner.pyi +0 -0
  183. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/running_app.py +0 -0
  184. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/sandbox_fs.py +0 -0
  185. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/sandbox_fs.pyi +0 -0
  186. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/schedule.py +0 -0
  187. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/scheduler_placement.py +0 -0
  188. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/secret.py +0 -0
  189. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/secret.pyi +0 -0
  190. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/server.py +0 -0
  191. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/serving.py +0 -0
  192. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/serving.pyi +0 -0
  193. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/skills/modal/SKILL.md +0 -0
  194. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/snapshot.py +0 -0
  195. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/snapshot.pyi +0 -0
  196. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/stream_type.py +0 -0
  197. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/token_flow.py +0 -0
  198. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/token_flow.pyi +0 -0
  199. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/volume.py +0 -0
  200. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/volume.pyi +0 -0
  201. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/workspace.py +0 -0
  202. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal/workspace.pyi +0 -0
  203. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal.egg-info/SOURCES.txt +0 -0
  204. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal.egg-info/dependency_links.txt +0 -0
  205. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal.egg-info/entry_points.txt +0 -0
  206. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal.egg-info/requires.txt +0 -0
  207. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal.egg-info/top_level.txt +0 -0
  208. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_docs/__init__.py +0 -0
  209. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_docs/gen_cli_docs.py +0 -0
  210. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_docs/gen_cli_docs_main.py +0 -0
  211. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_docs/gen_reference_docs.py +0 -0
  212. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_docs/gen_reference_docs_main.py +0 -0
  213. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_docs/mdmd/__init__.py +0 -0
  214. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_docs/mdmd/mdmd.py +0 -0
  215. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_docs/mdmd/signatures.py +0 -0
  216. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_docs/mdmd/types.py +0 -0
  217. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/__init__.py +0 -0
  218. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/api_grpc.py +0 -0
  219. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/api_pb2_grpc.py +0 -0
  220. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/api_pb2_grpc.pyi +0 -0
  221. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/modal_api_grpc.py +0 -0
  222. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_proto/py.typed +0 -0
  223. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/modal_version/__main__.py +0 -0
  224. {modal-1.5.1.dev0 → modal-1.5.1.dev1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.1.dev0
3
+ Version: 1.5.1.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
@@ -72,6 +72,10 @@ class _Server:
72
72
  def _get_service_function(self) -> _Function:
73
73
  return self._service_function
74
74
 
75
+ @property
76
+ def object_id(self) -> str:
77
+ return self._service_function.object_id
78
+
75
79
  @staticmethod
76
80
  def _extract_user_cls(wrapped_user_cls: "type | _PartialFunction") -> type:
77
81
  if isinstance(wrapped_user_cls, _PartialFunction):
@@ -83,14 +87,12 @@ class _Server:
83
87
  # ============ Live Methods ============
84
88
 
85
89
  @live_method
86
- async def get_urls(self) -> dict[str, str] | None:
87
- def _extract_region_from_url(url: str) -> str:
88
- return url.split(".")[-3].removeprefix("modal-")
89
-
90
- return {
91
- _extract_region_from_url(url): url
92
- for url in await self._get_service_function()._experimental_get_flash_urls() or []
93
- }
90
+ async def get_url(self) -> str | None:
91
+ urls = await self._get_service_function()._experimental_get_flash_urls()
92
+ # Return the first URL if it exists. Servers should only have one URL
93
+ # since they only have one region.
94
+ url = urls[0] if urls else None
95
+ return url
94
96
 
95
97
  @live_method
96
98
  async def update_autoscaler(
@@ -60,20 +60,13 @@ def _passed_forbidden_args(
60
60
  return passed_forbidden
61
61
 
62
62
 
63
- def _parse_experimental_options(options: Iterable[str]) -> dict[str, bool]:
64
- parsed: dict[str, bool] = {}
63
+ def _parse_experimental_options(options: Iterable[str]) -> dict[str, str]:
64
+ parsed: dict[str, str] = {}
65
65
  for option in options:
66
66
  key, sep, raw_value = option.partition("=")
67
67
  if not key or not sep:
68
68
  raise click.BadParameter("must use KEY=VALUE")
69
-
70
- value = raw_value.lower()
71
- if value in {"1", "true"}:
72
- parsed[key] = True
73
- elif value in {"0", "false"}:
74
- parsed[key] = False
75
- else:
76
- raise click.BadParameter("BOOL must be one of true, false, 1, or 0")
69
+ parsed[key] = raw_value
77
70
  return parsed
78
71
 
79
72
 
@@ -200,7 +193,7 @@ def _start_shell_from_function_spec(
200
193
  timeout: int,
201
194
  function_spec: _FunctionSpec,
202
195
  pty: bool,
203
- experimental_options: dict[str, bool],
196
+ experimental_options: dict[str, str],
204
197
  ) -> None:
205
198
  interactive_shell(
206
199
  app,
@@ -238,7 +231,7 @@ def _start_shell_from_image(
238
231
  cloud: str | None,
239
232
  region: str | None,
240
233
  pty: bool,
241
- experimental_options: dict[str, bool],
234
+ experimental_options: dict[str, str],
242
235
  ) -> None:
243
236
  volumes = {f"/mnt/{vol}": Volume.from_name(vol) for vol in volume}
244
237
  secrets = [Secret.from_name(s) for s in secret]
@@ -35,7 +35,7 @@ class _Client:
35
35
  server_url: str,
36
36
  client_type: int,
37
37
  credentials: typing.Optional[tuple[str, str]],
38
- version: str = "1.5.1.dev0",
38
+ version: str = "1.5.1.dev1",
39
39
  ):
40
40
  """mdmd:hidden
41
41
  The Modal client object is not intended to be instantiated directly by users.
@@ -205,7 +205,7 @@ class Client:
205
205
  server_url: str,
206
206
  client_type: int,
207
207
  credentials: typing.Optional[tuple[str, str]],
208
- version: str = "1.5.1.dev0",
208
+ version: str = "1.5.1.dev1",
209
209
  ):
210
210
  """mdmd:hidden
211
211
  The Modal client object is not intended to be instantiated directly by users.
@@ -487,7 +487,7 @@ class Function(
487
487
 
488
488
  _call_generator: ___call_generator_spec
489
489
 
490
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
490
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
491
491
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
492
492
  """Calls the function remotely, executing it with the given arguments and returning the execution's result.
493
493
 
@@ -512,7 +512,7 @@ class Function(
512
512
  """
513
513
  ...
514
514
 
515
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
515
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
516
516
 
517
517
  class __remote_gen_spec(typing_extensions.Protocol):
518
518
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -562,7 +562,7 @@ class Function(
562
562
  """
563
563
  ...
564
564
 
565
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
565
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
566
566
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
567
567
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
568
568
 
@@ -595,7 +595,7 @@ class Function(
595
595
  """
596
596
  ...
597
597
 
598
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
598
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
599
599
 
600
600
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
601
601
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -603,7 +603,7 @@ class Function(
603
603
 
604
604
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
605
605
 
606
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
606
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
607
607
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
608
608
  """Calls the function with the given arguments, without waiting for the results.
609
609
 
@@ -636,7 +636,7 @@ class Function(
636
636
  """
637
637
  ...
638
638
 
639
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
639
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
640
640
 
641
641
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
642
642
  """Return the inner Python object wrapped by this Modal Function.
@@ -352,7 +352,7 @@ class _Sandbox(_Object, type_prefix="sb"):
352
352
  unencrypted_ports: Sequence[int] = [],
353
353
  proxy: _Proxy | None = None,
354
354
  readiness_probe: Probe | None = None,
355
- experimental_options: dict[str, bool] | None = None,
355
+ experimental_options: dict[str, Any] | None = None,
356
356
  tags: dict[str, str] | None = None,
357
357
  enable_snapshot: bool = False,
358
358
  verbose: bool = False,
@@ -470,7 +470,9 @@ class _Sandbox(_Object, type_prefix="sb"):
470
470
  enable_snapshot=enable_snapshot,
471
471
  verbose=verbose,
472
472
  name=name,
473
- experimental_options=experimental_options,
473
+ experimental_options_v2=(
474
+ {k: str(v) for k, v in experimental_options.items()} if experimental_options else None
475
+ ),
474
476
  custom_domain=custom_domain,
475
477
  include_oidc_identity_token=include_oidc_identity_token,
476
478
  inbound_cidr_allowlist=list(inbound_cidr_allowlist) if inbound_cidr_allowlist is not None else [],
@@ -525,7 +527,7 @@ class _Sandbox(_Object, type_prefix="sb"):
525
527
  include_oidc_identity_token: bool = False,
526
528
  readiness_probe: Probe | None = None,
527
529
  verbose: bool = False,
528
- experimental_options: dict[str, bool] | None = None,
530
+ experimental_options: dict[str, Any] | None = None,
529
531
  _experimental_enable_snapshot: bool = False,
530
532
  client: _Client | None = None,
531
533
  environment_name: str | None = None, # *DEPRECATED*
@@ -696,7 +698,7 @@ class _Sandbox(_Object, type_prefix="sb"):
696
698
  proxy: _Proxy | None = None,
697
699
  include_oidc_identity_token: bool = False,
698
700
  readiness_probe: Probe | None = None,
699
- experimental_options: dict[str, bool] | None = None,
701
+ experimental_options: dict[str, Any] | None = None,
700
702
  _experimental_enable_snapshot: bool = False,
701
703
  client: _Client | None = None,
702
704
  verbose: bool = False,
@@ -1517,15 +1519,17 @@ class _Sandbox(_Object, type_prefix="sb"):
1517
1519
  return self._tunnels
1518
1520
 
1519
1521
  async def create_connect_token(
1520
- self, user_metadata: str | dict[str, Any] | None = None
1522
+ self, user_metadata: str | dict[str, Any] | None = None, port: int = 8080
1521
1523
  ) -> SandboxConnectCredentials:
1522
1524
  """Create a token for making HTTP connections to the Sandbox.
1523
1525
 
1524
- Also accepts an optional user_metadata string or dict to associate with the token. This metadata
1526
+ Accepts an optional user_metadata string or dict to associate with the token. This metadata
1525
1527
  will be added to the headers by the proxy when forwarding requests to the Sandbox.
1528
+ Also accepts a port that requests will be routed to.
1526
1529
 
1527
1530
  Args:
1528
1531
  user_metadata: Optional JSON-serializable metadata or string stored with the connect token.
1532
+ port: Optional container port that requests are routed to when using this token.
1529
1533
 
1530
1534
  Returns:
1531
1535
  URL and token credentials for connecting to the sandbox over HTTP.
@@ -1537,7 +1541,12 @@ class _Sandbox(_Object, type_prefix="sb"):
1537
1541
  except Exception as e:
1538
1542
  raise InvalidError(f"Failed to serialize user_metadata: {e}")
1539
1543
 
1540
- req = api_pb2.SandboxCreateConnectTokenRequest(sandbox_id=self.object_id, user_metadata=user_metadata)
1544
+ if not isinstance(port, int) or not (1 <= port <= 65535):
1545
+ raise InvalidError("port must be between 1 and 65535")
1546
+
1547
+ req = api_pb2.SandboxCreateConnectTokenRequest(
1548
+ sandbox_id=self.object_id, user_metadata=user_metadata, port=port
1549
+ )
1541
1550
  resp = await self._client.stub.SandboxCreateConnectToken(req)
1542
1551
  return SandboxConnectCredentials(resp.url, resp.token)
1543
1552
 
@@ -212,7 +212,7 @@ class _Sandbox(modal._object._Object):
212
212
  unencrypted_ports: collections.abc.Sequence[int] = [],
213
213
  proxy: typing.Optional[modal.proxy._Proxy] = None,
214
214
  readiness_probe: typing.Optional[Probe] = None,
215
- experimental_options: typing.Optional[dict[str, bool]] = None,
215
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
216
216
  tags: typing.Optional[dict[str, str]] = None,
217
217
  enable_snapshot: bool = False,
218
218
  verbose: bool = False,
@@ -257,7 +257,7 @@ class _Sandbox(modal._object._Object):
257
257
  include_oidc_identity_token: bool = False,
258
258
  readiness_probe: typing.Optional[Probe] = None,
259
259
  verbose: bool = False,
260
- experimental_options: typing.Optional[dict[str, bool]] = None,
260
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
261
261
  _experimental_enable_snapshot: bool = False,
262
262
  client: typing.Optional[modal.client._Client] = None,
263
263
  environment_name: typing.Optional[str] = None,
@@ -368,7 +368,7 @@ class _Sandbox(modal._object._Object):
368
368
  proxy: typing.Optional[modal.proxy._Proxy] = None,
369
369
  include_oidc_identity_token: bool = False,
370
370
  readiness_probe: typing.Optional[Probe] = None,
371
- experimental_options: typing.Optional[dict[str, bool]] = None,
371
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
372
372
  _experimental_enable_snapshot: bool = False,
373
373
  client: typing.Optional[modal.client._Client] = None,
374
374
  verbose: bool = False,
@@ -662,15 +662,17 @@ class _Sandbox(modal._object._Object):
662
662
  ...
663
663
 
664
664
  async def create_connect_token(
665
- self, user_metadata: typing.Union[str, dict[str, typing.Any], None] = None
665
+ self, user_metadata: typing.Union[str, dict[str, typing.Any], None] = None, port: int = 8080
666
666
  ) -> SandboxConnectCredentials:
667
667
  """Create a token for making HTTP connections to the Sandbox.
668
668
 
669
- Also accepts an optional user_metadata string or dict to associate with the token. This metadata
669
+ Accepts an optional user_metadata string or dict to associate with the token. This metadata
670
670
  will be added to the headers by the proxy when forwarding requests to the Sandbox.
671
+ Also accepts a port that requests will be routed to.
671
672
 
672
673
  Args:
673
674
  user_metadata: Optional JSON-serializable metadata or string stored with the connect token.
675
+ port: Optional container port that requests are routed to when using this token.
674
676
 
675
677
  Returns:
676
678
  URL and token credentials for connecting to the sandbox over HTTP.
@@ -1230,7 +1232,7 @@ class Sandbox(modal.object.Object):
1230
1232
  unencrypted_ports: collections.abc.Sequence[int] = [],
1231
1233
  proxy: typing.Optional[modal.proxy.Proxy] = None,
1232
1234
  readiness_probe: typing.Optional[Probe] = None,
1233
- experimental_options: typing.Optional[dict[str, bool]] = None,
1235
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
1234
1236
  tags: typing.Optional[dict[str, str]] = None,
1235
1237
  enable_snapshot: bool = False,
1236
1238
  verbose: bool = False,
@@ -1279,7 +1281,7 @@ class Sandbox(modal.object.Object):
1279
1281
  include_oidc_identity_token: bool = False,
1280
1282
  readiness_probe: typing.Optional[Probe] = None,
1281
1283
  verbose: bool = False,
1282
- experimental_options: typing.Optional[dict[str, bool]] = None,
1284
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
1283
1285
  _experimental_enable_snapshot: bool = False,
1284
1286
  client: typing.Optional[modal.client.Client] = None,
1285
1287
  environment_name: typing.Optional[str] = None,
@@ -1394,7 +1396,7 @@ class Sandbox(modal.object.Object):
1394
1396
  include_oidc_identity_token: bool = False,
1395
1397
  readiness_probe: typing.Optional[Probe] = None,
1396
1398
  verbose: bool = False,
1397
- experimental_options: typing.Optional[dict[str, bool]] = None,
1399
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
1398
1400
  _experimental_enable_snapshot: bool = False,
1399
1401
  client: typing.Optional[modal.client.Client] = None,
1400
1402
  environment_name: typing.Optional[str] = None,
@@ -1511,7 +1513,7 @@ class Sandbox(modal.object.Object):
1511
1513
  proxy: typing.Optional[modal.proxy.Proxy] = None,
1512
1514
  include_oidc_identity_token: bool = False,
1513
1515
  readiness_probe: typing.Optional[Probe] = None,
1514
- experimental_options: typing.Optional[dict[str, bool]] = None,
1516
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
1515
1517
  _experimental_enable_snapshot: bool = False,
1516
1518
  client: typing.Optional[modal.client.Client] = None,
1517
1519
  verbose: bool = False,
@@ -1563,7 +1565,7 @@ class Sandbox(modal.object.Object):
1563
1565
  proxy: typing.Optional[modal.proxy.Proxy] = None,
1564
1566
  include_oidc_identity_token: bool = False,
1565
1567
  readiness_probe: typing.Optional[Probe] = None,
1566
- experimental_options: typing.Optional[dict[str, bool]] = None,
1568
+ experimental_options: typing.Optional[dict[str, typing.Any]] = None,
1567
1569
  _experimental_enable_snapshot: bool = False,
1568
1570
  client: typing.Optional[modal.client.Client] = None,
1569
1571
  verbose: bool = False,
@@ -2170,15 +2172,17 @@ class Sandbox(modal.object.Object):
2170
2172
 
2171
2173
  class __create_connect_token_spec(typing_extensions.Protocol):
2172
2174
  def __call__(
2173
- self, /, user_metadata: typing.Union[str, dict[str, typing.Any], None] = None
2175
+ self, /, user_metadata: typing.Union[str, dict[str, typing.Any], None] = None, port: int = 8080
2174
2176
  ) -> SandboxConnectCredentials:
2175
2177
  """Create a token for making HTTP connections to the Sandbox.
2176
2178
 
2177
- Also accepts an optional user_metadata string or dict to associate with the token. This metadata
2179
+ Accepts an optional user_metadata string or dict to associate with the token. This metadata
2178
2180
  will be added to the headers by the proxy when forwarding requests to the Sandbox.
2181
+ Also accepts a port that requests will be routed to.
2179
2182
 
2180
2183
  Args:
2181
2184
  user_metadata: Optional JSON-serializable metadata or string stored with the connect token.
2185
+ port: Optional container port that requests are routed to when using this token.
2182
2186
 
2183
2187
  Returns:
2184
2188
  URL and token credentials for connecting to the sandbox over HTTP.
@@ -2186,15 +2190,17 @@ class Sandbox(modal.object.Object):
2186
2190
  ...
2187
2191
 
2188
2192
  async def aio(
2189
- self, /, user_metadata: typing.Union[str, dict[str, typing.Any], None] = None
2193
+ self, /, user_metadata: typing.Union[str, dict[str, typing.Any], None] = None, port: int = 8080
2190
2194
  ) -> SandboxConnectCredentials:
2191
2195
  """Create a token for making HTTP connections to the Sandbox.
2192
2196
 
2193
- Also accepts an optional user_metadata string or dict to associate with the token. This metadata
2197
+ Accepts an optional user_metadata string or dict to associate with the token. This metadata
2194
2198
  will be added to the headers by the proxy when forwarding requests to the Sandbox.
2199
+ Also accepts a port that requests will be routed to.
2195
2200
 
2196
2201
  Args:
2197
2202
  user_metadata: Optional JSON-serializable metadata or string stored with the connect token.
2203
+ port: Optional container port that requests are routed to when using this token.
2198
2204
 
2199
2205
  Returns:
2200
2206
  URL and token credentials for connecting to the sandbox over HTTP.
@@ -33,14 +33,16 @@ class Server:
33
33
  def _get_user_cls(self) -> type: ...
34
34
  def _get_app(self) -> modal.app.App: ...
35
35
  def _get_service_function(self) -> modal.functions.Function: ...
36
+ @property
37
+ def object_id(self) -> str: ...
36
38
  @staticmethod
37
39
  def _extract_user_cls(wrapped_user_cls: typing.Union[type, modal.partial_function.PartialFunction]) -> type: ...
38
40
 
39
- class __get_urls_spec(typing_extensions.Protocol):
40
- def __call__(self, /) -> typing.Optional[dict[str, str]]: ...
41
- async def aio(self, /) -> typing.Optional[dict[str, str]]: ...
41
+ class __get_url_spec(typing_extensions.Protocol):
42
+ def __call__(self, /) -> typing.Optional[str]: ...
43
+ async def aio(self, /) -> typing.Optional[str]: ...
42
44
 
43
- get_urls: __get_urls_spec
45
+ get_url: __get_url_spec
44
46
 
45
47
  class __update_autoscaler_spec(typing_extensions.Protocol):
46
48
  def __call__(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.1.dev0
3
+ Version: 1.5.1.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