modal 1.1.5.dev22__tar.gz → 1.1.5.dev24__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 (190) hide show
  1. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/PKG-INFO +1 -1
  2. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_container_entrypoint.py +1 -1
  3. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_runtime/user_code_imports.py +13 -53
  4. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/client.pyi +2 -2
  5. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/experimental/flash.py +2 -4
  6. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_version/__init__.py +1 -1
  8. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/LICENSE +0 -0
  9. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/README.md +0 -0
  10. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/__init__.py +0 -0
  11. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/__main__.py +0 -0
  12. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_clustered_functions.py +0 -0
  13. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_clustered_functions.pyi +0 -0
  14. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_functions.py +0 -0
  15. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_ipython.py +0 -0
  16. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_location.py +0 -0
  17. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_object.py +0 -0
  18. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_output.py +0 -0
  19. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_partial_function.py +0 -0
  20. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_pty.py +0 -0
  21. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_resolver.py +0 -0
  22. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_resources.py +0 -0
  23. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_runtime/__init__.py +0 -0
  24. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_runtime/asgi.py +0 -0
  25. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_runtime/container_io_manager.py +0 -0
  26. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_runtime/container_io_manager.pyi +0 -0
  27. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_runtime/execution_context.py +0 -0
  28. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_runtime/execution_context.pyi +0 -0
  29. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  30. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_runtime/telemetry.py +0 -0
  31. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_serialization.py +0 -0
  32. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_traceback.py +0 -0
  33. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_tunnel.py +0 -0
  34. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_tunnel.pyi +0 -0
  35. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_type_manager.py +0 -0
  36. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/__init__.py +0 -0
  37. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/app_utils.py +0 -0
  38. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/async_utils.py +0 -0
  39. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/auth_token_manager.py +0 -0
  40. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/blob_utils.py +0 -0
  41. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/bytes_io_segment_payload.py +0 -0
  42. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/deprecation.py +0 -0
  43. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/docker_utils.py +0 -0
  44. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/function_utils.py +0 -0
  45. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/git_utils.py +0 -0
  46. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/grpc_testing.py +0 -0
  47. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/grpc_utils.py +0 -0
  48. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/hash_utils.py +0 -0
  49. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/http_utils.py +0 -0
  50. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/jwt_utils.py +0 -0
  51. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/logger.py +0 -0
  52. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/mount_utils.py +0 -0
  53. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/name_utils.py +0 -0
  54. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/package_utils.py +0 -0
  55. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/pattern_utils.py +0 -0
  56. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/rand_pb_testing.py +0 -0
  57. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/shell_utils.py +0 -0
  58. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_utils/time_utils.py +0 -0
  59. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_vendor/__init__.py +0 -0
  60. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  61. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_vendor/cloudpickle.py +0 -0
  62. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_vendor/tblib.py +0 -0
  63. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/_watcher.py +0 -0
  64. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/app.py +0 -0
  65. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/app.pyi +0 -0
  66. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/builder/2023.12.312.txt +0 -0
  67. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/builder/2023.12.txt +0 -0
  68. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/builder/2024.04.txt +0 -0
  69. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/builder/2024.10.txt +0 -0
  70. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/builder/2025.06.txt +0 -0
  71. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/builder/PREVIEW.txt +0 -0
  72. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/builder/README.md +0 -0
  73. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/builder/base-images.json +0 -0
  74. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/call_graph.py +0 -0
  75. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/__init__.py +0 -0
  76. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/_download.py +0 -0
  77. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/_traceback.py +0 -0
  78. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/app.py +0 -0
  79. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/cluster.py +0 -0
  80. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/config.py +0 -0
  81. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/container.py +0 -0
  82. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/dict.py +0 -0
  83. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/entry_point.py +0 -0
  84. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/environment.py +0 -0
  85. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/import_refs.py +0 -0
  86. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/launch.py +0 -0
  87. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/network_file_system.py +0 -0
  88. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/profile.py +0 -0
  89. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/programs/__init__.py +0 -0
  90. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/programs/launch_instance_ssh.py +0 -0
  91. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/programs/run_jupyter.py +0 -0
  92. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/programs/run_marimo.py +0 -0
  93. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/programs/vscode.py +0 -0
  94. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/queues.py +0 -0
  95. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/run.py +0 -0
  96. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/secret.py +0 -0
  97. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/token.py +0 -0
  98. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/utils.py +0 -0
  99. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cli/volume.py +0 -0
  100. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/client.py +0 -0
  101. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cloud_bucket_mount.py +0 -0
  102. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cloud_bucket_mount.pyi +0 -0
  103. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cls.py +0 -0
  104. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/cls.pyi +0 -0
  105. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/config.py +0 -0
  106. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/container_process.py +0 -0
  107. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/container_process.pyi +0 -0
  108. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/dict.py +0 -0
  109. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/dict.pyi +0 -0
  110. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/environments.py +0 -0
  111. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/environments.pyi +0 -0
  112. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/exception.py +0 -0
  113. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/experimental/__init__.py +0 -0
  114. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/experimental/flash.pyi +0 -0
  115. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/experimental/ipython.py +0 -0
  116. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/file_io.py +0 -0
  117. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/file_io.pyi +0 -0
  118. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/file_pattern_matcher.py +0 -0
  119. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/functions.py +0 -0
  120. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/functions.pyi +0 -0
  121. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/gpu.py +0 -0
  122. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/image.py +0 -0
  123. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/image.pyi +0 -0
  124. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/io_streams.py +0 -0
  125. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/io_streams.pyi +0 -0
  126. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/mount.py +0 -0
  127. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/mount.pyi +0 -0
  128. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/network_file_system.py +0 -0
  129. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/network_file_system.pyi +0 -0
  130. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/object.py +0 -0
  131. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/object.pyi +0 -0
  132. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/output.py +0 -0
  133. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/parallel_map.py +0 -0
  134. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/parallel_map.pyi +0 -0
  135. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/partial_function.py +0 -0
  136. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/partial_function.pyi +0 -0
  137. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/proxy.py +0 -0
  138. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/proxy.pyi +0 -0
  139. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/py.typed +0 -0
  140. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/queue.py +0 -0
  141. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/queue.pyi +0 -0
  142. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/retries.py +0 -0
  143. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/runner.py +0 -0
  144. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/runner.pyi +0 -0
  145. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/running_app.py +0 -0
  146. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/sandbox.py +0 -0
  147. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/sandbox.pyi +0 -0
  148. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/schedule.py +0 -0
  149. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/scheduler_placement.py +0 -0
  150. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/secret.py +0 -0
  151. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/secret.pyi +0 -0
  152. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/serving.py +0 -0
  153. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/serving.pyi +0 -0
  154. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/snapshot.py +0 -0
  155. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/snapshot.pyi +0 -0
  156. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/stream_type.py +0 -0
  157. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/token_flow.py +0 -0
  158. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/token_flow.pyi +0 -0
  159. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/volume.py +0 -0
  160. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal/volume.pyi +0 -0
  161. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal.egg-info/SOURCES.txt +0 -0
  162. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal.egg-info/dependency_links.txt +0 -0
  163. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal.egg-info/entry_points.txt +0 -0
  164. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal.egg-info/requires.txt +0 -0
  165. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal.egg-info/top_level.txt +0 -0
  166. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_docs/__init__.py +0 -0
  167. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_docs/gen_cli_docs.py +0 -0
  168. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_docs/gen_reference_docs.py +0 -0
  169. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_docs/mdmd/__init__.py +0 -0
  170. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_docs/mdmd/mdmd.py +0 -0
  171. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_docs/mdmd/signatures.py +0 -0
  172. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/__init__.py +0 -0
  173. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/api.proto +0 -0
  174. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/api_grpc.py +0 -0
  175. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/api_pb2.py +0 -0
  176. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/api_pb2.pyi +0 -0
  177. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/api_pb2_grpc.py +0 -0
  178. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/api_pb2_grpc.pyi +0 -0
  179. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/modal_api_grpc.py +0 -0
  180. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/modal_options_grpc.py +0 -0
  181. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/options.proto +0 -0
  182. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/options_grpc.py +0 -0
  183. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/options_pb2.py +0 -0
  184. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/options_pb2.pyi +0 -0
  185. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/options_pb2_grpc.py +0 -0
  186. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/options_pb2_grpc.pyi +0 -0
  187. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_proto/py.typed +0 -0
  188. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/modal_version/__main__.py +0 -0
  189. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/pyproject.toml +0 -0
  190. {modal-1.1.5.dev22 → modal-1.1.5.dev24}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev22
3
+ Version: 1.1.5.dev24
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -437,9 +437,9 @@ def main(container_args: api_pb2.ContainerArguments, client: Client):
437
437
  param_kwargs,
438
438
  )
439
439
  else:
440
+ assert ser_usr_cls is None
440
441
  service = import_single_function_service(
441
442
  function_def,
442
- ser_usr_cls,
443
443
  ser_fun,
444
444
  )
445
445
 
@@ -93,9 +93,9 @@ def construct_webhook_callable(
93
93
 
94
94
  @dataclass
95
95
  class ImportedFunction(Service):
96
- user_cls_instance: Any
97
96
  app: modal.app._App
98
97
  service_deps: Optional[Sequence["modal._object._Object"]]
98
+ user_cls_instance = None
99
99
 
100
100
  _user_defined_callable: Callable[..., Any]
101
101
 
@@ -199,7 +199,6 @@ def get_user_class_instance(_cls: modal.cls._Cls, args: tuple[Any, ...], kwargs:
199
199
 
200
200
  def import_single_function_service(
201
201
  function_def: api_pb2.Function,
202
- ser_cls: Optional[type], # used only for @build functions
203
202
  ser_fun: Optional[Callable[..., Any]],
204
203
  ) -> Service:
205
204
  """Imports a function dynamically, and locates the app.
@@ -228,12 +227,9 @@ def import_single_function_service(
228
227
  service_deps: Optional[Sequence["modal._object._Object"]] = None
229
228
  active_app: modal.app._App
230
229
 
231
- user_cls_or_cls: typing.Union[None, type, modal.cls.Cls]
232
- user_cls_instance = None
233
-
234
230
  if ser_fun is not None:
235
231
  # This is a serialized function we already fetched from the server
236
- user_cls_or_cls, user_defined_callable = ser_cls, ser_fun
232
+ user_defined_callable = ser_fun
237
233
  active_app = get_active_app_fallback(function_def)
238
234
  else:
239
235
  # Load the module dynamically
@@ -244,58 +240,22 @@ def import_single_function_service(
244
240
  raise LocalFunctionError("Attempted to load a function defined in a function scope")
245
241
 
246
242
  parts = qual_name.split(".")
247
- if len(parts) == 1:
248
- # This is a function
249
- user_cls_or_cls = None
250
- f = getattr(module, qual_name)
251
- if isinstance(f, Function):
252
- _function: modal._functions._Function[Any, Any, Any] = synchronizer._translate_in(f) # type: ignore
253
- service_deps = _function.deps(only_explicit_mounts=True)
254
- user_defined_callable = _function.get_raw_f()
255
- assert _function._app # app should always be set on a decorated function
256
- active_app = _function._app
257
- else:
258
- user_defined_callable = f
259
- active_app = get_active_app_fallback(function_def)
260
-
261
- elif len(parts) == 2:
262
- # This path should only be triggered by @build class builder methods and can be removed
263
- # once @build is deprecated.
264
- assert not function_def.use_method_name # new "placeholder methods" should not be invoked directly!
265
- assert function_def.is_builder_function
266
- cls_name, fun_name = parts
267
- user_cls_or_cls = getattr(module, cls_name)
268
- if isinstance(user_cls_or_cls, modal.cls.Cls):
269
- # The cls decorator is in global scope
270
- _cls = typing.cast(modal.cls._Cls, synchronizer._translate_in(user_cls_or_cls))
271
- user_defined_callable = _cls._callables[fun_name]
272
- # Intentionally not including these, since @build functions don't actually
273
- # forward the information from their parent class.
274
- # service_deps = _cls._get_class_service_function().deps(only_explicit_mounts=True)
275
- assert _cls._app
276
- active_app = _cls._app
277
- else:
278
- # This is non-decorated class
279
- user_defined_callable = getattr(user_cls_or_cls, fun_name) # unbound method
280
- active_app = get_active_app_fallback(function_def)
281
- else:
243
+ if len(parts) != 1:
282
244
  raise InvalidError(f"Invalid function qualname {qual_name}")
283
245
 
284
- # Instantiate the class if it's defined
285
- if user_cls_or_cls:
286
- if isinstance(user_cls_or_cls, modal.cls.Cls):
287
- # This code is only used for @build methods on classes
288
- _cls = typing.cast(modal.cls._Cls, user_cls_or_cls)
289
- user_cls_instance = get_user_class_instance(_cls, (), {})
290
- # Bind the unbound method to the instance as self (using the descriptor protocol!)
246
+ f = getattr(module, qual_name)
247
+ if isinstance(f, Function):
248
+ _function: modal._functions._Function[Any, Any, Any] = synchronizer._translate_in(f) # type: ignore
249
+ service_deps = _function.deps(only_explicit_mounts=True)
250
+ user_defined_callable = _function.get_raw_f()
251
+ assert _function._app # app should always be set on a decorated function
252
+ active_app = _function._app
291
253
  else:
292
- # serialized=True or "undecorated"
293
- user_cls_instance = user_cls_or_cls()
294
-
295
- user_defined_callable = user_defined_callable.__get__(user_cls_instance)
254
+ # function isn't decorated in global scope
255
+ user_defined_callable = f
256
+ active_app = get_active_app_fallback(function_def)
296
257
 
297
258
  return ImportedFunction(
298
- user_cls_instance,
299
259
  active_app,
300
260
  service_deps,
301
261
  user_defined_callable,
@@ -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.dev22",
36
+ version: str = "1.1.5.dev24",
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.dev22",
167
+ version: str = "1.1.5.dev24",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -365,15 +365,13 @@ class _FlashPrometheusAutoscaler:
365
365
  # n_containers_unhealthy = number of dns registered containers that are not emitting metrics
366
366
  n_containers_unhealthy = n_total_containers - n_containers_with_metrics
367
367
 
368
- # number of total containers - buffer containers
369
- # This is used in 1) scale ratio denominators 2) provisioning base.
370
368
  # Max is used to handle case when buffer_containers are first initialized.
371
369
  num_provisioned_containers = max(n_current_replicas - buffer_containers, 1)
372
370
 
373
- # Scale up assuming that every unhealthy container is at (1 + scale_up_tolerance)x the target metric value.
371
+ # Scale up assuming that every unhealthy container is at 1.5 x (1 + scale_up_tolerance) the target metric value.
374
372
  # This way if all containers are unhealthy, we will increase our number of containers.
375
373
  scale_up_target_metric_value = (
376
- sum_metric + (1 + self.scale_up_tolerance) * n_containers_unhealthy * target_metric_value
374
+ sum_metric + 1.5 * (1 + self.scale_up_tolerance) * n_containers_unhealthy * target_metric_value
377
375
  ) / (num_provisioned_containers)
378
376
 
379
377
  # Scale down assuming that every container (including cold starting containers) are at the target metric value.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev22
3
+ Version: 1.1.5.dev24
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.dev22"
4
+ __version__ = "1.1.5.dev24"
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