modal 0.73.165__py3-none-any.whl → 0.73.167__py3-none-any.whl

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.
modal/cli/import_refs.py CHANGED
@@ -69,7 +69,6 @@ def import_file_or_module(import_ref: ImportRef, base_cmd: str = ""):
69
69
  (2025, 2, 6),
70
70
  f"Using Python module paths will require using the -m flag in a future version of Modal.\n"
71
71
  f"Use `{base_cmd} -m {import_ref.file_or_module}` instead.",
72
- pending=True,
73
72
  show_source=False,
74
73
  )
75
74
  try:
modal/client.pyi CHANGED
@@ -31,7 +31,7 @@ class _Client:
31
31
  server_url: str,
32
32
  client_type: int,
33
33
  credentials: typing.Optional[tuple[str, str]],
34
- version: str = "0.73.165",
34
+ version: str = "0.73.167",
35
35
  ): ...
36
36
  def is_closed(self) -> bool: ...
37
37
  @property
@@ -93,7 +93,7 @@ class Client:
93
93
  server_url: str,
94
94
  client_type: int,
95
95
  credentials: typing.Optional[tuple[str, str]],
96
- version: str = "0.73.165",
96
+ version: str = "0.73.167",
97
97
  ): ...
98
98
  def is_closed(self) -> bool: ...
99
99
  @property
modal/cls.py CHANGED
@@ -706,10 +706,9 @@ class _Cls(_Object, type_prefix="cs"):
706
706
  # if not local (== k *could* be a method) or it is local and we know k is a method
707
707
  deprecation_warning(
708
708
  (2025, 1, 13),
709
- "Usage of methods directly on the class will soon be deprecated, "
710
- "instantiate classes before using methods, e.g.:\n"
709
+ "Calling a method on an uninstantiated class will soon be deprecated; "
710
+ "update your code to instantiate the class first, i.e.:\n"
711
711
  f"{self._name}().{k} instead of {self._name}.{k}",
712
- pending=True,
713
712
  )
714
713
  return getattr(self(), k)
715
714
  # non-method attribute access on local class - arguably shouldn't be used either:
modal/functions.pyi CHANGED
@@ -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[P_INNER, ReturnType_INNER, SUPERSELF]):
203
+ class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_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.P, modal._functions.ReturnType, typing_extensions.Self]
207
+ remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, 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[P_INNER, ReturnType_INNER, SUPERSELF]):
222
+ class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_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.P, modal._functions.ReturnType, typing_extensions.Self
227
+ modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
228
228
  ]
229
229
 
230
- class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER, SUPERSELF]):
230
+ class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_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.P, modal._functions.ReturnType, typing_extensions.Self]
234
+ spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
235
235
 
236
236
  def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]: ...
237
237
 
modal/image.py CHANGED
@@ -820,7 +820,8 @@ class _Image(_Object, type_prefix="im"):
820
820
  works in a `Dockerfile`.
821
821
  """
822
822
  deprecation_warning(
823
- (2025, 1, 13), COPY_DEPRECATION_MESSAGE_PATTERN.format(replacement="image.add_local_file"), pending=True
823
+ (2025, 1, 13),
824
+ COPY_DEPRECATION_MESSAGE_PATTERN.format(replacement="image.add_local_file"),
824
825
  )
825
826
  basename = str(Path(local_path).name)
826
827
 
@@ -934,7 +935,8 @@ class _Image(_Object, type_prefix="im"):
934
935
  ```
935
936
  """
936
937
  deprecation_warning(
937
- (2025, 1, 13), COPY_DEPRECATION_MESSAGE_PATTERN.format(replacement="image.add_local_dir"), pending=True
938
+ (2025, 1, 13),
939
+ COPY_DEPRECATION_MESSAGE_PATTERN.format(replacement="image.add_local_dir"),
938
940
  )
939
941
 
940
942
  def build_dockerfile(version: ImageBuilderVersion) -> DockerfileSpec:
@@ -1367,9 +1369,8 @@ class _Image(_Object, type_prefix="im"):
1367
1369
  if context_mount is not None:
1368
1370
  deprecation_warning(
1369
1371
  (2025, 1, 13),
1370
- "`context_mount` is deprecated."
1371
- + " Files are now automatically added to the build context based on the commands.",
1372
- pending=True,
1372
+ "The `context_mount` parameter of `Image.dockerfile_commands` is deprecated."
1373
+ " Files are now automatically added to the build context based on the commands.",
1373
1374
  )
1374
1375
  cmds = _flatten_str_args("dockerfile_commands", "dockerfile_commands", dockerfile_commands)
1375
1376
  if not cmds:
@@ -1777,9 +1778,8 @@ class _Image(_Object, type_prefix="im"):
1777
1778
  if context_mount is not None:
1778
1779
  deprecation_warning(
1779
1780
  (2025, 1, 13),
1780
- "`context_mount` is deprecated."
1781
- + " Files are now automatically added to the build context based on the commands in the Dockerfile.",
1782
- pending=True,
1781
+ "The `context_mount` parameter of `Image.from_dockerfile` is deprecated."
1782
+ " Files are now automatically added to the build context based on the commands in the Dockerfile.",
1783
1783
  )
1784
1784
 
1785
1785
  # --- Build the base dockerfile
modal/mount.py CHANGED
@@ -410,7 +410,8 @@ class _Mount(_Object, type_prefix="mo"):
410
410
  ```
411
411
  """
412
412
  deprecation_warning(
413
- (2025, 1, 8), MOUNT_DEPRECATION_MESSAGE_PATTERN.format(replacement="image.add_local_dir"), pending=True
413
+ (2025, 1, 8),
414
+ MOUNT_DEPRECATION_MESSAGE_PATTERN.format(replacement="image.add_local_dir"),
414
415
  )
415
416
  return _Mount._from_local_dir(local_path, remote_path=remote_path, condition=condition, recursive=recursive)
416
417
 
@@ -467,7 +468,8 @@ class _Mount(_Object, type_prefix="mo"):
467
468
  ```
468
469
  """
469
470
  deprecation_warning(
470
- (2025, 1, 8), MOUNT_DEPRECATION_MESSAGE_PATTERN.format(replacement="image.add_local_file"), pending=True
471
+ (2025, 1, 8),
472
+ MOUNT_DEPRECATION_MESSAGE_PATTERN.format(replacement="image.add_local_file"),
471
473
  )
472
474
  return _Mount._from_local_file(local_path, remote_path)
473
475
 
@@ -640,7 +642,6 @@ class _Mount(_Object, type_prefix="mo"):
640
642
  deprecation_warning(
641
643
  (2025, 1, 8),
642
644
  MOUNT_DEPRECATION_MESSAGE_PATTERN.format(replacement="image.add_local_python_source"),
643
- pending=True,
644
645
  )
645
646
  return _Mount._from_local_python_packages(
646
647
  *module_names, remote_dir=remote_dir, condition=condition, ignore=ignore
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 0.73.165
3
+ Version: 0.73.167
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -23,10 +23,10 @@ modal/app.py,sha256=bJp7W3liuVG2VwWkG31tMFogDh84EKppzP8YJFWl3eQ,48140
23
23
  modal/app.pyi,sha256=SkqXNrdnGIZ4MmNNvpGtzNLoUdyuvi9IjQQR_DRiRHk,26968
24
24
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
25
25
  modal/client.py,sha256=U-YKSw0n7J1ZLREt9cbEJCtmHe5YoPKFxl0xlkan2yc,15565
26
- modal/client.pyi,sha256=ezGzumCVjsThwi36KrD6sOkRHXCKfqVsVC1T1nS8PbY,7661
26
+ modal/client.pyi,sha256=AGcVcEelqx_X_Jfb4xfzqsQLTEdabMRN3AWICFkwqc8,7661
27
27
  modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
28
28
  modal/cloud_bucket_mount.pyi,sha256=30T3K1a89l6wzmEJ_J9iWv9SknoGqaZDx59Xs-ZQcmk,1607
29
- modal/cls.py,sha256=8tvSw7QFTS1FnX2MXaxagu3KwuR6y_DMwhqHv3MZ0Nk,32963
29
+ modal/cls.py,sha256=x3CUDPC-QK7pa9E2eiFsiCS2ULvVi8UzNZQw1i9drsU,32945
30
30
  modal/cls.pyi,sha256=pTYO9JsRENmsa5pDgzfoRJGm_NpCvEjEx--vs-jJkj8,10902
31
31
  modal/config.py,sha256=FlqVyh6LVukMahhmEGQVTwWtwtfoPfHqEo3GDn13EOA,11687
32
32
  modal/container_process.py,sha256=vvyK3DVPUMsuqvkKdUiQ49cDLF9JawGrxpglLk5vfgI,6208
@@ -40,13 +40,13 @@ modal/file_io.py,sha256=lcMs_E9Xfm0YX1t9U2wNIBPnqHRxmImqjLW1GHqVmyg,20945
40
40
  modal/file_io.pyi,sha256=NTRft1tbPSWf9TlWVeZmTlgB5AZ_Zhu2srWIrWr7brk,9445
41
41
  modal/file_pattern_matcher.py,sha256=trosX-Bp7dOubudN1bLLhRAoidWy1TcoaR4Pv8CedWw,6497
42
42
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
43
- modal/functions.pyi,sha256=m1PL2pwO-lnGV0uZDVCmzZ_v7Mu8ISRtxmxS15aEIAQ,14785
43
+ modal/functions.pyi,sha256=Bg_zlYSHMYuEXQYLcFU-j1Kwq5zHQ9jggMA_5ZO_du8,14785
44
44
  modal/gpu.py,sha256=Kbhs_u49FaC2Zi0TjCdrpstpRtT5eZgecynmQi5IZVE,6752
45
- modal/image.py,sha256=qagLzHPbeEoM7TqvIuFJ8JV_IEJtRqiR0lik4O_K4Gw,92857
45
+ modal/image.py,sha256=I-9_YZL0SSfnuGPywa3-4PlxDmJ-53p7ce3gP74SrOA,92877
46
46
  modal/image.pyi,sha256=89zv12C1sFrJs7Es9SnX23_m208ASAdeNGCVTrhjzHI,25632
47
47
  modal/io_streams.py,sha256=h5O2LmbRoT9l777z3TQhCAm-JF1r7avZ2ykXlejztDs,15163
48
48
  modal/io_streams.pyi,sha256=bJ7ZLmSmJ0nKoa6r4FJpbqvzdUVa0lEe0Fa-MMpMezU,5071
49
- modal/mount.py,sha256=Y2sXIbUbr3ymVvfvknwbouBkkAUPIW1nkSToRGh8w7g,31973
49
+ modal/mount.py,sha256=_v1VYxryY3BcF4XxyRfOWm7AxAz79D2VRWh5tOHhWuc,31945
50
50
  modal/mount.pyi,sha256=CmHa7zKSxHA_7-vMQLnGfw_ZXvAvHlafvUEVJcQ1LQA,12535
51
51
  modal/network_file_system.py,sha256=WXdyL7du_fvjvuG6hSAREyJ83sSEP2xSLAIAhBsisdI,14869
52
52
  modal/network_file_system.pyi,sha256=4N3eqMbTSlqmS8VV_aJK-uvrgJC8xnf_YtW5FHfRfc8,8156
@@ -124,7 +124,7 @@ modal/cli/container.py,sha256=FYwEgjf93j4NMorAjGbSV98i1wpebqdAeNU1wfrFp1k,3668
124
124
  modal/cli/dict.py,sha256=8Wq3w-UDaywk8EVNdj-ECCNV9TYHqh4kzhUqhhulatM,4593
125
125
  modal/cli/entry_point.py,sha256=dOosuCwhfznwTCB4oMljUFhihq5aLUVoAz7RhcBEDnc,4189
126
126
  modal/cli/environment.py,sha256=Ayddkiq9jdj3XYDJ8ZmUqFpPPH8xajYlbexRkzGtUcg,4334
127
- modal/cli/import_refs.py,sha256=53WmXyOivTk2Pi85NgAr8K5tjwOxNeCmOR0wLNEEX1c,13941
127
+ modal/cli/import_refs.py,sha256=pmzY0hpexx6DtvobNmCOvRqEdS9IriEP4BpMw1TIy2w,13911
128
128
  modal/cli/launch.py,sha256=0_sBu6bv2xJEPWi-rbGS6Ri9ggnkWQvrGlgpYSUBMyY,3097
129
129
  modal/cli/network_file_system.py,sha256=eq3JnwjbfFNsJodIyANHL06ByYc3BSavzdmu8C96cHA,7948
130
130
  modal/cli/profile.py,sha256=0TYhgRSGUvQZ5LH9nkl6iZllEvAjDniES264dE57wOM,3201
@@ -146,7 +146,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
146
146
  modal/requirements/PREVIEW.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddRo,296
147
147
  modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
148
148
  modal/requirements/base-images.json,sha256=57vMSqzMbLBxw5tFWSaMiIkkVEps4JfX5PAtXGnkS4U,740
149
- modal-0.73.165.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
149
+ modal-0.73.167.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
150
150
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
151
151
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
152
152
  modal_docs/gen_reference_docs.py,sha256=cvTgltucqYLLIX84QxAwf51Z5Vc2n6cLxS8VcrxNCAo,6401
@@ -154,13 +154,13 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
154
154
  modal_docs/mdmd/mdmd.py,sha256=Irx49MCCTlBOP4FBdLR--JrpA3-WhsVeriq0LGgsRic,6232
155
155
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
156
156
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
157
- modal_proto/api.proto,sha256=jrhg7sMfpcFSL8xCPBzW8U7kas16vYh0c0WmCo4NN4o,91483
158
- modal_proto/api_grpc.py,sha256=9Rs0JyHcz_DSjVKhdtMbDuNt6qDkrE2718KsyA3QL4c,110702
159
- modal_proto/api_pb2.py,sha256=u6qmhGmIjnYxuofALoz0a5TaQKtASbWSlEIk27BfQ_I,322045
160
- modal_proto/api_pb2.pyi,sha256=EoQ1OnFWEVf9jVVvrjdWSFRJ7MXtWTkBtN3rbWjR8Ok,439118
161
- modal_proto/api_pb2_grpc.py,sha256=olXvs6OQvy7pqvHP9bkSWC_DdIv0iO38xRlmkLo-ai8,239213
162
- modal_proto/api_pb2_grpc.pyi,sha256=ybhcN2nwFBIPd4Z4kkMOv-M8Ejidz93Bl4zScLpYcK0,55706
163
- modal_proto/modal_api_grpc.py,sha256=43ujbC_a8YAjuhtEvS-O-5lNpkG5d0K0ZIlryJ4weT4,14766
157
+ modal_proto/api.proto,sha256=pVzFEsIpOuybO3v6aQW2ONmTaX6-Gcfk9sBbpxNYOOk,92066
158
+ modal_proto/api_grpc.py,sha256=DlrVx10B6HLy4LjWrgK7HJ7kUNDKqEvm6mUqh-6EVvs,112161
159
+ modal_proto/api_pb2.py,sha256=ACSAQ0P-ZR36tTgN3C_RmO381ZK-9EM1FXzUtQzCOn8,325087
160
+ modal_proto/api_pb2.pyi,sha256=KNJrAFmFXQY5REYJUgL4Rjg2ie-CZKGPkFz8vVIx0zs,442208
161
+ modal_proto/api_pb2_grpc.py,sha256=NQPpAa3Co-zFNB6L6BQoZjf-RaOlWFFPX8chQyGHQEo,242401
162
+ modal_proto/api_pb2_grpc.pyi,sha256=zK2Ms2Xws02cC9uy5U5A5sPULXx4T6A9o9BONqFcipg,56456
163
+ modal_proto/modal_api_grpc.py,sha256=K_GsrHIw2CayKh_nyuYAblQW_tOijUNW267Hs9vWUWU,14948
164
164
  modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
165
165
  modal_proto/options.proto,sha256=a-siq4swVbZPfaFRXAipRZzGP2bq8OsdUvjlyzAeodQ,488
166
166
  modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
@@ -171,9 +171,9 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
171
171
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
172
  modal_version/__init__.py,sha256=wiJQ53c-OMs0Xf1UeXOxQ7FwlV1VzIjnX6o-pRYZ_Pk,470
173
173
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
174
- modal_version/_version_generated.py,sha256=hRg9FYMu45Ztb3wBnbqwihpEOxZwsdjeAwcV1SMwKL8,150
175
- modal-0.73.165.dist-info/METADATA,sha256=nu47OVg9iyCvAYlGLNM3-TRZS8pa3_019VMJ5cyBiVE,2475
176
- modal-0.73.165.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
- modal-0.73.165.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
- modal-0.73.165.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
- modal-0.73.165.dist-info/RECORD,,
174
+ modal_version/_version_generated.py,sha256=48GMAoPZ_ag_EWB42SJTPQblePrD_fvU9USnaFhq-D8,150
175
+ modal-0.73.167.dist-info/METADATA,sha256=J9mj1Rd5kLYwuVHbs9jgxiyd5e19wUDaQZS76blat3g,2475
176
+ modal-0.73.167.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
177
+ modal-0.73.167.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
178
+ modal-0.73.167.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
179
+ modal-0.73.167.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -757,6 +757,29 @@ message CloudBucketMount {
757
757
  optional string oidc_auth_role_arn = 9;
758
758
  }
759
759
 
760
+ message ClusterGetRequest {
761
+ string cluster_id = 1;
762
+ }
763
+
764
+ message ClusterGetResponse {
765
+ ClusterStats cluster = 1;
766
+ }
767
+
768
+ message ClusterListRequest {
769
+ string environment_name = 1;
770
+ }
771
+
772
+ message ClusterListResponse {
773
+ repeated ClusterStats clusters = 1;
774
+ }
775
+
776
+ message ClusterStats {
777
+ string app_id = 1;
778
+ repeated string task_ids = 2;
779
+ string region = 3;
780
+ double started_at = 4; // Defined as start time of the first task in the cluster
781
+ }
782
+
760
783
  message CommitInfo {
761
784
  string vcs = 1; // Only git is supported for now
762
785
  string branch = 2;
@@ -3052,6 +3075,10 @@ service ModalClient {
3052
3075
  // Clients
3053
3076
  rpc ClientHello(google.protobuf.Empty) returns (ClientHelloResponse);
3054
3077
 
3078
+ // Clusters
3079
+ rpc ClusterGet(ClusterGetRequest) returns (ClusterGetResponse);
3080
+ rpc ClusterList(ClusterListRequest) returns (ClusterListResponse);
3081
+
3055
3082
  // Container
3056
3083
  rpc ContainerCheckpoint(ContainerCheckpointRequest) returns (google.protobuf.Empty);
3057
3084
  rpc ContainerExec(ContainerExecRequest) returns (ContainerExecResponse);
modal_proto/api_grpc.py CHANGED
@@ -102,6 +102,14 @@ class ModalClientBase(abc.ABC):
102
102
  async def ClientHello(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.ClientHelloResponse]') -> None:
103
103
  pass
104
104
 
105
+ @abc.abstractmethod
106
+ async def ClusterGet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.ClusterGetRequest, modal_proto.api_pb2.ClusterGetResponse]') -> None:
107
+ pass
108
+
109
+ @abc.abstractmethod
110
+ async def ClusterList(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.ClusterListRequest, modal_proto.api_pb2.ClusterListResponse]') -> None:
111
+ pass
112
+
105
113
  @abc.abstractmethod
106
114
  async def ContainerCheckpoint(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.ContainerCheckpointRequest, google.protobuf.empty_pb2.Empty]') -> None:
107
115
  pass
@@ -722,6 +730,18 @@ class ModalClientBase(abc.ABC):
722
730
  google.protobuf.empty_pb2.Empty,
723
731
  modal_proto.api_pb2.ClientHelloResponse,
724
732
  ),
733
+ '/modal.client.ModalClient/ClusterGet': grpclib.const.Handler(
734
+ self.ClusterGet,
735
+ grpclib.const.Cardinality.UNARY_UNARY,
736
+ modal_proto.api_pb2.ClusterGetRequest,
737
+ modal_proto.api_pb2.ClusterGetResponse,
738
+ ),
739
+ '/modal.client.ModalClient/ClusterList': grpclib.const.Handler(
740
+ self.ClusterList,
741
+ grpclib.const.Cardinality.UNARY_UNARY,
742
+ modal_proto.api_pb2.ClusterListRequest,
743
+ modal_proto.api_pb2.ClusterListResponse,
744
+ ),
725
745
  '/modal.client.ModalClient/ContainerCheckpoint': grpclib.const.Handler(
726
746
  self.ContainerCheckpoint,
727
747
  grpclib.const.Cardinality.UNARY_UNARY,
@@ -1592,6 +1612,18 @@ class ModalClientStub:
1592
1612
  google.protobuf.empty_pb2.Empty,
1593
1613
  modal_proto.api_pb2.ClientHelloResponse,
1594
1614
  )
1615
+ self.ClusterGet = grpclib.client.UnaryUnaryMethod(
1616
+ channel,
1617
+ '/modal.client.ModalClient/ClusterGet',
1618
+ modal_proto.api_pb2.ClusterGetRequest,
1619
+ modal_proto.api_pb2.ClusterGetResponse,
1620
+ )
1621
+ self.ClusterList = grpclib.client.UnaryUnaryMethod(
1622
+ channel,
1623
+ '/modal.client.ModalClient/ClusterList',
1624
+ modal_proto.api_pb2.ClusterListRequest,
1625
+ modal_proto.api_pb2.ClusterListResponse,
1626
+ )
1595
1627
  self.ContainerCheckpoint = grpclib.client.UnaryUnaryMethod(
1596
1628
  channel,
1597
1629
  '/modal.client.ModalClient/ContainerCheckpoint',