modal 0.70.3__py3-none-any.whl → 0.71.2__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/_container_entrypoint.py +23 -15
- modal/_runtime/container_io_manager.py +1 -6
- modal/app.py +10 -8
- modal/app.pyi +6 -2
- modal/client.pyi +2 -2
- modal/experimental.py +3 -0
- modal/file_io.py +86 -0
- modal/file_io.pyi +59 -0
- modal/functions.pyi +6 -6
- modal/io_streams.py +15 -27
- modal/io_streams_helper.py +53 -0
- modal/runner.py +0 -3
- modal/running_app.py +0 -8
- modal/sandbox.py +19 -6
- modal/sandbox.pyi +25 -0
- {modal-0.70.3.dist-info → modal-0.71.2.dist-info}/METADATA +1 -1
- {modal-0.70.3.dist-info → modal-0.71.2.dist-info}/RECORD +26 -25
- modal_proto/api.proto +3 -0
- modal_proto/api_pb2.py +436 -436
- modal_proto/api_pb2.pyi +8 -1
- modal_version/__init__.py +1 -1
- modal_version/_version_generated.py +2 -2
- {modal-0.70.3.dist-info → modal-0.71.2.dist-info}/LICENSE +0 -0
- {modal-0.70.3.dist-info → modal-0.71.2.dist-info}/WHEEL +0 -0
- {modal-0.70.3.dist-info → modal-0.71.2.dist-info}/entry_points.txt +0 -0
- {modal-0.70.3.dist-info → modal-0.71.2.dist-info}/top_level.txt +0 -0
modal/sandbox.py
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
import asyncio
|
3
3
|
import os
|
4
4
|
from collections.abc import AsyncGenerator, Sequence
|
5
|
-
from typing import TYPE_CHECKING, Literal, Optional, Union, overload
|
5
|
+
from typing import TYPE_CHECKING, AsyncIterator, Literal, Optional, Union, overload
|
6
6
|
|
7
7
|
if TYPE_CHECKING:
|
8
8
|
import _typeshed
|
@@ -26,7 +26,7 @@ from .client import _Client
|
|
26
26
|
from .config import config
|
27
27
|
from .container_process import _ContainerProcess
|
28
28
|
from .exception import ExecutionError, InvalidError, SandboxTerminatedError, SandboxTimeoutError
|
29
|
-
from .file_io import _FileIO
|
29
|
+
from .file_io import FileWatchEvent, FileWatchEventType, _FileIO
|
30
30
|
from .gpu import GPU_T
|
31
31
|
from .image import _Image
|
32
32
|
from .io_streams import StreamReader, StreamWriter, _StreamReader, _StreamWriter
|
@@ -276,9 +276,9 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
276
276
|
|
277
277
|
app_id = app.app_id
|
278
278
|
app_client = app._client
|
279
|
-
elif _App.
|
280
|
-
app_id =
|
281
|
-
app_client =
|
279
|
+
elif (container_app := _App._get_container_app()) is not None:
|
280
|
+
app_id = container_app.app_id
|
281
|
+
app_client = container_app._client
|
282
282
|
else:
|
283
283
|
arglist = ", ".join(repr(s) for s in entrypoint_args)
|
284
284
|
deprecation_error(
|
@@ -320,7 +320,9 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
320
320
|
resp = await retry_transient_errors(client.stub.SandboxWait, req)
|
321
321
|
|
322
322
|
obj = _Sandbox._new_hydrated(sandbox_id, client, None)
|
323
|
-
|
323
|
+
|
324
|
+
if resp.result.status:
|
325
|
+
obj._result = resp.result
|
324
326
|
|
325
327
|
return obj
|
326
328
|
|
@@ -579,6 +581,17 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
579
581
|
task_id = await self._get_task_id()
|
580
582
|
return await _FileIO.rm(path, self._client, task_id, recursive)
|
581
583
|
|
584
|
+
async def watch(
|
585
|
+
self,
|
586
|
+
path: str,
|
587
|
+
filter: Optional[list[FileWatchEventType]] = None,
|
588
|
+
recursive: Optional[bool] = None,
|
589
|
+
timeout: Optional[int] = None,
|
590
|
+
) -> AsyncIterator[FileWatchEvent]:
|
591
|
+
task_id = await self._get_task_id()
|
592
|
+
async for event in _FileIO.watch(path, self._client, task_id, filter, recursive, timeout):
|
593
|
+
yield event
|
594
|
+
|
582
595
|
@property
|
583
596
|
def stdout(self) -> _StreamReader[str]:
|
584
597
|
"""
|
modal/sandbox.pyi
CHANGED
@@ -131,6 +131,13 @@ class _Sandbox(modal.object._Object):
|
|
131
131
|
async def ls(self, path: str) -> list[str]: ...
|
132
132
|
async def mkdir(self, path: str, parents: bool = False) -> None: ...
|
133
133
|
async def rm(self, path: str, recursive: bool = False) -> None: ...
|
134
|
+
def watch(
|
135
|
+
self,
|
136
|
+
path: str,
|
137
|
+
filter: typing.Optional[list[modal.file_io.FileWatchEventType]] = None,
|
138
|
+
recursive: typing.Optional[bool] = None,
|
139
|
+
timeout: typing.Optional[int] = None,
|
140
|
+
) -> typing.AsyncIterator[modal.file_io.FileWatchEvent]: ...
|
134
141
|
@property
|
135
142
|
def stdout(self) -> modal.io_streams._StreamReader[str]: ...
|
136
143
|
@property
|
@@ -388,6 +395,24 @@ class Sandbox(modal.object.Object):
|
|
388
395
|
|
389
396
|
rm: __rm_spec
|
390
397
|
|
398
|
+
class __watch_spec(typing_extensions.Protocol):
|
399
|
+
def __call__(
|
400
|
+
self,
|
401
|
+
path: str,
|
402
|
+
filter: typing.Optional[list[modal.file_io.FileWatchEventType]] = None,
|
403
|
+
recursive: typing.Optional[bool] = None,
|
404
|
+
timeout: typing.Optional[int] = None,
|
405
|
+
) -> typing.Iterator[modal.file_io.FileWatchEvent]: ...
|
406
|
+
def aio(
|
407
|
+
self,
|
408
|
+
path: str,
|
409
|
+
filter: typing.Optional[list[modal.file_io.FileWatchEventType]] = None,
|
410
|
+
recursive: typing.Optional[bool] = None,
|
411
|
+
timeout: typing.Optional[int] = None,
|
412
|
+
) -> typing.AsyncIterator[modal.file_io.FileWatchEvent]: ...
|
413
|
+
|
414
|
+
watch: __watch_spec
|
415
|
+
|
391
416
|
@property
|
392
417
|
def stdout(self) -> modal.io_streams.StreamReader[str]: ...
|
393
418
|
@property
|
@@ -2,7 +2,7 @@ modal/__init__.py,sha256=3NJLLHb0TRc2tc68kf8NHzORx38GbtbZvPEWDWrQ6N4,2234
|
|
2
2
|
modal/__main__.py,sha256=scYhGFqh8OJcVDo-VOxIT6CCwxOgzgflYWMnIZiMRqE,2871
|
3
3
|
modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
|
4
4
|
modal/_clustered_functions.pyi,sha256=vllkegc99A0jrUOWa8mdlSbdp6uz36TsHhGxysAOpaQ,771
|
5
|
-
modal/_container_entrypoint.py,sha256
|
5
|
+
modal/_container_entrypoint.py,sha256=-zUa567FgOKmF0TtFWQ6DgehUD2CMfABDBQ8oLSpjyc,29171
|
6
6
|
modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
|
7
7
|
modal/_location.py,sha256=S3lSxIU3h9HkWpkJ3Pwo0pqjIOSB1fjeSgUsY3x7eec,1202
|
8
8
|
modal/_output.py,sha256=0fWX_KQwhER--U81ys16CL-pA5A-LN20C0EZjElKGJQ,25410
|
@@ -15,11 +15,11 @@ 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=
|
19
|
-
modal/app.pyi,sha256=
|
18
|
+
modal/app.py,sha256=vEE0cK5QPF6_cdW5AJvcuWxz5KmeprHwBEtlDkVRHgE,45582
|
19
|
+
modal/app.pyi,sha256=Gx7gxjfQ70sxhbwfpx1VjvzEON-ZEMTJ_Vy8qt0oQvo,25302
|
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=Hytz6ByaqDhEWzURBLckQhgx5lj1VGnSG5DWq6wf6O0,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
|
@@ -32,17 +32,18 @@ modal/dict.pyi,sha256=VmbzxltA2vFlIHZCxpNGtd-ieXwcUwdw3iyy3WCweqU,7115
|
|
32
32
|
modal/environments.py,sha256=wbv9ttFCbzATGfwcmvYiG608PfHovx0AQmawsg-jmic,6660
|
33
33
|
modal/environments.pyi,sha256=rF7oaaELoSNuoD6qImGnIbuGPtgWwR5SlcExyYJ61hQ,3515
|
34
34
|
modal/exception.py,sha256=GEV6xMnVnkle0gsFZVLB4B7cUMyw8HzVDvAvPr34ZV4,5185
|
35
|
-
modal/experimental.py,sha256=
|
36
|
-
modal/file_io.py,sha256=
|
37
|
-
modal/file_io.pyi,sha256=
|
35
|
+
modal/experimental.py,sha256=npfKbyMpI41uZZs9HW_QiB3E4ykWfDXZbACXXbw6qeA,2385
|
36
|
+
modal/file_io.py,sha256=ZR8VBCDsDt5uB9TNN9XbEh7sniJzM_5YL47m8WP0m5c,19617
|
37
|
+
modal/file_io.pyi,sha256=79Fg75BjmMEeCX0Lx-Z8C4XSNPCotwNdK6ZLIDFm2f4,9770
|
38
38
|
modal/file_pattern_matcher.py,sha256=LaI7Paxg0xR9D-D7Tgc60xR0w1KZee22LjGbFie1Vms,5571
|
39
39
|
modal/functions.py,sha256=aXXXr3rk7BCeh5OWMvxGksGm8FQoYCyrBDGV74FPoPE,67827
|
40
|
-
modal/functions.pyi,sha256=
|
40
|
+
modal/functions.pyi,sha256=snttn47K81lKhmrCLWNVZelZTDhNsbxtw4l1DlLDR74,25317
|
41
41
|
modal/gpu.py,sha256=MTxj6ql8EpgfBg8YmZ5a1cLznyuZFssX1qXbEX4LKVM,7503
|
42
42
|
modal/image.py,sha256=Krvcsclomp9YsqSNwFj2FoAyg10OvU47RDnsNCwjGbQ,84550
|
43
43
|
modal/image.pyi,sha256=1fgGvsL5Rb0Sa-_2OCgIyJ_QgHcL0_9MWD_oY7cyFFM,24937
|
44
|
-
modal/io_streams.py,sha256=
|
44
|
+
modal/io_streams.py,sha256=Xxc5grJiO94nBA48FFWH3S3g6SPR0xFVgZ_DZ1oFmvI,14428
|
45
45
|
modal/io_streams.pyi,sha256=bCCVSxkMcosYd8O3PQDDwJw7TQ8JEcnYonLJ5t27TQs,4804
|
46
|
+
modal/io_streams_helper.py,sha256=B5Ui56ph7LkRpZX0tAF80Q-gOMsvPPLx5bpIPX0kgDc,1772
|
46
47
|
modal/mount.py,sha256=wOr-2vmKImsE3lHBII8hL2gYy5ng46R58QwId4JultQ,29313
|
47
48
|
modal/mount.pyi,sha256=FiNV1wIKFvd0ZMZ0tm1mz6ZSA5Hjsge-kFSA5tPWfcI,10503
|
48
49
|
modal/network_file_system.py,sha256=INj1TfN_Fsmabmlte7anvey1epodjbMmjBW_TIJSST4,14406
|
@@ -60,11 +61,11 @@ modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
60
61
|
modal/queue.py,sha256=zMUQtdAyqZzBg-2iAo3c3G54HLP7TEWfVhiQXLjewb4,18556
|
61
62
|
modal/queue.pyi,sha256=gGV97pWelSSYqMV9Bl4ys3mSP7q82fS71oqSWeAwyDE,9818
|
62
63
|
modal/retries.py,sha256=HKR2Q9aNPWkMjQ5nwobqYTuZaSuw0a8lI2zrtY5IW98,5230
|
63
|
-
modal/runner.py,sha256=
|
64
|
+
modal/runner.py,sha256=mhqgRdjD5cUDpBQIokiX7OCfVblpGV6aWmZ-WvWJgGg,24114
|
64
65
|
modal/runner.pyi,sha256=YmP4EOCNjjkwSIPi2Gl6hF_ji_ytkxz9dw3iB9KXaOI,5275
|
65
|
-
modal/running_app.py,sha256=
|
66
|
-
modal/sandbox.py,sha256=
|
67
|
-
modal/sandbox.pyi,sha256=
|
66
|
+
modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
|
67
|
+
modal/sandbox.py,sha256=H63K3MTcgdb9KkKc79sMKe6UzFMGBNI7HB2TUwBbE_U,28609
|
68
|
+
modal/sandbox.pyi,sha256=lceWDeXqzdeRc1iIuM5YmpoZlBJcVBpQO1Jc3AT1AQI,20809
|
68
69
|
modal/schedule.py,sha256=0ZFpKs1bOxeo5n3HZjoL7OE2ktsb-_oGtq-WJEPO4tY,2615
|
69
70
|
modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
|
70
71
|
modal/secret.py,sha256=lebVTZi4fC9PXQpLVmsvgQLzy-2Kzxv1WBD0Jr2wsxQ,10117
|
@@ -78,7 +79,7 @@ modal/volume.py,sha256=T-pLxCYqmqRO6OolpAXlPxomMu0RWjti2e4kUpaj2cQ,29229
|
|
78
79
|
modal/volume.pyi,sha256=eekb2dnAAwFK_NO9ciAOOTthl8NP1iAmMFrCGgjDA2k,11100
|
79
80
|
modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
80
81
|
modal/_runtime/asgi.py,sha256=Mjs859pSgOmtZL-YmEsSKN557v1A2Ax_5-ERgPfj55E,21920
|
81
|
-
modal/_runtime/container_io_manager.py,sha256=
|
82
|
+
modal/_runtime/container_io_manager.py,sha256=HgDLjE78yy1P7WZTmsEVDf89YnFFWG63Ddes8uYLVDY,43764
|
82
83
|
modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
|
83
84
|
modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
|
84
85
|
modal/_runtime/user_code_imports.py,sha256=n4CQOojzSdf0jwSKSy6MEnVX3IWl3t3Dq54-x9VS2Ds,14663
|
@@ -148,10 +149,10 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
|
|
148
149
|
modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
|
149
150
|
modal_global_objects/mounts/python_standalone.py,sha256=SL_riIxpd8mP4i4CLDCWiFFNj0Ltknm9c_UIGfX5d60,1836
|
150
151
|
modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
151
|
-
modal_proto/api.proto,sha256=
|
152
|
+
modal_proto/api.proto,sha256=B7UvK-bWmAcBuqMMWmUBubAdstblzWgMqmUUco-1fEE,79926
|
152
153
|
modal_proto/api_grpc.py,sha256=AiUCWTHQQFC9RFB_XuavB_OnVMr7GJMRLEwcf4FSTio,102088
|
153
|
-
modal_proto/api_pb2.py,sha256=
|
154
|
-
modal_proto/api_pb2.pyi,sha256=
|
154
|
+
modal_proto/api_pb2.py,sha256=EEvj9MRiYAGiGP9lZqkQs7TIP7eepBKhAtL0eJAjpRM,293669
|
155
|
+
modal_proto/api_pb2.pyi,sha256=kdIvhfjCdoMP-uLw1MvQOIwE3m2xAenexGCXuo-SX0M,392331
|
155
156
|
modal_proto/api_pb2_grpc.py,sha256=dFxVTgosyp_o8NCI1JIySlR0qTzG4ILm9mq8MNo4jYc,220795
|
156
157
|
modal_proto/api_pb2_grpc.pyi,sha256=yJgwEl-1YU42m7MU_Sm5SK3rB9xdkisPk3nZB-mlqkg,51463
|
157
158
|
modal_proto/modal_api_grpc.py,sha256=MyNzvY_WqB7QTMOQjoH6lsqCY5-6_s1HP-knsOSjANs,13640
|
@@ -163,12 +164,12 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
|
|
163
164
|
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
164
165
|
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
165
166
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
166
|
-
modal_version/__init__.py,sha256=
|
167
|
+
modal_version/__init__.py,sha256=BEBWj9tcbFUwzEjUrqly601rauw5cYsHdcmJHs3iu0s,470
|
167
168
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
168
|
-
modal_version/_version_generated.py,sha256=
|
169
|
-
modal-0.
|
170
|
-
modal-0.
|
171
|
-
modal-0.
|
172
|
-
modal-0.
|
173
|
-
modal-0.
|
174
|
-
modal-0.
|
169
|
+
modal_version/_version_generated.py,sha256=mfMCToZpTuPxzuVuuvViSp1od7EJVezkQVZIUWWSBic,148
|
170
|
+
modal-0.71.2.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
171
|
+
modal-0.71.2.dist-info/METADATA,sha256=pF1LUr5t33VWn4eEb59j6Is9NTrmoT9Wr-lZF4ciHf0,2328
|
172
|
+
modal-0.71.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
|
173
|
+
modal-0.71.2.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
174
|
+
modal-0.71.2.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
|
175
|
+
modal-0.71.2.dist-info/RECORD,,
|
modal_proto/api.proto
CHANGED
@@ -1479,6 +1479,8 @@ message FunctionGetOutputsRequest {
|
|
1479
1479
|
string last_entry_id = 6;
|
1480
1480
|
bool clear_on_success = 7; // expires *any* remaining outputs soon after this call, not just the returned ones
|
1481
1481
|
double requested_at = 8; // Used for waypoints.
|
1482
|
+
// The jwts the client expects the server to be processing. This is optional and used for sync inputs only.
|
1483
|
+
repeated string input_jwts = 9;
|
1482
1484
|
}
|
1483
1485
|
|
1484
1486
|
message FunctionGetOutputsResponse {
|
@@ -1678,6 +1680,7 @@ message GenericResult { // Used for both tasks and function outputs
|
|
1678
1680
|
// Used when the user's function fails to initialize (ex. S3 mount failed due to invalid credentials).
|
1679
1681
|
// Terminates the function and all remaining inputs.
|
1680
1682
|
GENERIC_STATUS_INIT_FAILURE = 5;
|
1683
|
+
GENERIC_STATUS_INTERNAL_FAILURE = 6;
|
1681
1684
|
}
|
1682
1685
|
|
1683
1686
|
GenericStatus status = 1; // Status of the task or function output.
|