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 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(sys.stdin.fileno())
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.dev19",
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.dev19",
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[P_INNER, ReturnType_INNER, SUPERSELF]):
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.P, modal._functions.ReturnType, typing_extensions.Self]
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[P_INNER, ReturnType_INNER, SUPERSELF]):
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.P, modal._functions.ReturnType, typing_extensions.Self
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[P_INNER, ReturnType_INNER, SUPERSELF]):
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.P, modal._functions.ReturnType, typing_extensions.Self]
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.exec(
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.exec(
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
- pty_info: Optional[api_pb2.PTYInfo] = None,
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
- pty_info: Optional[api_pb2.PTYInfo] = None,
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
- pty_info=pty_info,
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, # Set the CMD of the Sandbox, overriding any CMD of the container image.
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, # Optionally give the sandbox a name. Unique within an app.
381
- image: Optional[_Image] = None, # The image to run as the container for the sandbox.
382
- secrets: Sequence[_Secret] = (), # Environment variables to inject into the sandbox.
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, # Maximum lifetime of the sandbox in seconds.
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, # Working directory of the sandbox.
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, # Region or regions to run the sandbox on.
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, # Whether to block network access
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
- ] = {}, # Mount points for Modal Volumes and CloudBucketMounts
405
- pty_info: Optional[api_pb2.PTYInfo] = None,
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, # Experimental controls over fine-grained scheduling (alpha).
424
+ ] = None,
420
425
  client: Optional[_Client] = None,
421
426
  verbose: bool = False,
427
+ pty_info: Optional[api_pb2.PTYInfo] = None,
422
428
  ):
423
- # This method exposes some internal arguments (currently `mounts`) which are not in the public API
424
- # `mounts` is currently only used by modal shell (cli) to provide a function's mounts to the
425
- # sandbox that runs the shell session
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
- # Internal option to set terminal size and metadata
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=_pty_info or 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
- pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
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
- pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
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
- pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
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
- pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
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
- pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
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
- pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
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: ...
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: modal
3
- Version: 1.1.5.dev19
3
+ Version: 1.1.5.dev20
4
4
  Summary: Python client library for Modal
5
5
  Author-email: Modal Labs <support@modal.com>
6
6
  License: Apache-2.0
@@ -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=JZfPDDpzqICZqtyPI_oMJf_9w-p_lLNuzHhwhodUXio,1329
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=mZ8qSJ6crYqbicfuo2eP0qib80Z0IPjaAWOQve0psJo,15831
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=F3Dll-9c3d8c8NuJuEYICUEB-sa67uWU75L111npwbA,39404
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=ostdzYpQb-20tlD6dIq7bpWTkZkOhjJBNuMNektqnJA,24068
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=GYSF--CsWnm-uta5xEnhilMRhx4burLFJ2VsAJCl9l0,43519
69
- modal/sandbox.pyi,sha256=eu7ZcHRlrXAC54v0Q1pq3E--w0L9iHSLLW6gQsVS_Q0,44265
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.dev19.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
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=M0KP5M2Ru7eFHighbiBZRm8ymjCDT50FTaROx8TKmJM,121
179
+ modal_version/__init__.py,sha256=JoRPUHSTT5B0elviCXt3qLm4PYL1rVJHN1v6kQwjN2U,121
180
180
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
181
- modal-1.1.5.dev19.dist-info/METADATA,sha256=LfhECOafZ2lxPcCiJqM4CQhyRF0QPqPKXQOSiQAjS90,2460
182
- modal-1.1.5.dev19.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
183
- modal-1.1.5.dev19.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
184
- modal-1.1.5.dev19.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
185
- modal-1.1.5.dev19.dist-info/RECORD,,
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
@@ -1,4 +1,4 @@
1
1
  # Copyright Modal Labs 2025
2
2
  """Supplies the current version of the modal client library."""
3
3
 
4
- __version__ = "1.1.5.dev19"
4
+ __version__ = "1.1.5.dev20"