modal 0.69.0__py3-none-any.whl → 0.69.1__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/_runtime/container_io_manager.py +9 -19
- modal/client.pyi +2 -2
- modal/runner.py +9 -5
- modal/running_app.py +27 -1
- {modal-0.69.0.dist-info → modal-0.69.1.dist-info}/METADATA +1 -1
- {modal-0.69.0.dist-info → modal-0.69.1.dist-info}/RECORD +11 -11
- modal_version/_version_generated.py +1 -1
- {modal-0.69.0.dist-info → modal-0.69.1.dist-info}/LICENSE +0 -0
- {modal-0.69.0.dist-info → modal-0.69.1.dist-info}/WHEEL +0 -0
- {modal-0.69.0.dist-info → modal-0.69.1.dist-info}/entry_points.txt +0 -0
- {modal-0.69.0.dist-info → modal-0.69.1.dist-info}/top_level.txt +0 -0
@@ -21,7 +21,6 @@ from typing import (
|
|
21
21
|
)
|
22
22
|
|
23
23
|
from google.protobuf.empty_pb2 import Empty
|
24
|
-
from google.protobuf.message import Message
|
25
24
|
from grpclib import Status
|
26
25
|
from synchronicity.async_wrap import asynccontextmanager
|
27
26
|
|
@@ -31,12 +30,12 @@ from modal._traceback import extract_traceback, print_exception
|
|
31
30
|
from modal._utils.async_utils import TaskContext, asyncify, synchronize_api, synchronizer
|
32
31
|
from modal._utils.blob_utils import MAX_OBJECT_SIZE_BYTES, blob_download, blob_upload
|
33
32
|
from modal._utils.function_utils import _stream_function_call_data
|
34
|
-
from modal._utils.grpc_utils import
|
33
|
+
from modal._utils.grpc_utils import retry_transient_errors
|
35
34
|
from modal._utils.package_utils import parse_major_minor_version
|
36
35
|
from modal.client import HEARTBEAT_INTERVAL, HEARTBEAT_TIMEOUT, _Client
|
37
36
|
from modal.config import config, logger
|
38
37
|
from modal.exception import ClientClosed, InputCancellation, InvalidError, SerializationError
|
39
|
-
from modal.running_app import RunningApp
|
38
|
+
from modal.running_app import RunningApp, running_app_from_layout
|
40
39
|
from modal_proto import api_pb2
|
41
40
|
|
42
41
|
if TYPE_CHECKING:
|
@@ -451,24 +450,15 @@ class _ContainerIOManager:
|
|
451
450
|
await asyncio.sleep(DYNAMIC_CONCURRENCY_INTERVAL_SECS)
|
452
451
|
|
453
452
|
async def get_app_objects(self) -> RunningApp:
|
454
|
-
req = api_pb2.
|
455
|
-
resp = await retry_transient_errors(self._client.stub.
|
456
|
-
logger.debug(f"
|
457
|
-
|
458
|
-
|
459
|
-
object_handle_metadata = {}
|
460
|
-
for item in resp.items:
|
461
|
-
handle_metadata: Optional[Message] = get_proto_oneof(item.object, "handle_metadata_oneof")
|
462
|
-
object_handle_metadata[item.object.object_id] = handle_metadata
|
463
|
-
if item.tag:
|
464
|
-
tag_to_object_id[item.tag] = item.object.object_id
|
465
|
-
|
466
|
-
return RunningApp(
|
453
|
+
req = api_pb2.AppGetLayoutRequest(app_id=self.app_id)
|
454
|
+
resp = await retry_transient_errors(self._client.stub.AppGetLayout, req)
|
455
|
+
logger.debug(f"AppGetLayout received {len(resp.app_layout.objects)} objects for app {self.app_id}")
|
456
|
+
|
457
|
+
return running_app_from_layout(
|
467
458
|
self.app_id,
|
459
|
+
resp.app_layout,
|
460
|
+
self._client,
|
468
461
|
environment_name=self._environment_name,
|
469
|
-
tag_to_object_id=tag_to_object_id,
|
470
|
-
object_handle_metadata=object_handle_metadata,
|
471
|
-
client=self._client,
|
472
462
|
)
|
473
463
|
|
474
464
|
async def get_serialized_function(self) -> tuple[Optional[Any], Optional[Callable[..., Any]]]:
|
modal/client.pyi
CHANGED
@@ -26,7 +26,7 @@ class _Client:
|
|
26
26
|
_stub: typing.Optional[modal_proto.api_grpc.ModalClientStub]
|
27
27
|
|
28
28
|
def __init__(
|
29
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.69.
|
29
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.69.1"
|
30
30
|
): ...
|
31
31
|
def is_closed(self) -> bool: ...
|
32
32
|
@property
|
@@ -81,7 +81,7 @@ class Client:
|
|
81
81
|
_stub: typing.Optional[modal_proto.api_grpc.ModalClientStub]
|
82
82
|
|
83
83
|
def __init__(
|
84
|
-
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.69.
|
84
|
+
self, server_url: str, client_type: int, credentials: typing.Optional[tuple[str, str]], version: str = "0.69.1"
|
85
85
|
): ...
|
86
86
|
def is_closed(self) -> bool: ...
|
87
87
|
@property
|
modal/runner.py
CHANGED
@@ -30,7 +30,7 @@ from .exception import InteractiveTimeoutError, InvalidError, RemoteError, _CliU
|
|
30
30
|
from .functions import _Function
|
31
31
|
from .object import _get_environment_name, _Object
|
32
32
|
from .output import _get_output_manager, enable_output
|
33
|
-
from .running_app import RunningApp
|
33
|
+
from .running_app import RunningApp, running_app_from_layout
|
34
34
|
from .sandbox import _Sandbox
|
35
35
|
from .secret import _Secret
|
36
36
|
from .stream_type import StreamType
|
@@ -54,15 +54,19 @@ async def _heartbeat(client: _Client, app_id: str) -> None:
|
|
54
54
|
|
55
55
|
async def _init_local_app_existing(client: _Client, existing_app_id: str, environment_name: str) -> RunningApp:
|
56
56
|
# Get all the objects first
|
57
|
-
obj_req = api_pb2.
|
57
|
+
obj_req = api_pb2.AppGetLayoutRequest(app_id=existing_app_id)
|
58
58
|
obj_resp, _ = await gather_cancel_on_exc(
|
59
|
-
retry_transient_errors(client.stub.
|
59
|
+
retry_transient_errors(client.stub.AppGetLayout, obj_req),
|
60
60
|
# Cache the environment associated with the app now as we will use it later
|
61
61
|
_get_environment_cached(environment_name, client),
|
62
62
|
)
|
63
63
|
app_page_url = f"https://modal.com/apps/{existing_app_id}" # TODO (elias): this should come from the backend
|
64
|
-
|
65
|
-
|
64
|
+
return running_app_from_layout(
|
65
|
+
existing_app_id,
|
66
|
+
obj_resp.app_layout,
|
67
|
+
client,
|
68
|
+
app_page_url=app_page_url,
|
69
|
+
)
|
66
70
|
|
67
71
|
|
68
72
|
async def _init_local_app_new(
|
modal/running_app.py
CHANGED
@@ -4,16 +4,42 @@ from typing import Optional
|
|
4
4
|
|
5
5
|
from google.protobuf.message import Message
|
6
6
|
|
7
|
+
from modal._utils.grpc_utils import get_proto_oneof
|
8
|
+
from modal_proto import api_pb2
|
9
|
+
|
7
10
|
from .client import _Client
|
8
11
|
|
9
12
|
|
10
13
|
@dataclass
|
11
14
|
class RunningApp:
|
12
15
|
app_id: str
|
16
|
+
client: _Client
|
13
17
|
environment_name: Optional[str] = None
|
14
18
|
app_page_url: Optional[str] = None
|
15
19
|
app_logs_url: Optional[str] = None
|
16
20
|
tag_to_object_id: dict[str, str] = field(default_factory=dict)
|
17
21
|
object_handle_metadata: dict[str, Optional[Message]] = field(default_factory=dict)
|
18
22
|
interactive: bool = False
|
19
|
-
|
23
|
+
|
24
|
+
|
25
|
+
def running_app_from_layout(
|
26
|
+
app_id: str,
|
27
|
+
app_layout: api_pb2.AppLayout,
|
28
|
+
client: _Client,
|
29
|
+
environment_name: Optional[str] = None,
|
30
|
+
app_page_url: Optional[str] = None,
|
31
|
+
) -> RunningApp:
|
32
|
+
tag_to_object_id = dict(**app_layout.function_ids, **app_layout.class_ids)
|
33
|
+
object_handle_metadata = {}
|
34
|
+
for obj in app_layout.objects:
|
35
|
+
handle_metadata: Optional[Message] = get_proto_oneof(obj, "handle_metadata_oneof")
|
36
|
+
object_handle_metadata[obj.object_id] = handle_metadata
|
37
|
+
|
38
|
+
return RunningApp(
|
39
|
+
app_id,
|
40
|
+
client,
|
41
|
+
environment_name=environment_name,
|
42
|
+
tag_to_object_id=tag_to_object_id,
|
43
|
+
object_handle_metadata=object_handle_metadata,
|
44
|
+
app_page_url=app_page_url,
|
45
|
+
)
|
@@ -19,7 +19,7 @@ modal/app.py,sha256=JWefPs4yB70BKQwSZejB_4_muhxn63cC9UmnNvpQ9XY,45526
|
|
19
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=
|
22
|
+
modal/client.pyi,sha256=7U3WKJizZ3WdJRt2qk42I5fnck6KLgjtjS1a3uvRXx8,7278
|
23
23
|
modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
|
24
24
|
modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
|
25
25
|
modal/cls.py,sha256=3hjb0JcoPjxKZNeK22f5rR43bZRBjoRI7_EMZXY7YrE,31172
|
@@ -60,9 +60,9 @@ modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
60
60
|
modal/queue.py,sha256=zMUQtdAyqZzBg-2iAo3c3G54HLP7TEWfVhiQXLjewb4,18556
|
61
61
|
modal/queue.pyi,sha256=gGV97pWelSSYqMV9Bl4ys3mSP7q82fS71oqSWeAwyDE,9818
|
62
62
|
modal/retries.py,sha256=HKR2Q9aNPWkMjQ5nwobqYTuZaSuw0a8lI2zrtY5IW98,5230
|
63
|
-
modal/runner.py,sha256=
|
63
|
+
modal/runner.py,sha256=1nPBsIfef2sOr2ebQ348EmDemvYFDhp1-_Gr3BKsjdM,24542
|
64
64
|
modal/runner.pyi,sha256=BvMS1ZVzWSn8B8q0KnIZOJKPkN5L-i5b-USbV6SWWHQ,5177
|
65
|
-
modal/running_app.py,sha256=
|
65
|
+
modal/running_app.py,sha256=FSr0XoL4mPLPCBMj2TozWuEvcvApdY_t68nUowwf8x4,1372
|
66
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
|
@@ -78,7 +78,7 @@ modal/volume.py,sha256=T-pLxCYqmqRO6OolpAXlPxomMu0RWjti2e4kUpaj2cQ,29229
|
|
78
78
|
modal/volume.pyi,sha256=eekb2dnAAwFK_NO9ciAOOTthl8NP1iAmMFrCGgjDA2k,11100
|
79
79
|
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
80
80
|
modal/_runtime/asgi.py,sha256=Mjs859pSgOmtZL-YmEsSKN557v1A2Ax_5-ERgPfj55E,21920
|
81
|
-
modal/_runtime/container_io_manager.py,sha256=
|
81
|
+
modal/_runtime/container_io_manager.py,sha256=5d7ikjaejLmJX3axLvxkXkJCWTl8eZIr1NGKkE7m9kA,43698
|
82
82
|
modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
|
83
83
|
modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
|
84
84
|
modal/_runtime/user_code_imports.py,sha256=n4CQOojzSdf0jwSKSy6MEnVX3IWl3t3Dq54-x9VS2Ds,14663
|
@@ -165,10 +165,10 @@ modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0y
|
|
165
165
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
166
166
|
modal_version/__init__.py,sha256=aBl2c-5ZPst-0n_E9DeJEfYYSifFGrDOwo9tpDwhyK8,470
|
167
167
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
168
|
-
modal_version/_version_generated.py,sha256=
|
169
|
-
modal-0.69.
|
170
|
-
modal-0.69.
|
171
|
-
modal-0.69.
|
172
|
-
modal-0.69.
|
173
|
-
modal-0.69.
|
174
|
-
modal-0.69.
|
168
|
+
modal_version/_version_generated.py,sha256=i5tv0oldHWm-ZUND3nzjQGAAW9h0-dhVC8LT02amWOo,148
|
169
|
+
modal-0.69.1.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
170
|
+
modal-0.69.1.dist-info/METADATA,sha256=7lw4rSs7pu1UUYNQ4OGoK14rZjZm3qwKrRm5-hX5CCA,2328
|
171
|
+
modal-0.69.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
172
|
+
modal-0.69.1.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
173
|
+
modal-0.69.1.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
|
174
|
+
modal-0.69.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|