modal 0.68.31__py3-none-any.whl → 0.68.50__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.
Files changed (48) hide show
  1. modal/_runtime/asgi.py +11 -4
  2. modal/_traceback.py +6 -2
  3. modal/_utils/deprecation.py +45 -0
  4. modal/_utils/function_utils.py +24 -13
  5. modal/app.py +5 -4
  6. modal/app.pyi +3 -3
  7. modal/cli/dict.py +6 -2
  8. modal/cli/network_file_system.py +1 -1
  9. modal/cli/run.py +1 -0
  10. modal/cli/volume.py +1 -1
  11. modal/client.pyi +2 -2
  12. modal/cls.py +15 -9
  13. modal/cls.pyi +5 -5
  14. modal/dict.py +11 -17
  15. modal/dict.pyi +8 -12
  16. modal/environments.py +10 -7
  17. modal/environments.pyi +6 -6
  18. modal/functions.py +11 -7
  19. modal/functions.pyi +7 -5
  20. modal/gpu.py +22 -0
  21. modal/image.py +0 -15
  22. modal/image.pyi +0 -26
  23. modal/mount.py +14 -8
  24. modal/mount.pyi +4 -4
  25. modal/network_file_system.py +12 -19
  26. modal/network_file_system.pyi +8 -12
  27. modal/partial_function.py +0 -29
  28. modal/queue.py +11 -17
  29. modal/queue.pyi +8 -12
  30. modal/sandbox.py +2 -0
  31. modal/secret.py +7 -4
  32. modal/secret.pyi +5 -5
  33. modal/volume.py +11 -17
  34. modal/volume.pyi +8 -12
  35. {modal-0.68.31.dist-info → modal-0.68.50.dist-info}/METADATA +2 -2
  36. {modal-0.68.31.dist-info → modal-0.68.50.dist-info}/RECORD +48 -48
  37. modal_proto/api.proto +9 -0
  38. modal_proto/api_grpc.py +16 -0
  39. modal_proto/api_pb2.py +785 -765
  40. modal_proto/api_pb2.pyi +30 -0
  41. modal_proto/api_pb2_grpc.py +33 -0
  42. modal_proto/api_pb2_grpc.pyi +10 -0
  43. modal_proto/modal_api_grpc.py +1 -0
  44. modal_version/_version_generated.py +1 -1
  45. {modal-0.68.31.dist-info → modal-0.68.50.dist-info}/LICENSE +0 -0
  46. {modal-0.68.31.dist-info → modal-0.68.50.dist-info}/WHEEL +0 -0
  47. {modal-0.68.31.dist-info → modal-0.68.50.dist-info}/entry_points.txt +0 -0
  48. {modal-0.68.31.dist-info → modal-0.68.50.dist-info}/top_level.txt +0 -0
modal/queue.py CHANGED
@@ -13,7 +13,7 @@ from modal_proto import api_pb2
13
13
  from ._resolver import Resolver
14
14
  from ._serialization import deserialize, serialize
15
15
  from ._utils.async_utils import TaskContext, synchronize_api, warn_if_generator_is_not_consumed
16
- from ._utils.deprecation import deprecation_error
16
+ from ._utils.deprecation import renamed_parameter
17
17
  from ._utils.grpc_utils import retry_transient_errors
18
18
  from ._utils.name_utils import check_object_name
19
19
  from .client import _Client
@@ -94,15 +94,6 @@ class _Queue(_Object, type_prefix="qu"):
94
94
  Partition keys must be non-empty and must not exceed 64 bytes.
95
95
  """
96
96
 
97
- @staticmethod
98
- def new():
99
- """mdmd:hidden"""
100
- message = (
101
- "`Queue.new` is deprecated."
102
- " Please use `Queue.from_name` (for persisted) or `Queue.ephemeral` (for ephemeral) queues instead."
103
- )
104
- deprecation_error((2024, 3, 19), message)
105
-
106
97
  def __init__(self):
107
98
  """mdmd:hidden"""
108
99
  raise RuntimeError("Queue() is not allowed. Please use `Queue.from_name(...)` or `Queue.ephemeral()` instead.")
@@ -154,8 +145,9 @@ class _Queue(_Object, type_prefix="qu"):
154
145
  yield cls._new_hydrated(response.queue_id, client, None, is_another_app=True)
155
146
 
156
147
  @staticmethod
148
+ @renamed_parameter((2024, 12, 18), "label", "name")
157
149
  def from_name(
158
- label: str,
150
+ name: str,
159
151
  namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
160
152
  environment_name: Optional[str] = None,
161
153
  create_if_missing: bool = False,
@@ -171,11 +163,11 @@ class _Queue(_Object, type_prefix="qu"):
171
163
  q.put(123)
172
164
  ```
173
165
  """
174
- check_object_name(label, "Queue")
166
+ check_object_name(name, "Queue")
175
167
 
176
168
  async def _load(self: _Queue, resolver: Resolver, existing_object_id: Optional[str]):
177
169
  req = api_pb2.QueueGetOrCreateRequest(
178
- deployment_name=label,
170
+ deployment_name=name,
179
171
  namespace=namespace,
180
172
  environment_name=_get_environment_name(environment_name, resolver),
181
173
  object_creation_type=(api_pb2.OBJECT_CREATION_TYPE_CREATE_IF_MISSING if create_if_missing else None),
@@ -186,8 +178,9 @@ class _Queue(_Object, type_prefix="qu"):
186
178
  return _Queue._from_loader(_load, "Queue()", is_another_app=True, hydrate_lazily=True)
187
179
 
188
180
  @staticmethod
181
+ @renamed_parameter((2024, 12, 18), "label", "name")
189
182
  async def lookup(
190
- label: str,
183
+ name: str,
191
184
  namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
192
185
  client: Optional[_Client] = None,
193
186
  environment_name: Optional[str] = None,
@@ -204,7 +197,7 @@ class _Queue(_Object, type_prefix="qu"):
204
197
  ```
205
198
  """
206
199
  obj = _Queue.from_name(
207
- label, namespace=namespace, environment_name=environment_name, create_if_missing=create_if_missing
200
+ name, namespace=namespace, environment_name=environment_name, create_if_missing=create_if_missing
208
201
  )
209
202
  if client is None:
210
203
  client = await _Client.from_env()
@@ -213,8 +206,9 @@ class _Queue(_Object, type_prefix="qu"):
213
206
  return obj
214
207
 
215
208
  @staticmethod
216
- async def delete(label: str, *, client: Optional[_Client] = None, environment_name: Optional[str] = None):
217
- obj = await _Queue.lookup(label, client=client, environment_name=environment_name)
209
+ @renamed_parameter((2024, 12, 18), "label", "name")
210
+ async def delete(name: str, *, client: Optional[_Client] = None, environment_name: Optional[str] = None):
211
+ obj = await _Queue.lookup(name, client=client, environment_name=environment_name)
218
212
  req = api_pb2.QueueDeleteRequest(queue_id=obj.object_id)
219
213
  await retry_transient_errors(obj._client.stub.QueueDelete, req)
220
214
 
modal/queue.pyi CHANGED
@@ -6,8 +6,6 @@ import typing
6
6
  import typing_extensions
7
7
 
8
8
  class _Queue(modal.object._Object):
9
- @staticmethod
10
- def new(): ...
11
9
  def __init__(self): ...
12
10
  @staticmethod
13
11
  def validate_partition_key(partition: typing.Optional[str]) -> bytes: ...
@@ -20,11 +18,11 @@ class _Queue(modal.object._Object):
20
18
  ) -> typing.AsyncContextManager[_Queue]: ...
21
19
  @staticmethod
22
20
  def from_name(
23
- label: str, namespace=1, environment_name: typing.Optional[str] = None, create_if_missing: bool = False
21
+ name: str, namespace=1, environment_name: typing.Optional[str] = None, create_if_missing: bool = False
24
22
  ) -> _Queue: ...
25
23
  @staticmethod
26
24
  async def lookup(
27
- label: str,
25
+ name: str,
28
26
  namespace=1,
29
27
  client: typing.Optional[modal.client._Client] = None,
30
28
  environment_name: typing.Optional[str] = None,
@@ -32,7 +30,7 @@ class _Queue(modal.object._Object):
32
30
  ) -> _Queue: ...
33
31
  @staticmethod
34
32
  async def delete(
35
- label: str,
33
+ name: str,
36
34
  *,
37
35
  client: typing.Optional[modal.client._Client] = None,
38
36
  environment_name: typing.Optional[str] = None,
@@ -89,8 +87,6 @@ class _Queue(modal.object._Object):
89
87
  class Queue(modal.object.Object):
90
88
  def __init__(self): ...
91
89
  @staticmethod
92
- def new(): ...
93
- @staticmethod
94
90
  def validate_partition_key(partition: typing.Optional[str]) -> bytes: ...
95
91
  @classmethod
96
92
  def ephemeral(
@@ -101,13 +97,13 @@ class Queue(modal.object.Object):
101
97
  ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[Queue]: ...
102
98
  @staticmethod
103
99
  def from_name(
104
- label: str, namespace=1, environment_name: typing.Optional[str] = None, create_if_missing: bool = False
100
+ name: str, namespace=1, environment_name: typing.Optional[str] = None, create_if_missing: bool = False
105
101
  ) -> Queue: ...
106
102
 
107
103
  class __lookup_spec(typing_extensions.Protocol):
108
104
  def __call__(
109
105
  self,
110
- label: str,
106
+ name: str,
111
107
  namespace=1,
112
108
  client: typing.Optional[modal.client.Client] = None,
113
109
  environment_name: typing.Optional[str] = None,
@@ -115,7 +111,7 @@ class Queue(modal.object.Object):
115
111
  ) -> Queue: ...
116
112
  async def aio(
117
113
  self,
118
- label: str,
114
+ name: str,
119
115
  namespace=1,
120
116
  client: typing.Optional[modal.client.Client] = None,
121
117
  environment_name: typing.Optional[str] = None,
@@ -127,14 +123,14 @@ class Queue(modal.object.Object):
127
123
  class __delete_spec(typing_extensions.Protocol):
128
124
  def __call__(
129
125
  self,
130
- label: str,
126
+ name: str,
131
127
  *,
132
128
  client: typing.Optional[modal.client.Client] = None,
133
129
  environment_name: typing.Optional[str] = None,
134
130
  ): ...
135
131
  async def aio(
136
132
  self,
137
- label: str,
133
+ name: str,
138
134
  *,
139
135
  client: typing.Optional[modal.client.Client] = None,
140
136
  environment_name: typing.Optional[str] = None,
modal/sandbox.py CHANGED
@@ -118,6 +118,8 @@ class _Sandbox(_Object, type_prefix="sb"):
118
118
  for _, cloud_bucket_mount in cloud_bucket_mounts:
119
119
  if cloud_bucket_mount.secret:
120
120
  deps.append(cloud_bucket_mount.secret)
121
+ if proxy:
122
+ deps.append(proxy)
121
123
  return deps
122
124
 
123
125
  async def _load(self: _Sandbox, resolver: Resolver, _existing_object_id: Optional[str]):
modal/secret.py CHANGED
@@ -9,6 +9,7 @@ from modal_proto import api_pb2
9
9
  from ._resolver import Resolver
10
10
  from ._runtime.execution_context import is_local
11
11
  from ._utils.async_utils import synchronize_api
12
+ from ._utils.deprecation import renamed_parameter
12
13
  from ._utils.grpc_utils import retry_transient_errors
13
14
  from ._utils.name_utils import check_object_name
14
15
  from .client import _Client
@@ -161,8 +162,9 @@ class _Secret(_Object, type_prefix="st"):
161
162
  return _Secret._from_loader(_load, "Secret.from_dotenv()", hydrate_lazily=True)
162
163
 
163
164
  @staticmethod
165
+ @renamed_parameter((2024, 12, 18), "label", "name")
164
166
  def from_name(
165
- label: str, # Some global identifier, such as "aws-secret"
167
+ name: str,
166
168
  namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
167
169
  environment_name: Optional[str] = None,
168
170
  required_keys: list[
@@ -186,7 +188,7 @@ class _Secret(_Object, type_prefix="st"):
186
188
 
187
189
  async def _load(self: _Secret, resolver: Resolver, existing_object_id: Optional[str]):
188
190
  req = api_pb2.SecretGetOrCreateRequest(
189
- deployment_name=label,
191
+ deployment_name=name,
190
192
  namespace=namespace,
191
193
  environment_name=_get_environment_name(environment_name, resolver),
192
194
  required_keys=required_keys,
@@ -203,8 +205,9 @@ class _Secret(_Object, type_prefix="st"):
203
205
  return _Secret._from_loader(_load, "Secret()", hydrate_lazily=True)
204
206
 
205
207
  @staticmethod
208
+ @renamed_parameter((2024, 12, 18), "label", "name")
206
209
  async def lookup(
207
- label: str,
210
+ name: str,
208
211
  namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
209
212
  client: Optional[_Client] = None,
210
213
  environment_name: Optional[str] = None,
@@ -212,7 +215,7 @@ class _Secret(_Object, type_prefix="st"):
212
215
  ) -> "_Secret":
213
216
  """mdmd:hidden"""
214
217
  obj = _Secret.from_name(
215
- label, namespace=namespace, environment_name=environment_name, required_keys=required_keys
218
+ name, namespace=namespace, environment_name=environment_name, required_keys=required_keys
216
219
  )
217
220
  if client is None:
218
221
  client = await _Client.from_env()
modal/secret.pyi CHANGED
@@ -12,11 +12,11 @@ class _Secret(modal.object._Object):
12
12
  def from_dotenv(path=None, *, filename=".env"): ...
13
13
  @staticmethod
14
14
  def from_name(
15
- label: str, namespace=1, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
15
+ name: str, namespace=1, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
16
16
  ) -> _Secret: ...
17
17
  @staticmethod
18
18
  async def lookup(
19
- label: str,
19
+ name: str,
20
20
  namespace=1,
21
21
  client: typing.Optional[modal.client._Client] = None,
22
22
  environment_name: typing.Optional[str] = None,
@@ -42,13 +42,13 @@ class Secret(modal.object.Object):
42
42
  def from_dotenv(path=None, *, filename=".env"): ...
43
43
  @staticmethod
44
44
  def from_name(
45
- label: str, namespace=1, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
45
+ name: str, namespace=1, environment_name: typing.Optional[str] = None, required_keys: list[str] = []
46
46
  ) -> Secret: ...
47
47
 
48
48
  class __lookup_spec(typing_extensions.Protocol):
49
49
  def __call__(
50
50
  self,
51
- label: str,
51
+ name: str,
52
52
  namespace=1,
53
53
  client: typing.Optional[modal.client.Client] = None,
54
54
  environment_name: typing.Optional[str] = None,
@@ -56,7 +56,7 @@ class Secret(modal.object.Object):
56
56
  ) -> Secret: ...
57
57
  async def aio(
58
58
  self,
59
- label: str,
59
+ name: str,
60
60
  namespace=1,
61
61
  client: typing.Optional[modal.client.Client] = None,
62
62
  environment_name: typing.Optional[str] = None,
modal/volume.py CHANGED
@@ -36,7 +36,7 @@ from ._utils.blob_utils import (
36
36
  get_file_upload_spec_from_fileobj,
37
37
  get_file_upload_spec_from_path,
38
38
  )
39
- from ._utils.deprecation import deprecation_error, deprecation_warning
39
+ from ._utils.deprecation import deprecation_error, deprecation_warning, renamed_parameter
40
40
  from ._utils.grpc_utils import retry_transient_errors
41
41
  from ._utils.name_utils import check_object_name
42
42
  from .client import _Client
@@ -135,17 +135,9 @@ class _Volume(_Object, type_prefix="vo"):
135
135
  return self._lock
136
136
 
137
137
  @staticmethod
138
- def new():
139
- """mdmd:hidden"""
140
- message = (
141
- "`Volume.new` is deprecated."
142
- " Please use `Volume.from_name` (for persisted) or `Volume.ephemeral` (for ephemeral) volumes instead."
143
- )
144
- deprecation_error((2024, 3, 20), message)
145
-
146
- @staticmethod
138
+ @renamed_parameter((2024, 12, 18), "label", "name")
147
139
  def from_name(
148
- label: str,
140
+ name: str,
149
141
  namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
150
142
  environment_name: Optional[str] = None,
151
143
  create_if_missing: bool = False,
@@ -168,11 +160,11 @@ class _Volume(_Object, type_prefix="vo"):
168
160
  pass
169
161
  ```
170
162
  """
171
- check_object_name(label, "Volume")
163
+ check_object_name(name, "Volume")
172
164
 
173
165
  async def _load(self: _Volume, resolver: Resolver, existing_object_id: Optional[str]):
174
166
  req = api_pb2.VolumeGetOrCreateRequest(
175
- deployment_name=label,
167
+ deployment_name=name,
176
168
  namespace=namespace,
177
169
  environment_name=_get_environment_name(environment_name, resolver),
178
170
  object_creation_type=(api_pb2.OBJECT_CREATION_TYPE_CREATE_IF_MISSING if create_if_missing else None),
@@ -220,8 +212,9 @@ class _Volume(_Object, type_prefix="vo"):
220
212
  yield cls._new_hydrated(response.volume_id, client, None, is_another_app=True)
221
213
 
222
214
  @staticmethod
215
+ @renamed_parameter((2024, 12, 18), "label", "name")
223
216
  async def lookup(
224
- label: str,
217
+ name: str,
225
218
  namespace=api_pb2.DEPLOYMENT_NAMESPACE_WORKSPACE,
226
219
  client: Optional[_Client] = None,
227
220
  environment_name: Optional[str] = None,
@@ -239,7 +232,7 @@ class _Volume(_Object, type_prefix="vo"):
239
232
  ```
240
233
  """
241
234
  obj = _Volume.from_name(
242
- label,
235
+ name,
243
236
  namespace=namespace,
244
237
  environment_name=environment_name,
245
238
  create_if_missing=create_if_missing,
@@ -507,8 +500,9 @@ class _Volume(_Object, type_prefix="vo"):
507
500
  )
508
501
 
509
502
  @staticmethod
510
- async def delete(label: str, client: Optional[_Client] = None, environment_name: Optional[str] = None):
511
- obj = await _Volume.lookup(label, client=client, environment_name=environment_name)
503
+ @renamed_parameter((2024, 12, 18), "label", "name")
504
+ async def delete(name: str, client: Optional[_Client] = None, environment_name: Optional[str] = None):
505
+ obj = await _Volume.lookup(name, client=client, environment_name=environment_name)
512
506
  req = api_pb2.VolumeDeleteRequest(volume_id=obj.object_id)
513
507
  await retry_transient_errors(obj._client.stub.VolumeDelete, req)
514
508
 
modal/volume.pyi CHANGED
@@ -38,10 +38,8 @@ class _Volume(modal.object._Object):
38
38
 
39
39
  async def _get_lock(self): ...
40
40
  @staticmethod
41
- def new(): ...
42
- @staticmethod
43
41
  def from_name(
44
- label: str,
42
+ name: str,
45
43
  namespace=1,
46
44
  environment_name: typing.Optional[str] = None,
47
45
  create_if_missing: bool = False,
@@ -57,7 +55,7 @@ class _Volume(modal.object._Object):
57
55
  ) -> typing.AsyncContextManager[_Volume]: ...
58
56
  @staticmethod
59
57
  async def lookup(
60
- label: str,
58
+ name: str,
61
59
  namespace=1,
62
60
  client: typing.Optional[modal.client._Client] = None,
63
61
  environment_name: typing.Optional[str] = None,
@@ -85,7 +83,7 @@ class _Volume(modal.object._Object):
85
83
  async def _instance_delete(self): ...
86
84
  @staticmethod
87
85
  async def delete(
88
- label: str, client: typing.Optional[modal.client._Client] = None, environment_name: typing.Optional[str] = None
86
+ name: str, client: typing.Optional[modal.client._Client] = None, environment_name: typing.Optional[str] = None
89
87
  ): ...
90
88
 
91
89
  class _VolumeUploadContextManager:
@@ -133,11 +131,9 @@ class Volume(modal.object.Object):
133
131
 
134
132
  _get_lock: ___get_lock_spec
135
133
 
136
- @staticmethod
137
- def new(): ...
138
134
  @staticmethod
139
135
  def from_name(
140
- label: str,
136
+ name: str,
141
137
  namespace=1,
142
138
  environment_name: typing.Optional[str] = None,
143
139
  create_if_missing: bool = False,
@@ -155,7 +151,7 @@ class Volume(modal.object.Object):
155
151
  class __lookup_spec(typing_extensions.Protocol):
156
152
  def __call__(
157
153
  self,
158
- label: str,
154
+ name: str,
159
155
  namespace=1,
160
156
  client: typing.Optional[modal.client.Client] = None,
161
157
  environment_name: typing.Optional[str] = None,
@@ -164,7 +160,7 @@ class Volume(modal.object.Object):
164
160
  ) -> Volume: ...
165
161
  async def aio(
166
162
  self,
167
- label: str,
163
+ name: str,
168
164
  namespace=1,
169
165
  client: typing.Optional[modal.client.Client] = None,
170
166
  environment_name: typing.Optional[str] = None,
@@ -263,13 +259,13 @@ class Volume(modal.object.Object):
263
259
  class __delete_spec(typing_extensions.Protocol):
264
260
  def __call__(
265
261
  self,
266
- label: str,
262
+ name: str,
267
263
  client: typing.Optional[modal.client.Client] = None,
268
264
  environment_name: typing.Optional[str] = None,
269
265
  ): ...
270
266
  async def aio(
271
267
  self,
272
- label: str,
268
+ name: str,
273
269
  client: typing.Optional[modal.client.Client] = None,
274
270
  environment_name: typing.Optional[str] = None,
275
271
  ): ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.68.31
3
+ Version: 0.68.50
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -21,7 +21,7 @@ Requires-Dist: fastapi
21
21
  Requires-Dist: grpclib (==0.4.7)
22
22
  Requires-Dist: protobuf (!=4.24.0,<6.0,>=3.19)
23
23
  Requires-Dist: rich (>=12.0.0)
24
- Requires-Dist: synchronicity (~=0.9.6)
24
+ Requires-Dist: synchronicity (~=0.9.8)
25
25
  Requires-Dist: toml
26
26
  Requires-Dist: typer (>=0.9)
27
27
  Requires-Dist: types-certifi
@@ -11,73 +11,73 @@ modal/_pty.py,sha256=JZfPDDpzqICZqtyPI_oMJf_9w-p_lLNuzHhwhodUXio,1329
11
11
  modal/_resolver.py,sha256=TtowKu2LdZ7NpiYkSXs058BZ4ivY8KVYdchqLfREkiA,6775
12
12
  modal/_resources.py,sha256=5qmcirXUI8dSH926nwkUaeX9H25mqYu9mXD_KuT79-o,1733
13
13
  modal/_serialization.py,sha256=qPLH6OUEBas1CT-a6i5pOP1hPGt5AfKr9q7RMUTFOMc,18722
14
- modal/_traceback.py,sha256=orZ7rsCk9ekV7ZoFjZTH_H00azCypwRKaLh0MZb1dR8,4898
14
+ modal/_traceback.py,sha256=IZQzB3fVlUfMHOSyKUgw0H6qv4yHnpyq-XVCNZKfUdA,5023
15
15
  modal/_tunnel.py,sha256=o-jJhS4vQ6-XswDhHcJWGMZZmD03SC0e9i8fEu1JTjo,6310
16
16
  modal/_tunnel.pyi,sha256=JmmDYAy9F1FpgJ_hWx0xkom2nTOFQjn4mTPYlU3PFo4,1245
17
17
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
18
- modal/app.py,sha256=nt25_TXlzG4Kw_Ev4cgGaQnJaMnXN9-23tUh8dtR5xk,45454
19
- modal/app.pyi,sha256=3h538rJ0Z2opldsKLuQhDnvop05TfzNG-Uw_n9rEHa4,25197
18
+ modal/app.py,sha256=JWefPs4yB70BKQwSZejB_4_muhxn63cC9UmnNvpQ9XY,45526
19
+ modal/app.pyi,sha256=FYPCEJNhof4YF6HIuNP_2yG6s2PgZnKW9tO1hFE6sfA,25194
20
20
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
21
21
  modal/client.py,sha256=JAnd4-GCN093BwkvOFAK5a6iy5ycxofjpUncMxlrIMw,15253
22
- modal/client.pyi,sha256=qaus2Fah5EEsfJGBXrjVzb-fCwJ459fjrWGkXVDQQGs,7280
22
+ modal/client.pyi,sha256=F97Ao08XxQn1RMnJx2ZYX_R2bP9k-d_rekRUjHvVzEE,7280
23
23
  modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
24
24
  modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
25
- modal/cls.py,sha256=ONnrfZ2vPcaY2JuKypPiBA9eTiyg8Qfg-Ull40nn9zs,30956
26
- modal/cls.pyi,sha256=uoOEANXgCFT9Au3e-_bU98M6ZfAgQWF5ngj8f4c6qpY,8225
25
+ modal/cls.py,sha256=3hjb0JcoPjxKZNeK22f5rR43bZRBjoRI7_EMZXY7YrE,31172
26
+ modal/cls.pyi,sha256=ooDU2IaGgD5VQ3jDX2KCrqb3a91-AdKv8yKYSkjnW8Y,8230
27
27
  modal/config.py,sha256=BzhZYUUwOmvVwf6x5kf0ywMC257s648dmuhsnB6g3gk,11041
28
28
  modal/container_process.py,sha256=WTqLn01dJPVkPpwR_0w_JH96ceN5mV4TGtiu1ZR2RRA,6108
29
29
  modal/container_process.pyi,sha256=dqtqBmyRpXXpRrDooESL6WBVU_1Rh6OG-66P2Hk9E5U,2666
30
- modal/dict.py,sha256=put8iNVOoifRa7vOvMThZ2_NeHiDc474xBCsGCOZ8I4,12653
31
- modal/dict.pyi,sha256=2cYgOqBxYZih4BYgMV0c3rNPuxYR6-cB1GBXzFkHA5c,7265
32
- modal/environments.py,sha256=5cgA-zbm6ngKLsRA19zSOgtgo9-BarJK3FJK0BiF2Lo,6505
33
- modal/environments.pyi,sha256=XalNpiPkAtHWAvOU2Cotq0ozmtl-Jv0FDsR8h9mr27Q,3521
30
+ modal/dict.py,sha256=ei9jsA5iTj4UFGPJxTAed6vjd49W47ezDtj0koUmVts,12497
31
+ modal/dict.pyi,sha256=VmbzxltA2vFlIHZCxpNGtd-ieXwcUwdw3iyy3WCweqU,7115
32
+ modal/environments.py,sha256=wbv9ttFCbzATGfwcmvYiG608PfHovx0AQmawsg-jmic,6660
33
+ modal/environments.pyi,sha256=rF7oaaELoSNuoD6qImGnIbuGPtgWwR5SlcExyYJ61hQ,3515
34
34
  modal/exception.py,sha256=GEV6xMnVnkle0gsFZVLB4B7cUMyw8HzVDvAvPr34ZV4,5185
35
35
  modal/experimental.py,sha256=jFuNbwrNHos47viMB9q-cHJSvf2RDxDdoEcss9plaZE,2302
36
36
  modal/file_io.py,sha256=pDOFNQU5m-x-k3oJauck4fOp3bZ55Vc-_LvSaN5_Bow,16465
37
37
  modal/file_io.pyi,sha256=GMhCCRyMftXYI3HqI9EdGPOx70CbCNi-VC5Sfy5TYnc,7631
38
38
  modal/file_pattern_matcher.py,sha256=V6P74Vc7LAuBFe_uepIaZmoDJiuAvqjFibe0GcMJwxo,5119
39
- modal/functions.py,sha256=ig7FjNHrzsYzIgpagLGphQYLybvtx_4m0Exp0ribO1c,67669
40
- modal/functions.pyi,sha256=dsA-f4Jc-VvXWaKcPyzUSgDCBQ5ujKv55AL7rtkSCT4,25213
41
- modal/gpu.py,sha256=r4rL6uH3UJIQthzYvfWauXNyh01WqCPtKZCmmSX1fd4,6881
42
- modal/image.py,sha256=-swOPK80OXnFuhxoG3tT2zmJhas8yO-lr0jkOebBdKQ,82858
43
- modal/image.pyi,sha256=Ryd3x_Bic7j40DPe0MveGqqwvNtum2qA-6lUd5lnHvk,25503
39
+ modal/functions.py,sha256=aXXXr3rk7BCeh5OWMvxGksGm8FQoYCyrBDGV74FPoPE,67827
40
+ modal/functions.pyi,sha256=snttn47K81lKhmrCLWNVZelZTDhNsbxtw4l1DlLDR74,25317
41
+ modal/gpu.py,sha256=MTxj6ql8EpgfBg8YmZ5a1cLznyuZFssX1qXbEX4LKVM,7503
42
+ modal/image.py,sha256=sv45bYaF5Jlmk8mQE3EDADYyXLi14hOe2CUM0Zb8Xao,82243
43
+ modal/image.pyi,sha256=VY_4HnDBhW8u_Zd3n-YBZ1H9idbTorWGwzsAzY7-B70,24213
44
44
  modal/io_streams.py,sha256=QkQiizKRzd5bnbKQsap31LJgBYlAnj4-XkV_50xPYX0,15079
45
45
  modal/io_streams.pyi,sha256=bCCVSxkMcosYd8O3PQDDwJw7TQ8JEcnYonLJ5t27TQs,4804
46
- modal/mount.py,sha256=QKvrgpS_FMqrGdoyVZWeWnkNpQeDSLpuiwZFSGgRp_Y,29017
47
- modal/mount.pyi,sha256=a0WAFmT7kZvoq_ZAu6R6fwxiEUR6QSmeC_avUpJKGWM,10495
48
- modal/network_file_system.py,sha256=6H-TMvU5pet448aSnqzmOOFOgv-IVjjEiVFeYT68Qc4,14631
49
- modal/network_file_system.pyi,sha256=8mHKXuRkxHPazF6ljIW7g4M5aVqLSl6eKUPLgDCug5c,7901
46
+ modal/mount.py,sha256=Miu9V5LB80uoMasSXxxf0aYTC7H1G08PjnjmmjQdyRc,29346
47
+ modal/mount.pyi,sha256=7dKl_JeVka3g4oKw7D-FFRU-Zpadt9LJEcfNUnhj540,10491
48
+ modal/network_file_system.py,sha256=INj1TfN_Fsmabmlte7anvey1epodjbMmjBW_TIJSST4,14406
49
+ modal/network_file_system.pyi,sha256=61M-sdWrtaRjmuNVsvusI6kf1Qw-jUOVXvEAeOkM8Aw,7751
50
50
  modal/object.py,sha256=HZs3N59C6JxlMuPQWJYvrWV1FEEkH9txUovVDorVUbs,9763
51
51
  modal/object.pyi,sha256=MO78H9yFSE5i1gExPEwyyQzLdlshkcGHN1aQ0ylyvq0,8802
52
52
  modal/output.py,sha256=N0xf4qeudEaYrslzdAl35VKV8rapstgIM2e9wO8_iy0,1967
53
53
  modal/parallel_map.py,sha256=4aoMXIrlG3wl5Ifk2YDNOQkXsGRsm6Xbfm6WtJ2t3WY,16002
54
54
  modal/parallel_map.pyi,sha256=pOhT0P3DDYlwLx0fR3PTsecA7DI8uOdXC1N8i-ZkyOY,2328
55
- modal/partial_function.py,sha256=s87ILMvIfQY0gwGzRcdfLog-nqeyrl04kaQpj-w1gmg,29232
55
+ modal/partial_function.py,sha256=pDDNR6KTaIIPpuKQaoO1vgP83_LTwxMhtOn6sVRrmC8,27862
56
56
  modal/partial_function.pyi,sha256=pO6kf8i5HVsZ7CF0z_KkzLk4Aeq7NJhFJ_VNIycRXaU,9260
57
57
  modal/proxy.py,sha256=ZrOsuQP7dSZFq1OrIxalNnt0Zvsnp1h86Th679sSL40,1417
58
58
  modal/proxy.pyi,sha256=UvygdOYneLTuoDY6hVaMNCyZ947Tmx93IdLjErUqkvM,368
59
59
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
- modal/queue.py,sha256=KJmY2kakfZZWwkYqTJ5maUwCty-Ijo3co1P5gHuzFDg,18689
61
- modal/queue.pyi,sha256=di3ownBw4jc6d4X7ygXtbpjlUMOK69qyaD3lVsJbpoM,9900
60
+ modal/queue.py,sha256=zMUQtdAyqZzBg-2iAo3c3G54HLP7TEWfVhiQXLjewb4,18556
61
+ modal/queue.pyi,sha256=gGV97pWelSSYqMV9Bl4ys3mSP7q82fS71oqSWeAwyDE,9818
62
62
  modal/retries.py,sha256=HKR2Q9aNPWkMjQ5nwobqYTuZaSuw0a8lI2zrtY5IW98,5230
63
63
  modal/runner.py,sha256=qfkB0OM97kb_-oP-D5KPj_jUwfd8ePUA3R_zLkjSTBQ,24586
64
64
  modal/runner.pyi,sha256=BvMS1ZVzWSn8B8q0KnIZOJKPkN5L-i5b-USbV6SWWHQ,5177
65
65
  modal/running_app.py,sha256=CshNvGDJtagOdKW54uYjY8HY73j2TpnsL9jkPFZAsfA,560
66
- modal/sandbox.py,sha256=YJaAeeBiyf3k1loHpLyJ3kwobEhS0Jnr7voC9venNJA,28049
66
+ modal/sandbox.py,sha256=c-Qli3QJPN7bBQzsTk4iS51zurNlq--InZ2eRR-B6No,28106
67
67
  modal/sandbox.pyi,sha256=k8_vHjN3oigxSCF13Cm2HfcSHuliGuSb8ryd3CGqwoA,19815
68
68
  modal/schedule.py,sha256=0ZFpKs1bOxeo5n3HZjoL7OE2ktsb-_oGtq-WJEPO4tY,2615
69
69
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
70
- modal/secret.py,sha256=Y1WgybQIkfkxdzH9CQ1h-Wd1DJJpzipigMhyyvSxTww,10007
71
- modal/secret.pyi,sha256=B_9QWiLvTwSopLsAHre-qSB2VS74cqfhtbA4GS8faQY,2957
70
+ modal/secret.py,sha256=lebVTZi4fC9PXQpLVmsvgQLzy-2Kzxv1WBD0Jr2wsxQ,10117
71
+ modal/secret.pyi,sha256=0SyCyiYamr97htTmMjPZKvp5AQZKFF9GO_Ia2VcgrtA,2952
72
72
  modal/serving.py,sha256=MnVuTsimN05LfNPxuJZ4sr5s1_BPUkIsOP_VC-bkp78,4464
73
73
  modal/serving.pyi,sha256=ncV-9jY_vZYFnGs5ZnMb3ffrX8LmcLdIMHBC56xRbtE,1711
74
74
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
75
75
  modal/token_flow.py,sha256=LcgSce_MSQ2p7j55DPwpVRpiAtCDe8GRSEwzO7muNR8,6774
76
76
  modal/token_flow.pyi,sha256=gOYtYujrWt_JFZeiI8EmfahXPx5GCR5Na-VaPQcWgEY,1937
77
- modal/volume.py,sha256=m25hZctl3zV5EMRM5BTd8mVDe66Scysbt__z6IXXa5g,29347
78
- modal/volume.pyi,sha256=St0mDiaojfep6Bs4sBbkRJmeacYHF6lh6FKOWGmheHA,11182
77
+ modal/volume.py,sha256=T-pLxCYqmqRO6OolpAXlPxomMu0RWjti2e4kUpaj2cQ,29229
78
+ modal/volume.pyi,sha256=eekb2dnAAwFK_NO9ciAOOTthl8NP1iAmMFrCGgjDA2k,11100
79
79
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
80
- modal/_runtime/asgi.py,sha256=H68KAN8bz8Zp7EcRl2c_ite1Y3kP1MHvjQAf-uUpCx8,21691
80
+ modal/_runtime/asgi.py,sha256=Mjs859pSgOmtZL-YmEsSKN557v1A2Ax_5-ERgPfj55E,21920
81
81
  modal/_runtime/container_io_manager.py,sha256=ctgyNFiHjq1brCrabXmlurkAXjnrCeWPRvTVa735vRw,44215
82
82
  modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
83
83
  modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
@@ -87,8 +87,8 @@ modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
87
87
  modal/_utils/async_utils.py,sha256=9ubwMkwiDB4gzOYG2jL9j7Fs-5dxHjcifZe3r7JRg-k,25091
88
88
  modal/_utils/blob_utils.py,sha256=N66LtZI8PpCkZ7maA7GLW5CAmYUoNJdG-GjaAUR4_NQ,14509
89
89
  modal/_utils/bytes_io_segment_payload.py,sha256=uunxVJS4PE1LojF_UpURMzVK9GuvmYWRqQo_bxEj5TU,3385
90
- modal/_utils/deprecation.py,sha256=9yHc2_bIuvivx-oYOzg-kj6JIolPdxXBlEkOVgnZcFA,1556
91
- modal/_utils/function_utils.py,sha256=LgcveUUb4XU_dWxtqgK_3ujZBvS3cGVzcDOkljyFZ2w,25066
90
+ modal/_utils/deprecation.py,sha256=dycySRBxyZf3ITzEqPNM6MxXTk9-0VVLA8oCPQ5j_Os,3426
91
+ modal/_utils/function_utils.py,sha256=4LYFbNY5aHc96QitwP4Ty-dBl45SD1HjfZrvBFUF-ko,25343
92
92
  modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
93
93
  modal/_utils/grpc_utils.py,sha256=PPB5ay-vXencXNIWPVw5modr3EH7gfq2QPcO5YJ1lMU,7737
94
94
  modal/_utils/hash_utils.py,sha256=zg3J6OGxTFGSFri1qQ12giDz90lWk8bzaxCTUCRtiX4,3034
@@ -110,19 +110,19 @@ modal/cli/_traceback.py,sha256=QlLa_iw3fAOA-mqCqjS8qAxvNT48J3YY3errtVVc2cw,7316
110
110
  modal/cli/app.py,sha256=HkwI38FZxx66jxiur4o_DRN3uwyO3L8hqgyo8oXKZxc,7726
111
111
  modal/cli/config.py,sha256=pXPLmX0bIoV57rQNqIPK7V-yllj-GPRY4jiBO_EklGg,1667
112
112
  modal/cli/container.py,sha256=nCySVD10VJPzmX3ghTsGmpxdYeVYYMW6ofjsyt2gQcM,3667
113
- modal/cli/dict.py,sha256=gwX4ZBsrr0dpWf_B5_5GN_ealcVzpcGyvY24dEY4y3Y,4455
113
+ modal/cli/dict.py,sha256=HaEcjfll7i3Uj3Fg56aj4407if5UljsYfr6fIq-D2W8,4589
114
114
  modal/cli/entry_point.py,sha256=aaNxFAqZcmtSjwzkYIA_Ba9CkL4cL4_i2gy5VjoXxkM,4228
115
115
  modal/cli/environment.py,sha256=Ayddkiq9jdj3XYDJ8ZmUqFpPPH8xajYlbexRkzGtUcg,4334
116
116
  modal/cli/import_refs.py,sha256=wnqE5AMeyAN3IZmQvJCp54KRnJh8Nq_5fMqB6u6GEL8,9147
117
117
  modal/cli/launch.py,sha256=uyI-ouGvYRjHLGxGQ2lYBZq32BiRT1i0L8ksz5iy7K8,2935
118
- modal/cli/network_file_system.py,sha256=3QbAxKEoRc6RCMsYE3OS-GcuiI4GMkz_wAKsIBbN1qg,8186
118
+ modal/cli/network_file_system.py,sha256=o6VLTgN4xn5XUiNPBfxYec-5uWCgYrDmfFFLM1ZW_eE,8180
119
119
  modal/cli/profile.py,sha256=rLXfjJObfPNjaZvNfHGIKqs7y9bGYyGe-K7V0w-Ni0M,3110
120
120
  modal/cli/queues.py,sha256=MIh2OsliNE2QeL1erubfsRsNuG4fxqcqWA2vgIfQ4Mg,4494
121
- modal/cli/run.py,sha256=W9isFpIQTNCxKafVfI_PUjxNrDMl5V8N9y15F3wtPXk,17831
121
+ modal/cli/run.py,sha256=9SvPmBzB8ZZRaqUJc9LmL2tfT5OMiR4Ow0dLANVwuB8,17870
122
122
  modal/cli/secret.py,sha256=uQpwYrMY98iMCWeZOQTcktOYhPTZ8IHnyealDc2CZqo,4206
123
123
  modal/cli/token.py,sha256=mxSgOWakXG6N71hQb1ko61XAR9ZGkTMZD-Txn7gmTac,1924
124
124
  modal/cli/utils.py,sha256=hZmjyzcPjDnQSkLvycZD2LhGdcsfdZshs_rOU78EpvI,3717
125
- modal/cli/volume.py,sha256=ngbnX4nhURMaCOqDGO4HmTvAbRBZBjRnPvk5TumnbVw,10004
125
+ modal/cli/volume.py,sha256=Oxc8WGP8wm2a_S87bp-P4OnPwoT1wIYQhbgkCvvFIdI,9998
126
126
  modal/cli/programs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
127
127
  modal/cli/programs/run_jupyter.py,sha256=RRr07CqZrStMbLdBM3PpzU6KM8t9FtLbdIPthg2-Mpw,2755
128
128
  modal/cli/programs/vscode.py,sha256=acKvTUNA2uIGITKWYS9mkb_W8WUuNmvOSOvf1KBtUco,2479
@@ -147,13 +147,13 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
147
147
  modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
148
148
  modal_global_objects/mounts/python_standalone.py,sha256=SL_riIxpd8mP4i4CLDCWiFFNj0Ltknm9c_UIGfX5d60,1836
149
149
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
150
- modal_proto/api.proto,sha256=Fdc1QR9kxirCiZW7o8fslrYd8vk-gR2dWOWj2uCbkHk,79553
151
- modal_proto/api_grpc.py,sha256=DveC4ejFYEhCLiWbQShnmY31_FWGYU675Bmr7nHhsgs,101342
152
- modal_proto/api_pb2.py,sha256=EwN_R_HDiLP0s61rpSRQ5r6Kwof_XiPtH-lqeX6gC9I,292335
153
- modal_proto/api_pb2.pyi,sha256=Ggl_mfNlUQWPQaxDUMqeC4Rglf1xXSf4Kx8vIFPiXp8,390741
154
- modal_proto/api_pb2_grpc.py,sha256=2PEP6JPOoTw2rDC5qYjLNuumP68ZwAouRhCoayisAhY,219162
155
- modal_proto/api_pb2_grpc.pyi,sha256=uWtCxVEd0cFpOZ1oOGfZNO7Dv45OP4kp09jMnNyx9D4,51098
156
- modal_proto/modal_api_grpc.py,sha256=-8mLby_om5MYo6yu1zA_hqhz0yLsQW7k2YWBVZW1iVs,13546
150
+ modal_proto/api.proto,sha256=LdD5XC5IhLP4rL_7nLeO0FL3emTs7jpEZGON2JIJDs4,79741
151
+ modal_proto/api_grpc.py,sha256=AiUCWTHQQFC9RFB_XuavB_OnVMr7GJMRLEwcf4FSTio,102088
152
+ modal_proto/api_pb2.py,sha256=rvBtjxpHVIXZmecc0OZS5PgZm4n1DcI4q1EHE675iW0,293583
153
+ modal_proto/api_pb2.pyi,sha256=LNvol6MFzFuG1J_wKA4AKPiSKSLkYfNW1kF7c5XXABk,391781
154
+ modal_proto/api_pb2_grpc.py,sha256=dFxVTgosyp_o8NCI1JIySlR0qTzG4ILm9mq8MNo4jYc,220795
155
+ modal_proto/api_pb2_grpc.pyi,sha256=yJgwEl-1YU42m7MU_Sm5SK3rB9xdkisPk3nZB-mlqkg,51463
156
+ modal_proto/modal_api_grpc.py,sha256=MyNzvY_WqB7QTMOQjoH6lsqCY5-6_s1HP-knsOSjANs,13640
157
157
  modal_proto/modal_options_grpc.py,sha256=qJ1cuwA54oRqrdTyPTbvfhFZYd9HhJKK5UCwt523r3Y,120
158
158
  modal_proto/options.proto,sha256=a-siq4swVbZPfaFRXAipRZzGP2bq8OsdUvjlyzAeodQ,488
159
159
  modal_proto/options_grpc.py,sha256=M18X3d-8F_cNYSVM3I25dUTO5rZ0rd-vCCfynfh13Nc,125
@@ -164,10 +164,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
164
164
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
165
  modal_version/__init__.py,sha256=RT6zPoOdFO99u5Wcxxaoir4ZCuPTbQ22cvzFAXl3vUY,470
166
166
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
167
- modal_version/_version_generated.py,sha256=C9Vb_Q2jwc4JqXMWby_tAoXXSlH3UtNjbodotQ6GwxI,149
168
- modal-0.68.31.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
169
- modal-0.68.31.dist-info/METADATA,sha256=DBQM-eDw-6sWtFeC6cVRZvEPULWr_Grn0eYDBEcUmaM,2329
170
- modal-0.68.31.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
171
- modal-0.68.31.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
172
- modal-0.68.31.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
173
- modal-0.68.31.dist-info/RECORD,,
167
+ modal_version/_version_generated.py,sha256=ut0wAyoP-7s5gVURkLb4fKBrb9HgRbFc7l23f9RyI24,149
168
+ modal-0.68.50.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
169
+ modal-0.68.50.dist-info/METADATA,sha256=bfjb4nM-LUkYVatsQ2-SdK_EOyiNICQFyKfYV5mRQjw,2329
170
+ modal-0.68.50.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
171
+ modal-0.68.50.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
172
+ modal-0.68.50.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
173
+ modal-0.68.50.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -321,6 +321,14 @@ message AppGetByDeploymentNameResponse {
321
321
  string app_id = 1;
322
322
  }
323
323
 
324
+ message AppGetLayoutRequest {
325
+ string app_id = 1;
326
+ }
327
+
328
+ message AppGetLayoutResponse {
329
+ AppLayout app_layout = 1;
330
+ }
331
+
324
332
  message AppGetLogsRequest {
325
333
  string app_id = 1;
326
334
  float timeout = 2;
@@ -2700,6 +2708,7 @@ service ModalClient {
2700
2708
  rpc AppDeploy(AppDeployRequest) returns (AppDeployResponse);
2701
2709
  rpc AppDeploymentHistory(AppDeploymentHistoryRequest) returns (AppDeploymentHistoryResponse);
2702
2710
  rpc AppGetByDeploymentName(AppGetByDeploymentNameRequest) returns (AppGetByDeploymentNameResponse);
2711
+ rpc AppGetLayout(AppGetLayoutRequest) returns (AppGetLayoutResponse);
2703
2712
  rpc AppGetLogs(AppGetLogsRequest) returns (stream TaskLogsBatch);
2704
2713
  rpc AppGetObjects(AppGetObjectsRequest) returns (AppGetObjectsResponse);
2705
2714
  rpc AppGetOrCreate(AppGetOrCreateRequest) returns (AppGetOrCreateResponse);