modal 0.73.45__tar.gz → 0.73.46__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 (191) hide show
  1. {modal-0.73.45 → modal-0.73.46}/PKG-INFO +20 -4
  2. modal-0.73.46/modal/_runtime/container_io_manager.pyi +395 -0
  3. modal-0.73.46/modal/_runtime/execution_context.pyi +23 -0
  4. {modal-0.73.45 → modal-0.73.46}/modal/client.pyi +2 -2
  5. {modal-0.73.45 → modal-0.73.46}/modal/functions.pyi +6 -6
  6. {modal-0.73.45 → modal-0.73.46}/modal.egg-info/PKG-INFO +20 -4
  7. {modal-0.73.45 → modal-0.73.46}/modal.egg-info/SOURCES.txt +2 -14
  8. {modal-0.73.45 → modal-0.73.46}/modal.egg-info/top_level.txt +0 -2
  9. {modal-0.73.45 → modal-0.73.46}/modal_version/_version_generated.py +1 -1
  10. modal-0.73.46/pyproject.toml +119 -0
  11. modal-0.73.46/setup.cfg +4 -0
  12. modal-0.73.45/modal_docs/__init__.py +0 -1
  13. modal-0.73.45/modal_docs/gen_cli_docs.py +0 -117
  14. modal-0.73.45/modal_docs/gen_reference_docs.py +0 -193
  15. modal-0.73.45/modal_docs/mdmd/__init__.py +0 -1
  16. modal-0.73.45/modal_docs/mdmd/mdmd.py +0 -195
  17. modal-0.73.45/modal_docs/mdmd/signatures.py +0 -76
  18. modal-0.73.45/modal_global_objects/__init__.py +0 -1
  19. modal-0.73.45/modal_global_objects/images/base_images.py +0 -28
  20. modal-0.73.45/modal_global_objects/mounts/__init__.py +0 -1
  21. modal-0.73.45/modal_global_objects/mounts/modal_client_package.py +0 -29
  22. modal-0.73.45/modal_global_objects/mounts/python_standalone.py +0 -53
  23. modal-0.73.45/modal_proto/__init__.py +0 -1
  24. modal-0.73.45/pyproject.toml +0 -64
  25. modal-0.73.45/setup.cfg +0 -62
  26. modal-0.73.45/setup.py +0 -18
  27. {modal-0.73.45 → modal-0.73.46}/LICENSE +0 -0
  28. {modal-0.73.45 → modal-0.73.46}/README.md +0 -0
  29. {modal-0.73.45 → modal-0.73.46}/modal/__init__.py +0 -0
  30. {modal-0.73.45 → modal-0.73.46}/modal/__main__.py +0 -0
  31. {modal-0.73.45 → modal-0.73.46}/modal/_clustered_functions.py +0 -0
  32. {modal-0.73.45 → modal-0.73.46}/modal/_clustered_functions.pyi +0 -0
  33. {modal-0.73.45 → modal-0.73.46}/modal/_container_entrypoint.py +0 -0
  34. {modal-0.73.45 → modal-0.73.46}/modal/_functions.py +0 -0
  35. {modal-0.73.45 → modal-0.73.46}/modal/_ipython.py +0 -0
  36. {modal-0.73.45 → modal-0.73.46}/modal/_location.py +0 -0
  37. {modal-0.73.45 → modal-0.73.46}/modal/_object.py +0 -0
  38. {modal-0.73.45 → modal-0.73.46}/modal/_output.py +0 -0
  39. {modal-0.73.45 → modal-0.73.46}/modal/_partial_function.py +0 -0
  40. {modal-0.73.45 → modal-0.73.46}/modal/_proxy_tunnel.py +0 -0
  41. {modal-0.73.45 → modal-0.73.46}/modal/_pty.py +0 -0
  42. {modal-0.73.45 → modal-0.73.46}/modal/_resolver.py +0 -0
  43. {modal-0.73.45 → modal-0.73.46}/modal/_resources.py +0 -0
  44. {modal-0.73.45 → modal-0.73.46}/modal/_runtime/__init__.py +0 -0
  45. {modal-0.73.45 → modal-0.73.46}/modal/_runtime/asgi.py +0 -0
  46. {modal-0.73.45 → modal-0.73.46}/modal/_runtime/container_io_manager.py +0 -0
  47. {modal-0.73.45 → modal-0.73.46}/modal/_runtime/execution_context.py +0 -0
  48. {modal-0.73.45 → modal-0.73.46}/modal/_runtime/gpu_memory_snapshot.py +0 -0
  49. {modal-0.73.45 → modal-0.73.46}/modal/_runtime/telemetry.py +0 -0
  50. {modal-0.73.45 → modal-0.73.46}/modal/_runtime/user_code_imports.py +0 -0
  51. {modal-0.73.45 → modal-0.73.46}/modal/_serialization.py +0 -0
  52. {modal-0.73.45 → modal-0.73.46}/modal/_traceback.py +0 -0
  53. {modal-0.73.45 → modal-0.73.46}/modal/_tunnel.py +0 -0
  54. {modal-0.73.45 → modal-0.73.46}/modal/_tunnel.pyi +0 -0
  55. {modal-0.73.45 → modal-0.73.46}/modal/_utils/__init__.py +0 -0
  56. {modal-0.73.45 → modal-0.73.46}/modal/_utils/app_utils.py +0 -0
  57. {modal-0.73.45 → modal-0.73.46}/modal/_utils/async_utils.py +0 -0
  58. {modal-0.73.45 → modal-0.73.46}/modal/_utils/blob_utils.py +0 -0
  59. {modal-0.73.45 → modal-0.73.46}/modal/_utils/bytes_io_segment_payload.py +0 -0
  60. {modal-0.73.45 → modal-0.73.46}/modal/_utils/deprecation.py +0 -0
  61. {modal-0.73.45 → modal-0.73.46}/modal/_utils/docker_utils.py +0 -0
  62. {modal-0.73.45 → modal-0.73.46}/modal/_utils/function_utils.py +0 -0
  63. {modal-0.73.45 → modal-0.73.46}/modal/_utils/grpc_testing.py +0 -0
  64. {modal-0.73.45 → modal-0.73.46}/modal/_utils/grpc_utils.py +0 -0
  65. {modal-0.73.45 → modal-0.73.46}/modal/_utils/hash_utils.py +0 -0
  66. {modal-0.73.45 → modal-0.73.46}/modal/_utils/http_utils.py +0 -0
  67. {modal-0.73.45 → modal-0.73.46}/modal/_utils/logger.py +0 -0
  68. {modal-0.73.45 → modal-0.73.46}/modal/_utils/mount_utils.py +0 -0
  69. {modal-0.73.45 → modal-0.73.46}/modal/_utils/name_utils.py +0 -0
  70. {modal-0.73.45 → modal-0.73.46}/modal/_utils/package_utils.py +0 -0
  71. {modal-0.73.45 → modal-0.73.46}/modal/_utils/pattern_utils.py +0 -0
  72. {modal-0.73.45 → modal-0.73.46}/modal/_utils/rand_pb_testing.py +0 -0
  73. {modal-0.73.45 → modal-0.73.46}/modal/_utils/shell_utils.py +0 -0
  74. {modal-0.73.45 → modal-0.73.46}/modal/_vendor/__init__.py +0 -0
  75. {modal-0.73.45 → modal-0.73.46}/modal/_vendor/a2wsgi_wsgi.py +0 -0
  76. {modal-0.73.45 → modal-0.73.46}/modal/_vendor/cloudpickle.py +0 -0
  77. {modal-0.73.45 → modal-0.73.46}/modal/_vendor/tblib.py +0 -0
  78. {modal-0.73.45 → modal-0.73.46}/modal/_watcher.py +0 -0
  79. {modal-0.73.45 → modal-0.73.46}/modal/app.py +0 -0
  80. {modal-0.73.45 → modal-0.73.46}/modal/app.pyi +0 -0
  81. {modal-0.73.45 → modal-0.73.46}/modal/call_graph.py +0 -0
  82. {modal-0.73.45 → modal-0.73.46}/modal/cli/__init__.py +0 -0
  83. {modal-0.73.45 → modal-0.73.46}/modal/cli/_download.py +0 -0
  84. {modal-0.73.45 → modal-0.73.46}/modal/cli/_traceback.py +0 -0
  85. {modal-0.73.45 → modal-0.73.46}/modal/cli/app.py +0 -0
  86. {modal-0.73.45 → modal-0.73.46}/modal/cli/config.py +0 -0
  87. {modal-0.73.45 → modal-0.73.46}/modal/cli/container.py +0 -0
  88. {modal-0.73.45 → modal-0.73.46}/modal/cli/dict.py +0 -0
  89. {modal-0.73.45 → modal-0.73.46}/modal/cli/entry_point.py +0 -0
  90. {modal-0.73.45 → modal-0.73.46}/modal/cli/environment.py +0 -0
  91. {modal-0.73.45 → modal-0.73.46}/modal/cli/import_refs.py +0 -0
  92. {modal-0.73.45 → modal-0.73.46}/modal/cli/launch.py +0 -0
  93. {modal-0.73.45 → modal-0.73.46}/modal/cli/network_file_system.py +0 -0
  94. {modal-0.73.45 → modal-0.73.46}/modal/cli/profile.py +0 -0
  95. {modal-0.73.45 → modal-0.73.46}/modal/cli/programs/__init__.py +0 -0
  96. {modal-0.73.45 → modal-0.73.46}/modal/cli/programs/run_jupyter.py +0 -0
  97. {modal-0.73.45 → modal-0.73.46}/modal/cli/programs/vscode.py +0 -0
  98. {modal-0.73.45 → modal-0.73.46}/modal/cli/queues.py +0 -0
  99. {modal-0.73.45 → modal-0.73.46}/modal/cli/run.py +0 -0
  100. {modal-0.73.45 → modal-0.73.46}/modal/cli/secret.py +0 -0
  101. {modal-0.73.45 → modal-0.73.46}/modal/cli/token.py +0 -0
  102. {modal-0.73.45 → modal-0.73.46}/modal/cli/utils.py +0 -0
  103. {modal-0.73.45 → modal-0.73.46}/modal/cli/volume.py +0 -0
  104. {modal-0.73.45 → modal-0.73.46}/modal/client.py +0 -0
  105. {modal-0.73.45 → modal-0.73.46}/modal/cloud_bucket_mount.py +0 -0
  106. {modal-0.73.45 → modal-0.73.46}/modal/cloud_bucket_mount.pyi +0 -0
  107. {modal-0.73.45 → modal-0.73.46}/modal/cls.py +0 -0
  108. {modal-0.73.45 → modal-0.73.46}/modal/cls.pyi +0 -0
  109. {modal-0.73.45 → modal-0.73.46}/modal/config.py +0 -0
  110. {modal-0.73.45 → modal-0.73.46}/modal/container_process.py +0 -0
  111. {modal-0.73.45 → modal-0.73.46}/modal/container_process.pyi +0 -0
  112. {modal-0.73.45 → modal-0.73.46}/modal/dict.py +0 -0
  113. {modal-0.73.45 → modal-0.73.46}/modal/dict.pyi +0 -0
  114. {modal-0.73.45 → modal-0.73.46}/modal/environments.py +0 -0
  115. {modal-0.73.45 → modal-0.73.46}/modal/environments.pyi +0 -0
  116. {modal-0.73.45 → modal-0.73.46}/modal/exception.py +0 -0
  117. {modal-0.73.45 → modal-0.73.46}/modal/experimental.py +0 -0
  118. {modal-0.73.45 → modal-0.73.46}/modal/experimental.pyi +0 -0
  119. {modal-0.73.45 → modal-0.73.46}/modal/extensions/__init__.py +0 -0
  120. {modal-0.73.45 → modal-0.73.46}/modal/extensions/ipython.py +0 -0
  121. {modal-0.73.45 → modal-0.73.46}/modal/file_io.py +0 -0
  122. {modal-0.73.45 → modal-0.73.46}/modal/file_io.pyi +0 -0
  123. {modal-0.73.45 → modal-0.73.46}/modal/file_pattern_matcher.py +0 -0
  124. {modal-0.73.45 → modal-0.73.46}/modal/functions.py +0 -0
  125. {modal-0.73.45 → modal-0.73.46}/modal/gpu.py +0 -0
  126. {modal-0.73.45 → modal-0.73.46}/modal/image.py +0 -0
  127. {modal-0.73.45 → modal-0.73.46}/modal/image.pyi +0 -0
  128. {modal-0.73.45 → modal-0.73.46}/modal/io_streams.py +0 -0
  129. {modal-0.73.45 → modal-0.73.46}/modal/io_streams.pyi +0 -0
  130. {modal-0.73.45 → modal-0.73.46}/modal/mount.py +0 -0
  131. {modal-0.73.45 → modal-0.73.46}/modal/mount.pyi +0 -0
  132. {modal-0.73.45 → modal-0.73.46}/modal/network_file_system.py +0 -0
  133. {modal-0.73.45 → modal-0.73.46}/modal/network_file_system.pyi +0 -0
  134. {modal-0.73.45 → modal-0.73.46}/modal/object.py +0 -0
  135. {modal-0.73.45 → modal-0.73.46}/modal/object.pyi +0 -0
  136. {modal-0.73.45 → modal-0.73.46}/modal/output.py +0 -0
  137. {modal-0.73.45 → modal-0.73.46}/modal/parallel_map.py +0 -0
  138. {modal-0.73.45 → modal-0.73.46}/modal/parallel_map.pyi +0 -0
  139. {modal-0.73.45 → modal-0.73.46}/modal/partial_function.py +0 -0
  140. {modal-0.73.45 → modal-0.73.46}/modal/partial_function.pyi +0 -0
  141. {modal-0.73.45 → modal-0.73.46}/modal/proxy.py +0 -0
  142. {modal-0.73.45 → modal-0.73.46}/modal/proxy.pyi +0 -0
  143. {modal-0.73.45 → modal-0.73.46}/modal/py.typed +0 -0
  144. {modal-0.73.45 → modal-0.73.46}/modal/queue.py +0 -0
  145. {modal-0.73.45 → modal-0.73.46}/modal/queue.pyi +0 -0
  146. {modal-0.73.45 → modal-0.73.46}/modal/requirements/2023.12.312.txt +0 -0
  147. {modal-0.73.45 → modal-0.73.46}/modal/requirements/2023.12.txt +0 -0
  148. {modal-0.73.45 → modal-0.73.46}/modal/requirements/2024.04.txt +0 -0
  149. {modal-0.73.45 → modal-0.73.46}/modal/requirements/2024.10.txt +0 -0
  150. {modal-0.73.45 → modal-0.73.46}/modal/requirements/README.md +0 -0
  151. {modal-0.73.45 → modal-0.73.46}/modal/requirements/base-images.json +0 -0
  152. {modal-0.73.45 → modal-0.73.46}/modal/retries.py +0 -0
  153. {modal-0.73.45 → modal-0.73.46}/modal/runner.py +0 -0
  154. {modal-0.73.45 → modal-0.73.46}/modal/runner.pyi +0 -0
  155. {modal-0.73.45 → modal-0.73.46}/modal/running_app.py +0 -0
  156. {modal-0.73.45 → modal-0.73.46}/modal/sandbox.py +0 -0
  157. {modal-0.73.45 → modal-0.73.46}/modal/sandbox.pyi +0 -0
  158. {modal-0.73.45 → modal-0.73.46}/modal/schedule.py +0 -0
  159. {modal-0.73.45 → modal-0.73.46}/modal/scheduler_placement.py +0 -0
  160. {modal-0.73.45 → modal-0.73.46}/modal/secret.py +0 -0
  161. {modal-0.73.45 → modal-0.73.46}/modal/secret.pyi +0 -0
  162. {modal-0.73.45 → modal-0.73.46}/modal/serving.py +0 -0
  163. {modal-0.73.45 → modal-0.73.46}/modal/serving.pyi +0 -0
  164. {modal-0.73.45 → modal-0.73.46}/modal/snapshot.py +0 -0
  165. {modal-0.73.45 → modal-0.73.46}/modal/snapshot.pyi +0 -0
  166. {modal-0.73.45 → modal-0.73.46}/modal/stream_type.py +0 -0
  167. {modal-0.73.45 → modal-0.73.46}/modal/token_flow.py +0 -0
  168. {modal-0.73.45 → modal-0.73.46}/modal/token_flow.pyi +0 -0
  169. {modal-0.73.45 → modal-0.73.46}/modal/volume.py +0 -0
  170. {modal-0.73.45 → modal-0.73.46}/modal/volume.pyi +0 -0
  171. {modal-0.73.45 → modal-0.73.46}/modal.egg-info/dependency_links.txt +0 -0
  172. {modal-0.73.45 → modal-0.73.46}/modal.egg-info/entry_points.txt +0 -0
  173. {modal-0.73.45 → modal-0.73.46}/modal.egg-info/requires.txt +0 -0
  174. {modal-0.73.45/modal_global_objects/images → modal-0.73.46/modal_proto}/__init__.py +0 -0
  175. {modal-0.73.45 → modal-0.73.46}/modal_proto/api.proto +0 -0
  176. {modal-0.73.45 → modal-0.73.46}/modal_proto/api_grpc.py +0 -0
  177. {modal-0.73.45 → modal-0.73.46}/modal_proto/api_pb2.py +0 -0
  178. {modal-0.73.45 → modal-0.73.46}/modal_proto/api_pb2.pyi +0 -0
  179. {modal-0.73.45 → modal-0.73.46}/modal_proto/api_pb2_grpc.py +0 -0
  180. {modal-0.73.45 → modal-0.73.46}/modal_proto/api_pb2_grpc.pyi +0 -0
  181. {modal-0.73.45 → modal-0.73.46}/modal_proto/modal_api_grpc.py +0 -0
  182. {modal-0.73.45 → modal-0.73.46}/modal_proto/modal_options_grpc.py +0 -0
  183. {modal-0.73.45 → modal-0.73.46}/modal_proto/options.proto +0 -0
  184. {modal-0.73.45 → modal-0.73.46}/modal_proto/options_grpc.py +0 -0
  185. {modal-0.73.45 → modal-0.73.46}/modal_proto/options_pb2.py +0 -0
  186. {modal-0.73.45 → modal-0.73.46}/modal_proto/options_pb2.pyi +0 -0
  187. {modal-0.73.45 → modal-0.73.46}/modal_proto/options_pb2_grpc.py +0 -0
  188. {modal-0.73.45 → modal-0.73.46}/modal_proto/options_pb2_grpc.pyi +0 -0
  189. {modal-0.73.45 → modal-0.73.46}/modal_proto/py.typed +0 -0
  190. {modal-0.73.45 → modal-0.73.46}/modal_version/__init__.py +0 -0
  191. {modal-0.73.45 → modal-0.73.46}/modal_version/__main__.py +0 -0
@@ -1,11 +1,13 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: modal
3
- Version: 0.73.45
3
+ Version: 0.73.46
4
4
  Summary: Python client library for Modal
5
- Author: Modal Labs
6
- Author-email: support@modal.com
5
+ Author-email: Modal Labs <support@modal.com>
6
+ License: Apache-2.0
7
7
  Project-URL: Homepage, https://modal.com
8
8
  Project-URL: Source, https://github.com/modal-labs/modal-client
9
+ Project-URL: Documentation, https://modal.com/docs
10
+ Project-URL: Issue Tracker, https://github.com/modal-labs/modal-client/issues
9
11
  Keywords: modal,client,cloud,serverless,infrastructure
10
12
  Classifier: Topic :: System :: Distributed Computing
11
13
  Classifier: Operating System :: OS Independent
@@ -14,6 +16,20 @@ Classifier: Programming Language :: Python :: 3
14
16
  Requires-Python: >=3.9
15
17
  Description-Content-Type: text/markdown
16
18
  License-File: LICENSE
19
+ Requires-Dist: aiohttp
20
+ Requires-Dist: certifi
21
+ Requires-Dist: click>=8.1.0
22
+ Requires-Dist: fastapi
23
+ Requires-Dist: grpclib==0.4.7
24
+ Requires-Dist: protobuf!=4.24.0,<6.0,>=3.19
25
+ Requires-Dist: rich>=12.0.0
26
+ Requires-Dist: synchronicity~=0.9.10
27
+ Requires-Dist: toml
28
+ Requires-Dist: typer>=0.9
29
+ Requires-Dist: types-certifi
30
+ Requires-Dist: types-toml
31
+ Requires-Dist: watchfiles
32
+ Requires-Dist: typing_extensions~=4.6
17
33
 
18
34
  # Modal Python Library
19
35
 
@@ -0,0 +1,395 @@
1
+ import asyncio
2
+ import asyncio.locks
3
+ import asyncio.queues
4
+ import collections.abc
5
+ import modal._runtime.user_code_imports
6
+ import modal.client
7
+ import modal_proto.api_pb2
8
+ import synchronicity.combined_types
9
+ import typing
10
+ import typing_extensions
11
+
12
+ class UserException(Exception): ...
13
+ class Sentinel: ...
14
+
15
+ class IOContext:
16
+ input_ids: list[str]
17
+ function_call_ids: list[str]
18
+ finalized_function: modal._runtime.user_code_imports.FinalizedFunction
19
+ _cancel_issued: bool
20
+ _cancel_callback: typing.Optional[collections.abc.Callable[[], None]]
21
+
22
+ def __init__(
23
+ self,
24
+ input_ids: list[str],
25
+ function_call_ids: list[str],
26
+ finalized_function: modal._runtime.user_code_imports.FinalizedFunction,
27
+ function_inputs: list[modal_proto.api_pb2.FunctionInput],
28
+ is_batched: bool,
29
+ client: modal.client._Client,
30
+ ): ...
31
+ @classmethod
32
+ async def create(
33
+ cls,
34
+ client: modal.client._Client,
35
+ finalized_functions: dict[str, modal._runtime.user_code_imports.FinalizedFunction],
36
+ inputs: list[tuple[str, str, modal_proto.api_pb2.FunctionInput]],
37
+ is_batched: bool,
38
+ ) -> IOContext: ...
39
+ def set_cancel_callback(self, cb: collections.abc.Callable[[], None]): ...
40
+ def cancel(self): ...
41
+ def _args_and_kwargs(self) -> tuple[tuple[typing.Any, ...], dict[str, list[typing.Any]]]: ...
42
+ def call_finalized_function(self) -> typing.Any: ...
43
+ def validate_output_data(self, data: typing.Any) -> list[typing.Any]: ...
44
+
45
+ class InputSlots:
46
+ active: int
47
+ value: int
48
+ waiter: typing.Optional[asyncio.Future]
49
+ closed: bool
50
+
51
+ def __init__(self, value: int) -> None: ...
52
+ async def acquire(self) -> None: ...
53
+ def _wake_waiter(self) -> None: ...
54
+ def release(self) -> None: ...
55
+ def set_value(self, value: int) -> None: ...
56
+ async def close(self) -> None: ...
57
+
58
+ class _ContainerIOManager:
59
+ task_id: str
60
+ function_id: str
61
+ app_id: str
62
+ function_def: modal_proto.api_pb2.Function
63
+ checkpoint_id: typing.Optional[str]
64
+ calls_completed: int
65
+ total_user_time: float
66
+ current_input_id: typing.Optional[str]
67
+ current_inputs: dict[str, IOContext]
68
+ current_input_started_at: typing.Optional[float]
69
+ _target_concurrency: int
70
+ _max_concurrency: int
71
+ _concurrency_loop: typing.Optional[asyncio.Task]
72
+ _input_slots: InputSlots
73
+ _environment_name: str
74
+ _heartbeat_loop: typing.Optional[asyncio.Task]
75
+ _heartbeat_condition: typing.Optional[asyncio.locks.Condition]
76
+ _waiting_for_memory_snapshot: bool
77
+ _is_interactivity_enabled: bool
78
+ _fetching_inputs: bool
79
+ _client: modal.client._Client
80
+ _GENERATOR_STOP_SENTINEL: typing.ClassVar[Sentinel]
81
+ _singleton: typing.ClassVar[typing.Optional[_ContainerIOManager]]
82
+
83
+ def _init(self, container_args: modal_proto.api_pb2.ContainerArguments, client: modal.client._Client): ...
84
+ @property
85
+ def heartbeat_condition(self) -> asyncio.locks.Condition: ...
86
+ @staticmethod
87
+ def __new__(
88
+ cls, container_args: modal_proto.api_pb2.ContainerArguments, client: modal.client._Client
89
+ ) -> _ContainerIOManager: ...
90
+ @classmethod
91
+ def _reset_singleton(cls): ...
92
+ async def hello(self): ...
93
+ async def _run_heartbeat_loop(self): ...
94
+ async def _heartbeat_handle_cancellations(self) -> bool: ...
95
+ def heartbeats(self, wait_for_mem_snap: bool) -> typing.AsyncContextManager[None]: ...
96
+ def stop_heartbeat(self): ...
97
+ def dynamic_concurrency_manager(self) -> typing.AsyncContextManager[None]: ...
98
+ async def _dynamic_concurrency_loop(self): ...
99
+ async def get_serialized_function(
100
+ self,
101
+ ) -> tuple[typing.Optional[typing.Any], typing.Optional[collections.abc.Callable[..., typing.Any]]]: ...
102
+ def serialize(self, obj: typing.Any) -> bytes: ...
103
+ def deserialize(self, data: bytes) -> typing.Any: ...
104
+ def serialize_data_format(self, obj: typing.Any, data_format: int) -> bytes: ...
105
+ async def format_blob_data(self, data: bytes) -> dict[str, typing.Any]: ...
106
+ def get_data_in(self, function_call_id: str) -> collections.abc.AsyncIterator[typing.Any]: ...
107
+ async def put_data_out(
108
+ self, function_call_id: str, start_index: int, data_format: int, serialized_messages: list[typing.Any]
109
+ ) -> None: ...
110
+ async def generator_output_task(
111
+ self, function_call_id: str, data_format: int, message_rx: asyncio.queues.Queue
112
+ ) -> None: ...
113
+ async def _queue_create(self, size: int) -> asyncio.queues.Queue: ...
114
+ async def _queue_put(self, queue: asyncio.queues.Queue, value: typing.Any) -> None: ...
115
+ def get_average_call_time(self) -> float: ...
116
+ def get_max_inputs_to_fetch(self): ...
117
+ def _generate_inputs(
118
+ self, batch_max_size: int, batch_wait_ms: int
119
+ ) -> collections.abc.AsyncIterator[list[tuple[str, str, modal_proto.api_pb2.FunctionInput]]]: ...
120
+ def run_inputs_outputs(
121
+ self,
122
+ finalized_functions: dict[str, modal._runtime.user_code_imports.FinalizedFunction],
123
+ batch_max_size: int = 0,
124
+ batch_wait_ms: int = 0,
125
+ ) -> collections.abc.AsyncIterator[IOContext]: ...
126
+ async def _push_outputs(
127
+ self,
128
+ io_context: IOContext,
129
+ started_at: float,
130
+ data_format: int,
131
+ results: list[modal_proto.api_pb2.GenericResult],
132
+ ) -> None: ...
133
+ def serialize_exception(self, exc: BaseException) -> bytes: ...
134
+ def serialize_traceback(self, exc: BaseException) -> tuple[typing.Optional[bytes], typing.Optional[bytes]]: ...
135
+ def handle_user_exception(self) -> typing.AsyncContextManager[None]: ...
136
+ def handle_input_exception(self, io_context: IOContext, started_at: float) -> typing.AsyncContextManager[None]: ...
137
+ def exit_context(self, started_at, input_ids: list[str]): ...
138
+ async def push_outputs(
139
+ self, io_context: IOContext, started_at: float, data: typing.Any, data_format: int
140
+ ) -> None: ...
141
+ async def memory_restore(self) -> None: ...
142
+ async def memory_snapshot(self) -> None: ...
143
+ async def volume_commit(self, volume_ids: list[str]) -> None: ...
144
+ async def interact(self, from_breakpoint: bool = False): ...
145
+ @property
146
+ def target_concurrency(self) -> int: ...
147
+ @property
148
+ def max_concurrency(self) -> int: ...
149
+ @classmethod
150
+ def get_input_concurrency(cls) -> int: ...
151
+ @classmethod
152
+ def set_input_concurrency(cls, concurrency: int): ...
153
+ @classmethod
154
+ def stop_fetching_inputs(cls): ...
155
+
156
+ SUPERSELF = typing.TypeVar("SUPERSELF", covariant=True)
157
+
158
+ class ContainerIOManager:
159
+ task_id: str
160
+ function_id: str
161
+ app_id: str
162
+ function_def: modal_proto.api_pb2.Function
163
+ checkpoint_id: typing.Optional[str]
164
+ calls_completed: int
165
+ total_user_time: float
166
+ current_input_id: typing.Optional[str]
167
+ current_inputs: dict[str, IOContext]
168
+ current_input_started_at: typing.Optional[float]
169
+ _target_concurrency: int
170
+ _max_concurrency: int
171
+ _concurrency_loop: typing.Optional[asyncio.Task]
172
+ _input_slots: InputSlots
173
+ _environment_name: str
174
+ _heartbeat_loop: typing.Optional[asyncio.Task]
175
+ _heartbeat_condition: typing.Optional[asyncio.locks.Condition]
176
+ _waiting_for_memory_snapshot: bool
177
+ _is_interactivity_enabled: bool
178
+ _fetching_inputs: bool
179
+ _client: modal.client.Client
180
+ _GENERATOR_STOP_SENTINEL: typing.ClassVar[Sentinel]
181
+ _singleton: typing.ClassVar[typing.Optional[ContainerIOManager]]
182
+
183
+ def __init__(self, /, *args, **kwargs): ...
184
+ def _init(self, container_args: modal_proto.api_pb2.ContainerArguments, client: modal.client.Client): ...
185
+ @property
186
+ def heartbeat_condition(self) -> asyncio.locks.Condition: ...
187
+ @classmethod
188
+ def _reset_singleton(cls): ...
189
+
190
+ class __hello_spec(typing_extensions.Protocol[SUPERSELF]):
191
+ def __call__(self): ...
192
+ async def aio(self): ...
193
+
194
+ hello: __hello_spec[typing_extensions.Self]
195
+
196
+ class ___run_heartbeat_loop_spec(typing_extensions.Protocol[SUPERSELF]):
197
+ def __call__(self): ...
198
+ async def aio(self): ...
199
+
200
+ _run_heartbeat_loop: ___run_heartbeat_loop_spec[typing_extensions.Self]
201
+
202
+ class ___heartbeat_handle_cancellations_spec(typing_extensions.Protocol[SUPERSELF]):
203
+ def __call__(self) -> bool: ...
204
+ async def aio(self) -> bool: ...
205
+
206
+ _heartbeat_handle_cancellations: ___heartbeat_handle_cancellations_spec[typing_extensions.Self]
207
+
208
+ class __heartbeats_spec(typing_extensions.Protocol[SUPERSELF]):
209
+ def __call__(
210
+ self, wait_for_mem_snap: bool
211
+ ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[None]: ...
212
+ def aio(self, wait_for_mem_snap: bool) -> typing.AsyncContextManager[None]: ...
213
+
214
+ heartbeats: __heartbeats_spec[typing_extensions.Self]
215
+
216
+ def stop_heartbeat(self): ...
217
+
218
+ class __dynamic_concurrency_manager_spec(typing_extensions.Protocol[SUPERSELF]):
219
+ def __call__(self) -> synchronicity.combined_types.AsyncAndBlockingContextManager[None]: ...
220
+ def aio(self) -> typing.AsyncContextManager[None]: ...
221
+
222
+ dynamic_concurrency_manager: __dynamic_concurrency_manager_spec[typing_extensions.Self]
223
+
224
+ class ___dynamic_concurrency_loop_spec(typing_extensions.Protocol[SUPERSELF]):
225
+ def __call__(self): ...
226
+ async def aio(self): ...
227
+
228
+ _dynamic_concurrency_loop: ___dynamic_concurrency_loop_spec[typing_extensions.Self]
229
+
230
+ class __get_serialized_function_spec(typing_extensions.Protocol[SUPERSELF]):
231
+ def __call__(
232
+ self,
233
+ ) -> tuple[typing.Optional[typing.Any], typing.Optional[collections.abc.Callable[..., typing.Any]]]: ...
234
+ async def aio(
235
+ self,
236
+ ) -> tuple[typing.Optional[typing.Any], typing.Optional[collections.abc.Callable[..., typing.Any]]]: ...
237
+
238
+ get_serialized_function: __get_serialized_function_spec[typing_extensions.Self]
239
+
240
+ def serialize(self, obj: typing.Any) -> bytes: ...
241
+ def deserialize(self, data: bytes) -> typing.Any: ...
242
+ def serialize_data_format(self, obj: typing.Any, data_format: int) -> bytes: ...
243
+
244
+ class __format_blob_data_spec(typing_extensions.Protocol[SUPERSELF]):
245
+ def __call__(self, data: bytes) -> dict[str, typing.Any]: ...
246
+ async def aio(self, data: bytes) -> dict[str, typing.Any]: ...
247
+
248
+ format_blob_data: __format_blob_data_spec[typing_extensions.Self]
249
+
250
+ class __get_data_in_spec(typing_extensions.Protocol[SUPERSELF]):
251
+ def __call__(self, function_call_id: str) -> typing.Iterator[typing.Any]: ...
252
+ def aio(self, function_call_id: str) -> collections.abc.AsyncIterator[typing.Any]: ...
253
+
254
+ get_data_in: __get_data_in_spec[typing_extensions.Self]
255
+
256
+ class __put_data_out_spec(typing_extensions.Protocol[SUPERSELF]):
257
+ def __call__(
258
+ self, function_call_id: str, start_index: int, data_format: int, serialized_messages: list[typing.Any]
259
+ ) -> None: ...
260
+ async def aio(
261
+ self, function_call_id: str, start_index: int, data_format: int, serialized_messages: list[typing.Any]
262
+ ) -> None: ...
263
+
264
+ put_data_out: __put_data_out_spec[typing_extensions.Self]
265
+
266
+ class __generator_output_task_spec(typing_extensions.Protocol[SUPERSELF]):
267
+ def __call__(self, function_call_id: str, data_format: int, message_rx: asyncio.queues.Queue) -> None: ...
268
+ async def aio(self, function_call_id: str, data_format: int, message_rx: asyncio.queues.Queue) -> None: ...
269
+
270
+ generator_output_task: __generator_output_task_spec[typing_extensions.Self]
271
+
272
+ class ___queue_create_spec(typing_extensions.Protocol[SUPERSELF]):
273
+ def __call__(self, size: int) -> asyncio.queues.Queue: ...
274
+ async def aio(self, size: int) -> asyncio.queues.Queue: ...
275
+
276
+ _queue_create: ___queue_create_spec[typing_extensions.Self]
277
+
278
+ class ___queue_put_spec(typing_extensions.Protocol[SUPERSELF]):
279
+ def __call__(self, queue: asyncio.queues.Queue, value: typing.Any) -> None: ...
280
+ async def aio(self, queue: asyncio.queues.Queue, value: typing.Any) -> None: ...
281
+
282
+ _queue_put: ___queue_put_spec[typing_extensions.Self]
283
+
284
+ def get_average_call_time(self) -> float: ...
285
+ def get_max_inputs_to_fetch(self): ...
286
+
287
+ class ___generate_inputs_spec(typing_extensions.Protocol[SUPERSELF]):
288
+ def __call__(
289
+ self, batch_max_size: int, batch_wait_ms: int
290
+ ) -> typing.Iterator[list[tuple[str, str, modal_proto.api_pb2.FunctionInput]]]: ...
291
+ def aio(
292
+ self, batch_max_size: int, batch_wait_ms: int
293
+ ) -> collections.abc.AsyncIterator[list[tuple[str, str, modal_proto.api_pb2.FunctionInput]]]: ...
294
+
295
+ _generate_inputs: ___generate_inputs_spec[typing_extensions.Self]
296
+
297
+ class __run_inputs_outputs_spec(typing_extensions.Protocol[SUPERSELF]):
298
+ def __call__(
299
+ self,
300
+ finalized_functions: dict[str, modal._runtime.user_code_imports.FinalizedFunction],
301
+ batch_max_size: int = 0,
302
+ batch_wait_ms: int = 0,
303
+ ) -> typing.Iterator[IOContext]: ...
304
+ def aio(
305
+ self,
306
+ finalized_functions: dict[str, modal._runtime.user_code_imports.FinalizedFunction],
307
+ batch_max_size: int = 0,
308
+ batch_wait_ms: int = 0,
309
+ ) -> collections.abc.AsyncIterator[IOContext]: ...
310
+
311
+ run_inputs_outputs: __run_inputs_outputs_spec[typing_extensions.Self]
312
+
313
+ class ___push_outputs_spec(typing_extensions.Protocol[SUPERSELF]):
314
+ def __call__(
315
+ self,
316
+ io_context: IOContext,
317
+ started_at: float,
318
+ data_format: int,
319
+ results: list[modal_proto.api_pb2.GenericResult],
320
+ ) -> None: ...
321
+ async def aio(
322
+ self,
323
+ io_context: IOContext,
324
+ started_at: float,
325
+ data_format: int,
326
+ results: list[modal_proto.api_pb2.GenericResult],
327
+ ) -> None: ...
328
+
329
+ _push_outputs: ___push_outputs_spec[typing_extensions.Self]
330
+
331
+ def serialize_exception(self, exc: BaseException) -> bytes: ...
332
+ def serialize_traceback(self, exc: BaseException) -> tuple[typing.Optional[bytes], typing.Optional[bytes]]: ...
333
+
334
+ class __handle_user_exception_spec(typing_extensions.Protocol[SUPERSELF]):
335
+ def __call__(self) -> synchronicity.combined_types.AsyncAndBlockingContextManager[None]: ...
336
+ def aio(self) -> typing.AsyncContextManager[None]: ...
337
+
338
+ handle_user_exception: __handle_user_exception_spec[typing_extensions.Self]
339
+
340
+ class __handle_input_exception_spec(typing_extensions.Protocol[SUPERSELF]):
341
+ def __call__(
342
+ self, io_context: IOContext, started_at: float
343
+ ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[None]: ...
344
+ def aio(self, io_context: IOContext, started_at: float) -> typing.AsyncContextManager[None]: ...
345
+
346
+ handle_input_exception: __handle_input_exception_spec[typing_extensions.Self]
347
+
348
+ def exit_context(self, started_at, input_ids: list[str]): ...
349
+
350
+ class __push_outputs_spec(typing_extensions.Protocol[SUPERSELF]):
351
+ def __call__(self, io_context: IOContext, started_at: float, data: typing.Any, data_format: int) -> None: ...
352
+ async def aio(self, io_context: IOContext, started_at: float, data: typing.Any, data_format: int) -> None: ...
353
+
354
+ push_outputs: __push_outputs_spec[typing_extensions.Self]
355
+
356
+ class __memory_restore_spec(typing_extensions.Protocol[SUPERSELF]):
357
+ def __call__(self) -> None: ...
358
+ async def aio(self) -> None: ...
359
+
360
+ memory_restore: __memory_restore_spec[typing_extensions.Self]
361
+
362
+ class __memory_snapshot_spec(typing_extensions.Protocol[SUPERSELF]):
363
+ def __call__(self) -> None: ...
364
+ async def aio(self) -> None: ...
365
+
366
+ memory_snapshot: __memory_snapshot_spec[typing_extensions.Self]
367
+
368
+ class __volume_commit_spec(typing_extensions.Protocol[SUPERSELF]):
369
+ def __call__(self, volume_ids: list[str]) -> None: ...
370
+ async def aio(self, volume_ids: list[str]) -> None: ...
371
+
372
+ volume_commit: __volume_commit_spec[typing_extensions.Self]
373
+
374
+ class __interact_spec(typing_extensions.Protocol[SUPERSELF]):
375
+ def __call__(self, from_breakpoint: bool = False): ...
376
+ async def aio(self, from_breakpoint: bool = False): ...
377
+
378
+ interact: __interact_spec[typing_extensions.Self]
379
+
380
+ @property
381
+ def target_concurrency(self) -> int: ...
382
+ @property
383
+ def max_concurrency(self) -> int: ...
384
+ @classmethod
385
+ def get_input_concurrency(cls) -> int: ...
386
+ @classmethod
387
+ def set_input_concurrency(cls, concurrency: int): ...
388
+ @classmethod
389
+ def stop_fetching_inputs(cls): ...
390
+
391
+ def check_fastapi_pydantic_compatibility(exc: ImportError) -> None: ...
392
+
393
+ MAX_OUTPUT_BATCH_SIZE: int
394
+
395
+ RTT_S: float
@@ -0,0 +1,23 @@
1
+ import collections.abc
2
+ import contextvars
3
+ import typing
4
+ import typing_extensions
5
+
6
+ def is_local() -> bool: ...
7
+ async def _interact() -> None: ...
8
+
9
+ class __interact_spec(typing_extensions.Protocol):
10
+ def __call__(self) -> None: ...
11
+ async def aio(self) -> None: ...
12
+
13
+ interact: __interact_spec
14
+
15
+ def current_input_id() -> typing.Optional[str]: ...
16
+ def current_function_call_id() -> typing.Optional[str]: ...
17
+ def _set_current_context_ids(
18
+ input_ids: list[str], function_call_ids: list[str]
19
+ ) -> collections.abc.Callable[[], None]: ...
20
+
21
+ _current_input_id: contextvars.ContextVar
22
+
23
+ _current_function_call_id: contextvars.ContextVar
@@ -27,7 +27,7 @@ class _Client:
27
27
  _snapshotted: bool
28
28
 
29
29
  def __init__(
30
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.45"
30
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.46"
31
31
  ): ...
32
32
  def is_closed(self) -> bool: ...
33
33
  @property
@@ -85,7 +85,7 @@ class Client:
85
85
  _snapshotted: bool
86
86
 
87
87
  def __init__(
88
- self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.45"
88
+ self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.73.46"
89
89
  ): ...
90
90
  def is_closed(self) -> bool: ...
91
91
  @property
@@ -200,11 +200,11 @@ class Function(
200
200
 
201
201
  _call_generator_nowait: ___call_generator_nowait_spec[typing_extensions.Self]
202
202
 
203
- class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
203
+ class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
204
204
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
205
205
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER: ...
206
206
 
207
- remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
207
+ remote: __remote_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
208
208
 
209
209
  class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
210
210
  def __call__(self, *args, **kwargs) -> typing.Generator[typing.Any, None, None]: ...
@@ -219,19 +219,19 @@ class Function(
219
219
  self, *args: modal._functions.P.args, **kwargs: modal._functions.P.kwargs
220
220
  ) -> modal._functions.OriginalReturnType: ...
221
221
 
222
- class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
222
+ class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
223
223
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
224
224
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
225
225
 
226
226
  _experimental_spawn: ___experimental_spawn_spec[
227
- modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
227
+ modal._functions.P, modal._functions.ReturnType, typing_extensions.Self
228
228
  ]
229
229
 
230
- class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
230
+ class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
231
231
  def __call__(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
232
232
  async def aio(self, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]: ...
233
233
 
234
- spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
234
+ spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType, typing_extensions.Self]
235
235
 
236
236
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
237
237
 
@@ -1,11 +1,13 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: modal
3
- Version: 0.73.45
3
+ Version: 0.73.46
4
4
  Summary: Python client library for Modal
5
- Author: Modal Labs
6
- Author-email: support@modal.com
5
+ Author-email: Modal Labs <support@modal.com>
6
+ License: Apache-2.0
7
7
  Project-URL: Homepage, https://modal.com
8
8
  Project-URL: Source, https://github.com/modal-labs/modal-client
9
+ Project-URL: Documentation, https://modal.com/docs
10
+ Project-URL: Issue Tracker, https://github.com/modal-labs/modal-client/issues
9
11
  Keywords: modal,client,cloud,serverless,infrastructure
10
12
  Classifier: Topic :: System :: Distributed Computing
11
13
  Classifier: Operating System :: OS Independent
@@ -14,6 +16,20 @@ Classifier: Programming Language :: Python :: 3
14
16
  Requires-Python: >=3.9
15
17
  Description-Content-Type: text/markdown
16
18
  License-File: LICENSE
19
+ Requires-Dist: aiohttp
20
+ Requires-Dist: certifi
21
+ Requires-Dist: click>=8.1.0
22
+ Requires-Dist: fastapi
23
+ Requires-Dist: grpclib==0.4.7
24
+ Requires-Dist: protobuf!=4.24.0,<6.0,>=3.19
25
+ Requires-Dist: rich>=12.0.0
26
+ Requires-Dist: synchronicity~=0.9.10
27
+ Requires-Dist: toml
28
+ Requires-Dist: typer>=0.9
29
+ Requires-Dist: types-certifi
30
+ Requires-Dist: types-toml
31
+ Requires-Dist: watchfiles
32
+ Requires-Dist: typing_extensions~=4.6
17
33
 
18
34
  # Modal Python Library
19
35
 
@@ -1,8 +1,6 @@
1
1
  LICENSE
2
2
  README.md
3
3
  pyproject.toml
4
- setup.cfg
5
- setup.py
6
4
  modal/__init__.py
7
5
  modal/__main__.py
8
6
  modal/_clustered_functions.py
@@ -96,7 +94,9 @@ modal.egg-info/top_level.txt
96
94
  modal/_runtime/__init__.py
97
95
  modal/_runtime/asgi.py
98
96
  modal/_runtime/container_io_manager.py
97
+ modal/_runtime/container_io_manager.pyi
99
98
  modal/_runtime/execution_context.py
99
+ modal/_runtime/execution_context.pyi
100
100
  modal/_runtime/gpu_memory_snapshot.py
101
101
  modal/_runtime/telemetry.py
102
102
  modal/_runtime/user_code_imports.py
@@ -153,18 +153,6 @@ modal/requirements/2024.04.txt
153
153
  modal/requirements/2024.10.txt
154
154
  modal/requirements/README.md
155
155
  modal/requirements/base-images.json
156
- modal_docs/__init__.py
157
- modal_docs/gen_cli_docs.py
158
- modal_docs/gen_reference_docs.py
159
- modal_docs/mdmd/__init__.py
160
- modal_docs/mdmd/mdmd.py
161
- modal_docs/mdmd/signatures.py
162
- modal_global_objects/__init__.py
163
- modal_global_objects/images/__init__.py
164
- modal_global_objects/images/base_images.py
165
- modal_global_objects/mounts/__init__.py
166
- modal_global_objects/mounts/modal_client_package.py
167
- modal_global_objects/mounts/python_standalone.py
168
156
  modal_proto/__init__.py
169
157
  modal_proto/api.proto
170
158
  modal_proto/api_grpc.py
@@ -1,5 +1,3 @@
1
1
  modal
2
- modal_docs
3
- modal_global_objects
4
2
  modal_proto
5
3
  modal_version
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
 
3
3
  # Note: Reset this value to -1 whenever you make a minor `0.X` release of the client.
4
- build_number = 45 # git: 9481268
4
+ build_number = 46 # git: 8736584