modal 1.5.1.dev5__tar.gz → 1.5.1.dev7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/PKG-INFO +1 -1
  2. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/__init__.py +2 -0
  3. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_server.py +5 -5
  4. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/app.py +7 -4
  5. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/app.pyi +8 -6
  6. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/client.pyi +2 -2
  7. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/functions.pyi +6 -6
  8. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/sandbox_fs.py +39 -2
  9. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/server.pyi +2 -2
  10. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal.egg-info/PKG-INFO +1 -1
  11. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/api_grpc.py +32 -0
  12. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/api_pb2.py +841 -809
  13. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/api_pb2.pyi +98 -5
  14. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/api_pb2_grpc.py +66 -0
  15. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/api_pb2_grpc.pyi +20 -0
  16. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/modal_api_grpc.py +2 -0
  17. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/task_command_router_grpc.py +16 -0
  18. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/task_command_router_pb2.py +41 -21
  19. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/task_command_router_pb2.pyi +31 -0
  20. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/task_command_router_pb2_grpc.py +38 -2
  21. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/task_command_router_pb2_grpc.pyi +20 -4
  22. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_version/__init__.py +1 -1
  23. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/LICENSE +0 -0
  24. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/README.md +0 -0
  25. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/__main__.py +0 -0
  26. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_billing.py +0 -0
  27. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_clustered_functions.py +0 -0
  28. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_clustered_functions.pyi +0 -0
  29. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_container_entrypoint.py +0 -0
  30. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_environments.py +0 -0
  31. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_function_variants.py +0 -0
  32. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_functions.py +0 -0
  33. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_grpc_client.py +0 -0
  34. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_image.py +0 -0
  35. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_ipython.py +0 -0
  36. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_load_context.py +0 -0
  37. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_location.py +0 -0
  38. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_logs.py +0 -0
  39. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_object.py +0 -0
  40. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_output/__init__.py +0 -0
  41. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_output/manager.py +0 -0
  42. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_output/pty.py +0 -0
  43. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_output/rich.py +0 -0
  44. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_output/status.py +0 -0
  45. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_partial_function.py +0 -0
  46. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_resolver.py +0 -0
  47. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_resources.py +0 -0
  48. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/__init__.py +0 -0
  49. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/asgi.py +0 -0
  50. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/container_io_manager.py +0 -0
  51. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/container_io_manager.pyi +0 -0
  52. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/execution_context.py +0 -0
  53. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/execution_context.pyi +0 -0
  54. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  55. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/task_lifecycle_manager.py +0 -0
  56. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  57. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/telemetry.py +0 -0
  58. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/user_code_event_loop.py +0 -0
  59. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_runtime/user_code_imports.py +0 -0
  60. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_serialization.py +0 -0
  61. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_traceback.py +0 -0
  62. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_tunnel.py +0 -0
  63. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_tunnel.pyi +0 -0
  64. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_type_manager.py +0 -0
  65. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/__init__.py +0 -0
  66. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/app_utils.py +0 -0
  67. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/async_utils.py +0 -0
  68. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/auth_token_manager.py +0 -0
  69. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/blob_utils.py +0 -0
  70. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/browser_utils.py +0 -0
  71. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/bytes_io_segment_payload.py +0 -0
  72. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/deprecation.py +0 -0
  73. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/docker_utils.py +0 -0
  74. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/function_utils.py +0 -0
  75. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/git_utils.py +0 -0
  76. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/grpc_testing.py +0 -0
  77. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/grpc_utils.py +0 -0
  78. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/hash_utils.py +0 -0
  79. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/http_utils.py +0 -0
  80. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/jwt_utils.py +0 -0
  81. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/logger.py +0 -0
  82. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/mount_utils.py +0 -0
  83. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/name_utils.py +0 -0
  84. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/package_utils.py +0 -0
  85. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/pattern_utils.py +0 -0
  86. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/rand_pb_testing.py +0 -0
  87. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/sandbox_fs_utils.py +0 -0
  88. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/shell_utils.py +0 -0
  89. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/task_command_router_client.py +0 -0
  90. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_utils/time_utils.py +0 -0
  91. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_vendor/__init__.py +0 -0
  92. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  93. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_vendor/cloudpickle.py +0 -0
  94. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_vendor/tblib.py +0 -0
  95. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_vendor/version.py +0 -0
  96. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_watcher.py +0 -0
  97. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/_workspace.py +0 -0
  98. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/billing.py +0 -0
  99. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/builder/2023.12.312.txt +0 -0
  100. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/builder/2023.12.txt +0 -0
  101. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/builder/2024.04.txt +0 -0
  102. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/builder/2024.10.txt +0 -0
  103. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/builder/2025.06.txt +0 -0
  104. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/builder/PREVIEW.txt +0 -0
  105. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/builder/README.md +0 -0
  106. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/builder/base-images.json +0 -0
  107. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/call_graph.py +0 -0
  108. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/__init__.py +0 -0
  109. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/_download.py +0 -0
  110. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/_help.py +0 -0
  111. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/_traceback.py +0 -0
  112. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/app.py +0 -0
  113. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/billing.py +0 -0
  114. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/bootstrap.py +0 -0
  115. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/changelog.py +0 -0
  116. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/cluster.py +0 -0
  117. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/config.py +0 -0
  118. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/container.py +0 -0
  119. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/dashboard.py +0 -0
  120. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/dict.py +0 -0
  121. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/entry_point.py +0 -0
  122. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/environment.py +0 -0
  123. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/image.py +0 -0
  124. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/import_refs.py +0 -0
  125. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/launch.py +0 -0
  126. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/logo.py +0 -0
  127. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/network_file_system.py +0 -0
  128. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/profile.py +0 -0
  129. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/programs/__init__.py +0 -0
  130. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/programs/run_jupyter.py +0 -0
  131. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/programs/vscode.py +0 -0
  132. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/queues.py +0 -0
  133. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/run.py +0 -0
  134. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/secret.py +0 -0
  135. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/selector.py +0 -0
  136. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/shell.py +0 -0
  137. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/skills.py +0 -0
  138. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/token.py +0 -0
  139. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/utils.py +0 -0
  140. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cli/volume.py +0 -0
  141. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/client.py +0 -0
  142. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cloud_bucket_mount.py +0 -0
  143. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cloud_bucket_mount.pyi +0 -0
  144. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cls.py +0 -0
  145. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/cls.pyi +0 -0
  146. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/config.py +0 -0
  147. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/container_process.py +0 -0
  148. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/container_process.pyi +0 -0
  149. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/dict.py +0 -0
  150. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/dict.pyi +0 -0
  151. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/environments.py +0 -0
  152. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/environments.pyi +0 -0
  153. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/exception.py +0 -0
  154. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/experimental/__init__.py +0 -0
  155. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/experimental/flash.py +0 -0
  156. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/experimental/flash.pyi +0 -0
  157. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/experimental/ipython.py +0 -0
  158. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/file_io.py +0 -0
  159. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/file_io.pyi +0 -0
  160. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/file_pattern_matcher.py +0 -0
  161. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/functions.py +0 -0
  162. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/image.py +0 -0
  163. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/image.pyi +0 -0
  164. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/io_streams.py +0 -0
  165. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/io_streams.pyi +0 -0
  166. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/mount.py +0 -0
  167. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/mount.pyi +0 -0
  168. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/network_file_system.py +0 -0
  169. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/network_file_system.pyi +0 -0
  170. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/object.py +0 -0
  171. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/object.pyi +0 -0
  172. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/output.py +0 -0
  173. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/parallel_map.py +0 -0
  174. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/parallel_map.pyi +0 -0
  175. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/partial_function.py +0 -0
  176. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/partial_function.pyi +0 -0
  177. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/proxy.py +0 -0
  178. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/proxy.pyi +0 -0
  179. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/py.typed +0 -0
  180. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/queue.py +0 -0
  181. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/queue.pyi +0 -0
  182. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/retries.py +0 -0
  183. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/runner.py +0 -0
  184. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/runner.pyi +0 -0
  185. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/running_app.py +0 -0
  186. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/sandbox.py +0 -0
  187. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/sandbox.pyi +0 -0
  188. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/sandbox_fs.pyi +0 -0
  189. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/schedule.py +0 -0
  190. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/scheduler_placement.py +0 -0
  191. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/secret.py +0 -0
  192. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/secret.pyi +0 -0
  193. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/server.py +0 -0
  194. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/serving.py +0 -0
  195. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/serving.pyi +0 -0
  196. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/skills/modal/SKILL.md +0 -0
  197. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/snapshot.py +0 -0
  198. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/snapshot.pyi +0 -0
  199. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/stream_type.py +0 -0
  200. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/token_flow.py +0 -0
  201. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/token_flow.pyi +0 -0
  202. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/volume.py +0 -0
  203. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/volume.pyi +0 -0
  204. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/workspace.py +0 -0
  205. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal/workspace.pyi +0 -0
  206. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal.egg-info/SOURCES.txt +0 -0
  207. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal.egg-info/dependency_links.txt +0 -0
  208. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal.egg-info/entry_points.txt +0 -0
  209. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal.egg-info/requires.txt +0 -0
  210. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal.egg-info/top_level.txt +0 -0
  211. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_docs/__init__.py +0 -0
  212. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_docs/gen_cli_docs.py +0 -0
  213. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_docs/gen_cli_docs_main.py +0 -0
  214. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_docs/gen_reference_docs.py +0 -0
  215. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_docs/gen_reference_docs_main.py +0 -0
  216. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_docs/mdmd/__init__.py +0 -0
  217. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_docs/mdmd/mdmd.py +0 -0
  218. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_docs/mdmd/signatures.py +0 -0
  219. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_docs/mdmd/types.py +0 -0
  220. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/__init__.py +0 -0
  221. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_proto/py.typed +0 -0
  222. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/modal_version/__main__.py +0 -0
  223. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/pyproject.toml +0 -0
  224. {modal-1.5.1.dev5 → modal-1.5.1.dev7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.1.dev5
3
+ Version: 1.5.1.dev7
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -43,6 +43,7 @@ try:
43
43
  from .schedule import Cron, Period
44
44
  from .scheduler_placement import SchedulerPlacement
45
45
  from .secret import Secret
46
+ from .server import Server
46
47
  from .snapshot import SandboxSnapshot
47
48
  from .volume import Volume
48
49
  from .workspace import Workspace
@@ -80,6 +81,7 @@ __all__ = [
80
81
  "SandboxSnapshot",
81
82
  "SchedulerPlacement",
82
83
  "Secret",
84
+ "Server",
83
85
  "Tunnel",
84
86
  "Volume",
85
87
  "Workspace",
@@ -23,7 +23,7 @@ def validate_http_server_config(
23
23
  proxy_regions: list[str], # The regions to proxy the HTTP server to.
24
24
  startup_timeout: int, # Maximum number of seconds to wait for the HTTP server to start.
25
25
  exit_grace_period: int | None, # The time to wait for the HTTP server to exit gracefully.
26
- is_server: bool = False, # Whether this validates a `_experimental_server` config.
26
+ is_server: bool = False, # Whether this validates a `server` config.
27
27
  ):
28
28
  if not isinstance(port, int) or port < 1 or port > 65535:
29
29
  raise InvalidError("Port must be a positive integer between 1 and 65535.")
@@ -49,10 +49,10 @@ class _Server:
49
49
  See [lifecycle hooks](https://modal.com/docs/guide/lifecycle-functions) for more information.
50
50
 
51
51
  Generally, you will not construct a Server directly.
52
- Instead, use the [`@app._experimental_server()`](https://modal.com/docs/reference/modal.App#server) decorator.
52
+ Instead, use the [`@app.server()`](https://modal.com/docs/reference/modal.App#server) decorator.
53
53
 
54
54
  ```python notest
55
- @app._experimental_server(port=8000, routing_region="us-east")
55
+ @app.server(port=8000, routing_region="us-east")
56
56
  class MyServer:
57
57
  @modal.enter()
58
58
  def start_server(self):
@@ -158,7 +158,7 @@ class _Server:
158
158
  ) -> "_Server":
159
159
  """Create a Server from a local class definition."""
160
160
 
161
- # Note: Validation should be done by the caller (app._experimental_server()) BEFORE creating the Server.
161
+ # Note: Validation should be done by the caller (app.server()) BEFORE creating the Server.
162
162
  # Extract the underlying class if wrapped in a _PartialFunction (e.g., from @modal.clustered())
163
163
  user_cls = _Server._extract_user_cls(wrapped_user_cls)
164
164
 
@@ -211,7 +211,7 @@ class _Server:
211
211
  user_cls = _Server._extract_user_cls(wrapped_user_cls)
212
212
 
213
213
  if not inspect.isclass(user_cls):
214
- raise TypeError("The @app._experimental_server() decorator must be used on a class.")
214
+ raise TypeError("The @app.server() decorator must be used on a class.")
215
215
 
216
216
  # Check for modal.parameter() - not allowed on server classes
217
217
  params = {k: v for k, v in user_cls.__dict__.items() if is_parameter(v)}
@@ -1266,7 +1266,10 @@ class _App:
1266
1266
 
1267
1267
  return wrapper
1268
1268
 
1269
- def _experimental_server(
1269
+ def _experimental_server(self, **kwargs):
1270
+ return self.server(**kwargs)
1271
+
1272
+ def server(
1270
1273
  self,
1271
1274
  _warn_parentheses_missing=None, # mdmd:line-hidden
1272
1275
  *,
@@ -1334,7 +1337,7 @@ class _App:
1334
1337
  startup_timeout: Maximum startup time in seconds.
1335
1338
  exit_grace_period: Grace period for in-flight requests on shutdown.
1336
1339
  routing_region: Region to route Server requests through.
1337
- h2_enabled: Enable HTTP/2.
1340
+ h2_enabled: Enable HTTP/2 in the container.
1338
1341
  target_concurrency: Target concurrency for the server; 0 disables autoscaling.
1339
1342
  cloud: Cloud provider (aws, gcp, oci, auto).
1340
1343
  region: Region(s) to run on.
@@ -1346,7 +1349,7 @@ class _App:
1346
1349
 
1347
1350
  Examples:
1348
1351
  ```python
1349
- @app._experimental_server(port=8000, routing_region="us-east")
1352
+ @app.server(port=8000, routing_region="us-east")
1350
1353
  class MyServer:
1351
1354
  @modal.enter()
1352
1355
  def start(self):
@@ -1358,7 +1361,7 @@ class _App:
1358
1361
  ```
1359
1362
  """
1360
1363
  if _warn_parentheses_missing:
1361
- raise InvalidError("Did you forget parentheses? Suggestion: `@app._experimental_server()`.")
1364
+ raise InvalidError("Did you forget parentheses? Suggestion: `@app.server()`.")
1362
1365
 
1363
1366
  # Validate HTTP server config
1364
1367
  validate_http_server_config(
@@ -728,7 +728,8 @@ class _App:
728
728
  """
729
729
  ...
730
730
 
731
- def _experimental_server(
731
+ def _experimental_server(self, **kwargs): ...
732
+ def server(
732
733
  self,
733
734
  _warn_parentheses_missing=None,
734
735
  *,
@@ -797,7 +798,7 @@ class _App:
797
798
  startup_timeout: Maximum startup time in seconds.
798
799
  exit_grace_period: Grace period for in-flight requests on shutdown.
799
800
  routing_region: Region to route Server requests through.
800
- h2_enabled: Enable HTTP/2.
801
+ h2_enabled: Enable HTTP/2 in the container.
801
802
  target_concurrency: Target concurrency for the server; 0 disables autoscaling.
802
803
  cloud: Cloud provider (aws, gcp, oci, auto).
803
804
  region: Region(s) to run on.
@@ -809,7 +810,7 @@ class _App:
809
810
 
810
811
  Examples:
811
812
  ```python
812
- @app._experimental_server(port=8000, routing_region="us-east")
813
+ @app.server(port=8000, routing_region="us-east")
813
814
  class MyServer:
814
815
  @modal.enter()
815
816
  def start(self):
@@ -1728,7 +1729,8 @@ class App:
1728
1729
  """
1729
1730
  ...
1730
1731
 
1731
- def _experimental_server(
1732
+ def _experimental_server(self, **kwargs): ...
1733
+ def server(
1732
1734
  self,
1733
1735
  _warn_parentheses_missing=None,
1734
1736
  *,
@@ -1795,7 +1797,7 @@ class App:
1795
1797
  startup_timeout: Maximum startup time in seconds.
1796
1798
  exit_grace_period: Grace period for in-flight requests on shutdown.
1797
1799
  routing_region: Region to route Server requests through.
1798
- h2_enabled: Enable HTTP/2.
1800
+ h2_enabled: Enable HTTP/2 in the container.
1799
1801
  target_concurrency: Target concurrency for the server; 0 disables autoscaling.
1800
1802
  cloud: Cloud provider (aws, gcp, oci, auto).
1801
1803
  region: Region(s) to run on.
@@ -1807,7 +1809,7 @@ class App:
1807
1809
 
1808
1810
  Examples:
1809
1811
  ```python
1810
- @app._experimental_server(port=8000, routing_region="us-east")
1812
+ @app.server(port=8000, routing_region="us-east")
1811
1813
  class MyServer:
1812
1814
  @modal.enter()
1813
1815
  def start(self):
@@ -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.dev5",
38
+ version: str = "1.5.1.dev7",
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.dev5",
208
+ version: str = "1.5.1.dev7",
209
209
  ):
210
210
  """mdmd:hidden
211
211
  The Modal client object is not intended to be instantiated directly by users.
@@ -490,7 +490,7 @@ class Function(
490
490
 
491
491
  _call_generator: ___call_generator_spec
492
492
 
493
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
493
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
494
494
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
495
495
  """Calls the function remotely, executing it with the given arguments and returning the execution's result.
496
496
 
@@ -515,7 +515,7 @@ class Function(
515
515
  """
516
516
  ...
517
517
 
518
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
518
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P]
519
519
 
520
520
  class __remote_gen_spec(typing_extensions.Protocol):
521
521
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -565,7 +565,7 @@ class Function(
565
565
  """
566
566
  ...
567
567
 
568
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
568
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
569
569
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
570
570
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
571
571
 
@@ -598,7 +598,7 @@ class Function(
598
598
  """
599
599
  ...
600
600
 
601
- _experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
601
+ _experimental_spawn: ___experimental_spawn_spec[modal._functions.ReturnType, modal._functions.P]
602
602
 
603
603
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
604
604
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
@@ -606,7 +606,7 @@ class Function(
606
606
 
607
607
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
608
608
 
609
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
609
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER]):
610
610
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
611
611
  """Calls the function with the given arguments, without waiting for the results.
612
612
 
@@ -639,7 +639,7 @@ class Function(
639
639
  """
640
640
  ...
641
641
 
642
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
642
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P]
643
643
 
644
644
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
645
645
  """Return the inner Python object wrapped by this Modal Function.
@@ -180,29 +180,66 @@ class _SandboxFilesystem:
180
180
  process = await self._container.exec(_SANDBOX_FS_TOOLS_PATH, make_write_file_command(remote_path))
181
181
  try:
182
182
  while True:
183
+ logger.debug(
184
+ f"sandbox copy_from_local('{local_path}', '{remote_path}'): reading "
185
+ f"{TASK_COMMAND_ROUTER_MAX_BUFFER_SIZE} bytes from {local_path} at offset {total_bytes}"
186
+ )
183
187
  # TODO(saltzm): If this fails, the ContainerProcess will remain alive indefinitely since
184
188
  # stdin will remain open. Unfortunately we can't just call write_eof either, since that
185
189
  # would lead to a partially written file being persisted. We should catch exceptions
186
190
  # from this and kill the ContainerProcess when we have a way to do this.
187
191
  chunk = file_obj.read(TASK_COMMAND_ROUTER_MAX_BUFFER_SIZE)
188
192
  if not chunk:
193
+ logger.debug(
194
+ f"sandbox copy_from_local('{local_path}', '{remote_path}'): read no data from "
195
+ f"{local_path}, finished reading file"
196
+ )
189
197
  break
190
198
  total_bytes += len(chunk)
199
+ logger.debug(
200
+ f"sandbox copy_from_local('{local_path}', '{remote_path}'): writing {len(chunk)} bytes "
201
+ f"from {local_path} to remote {remote_path}"
202
+ )
191
203
  process.stdin.write(chunk)
192
204
  await process.stdin.drain()
205
+ logger.debug(
206
+ f"sandbox copy_from_local('{local_path}', '{remote_path}'): finished writing "
207
+ f"{len(chunk)} bytes from {local_path} to remote {remote_path}"
208
+ )
209
+ logger.debug(
210
+ f"sandbox copy_from_local('{local_path}', '{remote_path}'): writing eof to remote {remote_path}"
211
+ )
193
212
  process.stdin.write_eof()
194
213
  await process.stdin.drain()
214
+ logger.debug(
215
+ f"sandbox copy_from_local('{local_path}', '{remote_path}'): finished writing eof to remote "
216
+ f"{remote_path}"
217
+ )
195
218
  # When the FS tools binary exits early on an error, the worker
196
219
  # reports the dropped stdin write as ConflictError.
197
220
  except ConflictError:
198
221
  pass
199
- stderr, returncode = await asyncio.gather(process.stderr.read(), process.wait())
222
+
223
+ async def read_stderr():
224
+ stderr = await process.stderr.read()
225
+ logger.debug(f"sandbox copy_from_local('{local_path}', '{remote_path}'): finished reading stderr")
226
+ return stderr
227
+
228
+ async def wait_for_process_completion():
229
+ returncode = await process.wait()
230
+ logger.debug(
231
+ f"sandbox copy_from_local('{local_path}', '{remote_path}'): finished waiting for process "
232
+ "completion"
233
+ )
234
+ return returncode
235
+
236
+ stderr, returncode = await asyncio.gather(read_stderr(), wait_for_process_completion())
200
237
 
201
238
  if returncode != 0:
202
239
  raise_write_file_error(returncode, stderr, remote_path)
203
240
 
204
241
  dur_s = max(time.monotonic() - t0, 0.001)
205
- _log_throughput(f"copy_from_local {local_path} -> {remote_path}", total_bytes, dur_s)
242
+ _log_throughput(f"copy_from_local('{local_path}', '{remote_path}')", total_bytes, dur_s)
206
243
 
207
244
  async def copy_to_local(self, remote_path: str, local_path: str | os.PathLike) -> None:
208
245
  """Copy a file from the Sandbox to a local path.
@@ -11,10 +11,10 @@ class Server:
11
11
  See [lifecycle hooks](https://modal.com/docs/guide/lifecycle-functions) for more information.
12
12
 
13
13
  Generally, you will not construct a Server directly.
14
- Instead, use the [`@app._experimental_server()`](https://modal.com/docs/reference/modal.App#server) decorator.
14
+ Instead, use the [`@app.server()`](https://modal.com/docs/reference/modal.App#server) decorator.
15
15
 
16
16
  ```python notest
17
- @app._experimental_server(port=8000, routing_region="us-east")
17
+ @app.server(port=8000, routing_region="us-east")
18
18
  class MyServer:
19
19
  @modal.enter()
20
20
  def start_server(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.1.dev5
3
+ Version: 1.5.1.dev7
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -279,6 +279,10 @@ class ModalClientBase(abc.ABC):
279
279
  async def EnvironmentDelete(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentDeleteRequest, google.protobuf.empty_pb2.Empty]') -> None:
280
280
  pass
281
281
 
282
+ @abc.abstractmethod
283
+ async def EnvironmentGetBudget(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentGetBudgetRequest, modal_proto.api_pb2.EnvironmentGetBudgetResponse]') -> None:
284
+ pass
285
+
282
286
  @abc.abstractmethod
283
287
  async def EnvironmentGetManaged(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentGetManagedRequest, modal_proto.api_pb2.EnvironmentGetManagedResponse]') -> None:
284
288
  pass
@@ -295,6 +299,10 @@ class ModalClientBase(abc.ABC):
295
299
  async def EnvironmentRoleSet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentRoleSetRequest, google.protobuf.empty_pb2.Empty]') -> None:
296
300
  pass
297
301
 
302
+ @abc.abstractmethod
303
+ async def EnvironmentSetBudget(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetBudgetRequest, google.protobuf.empty_pb2.Empty]') -> None:
304
+ pass
305
+
298
306
  @abc.abstractmethod
299
307
  async def EnvironmentSetManaged(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.EnvironmentSetManagedRequest, google.protobuf.empty_pb2.Empty]') -> None:
300
308
  pass
@@ -1235,6 +1243,12 @@ class ModalClientBase(abc.ABC):
1235
1243
  modal_proto.api_pb2.EnvironmentDeleteRequest,
1236
1244
  google.protobuf.empty_pb2.Empty,
1237
1245
  ),
1246
+ '/modal.client.ModalClient/EnvironmentGetBudget': grpclib.const.Handler(
1247
+ self.EnvironmentGetBudget,
1248
+ grpclib.const.Cardinality.UNARY_UNARY,
1249
+ modal_proto.api_pb2.EnvironmentGetBudgetRequest,
1250
+ modal_proto.api_pb2.EnvironmentGetBudgetResponse,
1251
+ ),
1238
1252
  '/modal.client.ModalClient/EnvironmentGetManaged': grpclib.const.Handler(
1239
1253
  self.EnvironmentGetManaged,
1240
1254
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1259,6 +1273,12 @@ class ModalClientBase(abc.ABC):
1259
1273
  modal_proto.api_pb2.EnvironmentRoleSetRequest,
1260
1274
  google.protobuf.empty_pb2.Empty,
1261
1275
  ),
1276
+ '/modal.client.ModalClient/EnvironmentSetBudget': grpclib.const.Handler(
1277
+ self.EnvironmentSetBudget,
1278
+ grpclib.const.Cardinality.UNARY_UNARY,
1279
+ modal_proto.api_pb2.EnvironmentSetBudgetRequest,
1280
+ google.protobuf.empty_pb2.Empty,
1281
+ ),
1262
1282
  '/modal.client.ModalClient/EnvironmentSetManaged': grpclib.const.Handler(
1263
1283
  self.EnvironmentSetManaged,
1264
1284
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -2477,6 +2497,12 @@ class ModalClientStub:
2477
2497
  modal_proto.api_pb2.EnvironmentDeleteRequest,
2478
2498
  google.protobuf.empty_pb2.Empty,
2479
2499
  )
2500
+ self.EnvironmentGetBudget = grpclib.client.UnaryUnaryMethod(
2501
+ channel,
2502
+ '/modal.client.ModalClient/EnvironmentGetBudget',
2503
+ modal_proto.api_pb2.EnvironmentGetBudgetRequest,
2504
+ modal_proto.api_pb2.EnvironmentGetBudgetResponse,
2505
+ )
2480
2506
  self.EnvironmentGetManaged = grpclib.client.UnaryUnaryMethod(
2481
2507
  channel,
2482
2508
  '/modal.client.ModalClient/EnvironmentGetManaged',
@@ -2501,6 +2527,12 @@ class ModalClientStub:
2501
2527
  modal_proto.api_pb2.EnvironmentRoleSetRequest,
2502
2528
  google.protobuf.empty_pb2.Empty,
2503
2529
  )
2530
+ self.EnvironmentSetBudget = grpclib.client.UnaryUnaryMethod(
2531
+ channel,
2532
+ '/modal.client.ModalClient/EnvironmentSetBudget',
2533
+ modal_proto.api_pb2.EnvironmentSetBudgetRequest,
2534
+ google.protobuf.empty_pb2.Empty,
2535
+ )
2504
2536
  self.EnvironmentSetManaged = grpclib.client.UnaryUnaryMethod(
2505
2537
  channel,
2506
2538
  '/modal.client.ModalClient/EnvironmentSetManaged',