modal 1.1.5.dev0__tar.gz → 1.1.5.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/PKG-INFO +1 -1
  2. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/client.pyi +2 -2
  3. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/experimental/flash.py +29 -12
  4. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal.egg-info/PKG-INFO +1 -1
  5. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_version/__init__.py +1 -1
  6. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/LICENSE +0 -0
  7. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/README.md +0 -0
  8. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/__init__.py +0 -0
  9. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/__main__.py +0 -0
  10. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_clustered_functions.py +0 -0
  11. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_clustered_functions.pyi +0 -0
  12. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_container_entrypoint.py +0 -0
  13. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_functions.py +0 -0
  14. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_ipython.py +0 -0
  15. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_location.py +0 -0
  16. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_object.py +0 -0
  17. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_output.py +0 -0
  18. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_partial_function.py +0 -0
  19. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_pty.py +0 -0
  20. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_resolver.py +0 -0
  21. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_resources.py +0 -0
  22. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_runtime/__init__.py +0 -0
  23. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_runtime/asgi.py +0 -0
  24. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_runtime/container_io_manager.py +0 -0
  25. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_runtime/container_io_manager.pyi +0 -0
  26. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_runtime/execution_context.py +0 -0
  27. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_runtime/execution_context.pyi +0 -0
  28. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  29. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_runtime/telemetry.py +0 -0
  30. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_runtime/user_code_imports.py +0 -0
  31. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_serialization.py +0 -0
  32. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_traceback.py +0 -0
  33. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_tunnel.py +0 -0
  34. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_tunnel.pyi +0 -0
  35. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_type_manager.py +0 -0
  36. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/__init__.py +0 -0
  37. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/app_utils.py +0 -0
  38. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/async_utils.py +0 -0
  39. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/auth_token_manager.py +0 -0
  40. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/blob_utils.py +0 -0
  41. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/bytes_io_segment_payload.py +0 -0
  42. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/deprecation.py +0 -0
  43. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/docker_utils.py +0 -0
  44. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/function_utils.py +0 -0
  45. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/git_utils.py +0 -0
  46. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/grpc_testing.py +0 -0
  47. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/grpc_utils.py +0 -0
  48. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/hash_utils.py +0 -0
  49. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/http_utils.py +0 -0
  50. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/jwt_utils.py +0 -0
  51. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/logger.py +0 -0
  52. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/mount_utils.py +0 -0
  53. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/name_utils.py +0 -0
  54. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/package_utils.py +0 -0
  55. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/pattern_utils.py +0 -0
  56. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/rand_pb_testing.py +0 -0
  57. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/shell_utils.py +0 -0
  58. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_utils/time_utils.py +0 -0
  59. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_vendor/__init__.py +0 -0
  60. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  61. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_vendor/cloudpickle.py +0 -0
  62. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_vendor/tblib.py +0 -0
  63. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/_watcher.py +0 -0
  64. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/app.py +0 -0
  65. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/app.pyi +0 -0
  66. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/builder/2023.12.312.txt +0 -0
  67. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/builder/2023.12.txt +0 -0
  68. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/builder/2024.04.txt +0 -0
  69. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/builder/2024.10.txt +0 -0
  70. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/builder/2025.06.txt +0 -0
  71. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/builder/PREVIEW.txt +0 -0
  72. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/builder/README.md +0 -0
  73. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/builder/base-images.json +0 -0
  74. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/call_graph.py +0 -0
  75. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/__init__.py +0 -0
  76. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/_download.py +0 -0
  77. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/_traceback.py +0 -0
  78. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/app.py +0 -0
  79. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/cluster.py +0 -0
  80. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/config.py +0 -0
  81. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/container.py +0 -0
  82. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/dict.py +0 -0
  83. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/entry_point.py +0 -0
  84. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/environment.py +0 -0
  85. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/import_refs.py +0 -0
  86. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/launch.py +0 -0
  87. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/network_file_system.py +0 -0
  88. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/profile.py +0 -0
  89. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/programs/__init__.py +0 -0
  90. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/programs/launch_instance_ssh.py +0 -0
  91. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/programs/run_jupyter.py +0 -0
  92. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/programs/run_marimo.py +0 -0
  93. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/programs/vscode.py +0 -0
  94. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/queues.py +0 -0
  95. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/run.py +0 -0
  96. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/secret.py +0 -0
  97. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/token.py +0 -0
  98. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/utils.py +0 -0
  99. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cli/volume.py +0 -0
  100. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/client.py +0 -0
  101. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cloud_bucket_mount.py +0 -0
  102. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cloud_bucket_mount.pyi +0 -0
  103. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cls.py +0 -0
  104. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/cls.pyi +0 -0
  105. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/config.py +0 -0
  106. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/container_process.py +0 -0
  107. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/container_process.pyi +0 -0
  108. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/dict.py +0 -0
  109. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/dict.pyi +0 -0
  110. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/environments.py +0 -0
  111. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/environments.pyi +0 -0
  112. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/exception.py +0 -0
  113. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/experimental/__init__.py +0 -0
  114. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/experimental/flash.pyi +0 -0
  115. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/experimental/ipython.py +0 -0
  116. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/file_io.py +0 -0
  117. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/file_io.pyi +0 -0
  118. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/file_pattern_matcher.py +0 -0
  119. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/functions.py +0 -0
  120. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/functions.pyi +0 -0
  121. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/gpu.py +0 -0
  122. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/image.py +0 -0
  123. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/image.pyi +0 -0
  124. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/io_streams.py +0 -0
  125. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/io_streams.pyi +0 -0
  126. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/mount.py +0 -0
  127. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/mount.pyi +0 -0
  128. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/network_file_system.py +0 -0
  129. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/network_file_system.pyi +0 -0
  130. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/object.py +0 -0
  131. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/object.pyi +0 -0
  132. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/output.py +0 -0
  133. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/parallel_map.py +0 -0
  134. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/parallel_map.pyi +0 -0
  135. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/partial_function.py +0 -0
  136. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/partial_function.pyi +0 -0
  137. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/proxy.py +0 -0
  138. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/proxy.pyi +0 -0
  139. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/py.typed +0 -0
  140. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/queue.py +0 -0
  141. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/queue.pyi +0 -0
  142. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/retries.py +0 -0
  143. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/runner.py +0 -0
  144. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/runner.pyi +0 -0
  145. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/running_app.py +0 -0
  146. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/sandbox.py +0 -0
  147. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/sandbox.pyi +0 -0
  148. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/schedule.py +0 -0
  149. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/scheduler_placement.py +0 -0
  150. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/secret.py +0 -0
  151. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/secret.pyi +0 -0
  152. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/serving.py +0 -0
  153. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/serving.pyi +0 -0
  154. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/snapshot.py +0 -0
  155. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/snapshot.pyi +0 -0
  156. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/stream_type.py +0 -0
  157. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/token_flow.py +0 -0
  158. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/token_flow.pyi +0 -0
  159. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/volume.py +0 -0
  160. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal/volume.pyi +0 -0
  161. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal.egg-info/SOURCES.txt +0 -0
  162. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal.egg-info/dependency_links.txt +0 -0
  163. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal.egg-info/entry_points.txt +0 -0
  164. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal.egg-info/requires.txt +0 -0
  165. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal.egg-info/top_level.txt +0 -0
  166. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_docs/__init__.py +0 -0
  167. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_docs/gen_cli_docs.py +0 -0
  168. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_docs/gen_reference_docs.py +0 -0
  169. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_docs/mdmd/__init__.py +0 -0
  170. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_docs/mdmd/mdmd.py +0 -0
  171. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_docs/mdmd/signatures.py +0 -0
  172. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/__init__.py +0 -0
  173. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/api.proto +0 -0
  174. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/api_grpc.py +0 -0
  175. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/api_pb2.py +0 -0
  176. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/api_pb2.pyi +0 -0
  177. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/api_pb2_grpc.py +0 -0
  178. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/api_pb2_grpc.pyi +0 -0
  179. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/modal_api_grpc.py +0 -0
  180. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/modal_options_grpc.py +0 -0
  181. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/options.proto +0 -0
  182. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/options_grpc.py +0 -0
  183. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/options_pb2.py +0 -0
  184. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/options_pb2.pyi +0 -0
  185. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/options_pb2_grpc.py +0 -0
  186. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/options_pb2_grpc.pyi +0 -0
  187. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_proto/py.typed +0 -0
  188. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/modal_version/__main__.py +0 -0
  189. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/pyproject.toml +0 -0
  190. {modal-1.1.5.dev0 → modal-1.1.5.dev1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev0
3
+ Version: 1.1.5.dev1
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.1.5.dev0",
36
+ version: str = "1.1.5.dev1",
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.1.5.dev0",
167
+ version: str = "1.1.5.dev1",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -337,25 +337,42 @@ class _FlashPrometheusAutoscaler:
337
337
  if not internal_metrics_list:
338
338
  return current_replicas
339
339
 
340
- avg_internal_metric = sum(internal_metrics_list) / len(internal_metrics_list)
340
+ sum_metric = sum(internal_metrics_list)
341
+ containers_with_metrics = len(internal_metrics_list)
342
+ # n_containers_missing_metric is the number of unhealthy containers + number of cold starting containers
343
+ n_containers_missing_metric = current_replicas - containers_with_metrics
344
+ # n_containers_unhealthy is the number of live containers that are not emitting metrics i.e. unhealthy
345
+ n_containers_unhealthy = len(containers) - containers_with_metrics
346
+
347
+ # Scale up assuming that every unhealthy container is at 2x the target metric value.
348
+ scale_up_target_metric_value = (sum_metric + n_containers_unhealthy * self.target_metric_value) / (
349
+ (containers_with_metrics + n_containers_unhealthy) or 1
350
+ )
351
+
352
+ # Scale down assuming that every container (including cold starting containers) are at the target metric value.
353
+ scale_down_target_metric_value = (sum_metric + n_containers_missing_metric * self.target_metric_value) / (
354
+ current_replicas or 1
355
+ )
341
356
 
342
- scale_factor = avg_internal_metric / self.target_metric_value
357
+ scale_up_ratio = scale_up_target_metric_value / self.target_metric_value
358
+ scale_down_ratio = scale_down_target_metric_value / self.target_metric_value
343
359
 
344
360
  desired_replicas = current_replicas
345
- if scale_factor > 1 + self.scale_up_tolerance:
346
- desired_replicas = math.ceil(current_replicas * scale_factor)
347
- elif scale_factor < 1 - self.scale_down_tolerance:
348
- desired_replicas = math.ceil(current_replicas * scale_factor)
361
+ if scale_up_ratio > 1 + self.scale_up_tolerance:
362
+ desired_replicas = math.ceil(current_replicas * scale_up_ratio)
363
+ elif scale_down_ratio < 1 - self.scale_down_tolerance:
364
+ desired_replicas = math.ceil(current_replicas * scale_down_ratio)
349
365
 
350
366
  logger.warning(
351
367
  f"[Modal Flash] Current replicas: {current_replicas}, "
352
- f"avg internal metric `{self.target_metric}`: {avg_internal_metric}, "
368
+ f"sum internal metric `{self.target_metric}`: {sum_metric}, "
353
369
  f"target internal metric value: {self.target_metric_value}, "
354
- f"scale factor: {scale_factor}, "
370
+ f"scale up ratio: {scale_up_ratio}, "
371
+ f"scale down ratio: {scale_down_ratio}, "
355
372
  f"desired replicas: {desired_replicas}"
356
373
  )
357
374
 
358
- desired_replicas = max(1, min(desired_replicas, self.max_containers or 1000))
375
+ desired_replicas = max(1, min(desired_replicas, self.max_containers or 5000))
359
376
  return desired_replicas
360
377
 
361
378
  async def _compute_target_containers_prometheus(self, current_replicas: int) -> int:
@@ -405,9 +422,9 @@ class _FlashPrometheusAutoscaler:
405
422
  )
406
423
 
407
424
  # Scale down assuming that every container (including cold starting containers) are at the target metric value.
408
- scale_down_target_metric_value = (
409
- sum_metric + n_containers_missing_metric * target_metric_value
410
- ) / current_replicas
425
+ scale_down_target_metric_value = (sum_metric + n_containers_missing_metric * target_metric_value) / (
426
+ current_replicas or 1
427
+ )
411
428
 
412
429
  scale_up_ratio = scale_up_target_metric_value / target_metric_value
413
430
  scale_down_ratio = scale_down_target_metric_value / target_metric_value
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev0
3
+ Version: 1.1.5.dev1
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.1.5.dev0"
4
+ __version__ = "1.1.5.dev1"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes