modal 1.1.5.dev19__py3-none-any.whl → 1.1.5.dev20__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.
Potentially problematic release.
This version of modal might be problematic. Click here for more details.
- modal/_pty.py +7 -3
- modal/client.pyi +2 -2
- modal/functions.pyi +6 -6
- modal/runner.py +2 -2
- modal/sandbox.py +85 -36
- modal/sandbox.pyi +119 -15
- {modal-1.1.5.dev19.dist-info → modal-1.1.5.dev20.dist-info}/METADATA +1 -1
- {modal-1.1.5.dev19.dist-info → modal-1.1.5.dev20.dist-info}/RECORD +13 -13
- modal_version/__init__.py +1 -1
- {modal-1.1.5.dev19.dist-info → modal-1.1.5.dev20.dist-info}/WHEEL +0 -0
- {modal-1.1.5.dev19.dist-info → modal-1.1.5.dev20.dist-info}/entry_points.txt +0 -0
- {modal-1.1.5.dev19.dist-info → modal-1.1.5.dev20.dist-info}/licenses/LICENSE +0 -0
- {modal-1.1.5.dev19.dist-info → modal-1.1.5.dev20.dist-info}/top_level.txt +0 -0
modal/_pty.py
CHANGED
|
@@ -7,8 +7,11 @@ from typing import Optional
|
|
|
7
7
|
from modal_proto import api_pb2
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
def get_winsz(fd) -> tuple[Optional[int], Optional[int]]:
|
|
10
|
+
def get_winsz(fd=None) -> tuple[Optional[int], Optional[int]]:
|
|
11
11
|
try:
|
|
12
|
+
if fd is None:
|
|
13
|
+
fd = sys.stdin.fileno()
|
|
14
|
+
|
|
12
15
|
import fcntl
|
|
13
16
|
import struct
|
|
14
17
|
import termios
|
|
@@ -40,8 +43,8 @@ def raw_terminal():
|
|
|
40
43
|
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
|
|
41
44
|
|
|
42
45
|
|
|
43
|
-
def get_pty_info(shell: bool) -> api_pb2.PTYInfo:
|
|
44
|
-
rows, cols = get_winsz(
|
|
46
|
+
def get_pty_info(shell: bool, no_terminate_on_idle_stdin: bool = False) -> api_pb2.PTYInfo:
|
|
47
|
+
rows, cols = get_winsz()
|
|
45
48
|
return api_pb2.PTYInfo(
|
|
46
49
|
enabled=True, # TODO(erikbern): deprecated
|
|
47
50
|
winsz_rows=rows,
|
|
@@ -50,4 +53,5 @@ def get_pty_info(shell: bool) -> api_pb2.PTYInfo:
|
|
|
50
53
|
env_colorterm=os.environ.get("COLORTERM"),
|
|
51
54
|
env_term_program=os.environ.get("TERM_PROGRAM"),
|
|
52
55
|
pty_type=api_pb2.PTYInfo.PTY_TYPE_SHELL if shell else api_pb2.PTYInfo.PTY_TYPE_FUNCTION,
|
|
56
|
+
no_terminate_on_idle_stdin=no_terminate_on_idle_stdin,
|
|
53
57
|
)
|
modal/client.pyi
CHANGED
|
@@ -33,7 +33,7 @@ class _Client:
|
|
|
33
33
|
server_url: str,
|
|
34
34
|
client_type: int,
|
|
35
35
|
credentials: typing.Optional[tuple[str, str]],
|
|
36
|
-
version: str = "1.1.5.
|
|
36
|
+
version: str = "1.1.5.dev20",
|
|
37
37
|
):
|
|
38
38
|
"""mdmd:hidden
|
|
39
39
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -164,7 +164,7 @@ class Client:
|
|
|
164
164
|
server_url: str,
|
|
165
165
|
client_type: int,
|
|
166
166
|
credentials: typing.Optional[tuple[str, str]],
|
|
167
|
-
version: str = "1.1.5.
|
|
167
|
+
version: str = "1.1.5.dev20",
|
|
168
168
|
):
|
|
169
169
|
"""mdmd:hidden
|
|
170
170
|
The Modal client object is not intended to be instantiated directly by users.
|
modal/functions.pyi
CHANGED
|
@@ -445,7 +445,7 @@ class Function(
|
|
|
445
445
|
|
|
446
446
|
_call_generator: ___call_generator_spec[typing_extensions.Self]
|
|
447
447
|
|
|
448
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
448
|
+
class __remote_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
|
449
449
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
450
450
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
|
451
451
|
...
|
|
@@ -454,7 +454,7 @@ class Function(
|
|
|
454
454
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result."""
|
|
455
455
|
...
|
|
456
456
|
|
|
457
|
-
remote: __remote_spec[modal._functions.
|
|
457
|
+
remote: __remote_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
|
458
458
|
|
|
459
459
|
class __remote_gen_spec(typing_extensions.Protocol[SUPERSELF]):
|
|
460
460
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -481,7 +481,7 @@ class Function(
|
|
|
481
481
|
"""
|
|
482
482
|
...
|
|
483
483
|
|
|
484
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
484
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
|
485
485
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
486
486
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
487
487
|
|
|
@@ -505,7 +505,7 @@ class Function(
|
|
|
505
505
|
...
|
|
506
506
|
|
|
507
507
|
_experimental_spawn: ___experimental_spawn_spec[
|
|
508
|
-
modal._functions.
|
|
508
|
+
modal._functions.ReturnType, modal._functions.P, typing_extensions.Self
|
|
509
509
|
]
|
|
510
510
|
|
|
511
511
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER, SUPERSELF]):
|
|
@@ -514,7 +514,7 @@ class Function(
|
|
|
514
514
|
|
|
515
515
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P, typing_extensions.Self]
|
|
516
516
|
|
|
517
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
517
|
+
class __spawn_spec(typing_extensions.Protocol[ReturnType_INNER, P_INNER, SUPERSELF]):
|
|
518
518
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
519
519
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
520
520
|
|
|
@@ -535,7 +535,7 @@ class Function(
|
|
|
535
535
|
"""
|
|
536
536
|
...
|
|
537
537
|
|
|
538
|
-
spawn: __spawn_spec[modal._functions.
|
|
538
|
+
spawn: __spawn_spec[modal._functions.ReturnType, modal._functions.P, typing_extensions.Self]
|
|
539
539
|
|
|
540
540
|
def get_raw_f(self) -> collections.abc.Callable[..., typing.Any]:
|
|
541
541
|
"""Return the inner Python object wrapped by this Modal Function."""
|
modal/runner.py
CHANGED
|
@@ -607,12 +607,12 @@ async def _interactive_shell(
|
|
|
607
607
|
|
|
608
608
|
try:
|
|
609
609
|
if pty:
|
|
610
|
-
container_process = await sandbox.
|
|
610
|
+
container_process = await sandbox._exec(
|
|
611
611
|
*sandbox_cmds, pty_info=get_pty_info(shell=True) if pty else None
|
|
612
612
|
)
|
|
613
613
|
await container_process.attach()
|
|
614
614
|
else:
|
|
615
|
-
container_process = await sandbox.
|
|
615
|
+
container_process = await sandbox._exec(
|
|
616
616
|
*sandbox_cmds, stdout=StreamType.STDOUT, stderr=StreamType.STDOUT
|
|
617
617
|
)
|
|
618
618
|
await container_process.wait()
|
modal/sandbox.py
CHANGED
|
@@ -7,6 +7,7 @@ from collections.abc import AsyncGenerator, Sequence
|
|
|
7
7
|
from dataclasses import dataclass
|
|
8
8
|
from typing import TYPE_CHECKING, Any, AsyncIterator, Literal, Optional, Union, overload
|
|
9
9
|
|
|
10
|
+
from ._pty import get_pty_info
|
|
10
11
|
from .config import config, logger
|
|
11
12
|
|
|
12
13
|
if TYPE_CHECKING:
|
|
@@ -124,6 +125,10 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
124
125
|
_tunnels: Optional[dict[int, Tunnel]] = None
|
|
125
126
|
_enable_snapshot: bool = False
|
|
126
127
|
|
|
128
|
+
@staticmethod
|
|
129
|
+
def _default_pty_info() -> api_pb2.PTYInfo:
|
|
130
|
+
return get_pty_info(shell=True, no_terminate_on_idle_stdin=True)
|
|
131
|
+
|
|
127
132
|
@staticmethod
|
|
128
133
|
def _new(
|
|
129
134
|
args: Sequence[str],
|
|
@@ -143,7 +148,8 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
143
148
|
block_network: bool = False,
|
|
144
149
|
cidr_allowlist: Optional[Sequence[str]] = None,
|
|
145
150
|
volumes: dict[Union[str, os.PathLike], Union[_Volume, _CloudBucketMount]] = {},
|
|
146
|
-
|
|
151
|
+
pty: bool = False,
|
|
152
|
+
pty_info: Optional[api_pb2.PTYInfo] = None, # deprecated
|
|
147
153
|
encrypted_ports: Sequence[int] = [],
|
|
148
154
|
h2_ports: Sequence[int] = [],
|
|
149
155
|
unencrypted_ports: Sequence[int] = [],
|
|
@@ -177,6 +183,9 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
177
183
|
cloud_bucket_mounts = [(k, v) for k, v in validated_volumes if isinstance(v, _CloudBucketMount)]
|
|
178
184
|
validated_volumes = [(k, v) for k, v in validated_volumes if isinstance(v, _Volume)]
|
|
179
185
|
|
|
186
|
+
if pty:
|
|
187
|
+
pty_info = _Sandbox._default_pty_info()
|
|
188
|
+
|
|
180
189
|
def _deps() -> list[_Object]:
|
|
181
190
|
deps: list[_Object] = [image] + list(mounts) + list(secrets)
|
|
182
191
|
for _, vol in validated_network_file_systems:
|
|
@@ -301,7 +310,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
301
310
|
volumes: dict[
|
|
302
311
|
Union[str, os.PathLike], Union[_Volume, _CloudBucketMount]
|
|
303
312
|
] = {}, # Mount points for Modal Volumes and CloudBucketMounts
|
|
304
|
-
|
|
313
|
+
pty: bool = False, # Enable a PTY for the Sandbox
|
|
305
314
|
# List of ports to tunnel into the sandbox. Encrypted ports are tunneled with TLS.
|
|
306
315
|
encrypted_ports: Sequence[int] = [],
|
|
307
316
|
# List of encrypted ports to tunnel into the sandbox, using HTTP/2.
|
|
@@ -320,6 +329,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
320
329
|
] = None, # Experimental controls over fine-grained scheduling (alpha).
|
|
321
330
|
client: Optional[_Client] = None,
|
|
322
331
|
environment_name: Optional[str] = None, # *DEPRECATED* Optionally override the default environment
|
|
332
|
+
pty_info: Optional[api_pb2.PTYInfo] = None, # *DEPRECATED* Use `pty` instead. `pty` will override `pty_info`.
|
|
323
333
|
) -> "_Sandbox":
|
|
324
334
|
"""
|
|
325
335
|
Create a new Sandbox to run untrusted, arbitrary code.
|
|
@@ -342,6 +352,13 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
342
352
|
"A sandbox's environment is determined by the app it is associated with.",
|
|
343
353
|
)
|
|
344
354
|
|
|
355
|
+
if pty_info is not None:
|
|
356
|
+
deprecation_warning(
|
|
357
|
+
(2025, 9, 12),
|
|
358
|
+
"The `pty_info` parameter is deprecated and will be removed in a future release. "
|
|
359
|
+
"Set the `pty` parameter to `True` instead.",
|
|
360
|
+
)
|
|
361
|
+
|
|
345
362
|
return await _Sandbox._create(
|
|
346
363
|
*args,
|
|
347
364
|
app=app,
|
|
@@ -360,7 +377,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
360
377
|
block_network=block_network,
|
|
361
378
|
cidr_allowlist=cidr_allowlist,
|
|
362
379
|
volumes=volumes,
|
|
363
|
-
|
|
380
|
+
pty=pty,
|
|
364
381
|
encrypted_ports=encrypted_ports,
|
|
365
382
|
h2_ports=h2_ports,
|
|
366
383
|
unencrypted_ports=unencrypted_ports,
|
|
@@ -370,59 +387,51 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
370
387
|
_experimental_scheduler_placement=_experimental_scheduler_placement,
|
|
371
388
|
client=client,
|
|
372
389
|
verbose=verbose,
|
|
390
|
+
pty_info=pty_info,
|
|
373
391
|
)
|
|
374
392
|
|
|
375
393
|
@staticmethod
|
|
376
394
|
async def _create(
|
|
377
|
-
*args: str,
|
|
378
|
-
# Associate the sandbox with an app. Required unless creating from a container.
|
|
395
|
+
*args: str,
|
|
379
396
|
app: Optional["modal.app._App"] = None,
|
|
380
|
-
name: Optional[str] = None,
|
|
381
|
-
image: Optional[_Image] = None,
|
|
382
|
-
secrets: Sequence[_Secret] = (),
|
|
397
|
+
name: Optional[str] = None,
|
|
398
|
+
image: Optional[_Image] = None,
|
|
399
|
+
secrets: Sequence[_Secret] = (),
|
|
383
400
|
mounts: Sequence[_Mount] = (),
|
|
384
401
|
network_file_systems: dict[Union[str, os.PathLike], _NetworkFileSystem] = {},
|
|
385
|
-
timeout: int = 300,
|
|
386
|
-
# The amount of time in seconds that a sandbox can be idle before being terminated.
|
|
402
|
+
timeout: int = 300,
|
|
387
403
|
idle_timeout: Optional[int] = None,
|
|
388
|
-
workdir: Optional[str] = None,
|
|
404
|
+
workdir: Optional[str] = None,
|
|
389
405
|
gpu: GPU_T = None,
|
|
390
406
|
cloud: Optional[str] = None,
|
|
391
|
-
region: Optional[Union[str, Sequence[str]]] = None,
|
|
392
|
-
# Specify, in fractional CPU cores, how many CPU cores to request.
|
|
393
|
-
# Or, pass (request, limit) to additionally specify a hard limit in fractional CPU cores.
|
|
394
|
-
# CPU throttling will prevent a container from exceeding its specified limit.
|
|
407
|
+
region: Optional[Union[str, Sequence[str]]] = None,
|
|
395
408
|
cpu: Optional[Union[float, tuple[float, float]]] = None,
|
|
396
|
-
# Specify, in MiB, a memory request which is the minimum memory required.
|
|
397
|
-
# Or, pass (request, limit) to additionally specify a hard limit in MiB.
|
|
398
409
|
memory: Optional[Union[int, tuple[int, int]]] = None,
|
|
399
|
-
block_network: bool = False,
|
|
400
|
-
# List of CIDRs the sandbox is allowed to access. If None, all CIDRs are allowed.
|
|
410
|
+
block_network: bool = False,
|
|
401
411
|
cidr_allowlist: Optional[Sequence[str]] = None,
|
|
402
412
|
volumes: dict[
|
|
403
413
|
Union[str, os.PathLike], Union[_Volume, _CloudBucketMount]
|
|
404
|
-
] = {},
|
|
405
|
-
|
|
406
|
-
# List of ports to tunnel into the sandbox. Encrypted ports are tunneled with TLS.
|
|
414
|
+
] = {},
|
|
415
|
+
pty: bool = False,
|
|
407
416
|
encrypted_ports: Sequence[int] = [],
|
|
408
|
-
# List of encrypted ports to tunnel into the sandbox, using HTTP/2.
|
|
409
417
|
h2_ports: Sequence[int] = [],
|
|
410
|
-
# List of ports to tunnel into the sandbox without encryption.
|
|
411
418
|
unencrypted_ports: Sequence[int] = [],
|
|
412
|
-
# Reference to a Modal Proxy to use in front of this Sandbox.
|
|
413
419
|
proxy: Optional[_Proxy] = None,
|
|
414
420
|
experimental_options: Optional[dict[str, bool]] = None,
|
|
415
|
-
# Enable memory snapshots.
|
|
416
421
|
_experimental_enable_snapshot: bool = False,
|
|
417
422
|
_experimental_scheduler_placement: Optional[
|
|
418
423
|
SchedulerPlacement
|
|
419
|
-
] = None,
|
|
424
|
+
] = None,
|
|
420
425
|
client: Optional[_Client] = None,
|
|
421
426
|
verbose: bool = False,
|
|
427
|
+
pty_info: Optional[api_pb2.PTYInfo] = None,
|
|
422
428
|
):
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
429
|
+
"""Private method used internally.
|
|
430
|
+
|
|
431
|
+
This method exposes some internal arguments (currently `mounts`) which are not in the public API.
|
|
432
|
+
`mounts` is currently only used by modal shell (cli) to provide a function's mounts to the
|
|
433
|
+
sandbox that runs the shell session.
|
|
434
|
+
"""
|
|
426
435
|
from .app import _App
|
|
427
436
|
|
|
428
437
|
_validate_exec_args(args)
|
|
@@ -451,6 +460,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
451
460
|
block_network=block_network,
|
|
452
461
|
cidr_allowlist=cidr_allowlist,
|
|
453
462
|
volumes=volumes,
|
|
463
|
+
pty=pty,
|
|
454
464
|
pty_info=pty_info,
|
|
455
465
|
encrypted_ports=encrypted_ports,
|
|
456
466
|
h2_ports=h2_ports,
|
|
@@ -703,7 +713,6 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
703
713
|
async def exec(
|
|
704
714
|
self,
|
|
705
715
|
*args: str,
|
|
706
|
-
pty_info: Optional[api_pb2.PTYInfo] = None,
|
|
707
716
|
stdout: StreamType = StreamType.PIPE,
|
|
708
717
|
stderr: StreamType = StreamType.PIPE,
|
|
709
718
|
timeout: Optional[int] = None,
|
|
@@ -711,6 +720,8 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
711
720
|
secrets: Sequence[_Secret] = (),
|
|
712
721
|
text: Literal[True] = True,
|
|
713
722
|
bufsize: Literal[-1, 1] = -1,
|
|
723
|
+
pty: bool = False,
|
|
724
|
+
pty_info: Optional[api_pb2.PTYInfo] = None,
|
|
714
725
|
_pty_info: Optional[api_pb2.PTYInfo] = None,
|
|
715
726
|
) -> _ContainerProcess[str]: ...
|
|
716
727
|
|
|
@@ -718,7 +729,6 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
718
729
|
async def exec(
|
|
719
730
|
self,
|
|
720
731
|
*args: str,
|
|
721
|
-
pty_info: Optional[api_pb2.PTYInfo] = None,
|
|
722
732
|
stdout: StreamType = StreamType.PIPE,
|
|
723
733
|
stderr: StreamType = StreamType.PIPE,
|
|
724
734
|
timeout: Optional[int] = None,
|
|
@@ -726,13 +736,14 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
726
736
|
secrets: Sequence[_Secret] = (),
|
|
727
737
|
text: Literal[False] = False,
|
|
728
738
|
bufsize: Literal[-1, 1] = -1,
|
|
739
|
+
pty: bool = False,
|
|
740
|
+
pty_info: Optional[api_pb2.PTYInfo] = None,
|
|
729
741
|
_pty_info: Optional[api_pb2.PTYInfo] = None,
|
|
730
742
|
) -> _ContainerProcess[bytes]: ...
|
|
731
743
|
|
|
732
744
|
async def exec(
|
|
733
745
|
self,
|
|
734
746
|
*args: str,
|
|
735
|
-
pty_info: Optional[api_pb2.PTYInfo] = None, # Deprecated: internal use only
|
|
736
747
|
stdout: StreamType = StreamType.PIPE,
|
|
737
748
|
stderr: StreamType = StreamType.PIPE,
|
|
738
749
|
timeout: Optional[int] = None,
|
|
@@ -743,8 +754,9 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
743
754
|
# Control line-buffered output.
|
|
744
755
|
# -1 means unbuffered, 1 means line-buffered (only available if `text=True`).
|
|
745
756
|
bufsize: Literal[-1, 1] = -1,
|
|
746
|
-
|
|
747
|
-
_pty_info: Optional[api_pb2.PTYInfo] = None,
|
|
757
|
+
pty: bool = False, # Enable a PTY for the command
|
|
758
|
+
_pty_info: Optional[api_pb2.PTYInfo] = None, # *DEPRECATED* Use `pty` instead. `pty` will override `pty_info`.
|
|
759
|
+
pty_info: Optional[api_pb2.PTYInfo] = None, # *DEPRECATED* Use `pty` instead. `pty` will override `pty_info`.
|
|
748
760
|
):
|
|
749
761
|
"""Execute a command in the Sandbox and return a ContainerProcess handle.
|
|
750
762
|
|
|
@@ -764,7 +776,44 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
764
776
|
print(line)
|
|
765
777
|
```
|
|
766
778
|
"""
|
|
779
|
+
if pty_info is not None or _pty_info is not None:
|
|
780
|
+
deprecation_warning(
|
|
781
|
+
(2025, 9, 12),
|
|
782
|
+
"The `_pty_info` and `pty_info` parameters are deprecated and will be removed in a future release. "
|
|
783
|
+
"Set the `pty` parameter to `True` instead.",
|
|
784
|
+
)
|
|
785
|
+
pty_info = _pty_info or pty_info
|
|
786
|
+
if pty:
|
|
787
|
+
pty_info = self._default_pty_info()
|
|
767
788
|
|
|
789
|
+
return await self._exec(
|
|
790
|
+
*args,
|
|
791
|
+
pty_info=pty_info,
|
|
792
|
+
stdout=stdout,
|
|
793
|
+
stderr=stderr,
|
|
794
|
+
timeout=timeout,
|
|
795
|
+
workdir=workdir,
|
|
796
|
+
secrets=secrets,
|
|
797
|
+
text=text,
|
|
798
|
+
bufsize=bufsize,
|
|
799
|
+
)
|
|
800
|
+
|
|
801
|
+
async def _exec(
|
|
802
|
+
self,
|
|
803
|
+
*args: str,
|
|
804
|
+
pty_info: Optional[api_pb2.PTYInfo] = None,
|
|
805
|
+
stdout: StreamType = StreamType.PIPE,
|
|
806
|
+
stderr: StreamType = StreamType.PIPE,
|
|
807
|
+
timeout: Optional[int] = None,
|
|
808
|
+
workdir: Optional[str] = None,
|
|
809
|
+
secrets: Sequence[_Secret] = (),
|
|
810
|
+
text: bool = True,
|
|
811
|
+
bufsize: Literal[-1, 1] = -1,
|
|
812
|
+
) -> Union[_ContainerProcess[bytes], _ContainerProcess[str]]:
|
|
813
|
+
"""Private method used internally.
|
|
814
|
+
|
|
815
|
+
This method exposes some internal arguments (currently `pty_info`) which are not in the public API.
|
|
816
|
+
"""
|
|
768
817
|
if workdir is not None and not workdir.startswith("/"):
|
|
769
818
|
raise InvalidError(f"workdir must be an absolute path, got: {workdir}")
|
|
770
819
|
_validate_exec_args(args)
|
|
@@ -777,7 +826,7 @@ class _Sandbox(_Object, type_prefix="sb"):
|
|
|
777
826
|
req = api_pb2.ContainerExecRequest(
|
|
778
827
|
task_id=task_id,
|
|
779
828
|
command=args,
|
|
780
|
-
pty_info=
|
|
829
|
+
pty_info=pty_info,
|
|
781
830
|
runtime_debug=config.get("function_runtime_debug"),
|
|
782
831
|
timeout_secs=timeout or 0,
|
|
783
832
|
workdir=workdir,
|
modal/sandbox.pyi
CHANGED
|
@@ -84,6 +84,8 @@ class _Sandbox(modal._object._Object):
|
|
|
84
84
|
_tunnels: typing.Optional[dict[int, modal._tunnel.Tunnel]]
|
|
85
85
|
_enable_snapshot: bool
|
|
86
86
|
|
|
87
|
+
@staticmethod
|
|
88
|
+
def _default_pty_info() -> modal_proto.api_pb2.PTYInfo: ...
|
|
87
89
|
@staticmethod
|
|
88
90
|
def _new(
|
|
89
91
|
args: collections.abc.Sequence[str],
|
|
@@ -106,6 +108,7 @@ class _Sandbox(modal._object._Object):
|
|
|
106
108
|
typing.Union[str, os.PathLike],
|
|
107
109
|
typing.Union[modal.volume._Volume, modal.cloud_bucket_mount._CloudBucketMount],
|
|
108
110
|
] = {},
|
|
111
|
+
pty: bool = False,
|
|
109
112
|
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
110
113
|
encrypted_ports: collections.abc.Sequence[int] = [],
|
|
111
114
|
h2_ports: collections.abc.Sequence[int] = [],
|
|
@@ -141,7 +144,7 @@ class _Sandbox(modal._object._Object):
|
|
|
141
144
|
typing.Union[str, os.PathLike],
|
|
142
145
|
typing.Union[modal.volume._Volume, modal.cloud_bucket_mount._CloudBucketMount],
|
|
143
146
|
] = {},
|
|
144
|
-
|
|
147
|
+
pty: bool = False,
|
|
145
148
|
encrypted_ports: collections.abc.Sequence[int] = [],
|
|
146
149
|
h2_ports: collections.abc.Sequence[int] = [],
|
|
147
150
|
unencrypted_ports: collections.abc.Sequence[int] = [],
|
|
@@ -152,6 +155,7 @@ class _Sandbox(modal._object._Object):
|
|
|
152
155
|
_experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
|
|
153
156
|
client: typing.Optional[modal.client._Client] = None,
|
|
154
157
|
environment_name: typing.Optional[str] = None,
|
|
158
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
155
159
|
) -> _Sandbox:
|
|
156
160
|
"""Create a new Sandbox to run untrusted, arbitrary code.
|
|
157
161
|
|
|
@@ -191,7 +195,7 @@ class _Sandbox(modal._object._Object):
|
|
|
191
195
|
typing.Union[str, os.PathLike],
|
|
192
196
|
typing.Union[modal.volume._Volume, modal.cloud_bucket_mount._CloudBucketMount],
|
|
193
197
|
] = {},
|
|
194
|
-
|
|
198
|
+
pty: bool = False,
|
|
195
199
|
encrypted_ports: collections.abc.Sequence[int] = [],
|
|
196
200
|
h2_ports: collections.abc.Sequence[int] = [],
|
|
197
201
|
unencrypted_ports: collections.abc.Sequence[int] = [],
|
|
@@ -201,7 +205,16 @@ class _Sandbox(modal._object._Object):
|
|
|
201
205
|
_experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
|
|
202
206
|
client: typing.Optional[modal.client._Client] = None,
|
|
203
207
|
verbose: bool = False,
|
|
204
|
-
|
|
208
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
209
|
+
):
|
|
210
|
+
"""Private method used internally.
|
|
211
|
+
|
|
212
|
+
This method exposes some internal arguments (currently `mounts`) which are not in the public API.
|
|
213
|
+
`mounts` is currently only used by modal shell (cli) to provide a function's mounts to the
|
|
214
|
+
sandbox that runs the shell session.
|
|
215
|
+
"""
|
|
216
|
+
...
|
|
217
|
+
|
|
205
218
|
def _hydrate_metadata(self, handle_metadata: typing.Optional[google.protobuf.message.Message]): ...
|
|
206
219
|
@staticmethod
|
|
207
220
|
async def from_name(
|
|
@@ -290,7 +303,6 @@ class _Sandbox(modal._object._Object):
|
|
|
290
303
|
async def exec(
|
|
291
304
|
self,
|
|
292
305
|
*args: str,
|
|
293
|
-
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
294
306
|
stdout: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
295
307
|
stderr: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
296
308
|
timeout: typing.Optional[int] = None,
|
|
@@ -298,13 +310,14 @@ class _Sandbox(modal._object._Object):
|
|
|
298
310
|
secrets: collections.abc.Sequence[modal.secret._Secret] = (),
|
|
299
311
|
text: typing.Literal[True] = True,
|
|
300
312
|
bufsize: typing.Literal[-1, 1] = -1,
|
|
313
|
+
pty: bool = False,
|
|
314
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
301
315
|
_pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
302
316
|
) -> modal.container_process._ContainerProcess[str]: ...
|
|
303
317
|
@typing.overload
|
|
304
318
|
async def exec(
|
|
305
319
|
self,
|
|
306
320
|
*args: str,
|
|
307
|
-
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
308
321
|
stdout: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
309
322
|
stderr: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
310
323
|
timeout: typing.Optional[int] = None,
|
|
@@ -312,8 +325,28 @@ class _Sandbox(modal._object._Object):
|
|
|
312
325
|
secrets: collections.abc.Sequence[modal.secret._Secret] = (),
|
|
313
326
|
text: typing.Literal[False] = False,
|
|
314
327
|
bufsize: typing.Literal[-1, 1] = -1,
|
|
328
|
+
pty: bool = False,
|
|
329
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
315
330
|
_pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
316
331
|
) -> modal.container_process._ContainerProcess[bytes]: ...
|
|
332
|
+
async def _exec(
|
|
333
|
+
self,
|
|
334
|
+
*args: str,
|
|
335
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
336
|
+
stdout: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
337
|
+
stderr: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
338
|
+
timeout: typing.Optional[int] = None,
|
|
339
|
+
workdir: typing.Optional[str] = None,
|
|
340
|
+
secrets: collections.abc.Sequence[modal.secret._Secret] = (),
|
|
341
|
+
text: bool = True,
|
|
342
|
+
bufsize: typing.Literal[-1, 1] = -1,
|
|
343
|
+
) -> typing.Union[modal.container_process._ContainerProcess[bytes], modal.container_process._ContainerProcess[str]]:
|
|
344
|
+
"""Private method used internally.
|
|
345
|
+
|
|
346
|
+
This method exposes some internal arguments (currently `pty_info`) which are not in the public API.
|
|
347
|
+
"""
|
|
348
|
+
...
|
|
349
|
+
|
|
317
350
|
async def _experimental_snapshot(self) -> modal.snapshot._SandboxSnapshot: ...
|
|
318
351
|
@staticmethod
|
|
319
352
|
async def _experimental_from_snapshot(
|
|
@@ -407,6 +440,8 @@ class Sandbox(modal.object.Object):
|
|
|
407
440
|
"""mdmd:hidden"""
|
|
408
441
|
...
|
|
409
442
|
|
|
443
|
+
@staticmethod
|
|
444
|
+
def _default_pty_info() -> modal_proto.api_pb2.PTYInfo: ...
|
|
410
445
|
@staticmethod
|
|
411
446
|
def _new(
|
|
412
447
|
args: collections.abc.Sequence[str],
|
|
@@ -428,6 +463,7 @@ class Sandbox(modal.object.Object):
|
|
|
428
463
|
volumes: dict[
|
|
429
464
|
typing.Union[str, os.PathLike], typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount]
|
|
430
465
|
] = {},
|
|
466
|
+
pty: bool = False,
|
|
431
467
|
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
432
468
|
encrypted_ports: collections.abc.Sequence[int] = [],
|
|
433
469
|
h2_ports: collections.abc.Sequence[int] = [],
|
|
@@ -467,7 +503,7 @@ class Sandbox(modal.object.Object):
|
|
|
467
503
|
typing.Union[str, os.PathLike],
|
|
468
504
|
typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount],
|
|
469
505
|
] = {},
|
|
470
|
-
|
|
506
|
+
pty: bool = False,
|
|
471
507
|
encrypted_ports: collections.abc.Sequence[int] = [],
|
|
472
508
|
h2_ports: collections.abc.Sequence[int] = [],
|
|
473
509
|
unencrypted_ports: collections.abc.Sequence[int] = [],
|
|
@@ -478,6 +514,7 @@ class Sandbox(modal.object.Object):
|
|
|
478
514
|
_experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
|
|
479
515
|
client: typing.Optional[modal.client.Client] = None,
|
|
480
516
|
environment_name: typing.Optional[str] = None,
|
|
517
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
481
518
|
) -> Sandbox:
|
|
482
519
|
"""Create a new Sandbox to run untrusted, arbitrary code.
|
|
483
520
|
|
|
@@ -519,7 +556,7 @@ class Sandbox(modal.object.Object):
|
|
|
519
556
|
typing.Union[str, os.PathLike],
|
|
520
557
|
typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount],
|
|
521
558
|
] = {},
|
|
522
|
-
|
|
559
|
+
pty: bool = False,
|
|
523
560
|
encrypted_ports: collections.abc.Sequence[int] = [],
|
|
524
561
|
h2_ports: collections.abc.Sequence[int] = [],
|
|
525
562
|
unencrypted_ports: collections.abc.Sequence[int] = [],
|
|
@@ -530,6 +567,7 @@ class Sandbox(modal.object.Object):
|
|
|
530
567
|
_experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
|
|
531
568
|
client: typing.Optional[modal.client.Client] = None,
|
|
532
569
|
environment_name: typing.Optional[str] = None,
|
|
570
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
533
571
|
) -> Sandbox:
|
|
534
572
|
"""Create a new Sandbox to run untrusted, arbitrary code.
|
|
535
573
|
|
|
@@ -575,7 +613,7 @@ class Sandbox(modal.object.Object):
|
|
|
575
613
|
typing.Union[str, os.PathLike],
|
|
576
614
|
typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount],
|
|
577
615
|
] = {},
|
|
578
|
-
|
|
616
|
+
pty: bool = False,
|
|
579
617
|
encrypted_ports: collections.abc.Sequence[int] = [],
|
|
580
618
|
h2_ports: collections.abc.Sequence[int] = [],
|
|
581
619
|
unencrypted_ports: collections.abc.Sequence[int] = [],
|
|
@@ -585,7 +623,16 @@ class Sandbox(modal.object.Object):
|
|
|
585
623
|
_experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
|
|
586
624
|
client: typing.Optional[modal.client.Client] = None,
|
|
587
625
|
verbose: bool = False,
|
|
588
|
-
|
|
626
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
627
|
+
):
|
|
628
|
+
"""Private method used internally.
|
|
629
|
+
|
|
630
|
+
This method exposes some internal arguments (currently `mounts`) which are not in the public API.
|
|
631
|
+
`mounts` is currently only used by modal shell (cli) to provide a function's mounts to the
|
|
632
|
+
sandbox that runs the shell session.
|
|
633
|
+
"""
|
|
634
|
+
...
|
|
635
|
+
|
|
589
636
|
async def aio(
|
|
590
637
|
self,
|
|
591
638
|
/,
|
|
@@ -612,7 +659,7 @@ class Sandbox(modal.object.Object):
|
|
|
612
659
|
typing.Union[str, os.PathLike],
|
|
613
660
|
typing.Union[modal.volume.Volume, modal.cloud_bucket_mount.CloudBucketMount],
|
|
614
661
|
] = {},
|
|
615
|
-
|
|
662
|
+
pty: bool = False,
|
|
616
663
|
encrypted_ports: collections.abc.Sequence[int] = [],
|
|
617
664
|
h2_ports: collections.abc.Sequence[int] = [],
|
|
618
665
|
unencrypted_ports: collections.abc.Sequence[int] = [],
|
|
@@ -622,7 +669,15 @@ class Sandbox(modal.object.Object):
|
|
|
622
669
|
_experimental_scheduler_placement: typing.Optional[modal.scheduler_placement.SchedulerPlacement] = None,
|
|
623
670
|
client: typing.Optional[modal.client.Client] = None,
|
|
624
671
|
verbose: bool = False,
|
|
625
|
-
|
|
672
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
673
|
+
):
|
|
674
|
+
"""Private method used internally.
|
|
675
|
+
|
|
676
|
+
This method exposes some internal arguments (currently `mounts`) which are not in the public API.
|
|
677
|
+
`mounts` is currently only used by modal shell (cli) to provide a function's mounts to the
|
|
678
|
+
sandbox that runs the shell session.
|
|
679
|
+
"""
|
|
680
|
+
...
|
|
626
681
|
|
|
627
682
|
_create: ___create_spec
|
|
628
683
|
|
|
@@ -834,7 +889,6 @@ class Sandbox(modal.object.Object):
|
|
|
834
889
|
self,
|
|
835
890
|
/,
|
|
836
891
|
*args: str,
|
|
837
|
-
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
838
892
|
stdout: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
839
893
|
stderr: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
840
894
|
timeout: typing.Optional[int] = None,
|
|
@@ -842,6 +896,8 @@ class Sandbox(modal.object.Object):
|
|
|
842
896
|
secrets: collections.abc.Sequence[modal.secret.Secret] = (),
|
|
843
897
|
text: typing.Literal[True] = True,
|
|
844
898
|
bufsize: typing.Literal[-1, 1] = -1,
|
|
899
|
+
pty: bool = False,
|
|
900
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
845
901
|
_pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
846
902
|
) -> modal.container_process.ContainerProcess[str]: ...
|
|
847
903
|
@typing.overload
|
|
@@ -849,7 +905,6 @@ class Sandbox(modal.object.Object):
|
|
|
849
905
|
self,
|
|
850
906
|
/,
|
|
851
907
|
*args: str,
|
|
852
|
-
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
853
908
|
stdout: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
854
909
|
stderr: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
855
910
|
timeout: typing.Optional[int] = None,
|
|
@@ -857,6 +912,8 @@ class Sandbox(modal.object.Object):
|
|
|
857
912
|
secrets: collections.abc.Sequence[modal.secret.Secret] = (),
|
|
858
913
|
text: typing.Literal[False] = False,
|
|
859
914
|
bufsize: typing.Literal[-1, 1] = -1,
|
|
915
|
+
pty: bool = False,
|
|
916
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
860
917
|
_pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
861
918
|
) -> modal.container_process.ContainerProcess[bytes]: ...
|
|
862
919
|
@typing.overload
|
|
@@ -864,7 +921,6 @@ class Sandbox(modal.object.Object):
|
|
|
864
921
|
self,
|
|
865
922
|
/,
|
|
866
923
|
*args: str,
|
|
867
|
-
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
868
924
|
stdout: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
869
925
|
stderr: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
870
926
|
timeout: typing.Optional[int] = None,
|
|
@@ -872,6 +928,8 @@ class Sandbox(modal.object.Object):
|
|
|
872
928
|
secrets: collections.abc.Sequence[modal.secret.Secret] = (),
|
|
873
929
|
text: typing.Literal[True] = True,
|
|
874
930
|
bufsize: typing.Literal[-1, 1] = -1,
|
|
931
|
+
pty: bool = False,
|
|
932
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
875
933
|
_pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
876
934
|
) -> modal.container_process.ContainerProcess[str]: ...
|
|
877
935
|
@typing.overload
|
|
@@ -879,7 +937,6 @@ class Sandbox(modal.object.Object):
|
|
|
879
937
|
self,
|
|
880
938
|
/,
|
|
881
939
|
*args: str,
|
|
882
|
-
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
883
940
|
stdout: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
884
941
|
stderr: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
885
942
|
timeout: typing.Optional[int] = None,
|
|
@@ -887,11 +944,58 @@ class Sandbox(modal.object.Object):
|
|
|
887
944
|
secrets: collections.abc.Sequence[modal.secret.Secret] = (),
|
|
888
945
|
text: typing.Literal[False] = False,
|
|
889
946
|
bufsize: typing.Literal[-1, 1] = -1,
|
|
947
|
+
pty: bool = False,
|
|
948
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
890
949
|
_pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
891
950
|
) -> modal.container_process.ContainerProcess[bytes]: ...
|
|
892
951
|
|
|
893
952
|
exec: __exec_spec[typing_extensions.Self]
|
|
894
953
|
|
|
954
|
+
class ___exec_spec(typing_extensions.Protocol[SUPERSELF]):
|
|
955
|
+
def __call__(
|
|
956
|
+
self,
|
|
957
|
+
/,
|
|
958
|
+
*args: str,
|
|
959
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
960
|
+
stdout: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
961
|
+
stderr: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
962
|
+
timeout: typing.Optional[int] = None,
|
|
963
|
+
workdir: typing.Optional[str] = None,
|
|
964
|
+
secrets: collections.abc.Sequence[modal.secret.Secret] = (),
|
|
965
|
+
text: bool = True,
|
|
966
|
+
bufsize: typing.Literal[-1, 1] = -1,
|
|
967
|
+
) -> typing.Union[
|
|
968
|
+
modal.container_process.ContainerProcess[bytes], modal.container_process.ContainerProcess[str]
|
|
969
|
+
]:
|
|
970
|
+
"""Private method used internally.
|
|
971
|
+
|
|
972
|
+
This method exposes some internal arguments (currently `pty_info`) which are not in the public API.
|
|
973
|
+
"""
|
|
974
|
+
...
|
|
975
|
+
|
|
976
|
+
async def aio(
|
|
977
|
+
self,
|
|
978
|
+
/,
|
|
979
|
+
*args: str,
|
|
980
|
+
pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
|
|
981
|
+
stdout: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
982
|
+
stderr: modal.stream_type.StreamType = modal.stream_type.StreamType.PIPE,
|
|
983
|
+
timeout: typing.Optional[int] = None,
|
|
984
|
+
workdir: typing.Optional[str] = None,
|
|
985
|
+
secrets: collections.abc.Sequence[modal.secret.Secret] = (),
|
|
986
|
+
text: bool = True,
|
|
987
|
+
bufsize: typing.Literal[-1, 1] = -1,
|
|
988
|
+
) -> typing.Union[
|
|
989
|
+
modal.container_process.ContainerProcess[bytes], modal.container_process.ContainerProcess[str]
|
|
990
|
+
]:
|
|
991
|
+
"""Private method used internally.
|
|
992
|
+
|
|
993
|
+
This method exposes some internal arguments (currently `pty_info`) which are not in the public API.
|
|
994
|
+
"""
|
|
995
|
+
...
|
|
996
|
+
|
|
997
|
+
_exec: ___exec_spec[typing_extensions.Self]
|
|
998
|
+
|
|
895
999
|
class ___experimental_snapshot_spec(typing_extensions.Protocol[SUPERSELF]):
|
|
896
1000
|
def __call__(self, /) -> modal.snapshot.SandboxSnapshot: ...
|
|
897
1001
|
async def aio(self, /) -> modal.snapshot.SandboxSnapshot: ...
|
|
@@ -9,7 +9,7 @@ modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
|
|
|
9
9
|
modal/_object.py,sha256=gwsLdXb-Ecd8nH8LVCo8oVZPzzdyo9BrN1DjgQmsSuM,11967
|
|
10
10
|
modal/_output.py,sha256=G9CeSQEBzjhveWWEzWmYa5Uwbu4lZf8N8IFH1UM4fU0,25803
|
|
11
11
|
modal/_partial_function.py,sha256=Yqk97hLS6vi8nWWVpzS5TSWbndWMdCtkhccdnyDJgBk,37302
|
|
12
|
-
modal/_pty.py,sha256=
|
|
12
|
+
modal/_pty.py,sha256=E58MQ8d5-wkbMatRKpQR-G9FdbCRcZGiZxOpGy__VuY,1481
|
|
13
13
|
modal/_resolver.py,sha256=2RWvm34cNSnbv1v7izJMNZgfvpLDD6LzaBlr0lIrLnY,7364
|
|
14
14
|
modal/_resources.py,sha256=NMAp0GCLutiZI4GuKSIVnRHVlstoD3hNGUabjTUtzf4,1794
|
|
15
15
|
modal/_serialization.py,sha256=wt09fOwo-E9ATlOG91O9RXCTPRNtsm97v4Unk8Bzd-8,24145
|
|
@@ -22,7 +22,7 @@ modal/app.py,sha256=F4baVULljFq0CwC_7U-EKNRNx7CYeWBKudjjYUuWc4U,48416
|
|
|
22
22
|
modal/app.pyi,sha256=AbXJCBkyt2rI_-M3VbTBYb32at0P6iRZuoC87xY_JrQ,43591
|
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
|
24
24
|
modal/client.py,sha256=kyAIVB3Ay-XKJizQ_1ufUFB__EagV0MLmHJpyYyJ7J0,18636
|
|
25
|
-
modal/client.pyi,sha256=
|
|
25
|
+
modal/client.pyi,sha256=C26WWTgMvVwreVQHp7K60BAvXsFHKNRBTuPckNk0GTk,15831
|
|
26
26
|
modal/cloud_bucket_mount.py,sha256=YOe9nnvSr4ZbeCn587d7_VhE9IioZYRvF9VYQTQux08,5914
|
|
27
27
|
modal/cloud_bucket_mount.pyi,sha256=-qSfYAQvIoO_l2wsCCGTG5ZUwQieNKXdAO00yP1-LYU,7394
|
|
28
28
|
modal/cls.py,sha256=pTEO7pHjlO7taMbIqs4oI9ZZgKDJpVKyGkO5ZT0w6tQ,40934
|
|
@@ -39,7 +39,7 @@ modal/file_io.py,sha256=OSKr77TujcXGJW1iikzYiHckLSmv07QBgBHcxxYEkoI,21456
|
|
|
39
39
|
modal/file_io.pyi,sha256=xtO6Glf_BFwDE7QiQQo24QqcMf_Vv-iz7WojcGVlLBU,15932
|
|
40
40
|
modal/file_pattern_matcher.py,sha256=A_Kdkej6q7YQyhM_2-BvpFmPqJ0oHb54B6yf9VqvPVE,8116
|
|
41
41
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
|
42
|
-
modal/functions.pyi,sha256=
|
|
42
|
+
modal/functions.pyi,sha256=cDqhpIM5caoCR18_8krpAmPOd4QvEbm1ypYUZ6Ze9Wo,39404
|
|
43
43
|
modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
|
|
44
44
|
modal/image.py,sha256=nXN9k_6gApHFy8-Bk_XT2Zu3jsDsGVrC3QcuiDC4yRY,103543
|
|
45
45
|
modal/image.pyi,sha256=vKdb5PpYM8wcpq9PQegeVMjrPLzAipuV4q994NZiL84,69325
|
|
@@ -62,11 +62,11 @@ modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
62
62
|
modal/queue.py,sha256=ooD_-z3gthje_kxBZQ_xDfwyTy_cxtyn5oM9wt2sXTo,27133
|
|
63
63
|
modal/queue.pyi,sha256=EJ6extEFKclbEUBXk-PuRJ4bkUYRwWgAAUNofQBbBmo,39509
|
|
64
64
|
modal/retries.py,sha256=IvNLDM0f_GLUDD5VgEDoN09C88yoxSrCquinAuxT1Sc,5205
|
|
65
|
-
modal/runner.py,sha256=
|
|
65
|
+
modal/runner.py,sha256=Q9wGTeg6sYyusTgwXSinoIti4Gv5LsiadAvflgETBHc,24070
|
|
66
66
|
modal/runner.pyi,sha256=lbwLljm1cC8d6PcNvmYQhkE8501V9fg0bYqqKX6G4r4,8489
|
|
67
67
|
modal/running_app.py,sha256=v61mapYNV1-O-Uaho5EfJlryMLvIT9We0amUOSvSGx8,1188
|
|
68
|
-
modal/sandbox.py,sha256=
|
|
69
|
-
modal/sandbox.pyi,sha256=
|
|
68
|
+
modal/sandbox.py,sha256=AUZSOr7pF6BMaR7DuoVlIz-RkKTbQakv_ZBVmLJ2YB4,44222
|
|
69
|
+
modal/sandbox.pyi,sha256=Dk9eN2wvQQtctb7WYV8WkHnfto4tQzSFpuqa7dCnPfs,48600
|
|
70
70
|
modal/schedule.py,sha256=ng0g0AqNY5GQI9KhkXZQ5Wam5G42glbkqVQsNpBtbDE,3078
|
|
71
71
|
modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
|
|
72
72
|
modal/secret.py,sha256=jcNJKc4ZB2nvAn7HJFawInqE-_7sbB43IWLZwyLBQ28,19308
|
|
@@ -153,7 +153,7 @@ modal/experimental/__init__.py,sha256=fCqzo_f3vcY750vHtd7CtLs5dvdM_C0ZLLGb3zXuK9
|
|
|
153
153
|
modal/experimental/flash.py,sha256=8HOHZ0XLSN8Znzsi6hGggS46CC6t_7IgGWyNoeSXS9o,28417
|
|
154
154
|
modal/experimental/flash.pyi,sha256=R9VV0UDotiY9BRUjacB-xI4qhR3yBymAvEZFRFHztLs,15143
|
|
155
155
|
modal/experimental/ipython.py,sha256=TrCfmol9LGsRZMeDoeMPx3Hv3BFqQhYnmD_iH0pqdhk,2904
|
|
156
|
-
modal-1.1.5.
|
|
156
|
+
modal-1.1.5.dev20.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
|
157
157
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
|
158
158
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
|
159
159
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
|
@@ -176,10 +176,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
|
|
|
176
176
|
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
177
177
|
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
|
178
178
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
179
|
-
modal_version/__init__.py,sha256=
|
|
179
|
+
modal_version/__init__.py,sha256=JoRPUHSTT5B0elviCXt3qLm4PYL1rVJHN1v6kQwjN2U,121
|
|
180
180
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
|
181
|
-
modal-1.1.5.
|
|
182
|
-
modal-1.1.5.
|
|
183
|
-
modal-1.1.5.
|
|
184
|
-
modal-1.1.5.
|
|
185
|
-
modal-1.1.5.
|
|
181
|
+
modal-1.1.5.dev20.dist-info/METADATA,sha256=b9tvnlJO11F6K419bbfP5gMlwgG-BfbMZdDHwrrPdBs,2460
|
|
182
|
+
modal-1.1.5.dev20.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
|
183
|
+
modal-1.1.5.dev20.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
|
184
|
+
modal-1.1.5.dev20.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
|
185
|
+
modal-1.1.5.dev20.dist-info/RECORD,,
|
modal_version/__init__.py
CHANGED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|