modal 1.2.2.dev30__py3-none-any.whl → 1.2.2.dev36__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 (46) hide show
  1. modal/_functions.py +77 -52
  2. modal/_load_context.py +105 -0
  3. modal/_object.py +47 -18
  4. modal/_resolver.py +21 -35
  5. modal/app.py +7 -0
  6. modal/app.pyi +3 -0
  7. modal/cli/dict.py +5 -2
  8. modal/cli/queues.py +4 -2
  9. modal/client.pyi +2 -2
  10. modal/cls.py +71 -32
  11. modal/cls.pyi +3 -0
  12. modal/dict.py +14 -5
  13. modal/dict.pyi +2 -0
  14. modal/environments.py +16 -7
  15. modal/environments.pyi +6 -2
  16. modal/functions.pyi +10 -4
  17. modal/image.py +22 -22
  18. modal/mount.py +35 -25
  19. modal/mount.pyi +33 -7
  20. modal/network_file_system.py +14 -5
  21. modal/network_file_system.pyi +12 -2
  22. modal/object.pyi +35 -8
  23. modal/proxy.py +14 -6
  24. modal/proxy.pyi +10 -2
  25. modal/queue.py +14 -5
  26. modal/queue.pyi +12 -2
  27. modal/runner.py +43 -47
  28. modal/runner.pyi +2 -2
  29. modal/sandbox.py +21 -12
  30. modal/secret.py +57 -39
  31. modal/secret.pyi +21 -4
  32. modal/serving.py +7 -11
  33. modal/serving.pyi +7 -8
  34. modal/snapshot.py +11 -5
  35. modal/volume.py +25 -7
  36. modal/volume.pyi +2 -0
  37. {modal-1.2.2.dev30.dist-info → modal-1.2.2.dev36.dist-info}/METADATA +1 -1
  38. {modal-1.2.2.dev30.dist-info → modal-1.2.2.dev36.dist-info}/RECORD +46 -45
  39. modal_proto/api.proto +4 -0
  40. modal_proto/api_pb2.py +684 -684
  41. modal_proto/api_pb2.pyi +24 -3
  42. modal_version/__init__.py +1 -1
  43. {modal-1.2.2.dev30.dist-info → modal-1.2.2.dev36.dist-info}/WHEEL +0 -0
  44. {modal-1.2.2.dev30.dist-info → modal-1.2.2.dev36.dist-info}/entry_points.txt +0 -0
  45. {modal-1.2.2.dev30.dist-info → modal-1.2.2.dev36.dist-info}/licenses/LICENSE +0 -0
  46. {modal-1.2.2.dev30.dist-info → modal-1.2.2.dev36.dist-info}/top_level.txt +0 -0
modal/serving.py CHANGED
@@ -4,13 +4,13 @@ import platform
4
4
  from collections.abc import AsyncGenerator
5
5
  from multiprocessing.context import SpawnProcess
6
6
  from multiprocessing.synchronize import Event
7
- from typing import TYPE_CHECKING, Optional, TypeVar
7
+ from typing import TYPE_CHECKING, Optional
8
8
 
9
9
  from synchronicity.async_wrap import asynccontextmanager
10
10
 
11
11
  from modal._output import OutputManager
12
12
 
13
- from ._utils.async_utils import TaskContext, asyncify, synchronize_api, synchronizer
13
+ from ._utils.async_utils import TaskContext, asyncify, synchronize_api
14
14
  from ._utils.logger import logger
15
15
  from ._watcher import watch
16
16
  from .cli.import_refs import ImportRef, import_app_from_ref
@@ -20,20 +20,16 @@ from .output import _get_output_manager, enable_output
20
20
  from .runner import _run_app, serve_update
21
21
 
22
22
  if TYPE_CHECKING:
23
- from .app import _App
24
- else:
25
- _App = TypeVar("_App")
23
+ import modal.app
26
24
 
27
25
 
28
26
  def _run_serve(
29
27
  import_ref: ImportRef, existing_app_id: str, is_ready: Event, environment_name: str, show_progress: bool
30
28
  ):
31
- # subprocess entrypoint
32
- _app = import_app_from_ref(import_ref, base_cmd="modal serve")
33
- blocking_app = synchronizer._translate_out(_app)
29
+ app = import_app_from_ref(import_ref, base_cmd="modal serve")
34
30
 
35
31
  with enable_output(show_progress=show_progress):
36
- serve_update(blocking_app, existing_app_id, is_ready, environment_name)
32
+ serve_update(app, existing_app_id, is_ready, environment_name)
37
33
 
38
34
 
39
35
  async def _restart_serve(
@@ -97,12 +93,12 @@ async def _run_watch_loop(
97
93
 
98
94
  @asynccontextmanager
99
95
  async def _serve_app(
100
- app: "_App",
96
+ app: "modal.app._App",
101
97
  import_ref: ImportRef,
102
98
  *,
103
99
  _watcher: Optional[AsyncGenerator[set[str], None]] = None, # for testing
104
100
  environment_name: Optional[str] = None,
105
- ) -> AsyncGenerator["_App", None]:
101
+ ) -> AsyncGenerator["modal.app._App", None]:
106
102
  if environment_name is None:
107
103
  environment_name = config.get("environment")
108
104
 
modal/serving.pyi CHANGED
@@ -1,4 +1,5 @@
1
1
  import collections.abc
2
+ import modal.app
2
3
  import modal.cli.import_refs
3
4
  import multiprocessing.context
4
5
  import multiprocessing.synchronize
@@ -6,8 +7,6 @@ import synchronicity.combined_types
6
7
  import typing
7
8
  import typing_extensions
8
9
 
9
- _App = typing.TypeVar("_App")
10
-
11
10
  def _run_serve(
12
11
  import_ref: modal.cli.import_refs.ImportRef,
13
12
  existing_app_id: str,
@@ -27,31 +26,31 @@ async def _run_watch_loop(
27
26
  environment_name: str,
28
27
  ): ...
29
28
  def _serve_app(
30
- app: _App,
29
+ app: modal.app._App,
31
30
  import_ref: modal.cli.import_refs.ImportRef,
32
31
  *,
33
32
  _watcher: typing.Optional[collections.abc.AsyncGenerator[set[str], None]] = None,
34
33
  environment_name: typing.Optional[str] = None,
35
- ) -> typing.AsyncContextManager[_App]: ...
34
+ ) -> typing.AsyncContextManager[modal.app._App]: ...
36
35
 
37
36
  class __serve_app_spec(typing_extensions.Protocol):
38
37
  def __call__(
39
38
  self,
40
39
  /,
41
- app: _App,
40
+ app: modal.app.App,
42
41
  import_ref: modal.cli.import_refs.ImportRef,
43
42
  *,
44
43
  _watcher: typing.Optional[typing.Generator[set[str], None, None]] = None,
45
44
  environment_name: typing.Optional[str] = None,
46
- ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[_App]: ...
45
+ ) -> synchronicity.combined_types.AsyncAndBlockingContextManager[modal.app.App]: ...
47
46
  def aio(
48
47
  self,
49
48
  /,
50
- app: _App,
49
+ app: modal.app.App,
51
50
  import_ref: modal.cli.import_refs.ImportRef,
52
51
  *,
53
52
  _watcher: typing.Optional[collections.abc.AsyncGenerator[set[str], None]] = None,
54
53
  environment_name: typing.Optional[str] = None,
55
- ) -> typing.AsyncContextManager[_App]: ...
54
+ ) -> typing.AsyncContextManager[modal.app.App]: ...
56
55
 
57
56
  serve_app: __serve_app_spec
modal/snapshot.py CHANGED
@@ -3,6 +3,7 @@ from typing import Optional
3
3
 
4
4
  from modal_proto import api_pb2
5
5
 
6
+ from ._load_context import LoadContext
6
7
  from ._object import _Object
7
8
  from ._resolver import Resolver
8
9
  from ._utils.async_utils import synchronize_api
@@ -23,14 +24,19 @@ class _SandboxSnapshot(_Object, type_prefix="sn"):
23
24
  """
24
25
  Construct a `SandboxSnapshot` object from a sandbox snapshot ID.
25
26
  """
26
- if client is None:
27
- client = await _Client.from_env()
27
+ # TODO: remove this - from_id constructor should not do io:
28
+ client = client or await _Client.from_env()
28
29
 
29
- async def _load(self: _SandboxSnapshot, resolver: Resolver, existing_object_id: Optional[str]):
30
- await client.stub.SandboxSnapshotGet(api_pb2.SandboxSnapshotGetRequest(snapshot_id=sandbox_snapshot_id))
30
+ async def _load(
31
+ self: _SandboxSnapshot, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]
32
+ ):
33
+ await load_context.client.stub.SandboxSnapshotGet(
34
+ api_pb2.SandboxSnapshotGetRequest(snapshot_id=sandbox_snapshot_id)
35
+ )
31
36
 
32
37
  rep = "SandboxSnapshot()"
33
- obj = _SandboxSnapshot._from_loader(_load, rep)
38
+ obj = _SandboxSnapshot._from_loader(_load, rep, load_context_overrides=LoadContext(client=client))
39
+ # TODO: should this be a _Object._new_hydrated instead?
34
40
  obj._hydrate(sandbox_snapshot_id, client, None)
35
41
 
36
42
  return obj
modal/volume.py CHANGED
@@ -33,6 +33,7 @@ import modal_proto.api_pb2
33
33
  from modal.exception import AlreadyExistsError, InvalidError, NotFoundError, VolumeUploadTimeoutError
34
34
  from modal_proto import api_pb2
35
35
 
36
+ from ._load_context import LoadContext
36
37
  from ._object import (
37
38
  EPHEMERAL_OBJECT_HEARTBEAT_SLEEP,
38
39
  _get_environment_name,
@@ -362,11 +363,19 @@ class _Volume(_Object, type_prefix="vo"):
362
363
  Added in v1.0.5.
363
364
  """
364
365
 
365
- async def _load(new_volume: _Volume, resolver: Resolver, existing_object_id: Optional[str]):
366
+ async def _load(
367
+ new_volume: _Volume, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]
368
+ ):
366
369
  new_volume._initialize_from_other(self)
367
370
  new_volume._read_only = True
368
371
 
369
- obj = _Volume._from_loader(_load, "Volume()", hydrate_lazily=True, deps=lambda: [self])
372
+ obj = _Volume._from_loader(
373
+ _load,
374
+ "Volume()",
375
+ hydrate_lazily=True,
376
+ deps=lambda: [self],
377
+ load_context_overrides=self._load_context_overrides,
378
+ )
370
379
  return obj
371
380
 
372
381
  def _hydrate_metadata(self, metadata: Optional[Message]):
@@ -408,6 +417,7 @@ class _Volume(_Object, type_prefix="vo"):
408
417
  environment_name: Optional[str] = None,
409
418
  create_if_missing: bool = False,
410
419
  version: "typing.Optional[modal_proto.api_pb2.VolumeFsVersion.ValueType]" = None,
420
+ client: Optional[_Client] = None,
411
421
  ) -> "_Volume":
412
422
  """Reference a Volume by name, creating if necessary.
413
423
 
@@ -429,18 +439,26 @@ class _Volume(_Object, type_prefix="vo"):
429
439
  check_object_name(name, "Volume")
430
440
  warn_if_passing_namespace(namespace, "modal.Volume.from_name")
431
441
 
432
- async def _load(self: _Volume, resolver: Resolver, existing_object_id: Optional[str]):
442
+ async def _load(
443
+ self: _Volume, resolver: Resolver, load_context: LoadContext, existing_object_id: Optional[str]
444
+ ):
433
445
  req = api_pb2.VolumeGetOrCreateRequest(
434
446
  deployment_name=name,
435
- environment_name=_get_environment_name(environment_name, resolver),
447
+ environment_name=load_context.environment_name,
436
448
  object_creation_type=(api_pb2.OBJECT_CREATION_TYPE_CREATE_IF_MISSING if create_if_missing else None),
437
449
  version=version,
438
450
  )
439
- response = await resolver.client.stub.VolumeGetOrCreate(req)
440
- self._hydrate(response.volume_id, resolver.client, response.metadata)
451
+ response = await load_context.client.stub.VolumeGetOrCreate(req)
452
+ self._hydrate(response.volume_id, load_context.client, response.metadata)
441
453
 
442
454
  rep = _Volume._repr(name, environment_name)
443
- return _Volume._from_loader(_load, rep, hydrate_lazily=True, name=name)
455
+ return _Volume._from_loader(
456
+ _load,
457
+ rep,
458
+ hydrate_lazily=True,
459
+ name=name,
460
+ load_context_overrides=LoadContext(client=client, environment_name=environment_name),
461
+ )
444
462
 
445
463
  @classmethod
446
464
  @asynccontextmanager
modal/volume.pyi CHANGED
@@ -489,6 +489,7 @@ class _Volume(modal._object._Object):
489
489
  environment_name: typing.Optional[str] = None,
490
490
  create_if_missing: bool = False,
491
491
  version: typing.Optional[int] = None,
492
+ client: typing.Optional[modal.client._Client] = None,
492
493
  ) -> _Volume:
493
494
  """Reference a Volume by name, creating if necessary.
494
495
 
@@ -806,6 +807,7 @@ class Volume(modal.object.Object):
806
807
  environment_name: typing.Optional[str] = None,
807
808
  create_if_missing: bool = False,
808
809
  version: typing.Optional[int] = None,
810
+ client: typing.Optional[modal.client.Client] = None,
809
811
  ) -> Volume:
810
812
  """Reference a Volume by name, creating if necessary.
811
813
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.2.2.dev30
3
+ Version: 1.2.2.dev36
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -4,15 +4,16 @@ modal/_billing.py,sha256=C1jUN9f_1WqozSZAt9EOk1nImXUdiLrgFeeAu3R23cI,3012
4
4
  modal/_clustered_functions.py,sha256=7amiOxErtlciWeBJBL2KvaxerUomJpTAJ3qElflFHQA,2884
5
5
  modal/_clustered_functions.pyi,sha256=JmYwAGOLEnD5AF-gYF9O5tu-SgGjeoJz-X1j48b1Ijg,1157
6
6
  modal/_container_entrypoint.py,sha256=zYk5mC8_IMx4kWnyFMRHKOrFRLBWchy6x-py3M8FYEw,28084
7
- modal/_functions.py,sha256=QCEm1_6l0WSGlF4ICyH580wd8VyFinQRybQVxUXESuM,90416
7
+ modal/_functions.py,sha256=nuIkMeklVmR8tSEVXK06EJOC5ui4m0rIpR35II4ylmg,91168
8
8
  modal/_grpc_client.py,sha256=KZcggVNvFL5jRQkFumshMppeFHMbaZI9Dzf13run6As,6083
9
9
  modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
10
+ modal/_load_context.py,sha256=YU5vhnnaLg_OexEp5W16a9pivwfmYw9I1ItPvYmLuoE,3706
10
11
  modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
11
- modal/_object.py,sha256=gwsLdXb-Ecd8nH8LVCo8oVZPzzdyo9BrN1DjgQmsSuM,11967
12
+ modal/_object.py,sha256=kuXkifDts65m1noObXNwKxDdxaurrtVs8DXj0iAZlXU,12833
12
13
  modal/_output.py,sha256=eikFqD82RA8uwF-LLVzO-A9EtmoVLnqg0X5nZE5hdLA,26852
13
14
  modal/_partial_function.py,sha256=t0yOVrYrDUdCJt7eVNyBS-atnUtjO56izKB3rDuN17Q,38573
14
15
  modal/_pty.py,sha256=E58MQ8d5-wkbMatRKpQR-G9FdbCRcZGiZxOpGy__VuY,1481
15
- modal/_resolver.py,sha256=2RWvm34cNSnbv1v7izJMNZgfvpLDD6LzaBlr0lIrLnY,7364
16
+ modal/_resolver.py,sha256=j_nhDXxT2gbmNEx5b0B8An4ZEt4EKdVLncIj8zF9-nU,7241
16
17
  modal/_resources.py,sha256=NMAp0GCLutiZI4GuKSIVnRHVlstoD3hNGUabjTUtzf4,1794
17
18
  modal/_serialization.py,sha256=_3-Z9jSoleDnv2HghH2kfo0m_WG8Iajs1wop1Iqnam8,26341
18
19
  modal/_traceback.py,sha256=muKP7RbAXq74UGwkaVIdOxDdfDug0UcDKr9fe4LL3m8,6503
@@ -20,69 +21,69 @@ modal/_tunnel.py,sha256=zTBxBiuH1O22tS1OliAJdIsSmaZS8PlnifS_6S5z-mk,6320
20
21
  modal/_tunnel.pyi,sha256=rvC7USR2BcKkbZIeCJXwf7-UfGE-LPLjKsGNiK7Lxa4,13366
21
22
  modal/_type_manager.py,sha256=DWjgmjYJuOagw2erin506UUbG2H5UzZCFEekS-7hmfA,9087
22
23
  modal/_watcher.py,sha256=K6LYnlmSGQB4tWWI9JADv-tvSvQ1j522FwT71B51CX8,3584
23
- modal/app.py,sha256=mS2k4d6yC3zDxm2L3U1gK5O70-epWfVRdo72q_9m6eA,54667
24
- modal/app.pyi,sha256=AUV5Rp8qQrZJTP2waoKHFY7rYgsXNMYibMcCAQKuSeo,50544
24
+ modal/app.py,sha256=wdcdEoWsP7UIH2TnZj39ZiHrQhwX-CH_tqa6yuKL6Xg,55057
25
+ modal/app.pyi,sha256=5XnLb07hnNS5mI7MpLTHSFrDVJbh7lYqHOdU0jz7lnk,50683
25
26
  modal/billing.py,sha256=zmQ3bcCJlwa4KD1IA_QgdWpm1pn13c-7qfy79iEauYI,195
26
27
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
27
28
  modal/client.py,sha256=tPzihC7R9WtP56k6dyPKi5GLGdLEHdMA6YUj9Ry5G8o,14409
28
- modal/client.pyi,sha256=wqhlqlBI75mdVJFrcfKk0gQ1qbKmFeXwiIvRC7hTEJo,13094
29
+ modal/client.pyi,sha256=n0peHkn8DFMWGtxlfkgDLpc8CWSCUyGx1KUGtG8sbyk,13094
29
30
  modal/cloud_bucket_mount.py,sha256=Ff8UFG_Z0HUzcRAAfo1jvDwzaNgiX_btTFOHL7CGyI8,6016
30
31
  modal/cloud_bucket_mount.pyi,sha256=vXusGMOUk9HjCs4lhxteuCK4xLQclPfugGWKo7LECEA,7539
31
- modal/cls.py,sha256=1kxGkqXgAJS6anuWKdbqWx_n0rbXqyFuYJIROeBxNyw,40306
32
- modal/cls.pyi,sha256=jJsDPFoqzM4ht-V-e-xEJKJ5TINLF0fYtoBm_UeAW5Y,27281
32
+ modal/cls.py,sha256=TSkc7XOdfYcMkVfXBHZzhqgnQTUYA8RPdv-DySIT9L0,41883
33
+ modal/cls.pyi,sha256=p8Unbfr0yUdAzYYnD7erSRO7dH-87HkAg4oAn6srBzA,27424
33
34
  modal/config.py,sha256=xUbw_ETdR7S3guj4dyzqdd9EYwRRht3aGYQRogZbi1o,13050
34
35
  modal/container_process.py,sha256=KG2ZkFOWe2KN1b8dFSBLBoW5pWoRxBzJ20MLhDTicJs,16749
35
36
  modal/container_process.pyi,sha256=xMKr-VbQsydS8AbhAys9UTpHHnH2QRyINpPtPG7NwmI,8373
36
- modal/dict.py,sha256=qHu6ZGLwgYWfQig1awWaOeza9EV5g9EexNscq2tGaEs,21317
37
- modal/dict.pyi,sha256=deOiwuwZtwXqedC3h19SwoQIWc4mUnDTBM5XkONt48Y,31712
38
- modal/environments.py,sha256=v_TGina35BlkjG54e3FrEx6zEIKE7w21QoFTNm6u0Ys,5950
39
- modal/environments.pyi,sha256=YwI2zClQ5vZHqqKaBJYX2eK4QHRlUuqRlF0lM1JrMOs,3673
37
+ modal/dict.py,sha256=Omfmj3fUyg7ijTI33Z97geyK7MW8T31LRm-N7pZqSwU,21582
38
+ modal/dict.pyi,sha256=wemd-RTH3__HUsF2zfcVojb2ixE0-Xm0RVKOh5ZSDYE,31835
39
+ modal/environments.py,sha256=wMiMNpPkvIl_BdxRb81CY9Djzhczp_y4GEYKWp0JyBc,6135
40
+ modal/environments.pyi,sha256=bMIxvwahckgaolGD3-hP2iovRHDXewvgbVs_nx4ze0o,3808
40
41
  modal/exception.py,sha256=HrvKRJO4EMwkoqa77PBeZyrGIgEZ-yqLIA10cqZndqI,5768
41
42
  modal/file_io.py,sha256=Whs3QSl3pQbSoLzSRIIWfK4XyP-kwgyZmWgx3bhJ9u0,20933
42
43
  modal/file_io.pyi,sha256=xtO6Glf_BFwDE7QiQQo24QqcMf_Vv-iz7WojcGVlLBU,15932
43
44
  modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
44
45
  modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
45
- modal/functions.pyi,sha256=Z6VuukLrjASAgf0kV9I6c09WvP_b2gCujX6f9j2bBaw,37988
46
+ modal/functions.pyi,sha256=11hKG3vRpHzXUycfz6ozZzJ-EUHLzBUo6la_et3pEPY,38049
46
47
  modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
47
- modal/image.py,sha256=Pm2nONagz9HfeZyyK4KWvTzDTKx9QRlumpFhzhuHW90,108130
48
+ modal/image.py,sha256=wdgZlQqewK8Tj95uGOq7s8YZ8wFxMhKZtzJFTN-RT0Y,108328
48
49
  modal/image.pyi,sha256=grkqK9BfyKDXmJYNme-lGa0O3u7pOU5GifyLOAhG3sc,78202
49
50
  modal/io_streams.py,sha256=Lc-id7HvW-ffJKSoN1xQxf37pHARNkr4re2HKyGpKy4,29316
50
51
  modal/io_streams.pyi,sha256=P9kvQhXmh9fxQNGI2DtuFnnZ_9MJQ4ZiqOpDP2-QWUU,16746
51
- modal/mount.py,sha256=UPel5L2JfeOgI96718SSrjJ0dhMOQgnFDJrzpzsZ4A8,33111
52
- modal/mount.pyi,sha256=MD_zV2M7eCWxbOpQRjU60aHevN-bmbiywaCX82QoFlw,15380
53
- modal/network_file_system.py,sha256=mN26L8Q3jVZjmxSWNKbQHGAIDoZuP1LopVMt5ODqZ1o,13335
54
- modal/network_file_system.pyi,sha256=zF4PIaiuIaC4OLQ0YCj1e2O3uepW9-2Jo1T3blc7RVg,15365
52
+ modal/mount.py,sha256=GNdUfj7tWZy3-LaxVX-fvk70BqC51P1s2ktrMOMJGWU,33297
53
+ modal/mount.pyi,sha256=3_Xftyk2lEMQbt8UzmUW5N77eb7t9EdbczPwj9wue9o,15828
54
+ modal/network_file_system.py,sha256=23GUYz2DZ5kCzlUrdWBq1siBse6fP_CeGt2Lo9xHkR8,13598
55
+ modal/network_file_system.pyi,sha256=A0YyIpxToPTRi-x5DQWtlWPgzw9qHGauvwW7jTcw6y0,15554
55
56
  modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
56
- modal/object.pyi,sha256=qlyVVMezW3XgJe_iqhtzWRSki3Nuk-KrpXc1g-r8ujA,6944
57
+ modal/object.pyi,sha256=fl-jJ0xYzYyIYBcU7OKubpLOeJHdtREKGYTzByq4x1I,7913
57
58
  modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
58
59
  modal/parallel_map.py,sha256=VAfhkgCKFXtpba01Dvq7kc-xg5nlP-AdvmJW0LoyfD8,68670
59
60
  modal/parallel_map.pyi,sha256=3sbWnV2ijA2KCh4BV8oNUJMd7ryemJu7NvwsqyUlvho,15588
60
61
  modal/partial_function.py,sha256=aIdlGfTjjgqY6Fpr-biCjvRU9W542_S5N2xkNN_rYGM,1127
61
62
  modal/partial_function.pyi,sha256=M7aHV6sbCc7R28D4Tk6Agr39m6R0emrXvm8IfWflt1o,14023
62
- modal/proxy.py,sha256=CQydu_NPDgApN2GLdd7rrcg8PM-pXyFdVYcTaGMBRCQ,1491
63
- modal/proxy.pyi,sha256=yWGWwADCRGrC2w81B7671UTH4Uv3HMZKy5vVqlJUZoA,1417
63
+ modal/proxy.py,sha256=zIe_ZMAeRu9dgU9FKwZqpvCFTNwLLwIC0Vra4ZZfz1I,1737
64
+ modal/proxy.pyi,sha256=05HihJqRRJydYQSjLMYs9-mxdvzq4OUpKg3PAfrBppo,1597
64
65
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- modal/queue.py,sha256=3IyfLRp_G_sg4-Wr7cplnt3KSjJkL-H3U0asfTacd7I,25536
66
- modal/queue.pyi,sha256=mFu7GFFVFNLU9VZshnfekEsb-ABgpjdhJ07KXHvdv3A,37256
66
+ modal/queue.py,sha256=ABXb1eaGBfl5lKh-O60B0wNi0rT7lZ8gCntMOA4piLQ,25801
67
+ modal/queue.pyi,sha256=XD-VwX9m-lH8Rc4KZXmvuaNZ8f5Sip1clQSTJPdUBZo,37445
67
68
  modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
68
- modal/runner.py,sha256=PvAdsJ0YVg3Bz9JOvVy_3tGQGSUwc1EuLq8oJ4UKVXc,25230
69
- modal/runner.pyi,sha256=NwhiJmchsiASJWELmrrLMqHplCkq4r3j9Ft9fpOAurg,8719
69
+ modal/runner.py,sha256=EkEAzZNJyYQa2TNHwCEP0-y_almtOfrfiUoYWv27JGg,25813
70
+ modal/runner.pyi,sha256=HYBi04nUrZN9-L-cTlvDDHFiJS-N6M3usKk1_QzGnpc,8736
70
71
  modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
71
- modal/sandbox.py,sha256=TwmME5-BHRLcT3PQwc2yzSm3MBKvG0ifBWMOtyzl0TQ,49876
72
+ modal/sandbox.py,sha256=onH4cjq8SAbMhzn7eVOOkYzr-6odBatrCQBX6_R7qjk,50374
72
73
  modal/sandbox.pyi,sha256=XWH57XZIouFGeE-CidVYXdI_l5w-kjCzIhqN4kd2y8Q,57428
73
74
  modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
74
75
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
75
- modal/secret.py,sha256=ZSI7OAT8YXWQn4gmidH1bwjh8h7z68jxv0of46xiam8,18173
76
- modal/secret.pyi,sha256=2dj8FPBlAJodp_yvwwzV0_Q1VevMNpKxri0rDvlIn4U,20493
77
- modal/serving.py,sha256=3I3WBeVbzZY258u9PXBCW_dZBgypq3OhwBuTVvlgubE,4423
78
- modal/serving.pyi,sha256=YfixTaWikyYpwhnNxCHMZnDDQiPmV1xJ87QF91U_WGU,1924
79
- modal/snapshot.py,sha256=DRKSQYwwUonh5Yt3lYUi1P3caJKc-gz4ST2ER7aZlrU,1347
76
+ modal/secret.py,sha256=KancnGQ3X4ihl1ysx7SplJP1dBsM1TWQTv6WyXM8nIo,18783
77
+ modal/secret.pyi,sha256=Fm4Tbs0UPLlqJZbjJUdubMOPpcOmIxGUQlXFSC9eOEc,21023
78
+ modal/serving.py,sha256=rfzj23Q4hPSMpc3vj_cQg3awkZULu4hLtRs83cOEB-w,4291
79
+ modal/serving.pyi,sha256=eNqF_bhO_JQ0EDpqvSjSUdNs48vv7AcPXinp7GEs5wI,1966
80
+ modal/snapshot.py,sha256=HiXLbJAZiQv2cEQ4ur8M3AVbI_ZSL-eoteVfCL77lUw,1640
80
81
  modal/snapshot.pyi,sha256=0q83hlmWxAhDu8xwZyL5VmYh0i8Tigf7S60or2k30L8,1682
81
82
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
82
83
  modal/token_flow.py,sha256=tLvBE9OT50p8AnYYh4b5MvBMQc1vV1-6C0GsmyFDfxw,7626
83
84
  modal/token_flow.pyi,sha256=eirYjyqbRiT3GCKMIPHJPpkvBTu8WxDKqSHehWaJI_4,2533
84
- modal/volume.py,sha256=Fpx6J3OxkIsaVvzzQdt0EdoJjXjP4ahgV8_Piw22r20,51984
85
- modal/volume.pyi,sha256=WZGdwB51qvH5E7d6qS7sNCsscyuHsKUHFyyiZaQyvw8,53212
85
+ modal/volume.py,sha256=gVGp1gvME3n1fALSXgLSRdSMbMiihJKEX5GV599orh8,52432
86
+ modal/volume.pyi,sha256=sBnG6t4aPjH09vlo63S-k4915uz5VNycE-JPgUjwDs8,53335
86
87
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
87
88
  modal/_runtime/asgi.py,sha256=AOcduIlijmlxhXVWo7AIUhigo-bqm6nDkHj4Q4JLy6o,22607
88
89
  modal/_runtime/container_io_manager.py,sha256=MGURW9xa89j6GXzLlZDe9onMvfb-E69HrTyJUPaVXjw,52051
@@ -135,14 +136,14 @@ modal/cli/app.py,sha256=rbuAG92my-1eZN0olk6p2eD4oBnyBliUsrCOUW-U-9k,7832
135
136
  modal/cli/cluster.py,sha256=BLcKDpwpDmlqE2UC4V0qNpJKiQ-ZXfI9g_SE7u6vnIU,3347
136
137
  modal/cli/config.py,sha256=7xgglsSf5pKfE7ZLz-uZf9S11NBuNbUkUbcZ5nFk8Y0,1721
137
138
  modal/cli/container.py,sha256=meFH-T_Bdyd7a9HjClzGCgYuPq0KhWs_HUUsSW12HjM,3686
138
- modal/cli/dict.py,sha256=YAJtiv41YcCd5Fqam3hXCNTs4Y0yOgGR_i6RfQNSAFM,4572
139
+ modal/cli/dict.py,sha256=8aVWjxdmsPznYNMNYYkKHtrJSEREGc_H21g1hTHa0FM,4686
139
140
  modal/cli/entry_point.py,sha256=7nGM8zob80L5iyLCf_TEmjyinKojquW3_O_V0wDnK-U,4809
140
141
  modal/cli/environment.py,sha256=LGBq8RVQjfBH3EWz8QgmYe19UO66JKSDNxOXMUjw7JM,4285
141
142
  modal/cli/import_refs.py,sha256=X59Z5JwgliRO6C-cIFto2Pr7o3SwlZMKQPKA0aI4ZK4,13927
142
143
  modal/cli/launch.py,sha256=oJKGWjTJiXQTdw-SUiCmCQ76bY_8nlzJMUMu0zew0zs,6435
143
144
  modal/cli/network_file_system.py,sha256=MO4YHBdwokXaVv95W4ucmxvi-Q2IpiMrxWLOBhEED5c,8029
144
145
  modal/cli/profile.py,sha256=g8X6tFFK9ccKyu2he9Yu19WLSLNdztzECgmIV__XJFs,3257
145
- modal/cli/queues.py,sha256=-vqEHbbc5XHT0Qbzc4ttQtAGtKzoaeJ8o9B9-WlyMhU,6057
146
+ modal/cli/queues.py,sha256=S5dqk6lEd_2fJolHqoN9iRs6EkeTa0k7KqJWBBGS23k,6170
146
147
  modal/cli/run.py,sha256=3_UF2Vdye_KEgY8JzBBomt0i944cCJx96RfNbeAEPDo,25783
147
148
  modal/cli/secret.py,sha256=zkCztov8c4x8CI8G0EoyieUfv9XLQQtVXV8xeMLK-Os,8044
148
149
  modal/cli/token.py,sha256=NAmQzKBfEHkcldWKeFxAVIqQBoo1RTp7_A4yc7-8qM0,1911
@@ -157,7 +158,7 @@ modal/experimental/__init__.py,sha256=sCwNbBLcR2t-jhrpwtMAPGKt2WNqXBg0xkNZdyB-6C
157
158
  modal/experimental/flash.py,sha256=RKS3X3h4tY_mOLcMzbRs5tNCLPFL01dBAhCZSqCeBgA,26675
158
159
  modal/experimental/flash.pyi,sha256=uwinKAYxpunNNfBj58FP88DXb535Qik4F6tnJKPAIwQ,14696
159
160
  modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
160
- modal-1.2.2.dev30.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
161
+ modal-1.2.2.dev36.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
161
162
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
162
163
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
163
164
  modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
@@ -165,10 +166,10 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
165
166
  modal_docs/mdmd/mdmd.py,sha256=tUTImNd4UMFk1opkaw8J672gX8AkBO5gbY2S_NMxsxs,7140
166
167
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
167
168
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
168
- modal_proto/api.proto,sha256=_S8S_Ci838KDw8dqf4fmhVOE5_apAuctufrX56ze7bk,109030
169
+ modal_proto/api.proto,sha256=o1gwFo-hSFA6vsqgwuj8mfCuU115IH9WRaGFYZCbxBE,109200
169
170
  modal_proto/api_grpc.py,sha256=vwC-GjejDKWbG5jRN3rkU8WBSqQ8Pdj-T2E2xAECAUw,134411
170
- modal_proto/api_pb2.py,sha256=9D9DrafONt1rKOa8o-Qa-4Et7AGk8_XwV9kYXuja4g8,381073
171
- modal_proto/api_pb2.pyi,sha256=vAuI2gGBbKY2APIcWitUCSjdw7uM92zU9FL32i6R75s,534109
171
+ modal_proto/api_pb2.py,sha256=SqMt_EbaHRTcCz4_HeelaJTvQSsbP_YPTJSmlLNn8BU,381467
172
+ modal_proto/api_pb2.pyi,sha256=EaDJnKXZxxs1497rPGGCIcj5ZjfGNj891QEqftQ2qiA,536365
172
173
  modal_proto/api_pb2_grpc.py,sha256=Hqw9jcbhpr-W6jsfog_tGU55ouZjITxGvA-DGNBqOLA,289714
173
174
  modal_proto/api_pb2_grpc.pyi,sha256=QLJ58ANCx147HeGJva58h0MTCLIDs9JmVjrx8bDdwlg,67776
174
175
  modal_proto/modal_api_grpc.py,sha256=MqaBZB2ZqYj6XTIgI_p5dOPjt9gKT4pAJNd_WXR3W84,21295
@@ -185,10 +186,10 @@ modal_proto/task_command_router_pb2.py,sha256=_pD2ZpU0bNzhwBdzmLoLyLtAtftI_Agxwn
185
186
  modal_proto/task_command_router_pb2.pyi,sha256=EyDgXPLr7alqjXYERV8w_MPuO404x0uCppmSkrfE9IE,14589
186
187
  modal_proto/task_command_router_pb2_grpc.py,sha256=uEQ0HdrCp8v-9bB5yIic9muA8spCShLHY6Bz9cCgOUE,10114
187
188
  modal_proto/task_command_router_pb2_grpc.pyi,sha256=s3Yxsrawdj4nr8vqQqsAxyX6ilWaGbdECy425KKbLIA,3301
188
- modal_version/__init__.py,sha256=zvuna815ilJagWL3Xg8huaAv_l72NGA63ECILONhr5I,121
189
+ modal_version/__init__.py,sha256=782DByEJ_th6XWFxmR8yS5KZXKX4zFVE27W21dDjsPs,121
189
190
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
190
- modal-1.2.2.dev30.dist-info/METADATA,sha256=omF9tdS7xacsGah8jgkumnAt2loWlqZ_2eoT9eYFajo,2490
191
- modal-1.2.2.dev30.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
192
- modal-1.2.2.dev30.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
193
- modal-1.2.2.dev30.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
194
- modal-1.2.2.dev30.dist-info/RECORD,,
191
+ modal-1.2.2.dev36.dist-info/METADATA,sha256=cTS-BK_hb6dcpVhvPmBf0q0XgS8d8voOmHkksd0NTJQ,2490
192
+ modal-1.2.2.dev36.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
193
+ modal-1.2.2.dev36.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
194
+ modal-1.2.2.dev36.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
195
+ modal-1.2.2.dev36.dist-info/RECORD,,
modal_proto/api.proto CHANGED
@@ -1289,6 +1289,8 @@ message EnvironmentListItem {
1289
1289
  bool default = 4;
1290
1290
  bool is_managed = 5;
1291
1291
  string environment_id = 6;
1292
+ optional int32 max_concurrent_tasks = 7;
1293
+ optional int32 max_concurrent_gpus = 8;
1292
1294
  }
1293
1295
 
1294
1296
  message EnvironmentListResponse {
@@ -1312,6 +1314,8 @@ message EnvironmentUpdateRequest {
1312
1314
  string current_name = 1;
1313
1315
  google.protobuf.StringValue name = 2;
1314
1316
  google.protobuf.StringValue web_suffix = 3;
1317
+ optional int32 max_concurrent_tasks = 4;
1318
+ optional int32 max_concurrent_gpus = 5;
1315
1319
  }
1316
1320
 
1317
1321
  // A file entry when listing files in a volume or network file system.