modal 1.2.1.dev14__tar.gz → 1.2.1.dev15__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.

Potentially problematic release.


This version of modal might be problematic. Click here for more details.

Files changed (198) hide show
  1. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/PKG-INFO +1 -1
  2. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/client.pyi +2 -2
  3. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/experimental/flash.py +21 -47
  4. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/experimental/flash.pyi +6 -20
  5. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/functions.pyi +6 -6
  6. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/api.proto +0 -9
  8. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/api_grpc.py +0 -16
  9. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/api_pb2.py +185 -205
  10. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/api_pb2.pyi +0 -30
  11. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/api_pb2_grpc.py +0 -34
  12. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/api_pb2_grpc.pyi +0 -12
  13. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/modal_api_grpc.py +0 -1
  14. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_version/__init__.py +1 -1
  15. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/LICENSE +0 -0
  16. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/README.md +0 -0
  17. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/__init__.py +0 -0
  18. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/__main__.py +0 -0
  19. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_billing.py +0 -0
  20. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_clustered_functions.py +0 -0
  21. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_clustered_functions.pyi +0 -0
  22. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_container_entrypoint.py +0 -0
  23. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_functions.py +0 -0
  24. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_ipython.py +0 -0
  25. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_location.py +0 -0
  26. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_object.py +0 -0
  27. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_output.py +0 -0
  28. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_partial_function.py +0 -0
  29. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_pty.py +0 -0
  30. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_resolver.py +0 -0
  31. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_resources.py +0 -0
  32. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_runtime/__init__.py +0 -0
  33. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_runtime/asgi.py +0 -0
  34. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_runtime/container_io_manager.py +0 -0
  35. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_runtime/container_io_manager.pyi +0 -0
  36. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_runtime/execution_context.py +0 -0
  37. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_runtime/execution_context.pyi +0 -0
  38. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  39. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_runtime/telemetry.py +0 -0
  40. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_runtime/user_code_imports.py +0 -0
  41. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_serialization.py +0 -0
  42. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_traceback.py +0 -0
  43. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_tunnel.py +0 -0
  44. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_tunnel.pyi +0 -0
  45. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_type_manager.py +0 -0
  46. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/__init__.py +0 -0
  47. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/app_utils.py +0 -0
  48. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/async_utils.py +0 -0
  49. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/auth_token_manager.py +0 -0
  50. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/blob_utils.py +0 -0
  51. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/bytes_io_segment_payload.py +0 -0
  52. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/deprecation.py +0 -0
  53. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/docker_utils.py +0 -0
  54. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/function_utils.py +0 -0
  55. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/git_utils.py +0 -0
  56. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/grpc_testing.py +0 -0
  57. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/grpc_utils.py +0 -0
  58. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/hash_utils.py +0 -0
  59. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/http_utils.py +0 -0
  60. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/jwt_utils.py +0 -0
  61. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/logger.py +0 -0
  62. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/mount_utils.py +0 -0
  63. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/name_utils.py +0 -0
  64. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/package_utils.py +0 -0
  65. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/pattern_utils.py +0 -0
  66. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/rand_pb_testing.py +0 -0
  67. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/shell_utils.py +0 -0
  68. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/task_command_router_client.py +0 -0
  69. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_utils/time_utils.py +0 -0
  70. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_vendor/__init__.py +0 -0
  71. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  72. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_vendor/cloudpickle.py +0 -0
  73. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_vendor/tblib.py +0 -0
  74. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/_watcher.py +0 -0
  75. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/app.py +0 -0
  76. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/app.pyi +0 -0
  77. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/billing.py +0 -0
  78. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/builder/2023.12.312.txt +0 -0
  79. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/builder/2023.12.txt +0 -0
  80. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/builder/2024.04.txt +0 -0
  81. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/builder/2024.10.txt +0 -0
  82. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/builder/2025.06.txt +0 -0
  83. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/builder/PREVIEW.txt +0 -0
  84. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/builder/README.md +0 -0
  85. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/builder/base-images.json +0 -0
  86. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/call_graph.py +0 -0
  87. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/__init__.py +0 -0
  88. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/_download.py +0 -0
  89. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/_traceback.py +0 -0
  90. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/app.py +0 -0
  91. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/cluster.py +0 -0
  92. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/config.py +0 -0
  93. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/container.py +0 -0
  94. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/dict.py +0 -0
  95. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/entry_point.py +0 -0
  96. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/environment.py +0 -0
  97. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/import_refs.py +0 -0
  98. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/launch.py +0 -0
  99. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/network_file_system.py +0 -0
  100. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/profile.py +0 -0
  101. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/programs/__init__.py +0 -0
  102. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/programs/launch_instance_ssh.py +0 -0
  103. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/programs/run_jupyter.py +0 -0
  104. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/programs/run_marimo.py +0 -0
  105. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/programs/vscode.py +0 -0
  106. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/queues.py +0 -0
  107. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/run.py +0 -0
  108. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/secret.py +0 -0
  109. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/token.py +0 -0
  110. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/utils.py +0 -0
  111. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cli/volume.py +0 -0
  112. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/client.py +0 -0
  113. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cloud_bucket_mount.py +0 -0
  114. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cloud_bucket_mount.pyi +0 -0
  115. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cls.py +0 -0
  116. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/cls.pyi +0 -0
  117. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/config.py +0 -0
  118. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/container_process.py +0 -0
  119. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/container_process.pyi +0 -0
  120. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/dict.py +0 -0
  121. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/dict.pyi +0 -0
  122. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/environments.py +0 -0
  123. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/environments.pyi +0 -0
  124. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/exception.py +0 -0
  125. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/experimental/__init__.py +0 -0
  126. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/experimental/ipython.py +0 -0
  127. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/file_io.py +0 -0
  128. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/file_io.pyi +0 -0
  129. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/file_pattern_matcher.py +0 -0
  130. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/functions.py +0 -0
  131. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/gpu.py +0 -0
  132. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/image.py +0 -0
  133. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/image.pyi +0 -0
  134. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/io_streams.py +0 -0
  135. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/io_streams.pyi +0 -0
  136. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/mount.py +0 -0
  137. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/mount.pyi +0 -0
  138. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/network_file_system.py +0 -0
  139. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/network_file_system.pyi +0 -0
  140. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/object.py +0 -0
  141. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/object.pyi +0 -0
  142. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/output.py +0 -0
  143. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/parallel_map.py +0 -0
  144. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/parallel_map.pyi +0 -0
  145. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/partial_function.py +0 -0
  146. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/partial_function.pyi +0 -0
  147. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/proxy.py +0 -0
  148. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/proxy.pyi +0 -0
  149. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/py.typed +0 -0
  150. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/queue.py +0 -0
  151. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/queue.pyi +0 -0
  152. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/retries.py +0 -0
  153. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/runner.py +0 -0
  154. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/runner.pyi +0 -0
  155. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/running_app.py +0 -0
  156. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/sandbox.py +0 -0
  157. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/sandbox.pyi +0 -0
  158. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/schedule.py +0 -0
  159. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/scheduler_placement.py +0 -0
  160. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/secret.py +0 -0
  161. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/secret.pyi +0 -0
  162. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/serving.py +0 -0
  163. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/serving.pyi +0 -0
  164. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/snapshot.py +0 -0
  165. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/snapshot.pyi +0 -0
  166. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/stream_type.py +0 -0
  167. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/token_flow.py +0 -0
  168. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/token_flow.pyi +0 -0
  169. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/volume.py +0 -0
  170. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal/volume.pyi +0 -0
  171. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal.egg-info/SOURCES.txt +0 -0
  172. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal.egg-info/dependency_links.txt +0 -0
  173. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal.egg-info/entry_points.txt +0 -0
  174. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal.egg-info/requires.txt +0 -0
  175. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal.egg-info/top_level.txt +0 -0
  176. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_docs/__init__.py +0 -0
  177. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_docs/gen_cli_docs.py +0 -0
  178. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_docs/gen_reference_docs.py +0 -0
  179. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_docs/mdmd/__init__.py +0 -0
  180. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_docs/mdmd/mdmd.py +0 -0
  181. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_docs/mdmd/signatures.py +0 -0
  182. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/__init__.py +0 -0
  183. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/py.typed +0 -0
  184. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/sandbox_router.proto +0 -0
  185. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/sandbox_router_grpc.py +0 -0
  186. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/sandbox_router_pb2.py +0 -0
  187. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/sandbox_router_pb2.pyi +0 -0
  188. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/sandbox_router_pb2_grpc.py +0 -0
  189. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/sandbox_router_pb2_grpc.pyi +0 -0
  190. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/task_command_router.proto +0 -0
  191. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/task_command_router_grpc.py +0 -0
  192. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/task_command_router_pb2.py +0 -0
  193. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/task_command_router_pb2.pyi +0 -0
  194. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/task_command_router_pb2_grpc.py +0 -0
  195. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
  196. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/modal_version/__main__.py +0 -0
  197. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/pyproject.toml +0 -0
  198. {modal-1.2.1.dev14 → modal-1.2.1.dev15}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.1.dev14
3
+ Version: 1.2.1.dev15
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -33,7 +33,7 @@ class _Client:
33
33
  server_url: str,
34
34
  client_type: int,
35
35
  credentials: typing.Optional[tuple[str, str]],
36
- version: str = "1.2.1.dev14",
36
+ version: str = "1.2.1.dev15",
37
37
  ):
38
38
  """mdmd:hidden
39
39
  The Modal client object is not intended to be instantiated directly by users.
@@ -164,7 +164,7 @@ class Client:
164
164
  server_url: str,
165
165
  client_type: int,
166
166
  credentials: typing.Optional[tuple[str, str]],
167
- version: str = "1.2.1.dev14",
167
+ version: str = "1.2.1.dev15",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -321,7 +321,7 @@ class _FlashPrometheusAutoscaler:
321
321
 
322
322
  async def _compute_target_containers(self, current_replicas: int) -> int:
323
323
  """
324
- Gets internal metrics from container to autoscale up or down.
324
+ Gets metrics from container to autoscale up or down.
325
325
  """
326
326
  containers = await self._get_all_containers()
327
327
  if len(containers) > current_replicas:
@@ -334,7 +334,7 @@ class _FlashPrometheusAutoscaler:
334
334
  if current_replicas == 0:
335
335
  return 1
336
336
 
337
- # Get metrics based on autoscaler type (prometheus or internal)
337
+ # Get metrics based on autoscaler type
338
338
  sum_metric, n_containers_with_metrics = await self._get_scaling_info(containers)
339
339
 
340
340
  desired_replicas = self._calculate_desired_replicas(
@@ -406,39 +406,26 @@ class _FlashPrometheusAutoscaler:
406
406
  return desired_replicas
407
407
 
408
408
  async def _get_scaling_info(self, containers) -> tuple[float, int]:
409
- """Get metrics using either internal container metrics API or prometheus HTTP endpoints."""
410
- if self.metrics_endpoint == "internal":
411
- container_metrics_results = await asyncio.gather(
412
- *[self._get_container_metrics(container.task_id) for container in containers]
413
- )
414
- container_metrics_list = []
415
- for container_metric in container_metrics_results:
416
- if container_metric is None:
417
- continue
418
- container_metrics_list.append(getattr(container_metric.metrics, self.target_metric))
419
-
420
- sum_metric = sum(container_metrics_list)
421
- n_containers_with_metrics = len(container_metrics_list)
422
- else:
423
- sum_metric = 0
424
- n_containers_with_metrics = 0
425
-
426
- container_metrics_list = await asyncio.gather(
427
- *[
428
- self._get_metrics(f"https://{container.host}:{container.port}/{self.metrics_endpoint}")
429
- for container in containers
430
- ]
431
- )
409
+ """Get metrics using container exposed metrics endpoints."""
410
+ sum_metric = 0
411
+ n_containers_with_metrics = 0
412
+
413
+ container_metrics_list = await asyncio.gather(
414
+ *[
415
+ self._get_metrics(f"https://{container.host}:{container.port}/{self.metrics_endpoint}")
416
+ for container in containers
417
+ ]
418
+ )
432
419
 
433
- for container_metrics in container_metrics_list:
434
- if (
435
- container_metrics is None
436
- or self.target_metric not in container_metrics
437
- or len(container_metrics[self.target_metric]) == 0
438
- ):
439
- continue
440
- sum_metric += container_metrics[self.target_metric][0].value
441
- n_containers_with_metrics += 1
420
+ for container_metrics in container_metrics_list:
421
+ if (
422
+ container_metrics is None
423
+ or self.target_metric not in container_metrics
424
+ or len(container_metrics[self.target_metric]) == 0
425
+ ):
426
+ continue
427
+ sum_metric += container_metrics[self.target_metric][0].value
428
+ n_containers_with_metrics += 1
442
429
 
443
430
  return sum_metric, n_containers_with_metrics
444
431
 
@@ -474,15 +461,6 @@ class _FlashPrometheusAutoscaler:
474
461
 
475
462
  return metrics
476
463
 
477
- async def _get_container_metrics(self, container_id: str) -> Optional[api_pb2.TaskGetAutoscalingMetricsResponse]:
478
- req = api_pb2.TaskGetAutoscalingMetricsRequest(task_id=container_id)
479
- try:
480
- resp = await retry_transient_errors(self.client.stub.TaskGetAutoscalingMetrics, req)
481
- return resp
482
- except Exception as e:
483
- logger.warning(f"[Modal Flash] Error getting metrics for container {container_id}: {e}")
484
- return None
485
-
486
464
  async def _get_all_containers(self):
487
465
  req = api_pb2.FlashContainerListRequest(function_id=self.fn.object_id)
488
466
  resp = await retry_transient_errors(self.client.stub.FlashContainerList, req)
@@ -572,14 +550,10 @@ async def flash_prometheus_autoscaler(
572
550
  app_name: str,
573
551
  cls_name: str,
574
552
  # Endpoint to fetch metrics from. Must be in Prometheus format. Example: "/metrics"
575
- # If metrics_endpoint is "internal", we will use containers' internal metrics to autoscale instead.
576
553
  metrics_endpoint: str,
577
554
  # Target metric to autoscale on. Example: "vllm:num_requests_running"
578
- # If metrics_endpoint is "internal", target_metrics options are: [cpu_usage_percent, memory_usage_percent]
579
555
  target_metric: str,
580
556
  # Target metric value. Example: 25
581
- # If metrics_endpoint is "internal", target_metric_value is a percentage value between 0.1 and 1.0 (inclusive),
582
- # indicating container's usage of that metric.
583
557
  target_metric_value: float,
584
558
  min_containers: Optional[int] = None,
585
559
  max_containers: Optional[int] = None,
@@ -1,5 +1,4 @@
1
1
  import modal.client
2
- import modal_proto.api_pb2
3
2
  import subprocess
4
3
  import typing
5
4
  import typing_extensions
@@ -139,7 +138,7 @@ class _FlashPrometheusAutoscaler:
139
138
  async def start(self): ...
140
139
  async def _run_autoscaler_loop(self): ...
141
140
  async def _compute_target_containers(self, current_replicas: int) -> int:
142
- """Gets internal metrics from container to autoscale up or down."""
141
+ """Gets metrics from container to autoscale up or down."""
143
142
  ...
144
143
 
145
144
  def _calculate_desired_replicas(
@@ -154,13 +153,10 @@ class _FlashPrometheusAutoscaler:
154
153
  ...
155
154
 
156
155
  async def _get_scaling_info(self, containers) -> tuple[float, int]:
157
- """Get metrics using either internal container metrics API or prometheus HTTP endpoints."""
156
+ """Get metrics using container exposed metrics endpoints."""
158
157
  ...
159
158
 
160
159
  async def _get_metrics(self, url: str) -> typing.Optional[dict[str, list[typing.Any]]]: ...
161
- async def _get_container_metrics(
162
- self, container_id: str
163
- ) -> typing.Optional[modal_proto.api_pb2.TaskGetAutoscalingMetricsResponse]: ...
164
160
  async def _get_all_containers(self): ...
165
161
  async def _set_target_slots(self, target_slots: int): ...
166
162
  def _make_scaling_decision(
@@ -226,11 +222,11 @@ class FlashPrometheusAutoscaler:
226
222
 
227
223
  class ___compute_target_containers_spec(typing_extensions.Protocol[SUPERSELF]):
228
224
  def __call__(self, /, current_replicas: int) -> int:
229
- """Gets internal metrics from container to autoscale up or down."""
225
+ """Gets metrics from container to autoscale up or down."""
230
226
  ...
231
227
 
232
228
  async def aio(self, /, current_replicas: int) -> int:
233
- """Gets internal metrics from container to autoscale up or down."""
229
+ """Gets metrics from container to autoscale up or down."""
234
230
  ...
235
231
 
236
232
  _compute_target_containers: ___compute_target_containers_spec[typing_extensions.Self]
@@ -248,11 +244,11 @@ class FlashPrometheusAutoscaler:
248
244
 
249
245
  class ___get_scaling_info_spec(typing_extensions.Protocol[SUPERSELF]):
250
246
  def __call__(self, /, containers) -> tuple[float, int]:
251
- """Get metrics using either internal container metrics API or prometheus HTTP endpoints."""
247
+ """Get metrics using container exposed metrics endpoints."""
252
248
  ...
253
249
 
254
250
  async def aio(self, /, containers) -> tuple[float, int]:
255
- """Get metrics using either internal container metrics API or prometheus HTTP endpoints."""
251
+ """Get metrics using container exposed metrics endpoints."""
256
252
  ...
257
253
 
258
254
  _get_scaling_info: ___get_scaling_info_spec[typing_extensions.Self]
@@ -263,16 +259,6 @@ class FlashPrometheusAutoscaler:
263
259
 
264
260
  _get_metrics: ___get_metrics_spec[typing_extensions.Self]
265
261
 
266
- class ___get_container_metrics_spec(typing_extensions.Protocol[SUPERSELF]):
267
- def __call__(
268
- self, /, container_id: str
269
- ) -> typing.Optional[modal_proto.api_pb2.TaskGetAutoscalingMetricsResponse]: ...
270
- async def aio(
271
- self, /, container_id: str
272
- ) -> typing.Optional[modal_proto.api_pb2.TaskGetAutoscalingMetricsResponse]: ...
273
-
274
- _get_container_metrics: ___get_container_metrics_spec[typing_extensions.Self]
275
-
276
262
  class ___get_all_containers_spec(typing_extensions.Protocol[SUPERSELF]):
277
263
  def __call__(self, /): ...
278
264
  async def aio(self, /): ...
@@ -401,7 +401,7 @@ class Function(
401
401
 
402
402
  _call_generator: ___call_generator_spec[typing_extensions.Self]
403
403
 
404
- class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
404
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
405
405
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
406
406
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
407
407
  ...
@@ -410,7 +410,7 @@ class Function(
410
410
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
411
411
  ...
412
412
 
413
- remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
413
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
414
414
 
415
415
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
416
416
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -437,7 +437,7 @@ class Function(
437
437
  """
438
438
  ...
439
439
 
440
- class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
440
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
441
441
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
442
442
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
443
443
 
@@ -461,7 +461,7 @@ class Function(
461
461
  ...
462
462
 
463
463
  _experimental_spawn: ___experimental_spawn_spec[
464
- modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
464
+ modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
465
465
  ]
466
466
 
467
467
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -470,7 +470,7 @@ class Function(
470
470
 
471
471
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
472
472
 
473
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
473
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
474
474
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
475
475
  """Calls the function with the given arguments, without waiting for the results.
476
476
 
@@ -491,7 +491,7 @@ class Function(
491
491
  """
492
492
  ...
493
493
 
494
- spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
494
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
495
495
 
496
496
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
497
497
  """Return the inner Python object wrapped by this Modal Function."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.1.dev14
3
+ Version: 1.2.1.dev15
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -3143,14 +3143,6 @@ message TaskCurrentInputsResponse {
3143
3143
  repeated string input_ids = 1;
3144
3144
  }
3145
3145
 
3146
- message TaskGetAutoscalingMetricsRequest {
3147
- string task_id = 1;
3148
- }
3149
-
3150
- message TaskGetAutoscalingMetricsResponse {
3151
- AutoscalingMetrics metrics = 1;
3152
- }
3153
-
3154
3146
  // Used to get a JWT and URL for direct access to a task command router
3155
3147
  // running on the modal-worker, so the client can issue exec commands (and other
3156
3148
  // operations as they become available) directly to the worker.
@@ -3778,7 +3770,6 @@ service ModalClient {
3778
3770
  // Tasks
3779
3771
  rpc TaskClusterHello(TaskClusterHelloRequest) returns (TaskClusterHelloResponse);
3780
3772
  rpc TaskCurrentInputs(google.protobuf.Empty) returns (TaskCurrentInputsResponse);
3781
- rpc TaskGetAutoscalingMetrics(TaskGetAutoscalingMetricsRequest) returns (TaskGetAutoscalingMetricsResponse); // Used for flash autoscaling
3782
3773
  rpc TaskGetCommandRouterAccess(TaskGetCommandRouterAccessRequest) returns (TaskGetCommandRouterAccessResponse);
3783
3774
  rpc TaskList(TaskListRequest) returns (TaskListResponse);
3784
3775
  rpc TaskResult(TaskResultRequest) returns (google.protobuf.Empty);
@@ -610,10 +610,6 @@ class ModalClientBase(abc.ABC):
610
610
  async def TaskCurrentInputs(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.TaskCurrentInputsResponse]') -> None:
611
611
  pass
612
612
 
613
- @abc.abstractmethod
614
- async def TaskGetAutoscalingMetrics(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.TaskGetAutoscalingMetricsRequest, modal_proto.api_pb2.TaskGetAutoscalingMetricsResponse]') -> None:
615
- pass
616
-
617
613
  @abc.abstractmethod
618
614
  async def TaskGetCommandRouterAccess(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.TaskGetCommandRouterAccessRequest, modal_proto.api_pb2.TaskGetCommandRouterAccessResponse]') -> None:
619
615
  pass
@@ -1608,12 +1604,6 @@ class ModalClientBase(abc.ABC):
1608
1604
  google.protobuf.empty_pb2.Empty,
1609
1605
  modal_proto.api_pb2.TaskCurrentInputsResponse,
1610
1606
  ),
1611
- '/modal.client.ModalClient/TaskGetAutoscalingMetrics': grpclib.const.Handler(
1612
- self.TaskGetAutoscalingMetrics,
1613
- grpclib.const.Cardinality.UNARY_UNARY,
1614
- modal_proto.api_pb2.TaskGetAutoscalingMetricsRequest,
1615
- modal_proto.api_pb2.TaskGetAutoscalingMetricsResponse,
1616
- ),
1617
1607
  '/modal.client.ModalClient/TaskGetCommandRouterAccess': grpclib.const.Handler(
1618
1608
  self.TaskGetCommandRouterAccess,
1619
1609
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -2664,12 +2654,6 @@ class ModalClientStub:
2664
2654
  google.protobuf.empty_pb2.Empty,
2665
2655
  modal_proto.api_pb2.TaskCurrentInputsResponse,
2666
2656
  )
2667
- self.TaskGetAutoscalingMetrics = grpclib.client.UnaryUnaryMethod(
2668
- channel,
2669
- '/modal.client.ModalClient/TaskGetAutoscalingMetrics',
2670
- modal_proto.api_pb2.TaskGetAutoscalingMetricsRequest,
2671
- modal_proto.api_pb2.TaskGetAutoscalingMetricsResponse,
2672
- )
2673
2657
  self.TaskGetCommandRouterAccess = grpclib.client.UnaryUnaryMethod(
2674
2658
  channel,
2675
2659
  '/modal.client.ModalClient/TaskGetCommandRouterAccess',