modal 1.5.1.dev1__tar.gz → 1.5.1.dev3__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.dev1 → modal-1.5.1.dev3}/PKG-INFO +1 -1
  2. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_functions.py +4 -0
  3. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_server.py +9 -1
  4. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/app.py +6 -0
  5. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/app.pyi +4 -0
  6. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/shell.py +1 -1
  7. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/client.pyi +2 -2
  8. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/functions.pyi +3 -0
  9. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/server.pyi +8 -0
  10. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/PKG-INFO +1 -1
  11. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_pb2.py +245 -232
  12. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_pb2.pyi +41 -4
  13. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_grpc.py +5 -5
  14. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_pb2.py +93 -93
  15. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_pb2.pyi +10 -5
  16. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_pb2_grpc.py +6 -6
  17. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/task_command_router_pb2_grpc.pyi +4 -4
  18. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_version/__init__.py +1 -1
  19. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/LICENSE +0 -0
  20. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/README.md +0 -0
  21. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/__init__.py +0 -0
  22. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/__main__.py +0 -0
  23. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_billing.py +0 -0
  24. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_clustered_functions.py +0 -0
  25. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_clustered_functions.pyi +0 -0
  26. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_container_entrypoint.py +0 -0
  27. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_environments.py +0 -0
  28. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_function_variants.py +0 -0
  29. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_grpc_client.py +0 -0
  30. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_image.py +0 -0
  31. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_ipython.py +0 -0
  32. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_load_context.py +0 -0
  33. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_location.py +0 -0
  34. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_logs.py +0 -0
  35. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_object.py +0 -0
  36. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/__init__.py +0 -0
  37. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/manager.py +0 -0
  38. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/pty.py +0 -0
  39. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/rich.py +0 -0
  40. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_output/status.py +0 -0
  41. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_partial_function.py +0 -0
  42. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_resolver.py +0 -0
  43. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_resources.py +0 -0
  44. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/__init__.py +0 -0
  45. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/asgi.py +0 -0
  46. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/container_io_manager.py +0 -0
  47. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/container_io_manager.pyi +0 -0
  48. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/execution_context.py +0 -0
  49. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/execution_context.pyi +0 -0
  50. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  51. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/task_lifecycle_manager.py +0 -0
  52. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
  53. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/telemetry.py +0 -0
  54. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/user_code_event_loop.py +0 -0
  55. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_runtime/user_code_imports.py +0 -0
  56. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_serialization.py +0 -0
  57. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_traceback.py +0 -0
  58. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_tunnel.py +0 -0
  59. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_tunnel.pyi +0 -0
  60. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_type_manager.py +0 -0
  61. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/__init__.py +0 -0
  62. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/app_utils.py +0 -0
  63. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/async_utils.py +0 -0
  64. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/auth_token_manager.py +0 -0
  65. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/blob_utils.py +0 -0
  66. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/browser_utils.py +0 -0
  67. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/bytes_io_segment_payload.py +0 -0
  68. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/deprecation.py +0 -0
  69. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/docker_utils.py +0 -0
  70. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/function_utils.py +0 -0
  71. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/git_utils.py +0 -0
  72. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/grpc_testing.py +0 -0
  73. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/grpc_utils.py +0 -0
  74. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/hash_utils.py +0 -0
  75. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/http_utils.py +0 -0
  76. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/jwt_utils.py +0 -0
  77. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/logger.py +0 -0
  78. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/mount_utils.py +0 -0
  79. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/name_utils.py +0 -0
  80. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/package_utils.py +0 -0
  81. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/pattern_utils.py +0 -0
  82. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/rand_pb_testing.py +0 -0
  83. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/sandbox_fs_utils.py +0 -0
  84. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/shell_utils.py +0 -0
  85. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/task_command_router_client.py +0 -0
  86. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_utils/time_utils.py +0 -0
  87. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/__init__.py +0 -0
  88. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  89. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/cloudpickle.py +0 -0
  90. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/tblib.py +0 -0
  91. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_vendor/version.py +0 -0
  92. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_watcher.py +0 -0
  93. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/_workspace.py +0 -0
  94. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/billing.py +0 -0
  95. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2023.12.312.txt +0 -0
  96. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2023.12.txt +0 -0
  97. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2024.04.txt +0 -0
  98. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2024.10.txt +0 -0
  99. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/2025.06.txt +0 -0
  100. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/PREVIEW.txt +0 -0
  101. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/README.md +0 -0
  102. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/builder/base-images.json +0 -0
  103. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/call_graph.py +0 -0
  104. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/__init__.py +0 -0
  105. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/_download.py +0 -0
  106. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/_help.py +0 -0
  107. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/_traceback.py +0 -0
  108. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/app.py +0 -0
  109. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/billing.py +0 -0
  110. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/bootstrap.py +0 -0
  111. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/changelog.py +0 -0
  112. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/cluster.py +0 -0
  113. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/config.py +0 -0
  114. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/container.py +0 -0
  115. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/dashboard.py +0 -0
  116. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/dict.py +0 -0
  117. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/entry_point.py +0 -0
  118. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/environment.py +0 -0
  119. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/image.py +0 -0
  120. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/import_refs.py +0 -0
  121. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/launch.py +0 -0
  122. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/logo.py +0 -0
  123. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/network_file_system.py +0 -0
  124. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/profile.py +0 -0
  125. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/programs/__init__.py +0 -0
  126. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/programs/run_jupyter.py +0 -0
  127. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/programs/vscode.py +0 -0
  128. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/queues.py +0 -0
  129. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/run.py +0 -0
  130. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/secret.py +0 -0
  131. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/selector.py +0 -0
  132. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/skills.py +0 -0
  133. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/token.py +0 -0
  134. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/utils.py +0 -0
  135. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cli/volume.py +0 -0
  136. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/client.py +0 -0
  137. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cloud_bucket_mount.py +0 -0
  138. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cloud_bucket_mount.pyi +0 -0
  139. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cls.py +0 -0
  140. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/cls.pyi +0 -0
  141. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/config.py +0 -0
  142. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/container_process.py +0 -0
  143. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/container_process.pyi +0 -0
  144. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/dict.py +0 -0
  145. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/dict.pyi +0 -0
  146. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/environments.py +0 -0
  147. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/environments.pyi +0 -0
  148. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/exception.py +0 -0
  149. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/experimental/__init__.py +0 -0
  150. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/experimental/flash.py +0 -0
  151. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/experimental/flash.pyi +0 -0
  152. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/experimental/ipython.py +0 -0
  153. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/file_io.py +0 -0
  154. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/file_io.pyi +0 -0
  155. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/file_pattern_matcher.py +0 -0
  156. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/functions.py +0 -0
  157. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/image.py +0 -0
  158. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/image.pyi +0 -0
  159. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/io_streams.py +0 -0
  160. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/io_streams.pyi +0 -0
  161. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/mount.py +0 -0
  162. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/mount.pyi +0 -0
  163. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/network_file_system.py +0 -0
  164. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/network_file_system.pyi +0 -0
  165. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/object.py +0 -0
  166. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/object.pyi +0 -0
  167. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/output.py +0 -0
  168. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/parallel_map.py +0 -0
  169. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/parallel_map.pyi +0 -0
  170. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/partial_function.py +0 -0
  171. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/partial_function.pyi +0 -0
  172. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/proxy.py +0 -0
  173. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/proxy.pyi +0 -0
  174. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/py.typed +0 -0
  175. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/queue.py +0 -0
  176. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/queue.pyi +0 -0
  177. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/retries.py +0 -0
  178. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/runner.py +0 -0
  179. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/runner.pyi +0 -0
  180. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/running_app.py +0 -0
  181. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/sandbox.py +0 -0
  182. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/sandbox.pyi +0 -0
  183. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/sandbox_fs.py +0 -0
  184. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/sandbox_fs.pyi +0 -0
  185. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/schedule.py +0 -0
  186. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/scheduler_placement.py +0 -0
  187. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/secret.py +0 -0
  188. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/secret.pyi +0 -0
  189. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/server.py +0 -0
  190. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/serving.py +0 -0
  191. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/serving.pyi +0 -0
  192. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/skills/modal/SKILL.md +0 -0
  193. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/snapshot.py +0 -0
  194. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/snapshot.pyi +0 -0
  195. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/stream_type.py +0 -0
  196. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/token_flow.py +0 -0
  197. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/token_flow.pyi +0 -0
  198. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/volume.py +0 -0
  199. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/volume.pyi +0 -0
  200. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/workspace.py +0 -0
  201. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal/workspace.pyi +0 -0
  202. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/SOURCES.txt +0 -0
  203. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/dependency_links.txt +0 -0
  204. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/entry_points.txt +0 -0
  205. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/requires.txt +0 -0
  206. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal.egg-info/top_level.txt +0 -0
  207. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/__init__.py +0 -0
  208. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/gen_cli_docs.py +0 -0
  209. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/gen_cli_docs_main.py +0 -0
  210. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/gen_reference_docs.py +0 -0
  211. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/gen_reference_docs_main.py +0 -0
  212. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/mdmd/__init__.py +0 -0
  213. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/mdmd/mdmd.py +0 -0
  214. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/mdmd/signatures.py +0 -0
  215. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_docs/mdmd/types.py +0 -0
  216. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/__init__.py +0 -0
  217. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_grpc.py +0 -0
  218. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_pb2_grpc.py +0 -0
  219. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/api_pb2_grpc.pyi +0 -0
  220. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/modal_api_grpc.py +0 -0
  221. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_proto/py.typed +0 -0
  222. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/modal_version/__main__.py +0 -0
  223. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/pyproject.toml +0 -0
  224. {modal-1.5.1.dev1 → modal-1.5.1.dev3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.1.dev1
3
+ Version: 1.5.1.dev3
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0
@@ -661,6 +661,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
661
661
  min_containers: int | None = None,
662
662
  max_containers: int | None = None,
663
663
  buffer_containers: int | None = None,
664
+ scaleup_window: int | None = None,
664
665
  scaledown_window: int | None = None,
665
666
  max_concurrent_inputs: int | None = None,
666
667
  target_concurrent_inputs: int | None = None,
@@ -766,6 +767,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
766
767
  min_containers=min_containers,
767
768
  max_containers=max_containers,
768
769
  buffer_containers=buffer_containers,
770
+ scaleup_window=scaleup_window,
769
771
  scaledown_window=scaledown_window,
770
772
  )
771
773
 
@@ -1157,6 +1159,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1157
1159
  min_containers: int | None = None,
1158
1160
  max_containers: int | None = None,
1159
1161
  buffer_containers: int | None = None,
1162
+ scaleup_window: int | None = None,
1160
1163
  scaledown_window: int | None = None,
1161
1164
  target_concurrency: int | None = None,
1162
1165
  ) -> None:
@@ -1164,6 +1167,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
1164
1167
  min_containers=min_containers,
1165
1168
  max_containers=max_containers,
1166
1169
  buffer_containers=buffer_containers,
1170
+ scaleup_window=scaleup_window,
1167
1171
  scaledown_window=scaledown_window,
1168
1172
  target_concurrency=target_concurrency,
1169
1173
  )
@@ -31,7 +31,10 @@ def validate_http_server_config(
31
31
  raise InvalidError("The `startup_timeout` argument must be positive.")
32
32
  if exit_grace_period is not None and exit_grace_period < 0:
33
33
  raise InvalidError("The `exit_grace_period` argument must be non-negative.")
34
- if not is_server and exit_grace_period is not None and exit_grace_period > 25:
34
+ if is_server:
35
+ if exit_grace_period is not None and exit_grace_period > 3600:
36
+ raise InvalidError("The `exit_grace_period` argument must not exceed 3600 seconds (1 hour).")
37
+ elif exit_grace_period is not None and exit_grace_period > 25:
35
38
  raise InvalidError("The `exit_grace_period` argument must not exceed 25 seconds.")
36
39
 
37
40
  if not proxy_regions or not proxy_regions[0]:
@@ -101,6 +104,7 @@ class _Server:
101
104
  min_containers: int | None = None,
102
105
  max_containers: int | None = None,
103
106
  buffer_containers: int | None = None,
107
+ scaleup_window: int | None = None,
104
108
  scaledown_window: int | None = None,
105
109
  target_concurrency: int | None = None,
106
110
  ) -> None:
@@ -118,6 +122,9 @@ class _Server:
118
122
  # Limit this Server to avoid spinning up more than 5 containers
119
123
  server.update_autoscaler(max_containers=5)
120
124
 
125
+ # Require 30 seconds of sustained demand before scaling up
126
+ server.update_autoscaler(scaleup_window=30)
127
+
121
128
  # Adjust Server autoscaling to target 20 concurrent requests per replica
122
129
  server.update_autoscaler(target_concurrency=20)
123
130
 
@@ -129,6 +136,7 @@ class _Server:
129
136
  return await self._get_service_function()._update_autoscaler(
130
137
  min_containers=min_containers,
131
138
  max_containers=max_containers,
139
+ scaleup_window=scaleup_window,
132
140
  scaledown_window=scaledown_window,
133
141
  buffer_containers=buffer_containers,
134
142
  target_concurrency=target_concurrency,
@@ -1284,6 +1284,7 @@ class _App:
1284
1284
  min_containers: int | None = None, # Minimum number of containers to keep warm
1285
1285
  max_containers: int | None = None, # Maximum number of containers
1286
1286
  buffer_containers: int | None = None, # Additional idle containers under active load
1287
+ scaleup_window: int | None = None, # Stabilization window (seconds) of sustained demand before scaling up
1287
1288
  scaledown_window: int | None = None, # Max idle time before scaling down (seconds)
1288
1289
  proxy: _Proxy | None = None, # Modal Proxy to use in front of this server
1289
1290
  port: int = 8000, # Port the HTTP server listens on
@@ -1326,6 +1327,7 @@ class _App:
1326
1327
  min_containers: Minimum number of containers to keep warm.
1327
1328
  max_containers: Maximum number of containers.
1328
1329
  buffer_containers: Additional idle containers under active load.
1330
+ scaleup_window: Stabilization window (seconds) of sustained demand before scaling up, defaults to 1 second.
1329
1331
  scaledown_window: Max idle time before scaling down (seconds).
1330
1332
  proxy: Modal Proxy to use in front of this server.
1331
1333
  port: Port the HTTP server listens on.
@@ -1371,6 +1373,9 @@ class _App:
1371
1373
  if not isinstance(target_concurrency, int) or target_concurrency < 0:
1372
1374
  raise InvalidError("The `target_concurrency` argument must be a non-negative integer.")
1373
1375
 
1376
+ if scaleup_window is not None and scaleup_window <= 0:
1377
+ raise InvalidError("`scaleup_window` must be > 0")
1378
+
1374
1379
  http_config = api_pb2.HTTPConfig(
1375
1380
  port=port,
1376
1381
  proxy_regions=[routing_region],
@@ -1420,6 +1425,7 @@ class _App:
1420
1425
  min_containers=min_containers,
1421
1426
  max_containers=max_containers,
1422
1427
  buffer_containers=buffer_containers,
1428
+ scaleup_window=scaleup_window,
1423
1429
  scaledown_window=scaledown_window,
1424
1430
  proxy=proxy,
1425
1431
  retries=None, # No support for Server level retries
@@ -747,6 +747,7 @@ class _App:
747
747
  min_containers: typing.Optional[int] = None,
748
748
  max_containers: typing.Optional[int] = None,
749
749
  buffer_containers: typing.Optional[int] = None,
750
+ scaleup_window: typing.Optional[int] = None,
750
751
  scaledown_window: typing.Optional[int] = None,
751
752
  proxy: typing.Optional[modal.proxy._Proxy] = None,
752
753
  port: int = 8000,
@@ -789,6 +790,7 @@ class _App:
789
790
  min_containers: Minimum number of containers to keep warm.
790
791
  max_containers: Maximum number of containers.
791
792
  buffer_containers: Additional idle containers under active load.
793
+ scaleup_window: Stabilization window (seconds) of sustained demand before scaling up, defaults to 1 second.
792
794
  scaledown_window: Max idle time before scaling down (seconds).
793
795
  proxy: Modal Proxy to use in front of this server.
794
796
  port: Port the HTTP server listens on.
@@ -1745,6 +1747,7 @@ class App:
1745
1747
  min_containers: typing.Optional[int] = None,
1746
1748
  max_containers: typing.Optional[int] = None,
1747
1749
  buffer_containers: typing.Optional[int] = None,
1750
+ scaleup_window: typing.Optional[int] = None,
1748
1751
  scaledown_window: typing.Optional[int] = None,
1749
1752
  proxy: typing.Optional[modal.proxy.Proxy] = None,
1750
1753
  port: int = 8000,
@@ -1785,6 +1788,7 @@ class App:
1785
1788
  min_containers: Minimum number of containers to keep warm.
1786
1789
  max_containers: Maximum number of containers.
1787
1790
  buffer_containers: Additional idle containers under active load.
1791
+ scaleup_window: Stabilization window (seconds) of sustained demand before scaling up, defaults to 1 second.
1788
1792
  scaledown_window: Max idle time before scaling down (seconds).
1789
1793
  proxy: Modal Proxy to use in front of this server.
1790
1794
  port: Port the HTTP server listens on.
@@ -78,7 +78,7 @@ def _is_valid_modal_id(ref: str, prefix: str) -> bool:
78
78
  def _parse_sandbox_container_ref(ref: str) -> tuple[str, str | None]:
79
79
  """Parse a sandbox:container reference into (sandbox_id, container_name).
80
80
 
81
- Supports the pattern `sb-xyz:container_name` for accessing sandbox containers.
81
+ Supports the pattern `sb-xyz:container_name` for accessing sandbox sidecars.
82
82
  Returns (ref, None) if no container name is specified.
83
83
  """
84
84
  if _is_valid_modal_id(ref, "sb-"):
@@ -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.dev1",
38
+ version: str = "1.5.1.dev3",
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.dev1",
208
+ version: str = "1.5.1.dev3",
209
209
  ):
210
210
  """mdmd:hidden
211
211
  The Modal client object is not intended to be instantiated directly by users.
@@ -90,6 +90,7 @@ class Function(
90
90
  min_containers: typing.Optional[int] = None,
91
91
  max_containers: typing.Optional[int] = None,
92
92
  buffer_containers: typing.Optional[int] = None,
93
+ scaleup_window: typing.Optional[int] = None,
93
94
  scaledown_window: typing.Optional[int] = None,
94
95
  max_concurrent_inputs: typing.Optional[int] = None,
95
96
  target_concurrent_inputs: typing.Optional[int] = None,
@@ -129,6 +130,7 @@ class Function(
129
130
  min_containers: typing.Optional[int] = None,
130
131
  max_containers: typing.Optional[int] = None,
131
132
  buffer_containers: typing.Optional[int] = None,
133
+ scaleup_window: typing.Optional[int] = None,
132
134
  scaledown_window: typing.Optional[int] = None,
133
135
  target_concurrency: typing.Optional[int] = None,
134
136
  ) -> None: ...
@@ -139,6 +141,7 @@ class Function(
139
141
  min_containers: typing.Optional[int] = None,
140
142
  max_containers: typing.Optional[int] = None,
141
143
  buffer_containers: typing.Optional[int] = None,
144
+ scaleup_window: typing.Optional[int] = None,
142
145
  scaledown_window: typing.Optional[int] = None,
143
146
  target_concurrency: typing.Optional[int] = None,
144
147
  ) -> None: ...
@@ -52,6 +52,7 @@ class Server:
52
52
  min_containers: typing.Optional[int] = None,
53
53
  max_containers: typing.Optional[int] = None,
54
54
  buffer_containers: typing.Optional[int] = None,
55
+ scaleup_window: typing.Optional[int] = None,
55
56
  scaledown_window: typing.Optional[int] = None,
56
57
  target_concurrency: typing.Optional[int] = None,
57
58
  ) -> None:
@@ -69,6 +70,9 @@ class Server:
69
70
  # Limit this Server to avoid spinning up more than 5 containers
70
71
  server.update_autoscaler(max_containers=5)
71
72
 
73
+ # Require 30 seconds of sustained demand before scaling up
74
+ server.update_autoscaler(scaleup_window=30)
75
+
72
76
  # Adjust Server autoscaling to target 20 concurrent requests per replica
73
77
  server.update_autoscaler(target_concurrency=20)
74
78
 
@@ -85,6 +89,7 @@ class Server:
85
89
  min_containers: typing.Optional[int] = None,
86
90
  max_containers: typing.Optional[int] = None,
87
91
  buffer_containers: typing.Optional[int] = None,
92
+ scaleup_window: typing.Optional[int] = None,
88
93
  scaledown_window: typing.Optional[int] = None,
89
94
  target_concurrency: typing.Optional[int] = None,
90
95
  ) -> None:
@@ -102,6 +107,9 @@ class Server:
102
107
  # Limit this Server to avoid spinning up more than 5 containers
103
108
  server.update_autoscaler(max_containers=5)
104
109
 
110
+ # Require 30 seconds of sustained demand before scaling up
111
+ server.update_autoscaler(scaleup_window=30)
112
+
105
113
  # Adjust Server autoscaling to target 20 concurrent requests per replica
106
114
  server.update_autoscaler(target_concurrency=20)
107
115
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.5.1.dev1
3
+ Version: 1.5.1.dev3
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License-Expression: Apache-2.0