modal 1.1.5.dev23__tar.gz → 1.1.5.dev25__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.dev23 → modal-1.1.5.dev25}/PKG-INFO +1 -1
  2. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_container_entrypoint.py +1 -1
  3. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_runtime/user_code_imports.py +13 -53
  4. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/client.pyi +2 -2
  5. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/functions.pyi +6 -6
  6. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal.egg-info/PKG-INFO +1 -1
  7. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/api.proto +22 -1
  8. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/api_pb2.py +902 -869
  9. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/api_pb2.pyi +78 -1
  10. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_version/__init__.py +1 -1
  11. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/LICENSE +0 -0
  12. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/README.md +0 -0
  13. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/__init__.py +0 -0
  14. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/__main__.py +0 -0
  15. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_clustered_functions.py +0 -0
  16. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_clustered_functions.pyi +0 -0
  17. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_functions.py +0 -0
  18. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_ipython.py +0 -0
  19. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_location.py +0 -0
  20. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_object.py +0 -0
  21. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_output.py +0 -0
  22. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_partial_function.py +0 -0
  23. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_pty.py +0 -0
  24. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_resolver.py +0 -0
  25. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_resources.py +0 -0
  26. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_runtime/__init__.py +0 -0
  27. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_runtime/asgi.py +0 -0
  28. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_runtime/container_io_manager.py +0 -0
  29. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_runtime/container_io_manager.pyi +0 -0
  30. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_runtime/execution_context.py +0 -0
  31. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_runtime/execution_context.pyi +0 -0
  32. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  33. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_runtime/telemetry.py +0 -0
  34. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_serialization.py +0 -0
  35. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_traceback.py +0 -0
  36. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_tunnel.py +0 -0
  37. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_tunnel.pyi +0 -0
  38. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_type_manager.py +0 -0
  39. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/__init__.py +0 -0
  40. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/app_utils.py +0 -0
  41. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/async_utils.py +0 -0
  42. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/auth_token_manager.py +0 -0
  43. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/blob_utils.py +0 -0
  44. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/bytes_io_segment_payload.py +0 -0
  45. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/deprecation.py +0 -0
  46. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/docker_utils.py +0 -0
  47. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/function_utils.py +0 -0
  48. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/git_utils.py +0 -0
  49. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/grpc_testing.py +0 -0
  50. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/grpc_utils.py +0 -0
  51. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/hash_utils.py +0 -0
  52. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/http_utils.py +0 -0
  53. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/jwt_utils.py +0 -0
  54. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/logger.py +0 -0
  55. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/mount_utils.py +0 -0
  56. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/name_utils.py +0 -0
  57. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/package_utils.py +0 -0
  58. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/pattern_utils.py +0 -0
  59. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/rand_pb_testing.py +0 -0
  60. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/shell_utils.py +0 -0
  61. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_utils/time_utils.py +0 -0
  62. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_vendor/__init__.py +0 -0
  63. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  64. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_vendor/cloudpickle.py +0 -0
  65. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_vendor/tblib.py +0 -0
  66. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/_watcher.py +0 -0
  67. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/app.py +0 -0
  68. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/app.pyi +0 -0
  69. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/builder/2023.12.312.txt +0 -0
  70. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/builder/2023.12.txt +0 -0
  71. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/builder/2024.04.txt +0 -0
  72. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/builder/2024.10.txt +0 -0
  73. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/builder/2025.06.txt +0 -0
  74. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/builder/PREVIEW.txt +0 -0
  75. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/builder/README.md +0 -0
  76. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/builder/base-images.json +0 -0
  77. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/call_graph.py +0 -0
  78. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/__init__.py +0 -0
  79. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/_download.py +0 -0
  80. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/_traceback.py +0 -0
  81. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/app.py +0 -0
  82. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/cluster.py +0 -0
  83. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/config.py +0 -0
  84. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/container.py +0 -0
  85. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/dict.py +0 -0
  86. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/entry_point.py +0 -0
  87. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/environment.py +0 -0
  88. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/import_refs.py +0 -0
  89. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/launch.py +0 -0
  90. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/network_file_system.py +0 -0
  91. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/profile.py +0 -0
  92. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/programs/__init__.py +0 -0
  93. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/programs/launch_instance_ssh.py +0 -0
  94. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/programs/run_jupyter.py +0 -0
  95. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/programs/run_marimo.py +0 -0
  96. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/programs/vscode.py +0 -0
  97. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/queues.py +0 -0
  98. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/run.py +0 -0
  99. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/secret.py +0 -0
  100. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/token.py +0 -0
  101. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/utils.py +0 -0
  102. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cli/volume.py +0 -0
  103. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/client.py +0 -0
  104. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cloud_bucket_mount.py +0 -0
  105. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cloud_bucket_mount.pyi +0 -0
  106. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cls.py +0 -0
  107. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/cls.pyi +0 -0
  108. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/config.py +0 -0
  109. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/container_process.py +0 -0
  110. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/container_process.pyi +0 -0
  111. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/dict.py +0 -0
  112. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/dict.pyi +0 -0
  113. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/environments.py +0 -0
  114. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/environments.pyi +0 -0
  115. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/exception.py +0 -0
  116. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/experimental/__init__.py +0 -0
  117. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/experimental/flash.py +0 -0
  118. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/experimental/flash.pyi +0 -0
  119. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/experimental/ipython.py +0 -0
  120. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/file_io.py +0 -0
  121. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/file_io.pyi +0 -0
  122. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/file_pattern_matcher.py +0 -0
  123. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/functions.py +0 -0
  124. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/gpu.py +0 -0
  125. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/image.py +0 -0
  126. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/image.pyi +0 -0
  127. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/io_streams.py +0 -0
  128. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/io_streams.pyi +0 -0
  129. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/mount.py +0 -0
  130. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/mount.pyi +0 -0
  131. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/network_file_system.py +0 -0
  132. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/network_file_system.pyi +0 -0
  133. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/object.py +0 -0
  134. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/object.pyi +0 -0
  135. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/output.py +0 -0
  136. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/parallel_map.py +0 -0
  137. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/parallel_map.pyi +0 -0
  138. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/partial_function.py +0 -0
  139. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/partial_function.pyi +0 -0
  140. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/proxy.py +0 -0
  141. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/proxy.pyi +0 -0
  142. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/py.typed +0 -0
  143. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/queue.py +0 -0
  144. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/queue.pyi +0 -0
  145. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/retries.py +0 -0
  146. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/runner.py +0 -0
  147. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/runner.pyi +0 -0
  148. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/running_app.py +0 -0
  149. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/sandbox.py +0 -0
  150. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/sandbox.pyi +0 -0
  151. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/schedule.py +0 -0
  152. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/scheduler_placement.py +0 -0
  153. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/secret.py +0 -0
  154. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/secret.pyi +0 -0
  155. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/serving.py +0 -0
  156. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/serving.pyi +0 -0
  157. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/snapshot.py +0 -0
  158. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/snapshot.pyi +0 -0
  159. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/stream_type.py +0 -0
  160. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/token_flow.py +0 -0
  161. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/token_flow.pyi +0 -0
  162. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/volume.py +0 -0
  163. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal/volume.pyi +0 -0
  164. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal.egg-info/SOURCES.txt +0 -0
  165. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal.egg-info/dependency_links.txt +0 -0
  166. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal.egg-info/entry_points.txt +0 -0
  167. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal.egg-info/requires.txt +0 -0
  168. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal.egg-info/top_level.txt +0 -0
  169. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_docs/__init__.py +0 -0
  170. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_docs/gen_cli_docs.py +0 -0
  171. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_docs/gen_reference_docs.py +0 -0
  172. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_docs/mdmd/__init__.py +0 -0
  173. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_docs/mdmd/mdmd.py +0 -0
  174. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_docs/mdmd/signatures.py +0 -0
  175. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/__init__.py +0 -0
  176. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/api_grpc.py +0 -0
  177. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/api_pb2_grpc.py +0 -0
  178. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/api_pb2_grpc.pyi +0 -0
  179. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/modal_api_grpc.py +0 -0
  180. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/modal_options_grpc.py +0 -0
  181. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/options.proto +0 -0
  182. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/options_grpc.py +0 -0
  183. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/options_pb2.py +0 -0
  184. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/options_pb2.pyi +0 -0
  185. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/options_pb2_grpc.py +0 -0
  186. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/options_pb2_grpc.pyi +0 -0
  187. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_proto/py.typed +0 -0
  188. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/modal_version/__main__.py +0 -0
  189. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/pyproject.toml +0 -0
  190. {modal-1.1.5.dev23 → modal-1.1.5.dev25}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev23
3
+ Version: 1.1.5.dev25
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.dev23",
36
+ version: str = "1.1.5.dev25",
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.dev23",
167
+ version: str = "1.1.5.dev25",
168
168
  ):
169
169
  """mdmd:hidden
170
170
  The Modal client object is not intended to be instantiated directly by users.
@@ -449,7 +449,7 @@ class Function(
449
449
 
450
450
  _call_generator: ___call_generator_spec[typing_extensions.Self]
451
451
 
452
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
452
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
453
453
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
454
454
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
455
455
  ...
@@ -458,7 +458,7 @@ class Function(
458
458
  """Calls the function remotely, executing it with the given arguments and returning the execution's result."""
459
459
  ...
460
460
 
461
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
461
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
462
462
 
463
463
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
464
464
  def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
@@ -485,7 +485,7 @@ class Function(
485
485
  """
486
486
  ...
487
487
 
488
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
488
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
489
489
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
490
490
  """[Experimental] Calls the function with the given arguments, without waiting for the results.
491
491
 
@@ -509,7 +509,7 @@ class Function(
509
509
  ...
510
510
 
511
511
  _experimental_spawn: ___experimental_spawn_spec[
512
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
512
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
513
513
  ]
514
514
 
515
515
  class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
@@ -518,7 +518,7 @@ class Function(
518
518
 
519
519
  _spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
520
520
 
521
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
521
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
522
522
  def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
523
523
  """Calls the function with the given arguments, without waiting for the results.
524
524
 
@@ -539,7 +539,7 @@ class Function(
539
539
  """
540
540
  ...
541
541
 
542
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
542
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
543
543
 
544
544
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
545
545
  """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.1.5.dev23
3
+ Version: 1.1.5.dev25
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -628,11 +628,26 @@ message AuthTokenGetResponse {
628
628
  string token = 1;
629
629
  }
630
630
 
631
+ // Message representing the current (coalesced) state of the autoscaler configuration
632
+ // As well as the different sources that were used to create it.
633
+ message AutoscalerConfiguration {
634
+ // The settings that are currently in effect.
635
+ AutoscalerSettings settings = 1;
636
+ // For tracking the source of the overridden value; keys correspond to fields in `settings`.
637
+ map<string, UserActionInfo> override_events = 2;
638
+ // The default settings that are used when no static settings are provided and no overrides are in effect.
639
+ AutoscalerSettings default_settings = 3;
640
+ // The static settings that were used to initialize the configuration.
641
+ AutoscalerSettings static_settings = 4;
642
+ // The merge of all overrides that were used to create the current configuration.
643
+ AutoscalerSettings override_settings = 5;
644
+ }
645
+
631
646
  message AutoscalerSettings {
632
647
  // A collection of user-configurable settings for Function autoscaling
633
648
  // These are used for static configuration and for dynamic autoscaler updates
634
649
 
635
- // Minimum containers when scale-to-zero is not deisired; pka "keep_warm" or "warm_pool_size"
650
+ // Minimum containers when scale-to-zero is not desired; pka "keep_warm" or "warm_pool_size"
636
651
  optional uint32 min_containers = 1;
637
652
  // Limit on the number of containers that can be running for each Function; pka "concurrency_limit"
638
653
  optional uint32 max_containers = 2;
@@ -3217,6 +3232,12 @@ message UploadUrlList {
3217
3232
  repeated string items = 1;
3218
3233
  }
3219
3234
 
3235
+ // Used for capturing context about an action performed by a user
3236
+ message UserActionInfo {
3237
+ string user_id = 1;
3238
+ double timestamp = 2;
3239
+ }
3240
+
3220
3241
  message VolumeCommitRequest {
3221
3242
  // NOTE(staffan): Mounting a volume in multiple locations is not supported, so volume_id alone uniquely identifies
3222
3243
  // a volume mount.