modal 0.67.43__py3-none-any.whl → 0.68.24__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. modal/__init__.py +2 -0
  2. modal/_container_entrypoint.py +4 -1
  3. modal/_ipython.py +3 -13
  4. modal/_runtime/asgi.py +4 -0
  5. modal/_runtime/container_io_manager.py +3 -0
  6. modal/_runtime/user_code_imports.py +17 -20
  7. modal/_traceback.py +16 -2
  8. modal/_utils/blob_utils.py +27 -92
  9. modal/_utils/bytes_io_segment_payload.py +97 -0
  10. modal/_utils/function_utils.py +5 -1
  11. modal/_utils/grpc_testing.py +6 -2
  12. modal/_utils/hash_utils.py +51 -10
  13. modal/_utils/http_utils.py +19 -10
  14. modal/_utils/{pattern_matcher.py → pattern_utils.py} +1 -70
  15. modal/_utils/shell_utils.py +11 -5
  16. modal/cli/_traceback.py +11 -4
  17. modal/cli/run.py +25 -12
  18. modal/client.py +6 -37
  19. modal/client.pyi +2 -6
  20. modal/cls.py +132 -62
  21. modal/cls.pyi +13 -7
  22. modal/exception.py +20 -0
  23. modal/file_io.py +380 -0
  24. modal/file_io.pyi +185 -0
  25. modal/file_pattern_matcher.py +121 -0
  26. modal/functions.py +33 -11
  27. modal/functions.pyi +11 -9
  28. modal/image.py +88 -8
  29. modal/image.pyi +20 -4
  30. modal/mount.py +49 -9
  31. modal/mount.pyi +19 -4
  32. modal/network_file_system.py +4 -1
  33. modal/object.py +4 -2
  34. modal/partial_function.py +22 -10
  35. modal/partial_function.pyi +10 -2
  36. modal/runner.py +5 -4
  37. modal/runner.pyi +2 -1
  38. modal/sandbox.py +40 -0
  39. modal/sandbox.pyi +18 -0
  40. modal/volume.py +5 -1
  41. {modal-0.67.43.dist-info → modal-0.68.24.dist-info}/METADATA +2 -2
  42. {modal-0.67.43.dist-info → modal-0.68.24.dist-info}/RECORD +52 -48
  43. modal_docs/gen_reference_docs.py +1 -0
  44. modal_proto/api.proto +33 -1
  45. modal_proto/api_pb2.py +813 -737
  46. modal_proto/api_pb2.pyi +160 -13
  47. modal_version/__init__.py +1 -1
  48. modal_version/_version_generated.py +1 -1
  49. {modal-0.67.43.dist-info → modal-0.68.24.dist-info}/LICENSE +0 -0
  50. {modal-0.67.43.dist-info → modal-0.68.24.dist-info}/WHEEL +0 -0
  51. {modal-0.67.43.dist-info → modal-0.68.24.dist-info}/entry_points.txt +0 -0
  52. {modal-0.67.43.dist-info → modal-0.68.24.dist-info}/top_level.txt +0 -0
modal/partial_function.py CHANGED
@@ -49,7 +49,7 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
49
49
  raw_f: Callable[P, ReturnType]
50
50
  flags: _PartialFunctionFlags
51
51
  webhook_config: Optional[api_pb2.WebhookConfig]
52
- is_generator: Optional[bool]
52
+ is_generator: bool
53
53
  keep_warm: Optional[int]
54
54
  batch_max_size: Optional[int]
55
55
  batch_wait_ms: Optional[int]
@@ -73,7 +73,13 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
73
73
  self.raw_f = raw_f
74
74
  self.flags = flags
75
75
  self.webhook_config = webhook_config
76
- self.is_generator = is_generator
76
+ if is_generator is None:
77
+ # auto detect - doesn't work if the function *returns* a generator
78
+ final_is_generator = inspect.isgeneratorfunction(raw_f) or inspect.isasyncgenfunction(raw_f)
79
+ else:
80
+ final_is_generator = is_generator
81
+
82
+ self.is_generator = final_is_generator
77
83
  self.keep_warm = keep_warm
78
84
  self.wrapped = False # Make sure that this was converted into a FunctionHandle
79
85
  self.batch_max_size = batch_max_size
@@ -101,7 +107,7 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
101
107
  # This happens mainly during serialization of the wrapped underlying class of a Cls
102
108
  # since we don't have the instance info here we just return the PartialFunction itself
103
109
  # to let it be bound to a variable and become a Function later on
104
- return self
110
+ return self # type: ignore # this returns a PartialFunction in a special internal case
105
111
 
106
112
  def __del__(self):
107
113
  if (self.flags & _PartialFunctionFlags.FUNCTION) and self.wrapped is False:
@@ -154,14 +160,14 @@ def _find_partial_methods_for_user_cls(user_cls: type[Any], flags: int) -> dict[
154
160
  )
155
161
  deprecation_error((2024, 2, 21), message)
156
162
 
157
- partial_functions: dict[str, PartialFunction] = {}
163
+ partial_functions: dict[str, _PartialFunction] = {}
158
164
  for parent_cls in reversed(user_cls.mro()):
159
165
  if parent_cls is not object:
160
166
  for k, v in parent_cls.__dict__.items():
161
- if isinstance(v, PartialFunction):
162
- partial_function = synchronizer._translate_in(v) # TODO: remove need for?
163
- if partial_function.flags & flags:
164
- partial_functions[k] = partial_function
167
+ if isinstance(v, PartialFunction): # type: ignore[reportArgumentType] # synchronicity wrapper types
168
+ _partial_function: _PartialFunction = typing.cast(_PartialFunction, synchronizer._translate_in(v))
169
+ if _partial_function.flags & flags:
170
+ partial_functions[k] = _partial_function
165
171
 
166
172
  return partial_functions
167
173
 
@@ -245,8 +251,6 @@ def _method(
245
251
  "Batched function on classes should not be wrapped by `@method`. "
246
252
  "Suggestion: remove the `@method` decorator."
247
253
  )
248
- if is_generator is None:
249
- is_generator = inspect.isgeneratorfunction(raw_f) or inspect.isasyncgenfunction(raw_f)
250
254
  return _PartialFunction(raw_f, _PartialFunctionFlags.FUNCTION, is_generator=is_generator, keep_warm=keep_warm)
251
255
 
252
256
  return wrapper
@@ -271,6 +275,7 @@ def _web_endpoint(
271
275
  custom_domains: Optional[
272
276
  Iterable[str]
273
277
  ] = None, # Create an endpoint using a custom domain fully-qualified domain name (FQDN).
278
+ requires_proxy_auth: bool = False, # Require Proxy-Authorization HTTP Headers on requests to the endpoint
274
279
  wait_for_response: bool = True, # DEPRECATED: this must always be True now
275
280
  ) -> Callable[[Callable[P, ReturnType]], _PartialFunction[P, ReturnType, ReturnType]]:
276
281
  """Register a basic web endpoint with this application.
@@ -321,6 +326,7 @@ def _web_endpoint(
321
326
  requested_suffix=label,
322
327
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
323
328
  custom_domains=_parse_custom_domains(custom_domains),
329
+ requires_proxy_auth=requires_proxy_auth,
324
330
  ),
325
331
  )
326
332
 
@@ -332,6 +338,7 @@ def _asgi_app(
332
338
  *,
333
339
  label: Optional[str] = None, # Label for created endpoint. Final subdomain will be <workspace>--<label>.modal.run.
334
340
  custom_domains: Optional[Iterable[str]] = None, # Deploy this endpoint on a custom domain.
341
+ requires_proxy_auth: bool = False, # Require Proxy-Authorization HTTP Headers on requests to the endpoint
335
342
  wait_for_response: bool = True, # DEPRECATED: this must always be True now
336
343
  ) -> Callable[[Callable[..., Any]], _PartialFunction]:
337
344
  """Decorator for registering an ASGI app with a Modal function.
@@ -395,6 +402,7 @@ def _asgi_app(
395
402
  requested_suffix=label,
396
403
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
397
404
  custom_domains=_parse_custom_domains(custom_domains),
405
+ requires_proxy_auth=requires_proxy_auth,
398
406
  ),
399
407
  )
400
408
 
@@ -406,6 +414,7 @@ def _wsgi_app(
406
414
  *,
407
415
  label: Optional[str] = None, # Label for created endpoint. Final subdomain will be <workspace>--<label>.modal.run.
408
416
  custom_domains: Optional[Iterable[str]] = None, # Deploy this endpoint on a custom domain.
417
+ requires_proxy_auth: bool = False, # Require Proxy-Authorization HTTP Headers on requests to the endpoint
409
418
  wait_for_response: bool = True, # DEPRECATED: this must always be True now
410
419
  ) -> Callable[[Callable[..., Any]], _PartialFunction]:
411
420
  """Decorator for registering a WSGI app with a Modal function.
@@ -469,6 +478,7 @@ def _wsgi_app(
469
478
  requested_suffix=label,
470
479
  async_mode=api_pb2.WEBHOOK_ASYNC_MODE_AUTO,
471
480
  custom_domains=_parse_custom_domains(custom_domains),
481
+ requires_proxy_auth=requires_proxy_auth,
472
482
  ),
473
483
  )
474
484
 
@@ -481,6 +491,7 @@ def _web_server(
481
491
  startup_timeout: float = 5.0, # Maximum number of seconds to wait for the web server to start.
482
492
  label: Optional[str] = None, # Label for created endpoint. Final subdomain will be <workspace>--<label>.modal.run.
483
493
  custom_domains: Optional[Iterable[str]] = None, # Deploy this endpoint on a custom domain.
494
+ requires_proxy_auth: bool = False, # Require Proxy-Authorization HTTP Headers on requests to the endpoint
484
495
  ) -> Callable[[Callable[..., Any]], _PartialFunction]:
485
496
  """Decorator that registers an HTTP web server inside the container.
486
497
 
@@ -524,6 +535,7 @@ def _web_server(
524
535
  custom_domains=_parse_custom_domains(custom_domains),
525
536
  web_server_port=port,
526
537
  web_server_startup_timeout=startup_timeout,
538
+ requires_proxy_auth=requires_proxy_auth,
527
539
  ),
528
540
  )
529
541
 
@@ -28,7 +28,7 @@ class _PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
28
28
  raw_f: typing.Callable[P, ReturnType]
29
29
  flags: _PartialFunctionFlags
30
30
  webhook_config: typing.Optional[modal_proto.api_pb2.WebhookConfig]
31
- is_generator: typing.Optional[bool]
31
+ is_generator: bool
32
32
  keep_warm: typing.Optional[int]
33
33
  batch_max_size: typing.Optional[int]
34
34
  batch_wait_ms: typing.Optional[int]
@@ -57,7 +57,7 @@ class PartialFunction(typing.Generic[P, ReturnType, OriginalReturnType]):
57
57
  raw_f: typing.Callable[P, ReturnType]
58
58
  flags: _PartialFunctionFlags
59
59
  webhook_config: typing.Optional[modal_proto.api_pb2.WebhookConfig]
60
- is_generator: typing.Optional[bool]
60
+ is_generator: bool
61
61
  keep_warm: typing.Optional[int]
62
62
  batch_max_size: typing.Optional[int]
63
63
  batch_wait_ms: typing.Optional[int]
@@ -118,6 +118,7 @@ def _web_endpoint(
118
118
  label: typing.Optional[str] = None,
119
119
  docs: bool = False,
120
120
  custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
121
+ requires_proxy_auth: bool = False,
121
122
  wait_for_response: bool = True,
122
123
  ) -> typing.Callable[[typing.Callable[P, ReturnType]], _PartialFunction[P, ReturnType, ReturnType]]: ...
123
124
  def _asgi_app(
@@ -125,6 +126,7 @@ def _asgi_app(
125
126
  *,
126
127
  label: typing.Optional[str] = None,
127
128
  custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
129
+ requires_proxy_auth: bool = False,
128
130
  wait_for_response: bool = True,
129
131
  ) -> typing.Callable[[typing.Callable[..., typing.Any]], _PartialFunction]: ...
130
132
  def _wsgi_app(
@@ -132,6 +134,7 @@ def _wsgi_app(
132
134
  *,
133
135
  label: typing.Optional[str] = None,
134
136
  custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
137
+ requires_proxy_auth: bool = False,
135
138
  wait_for_response: bool = True,
136
139
  ) -> typing.Callable[[typing.Callable[..., typing.Any]], _PartialFunction]: ...
137
140
  def _web_server(
@@ -140,6 +143,7 @@ def _web_server(
140
143
  startup_timeout: float = 5.0,
141
144
  label: typing.Optional[str] = None,
142
145
  custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
146
+ requires_proxy_auth: bool = False,
143
147
  ) -> typing.Callable[[typing.Callable[..., typing.Any]], _PartialFunction]: ...
144
148
  def _disallow_wrapping_method(f: _PartialFunction, wrapper: str) -> None: ...
145
149
  def _build(
@@ -178,6 +182,7 @@ def web_endpoint(
178
182
  label: typing.Optional[str] = None,
179
183
  docs: bool = False,
180
184
  custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
185
+ requires_proxy_auth: bool = False,
181
186
  wait_for_response: bool = True,
182
187
  ) -> typing.Callable[[typing.Callable[P, ReturnType]], PartialFunction[P, ReturnType, ReturnType]]: ...
183
188
  def asgi_app(
@@ -185,6 +190,7 @@ def asgi_app(
185
190
  *,
186
191
  label: typing.Optional[str] = None,
187
192
  custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
193
+ requires_proxy_auth: bool = False,
188
194
  wait_for_response: bool = True,
189
195
  ) -> typing.Callable[[typing.Callable[..., typing.Any]], PartialFunction]: ...
190
196
  def wsgi_app(
@@ -192,6 +198,7 @@ def wsgi_app(
192
198
  *,
193
199
  label: typing.Optional[str] = None,
194
200
  custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
201
+ requires_proxy_auth: bool = False,
195
202
  wait_for_response: bool = True,
196
203
  ) -> typing.Callable[[typing.Callable[..., typing.Any]], PartialFunction]: ...
197
204
  def web_server(
@@ -200,6 +207,7 @@ def web_server(
200
207
  startup_timeout: float = 5.0,
201
208
  label: typing.Optional[str] = None,
202
209
  custom_domains: typing.Optional[collections.abc.Iterable[str]] = None,
210
+ requires_proxy_auth: bool = False,
203
211
  ) -> typing.Callable[[typing.Callable[..., typing.Any]], PartialFunction]: ...
204
212
  def build(
205
213
  _warn_parentheses_missing=None, *, force: bool = False, timeout: int = 86400
modal/runner.py CHANGED
@@ -17,7 +17,7 @@ from modal_proto import api_pb2
17
17
  from ._pty import get_pty_info
18
18
  from ._resolver import Resolver
19
19
  from ._runtime.execution_context import is_local
20
- from ._traceback import traceback_contains_remote_call
20
+ from ._traceback import print_server_warnings, traceback_contains_remote_call
21
21
  from ._utils.async_utils import TaskContext, gather_cancel_on_exc, synchronize_api
22
22
  from ._utils.grpc_utils import retry_transient_errors
23
23
  from ._utils.name_utils import check_object_name, is_valid_tag
@@ -176,7 +176,7 @@ async def _publish_app(
176
176
  indexed_objects: dict[str, _Object],
177
177
  name: str = "", # Only relevant for deployments
178
178
  tag: str = "", # Only relevant for deployments
179
- ) -> tuple[str, list[str]]:
179
+ ) -> tuple[str, list[api_pb2.Warning]]:
180
180
  """Wrapper for AppPublish RPC."""
181
181
 
182
182
  # Could simplify this function some changing the internal representation to use
@@ -206,7 +206,8 @@ async def _publish_app(
206
206
  raise InvalidError(exc.message)
207
207
  raise
208
208
 
209
- return response.url, response.warnings
209
+ print_server_warnings(response.server_warnings)
210
+ return response.url, response.server_warnings
210
211
 
211
212
 
212
213
  async def _disconnect(
@@ -554,7 +555,7 @@ async def _deploy_app(
554
555
  app_id=running_app.app_id,
555
556
  app_page_url=running_app.app_page_url,
556
557
  app_logs_url=running_app.app_logs_url, # type: ignore
557
- warnings=warnings,
558
+ warnings=[warning.message for warning in warnings],
558
559
  )
559
560
 
560
561
 
modal/runner.pyi CHANGED
@@ -1,6 +1,7 @@
1
1
  import modal.client
2
2
  import modal.object
3
3
  import modal.running_app
4
+ import modal_proto.api_pb2
4
5
  import multiprocessing.synchronize
5
6
  import synchronicity.combined_types
6
7
  import typing
@@ -37,7 +38,7 @@ async def _publish_app(
37
38
  indexed_objects: dict[str, modal.object._Object],
38
39
  name: str = "",
39
40
  tag: str = "",
40
- ) -> tuple[str, list[str]]: ...
41
+ ) -> tuple[str, list[modal_proto.api_pb2.Warning]]: ...
41
42
  async def _disconnect(client: modal.client._Client, app_id: str, reason: int, exc_str: str = "") -> None: ...
42
43
  async def _status_based_disconnect(
43
44
  client: modal.client._Client, app_id: str, exc_info: typing.Optional[BaseException] = None
modal/sandbox.py CHANGED
@@ -4,6 +4,9 @@ import os
4
4
  from collections.abc import AsyncGenerator, Sequence
5
5
  from typing import TYPE_CHECKING, Literal, Optional, Union, overload
6
6
 
7
+ if TYPE_CHECKING:
8
+ import _typeshed
9
+
7
10
  from google.protobuf.message import Message
8
11
  from grpclib import GRPCError, Status
9
12
 
@@ -29,6 +32,7 @@ from .exception import (
29
32
  deprecation_error,
30
33
  deprecation_warning,
31
34
  )
35
+ from .file_io import _FileIO
32
36
  from .gpu import GPU_T
33
37
  from .image import _Image
34
38
  from .io_streams import StreamReader, StreamWriter, _StreamReader, _StreamWriter
@@ -527,6 +531,42 @@ class _Sandbox(_Object, type_prefix="sb"):
527
531
  by_line = bufsize == 1
528
532
  return _ContainerProcess(resp.exec_id, self._client, stdout=stdout, stderr=stderr, text=text, by_line=by_line)
529
533
 
534
+ @overload
535
+ async def open(
536
+ self,
537
+ path: str,
538
+ mode: "_typeshed.OpenTextMode",
539
+ ) -> _FileIO[str]:
540
+ ...
541
+
542
+ @overload
543
+ async def open(
544
+ self,
545
+ path: str,
546
+ mode: "_typeshed.OpenBinaryMode",
547
+ ) -> _FileIO[bytes]:
548
+ ...
549
+
550
+ async def open(
551
+ self,
552
+ path: str,
553
+ mode: Union["_typeshed.OpenTextMode", "_typeshed.OpenBinaryMode"] = "r",
554
+ ):
555
+ """Open a file in the Sandbox and return
556
+ a [`FileIO`](/docs/reference/modal.FileIO#modalfile_io) handle.
557
+
558
+ **Usage**
559
+
560
+ ```python notest
561
+ sb = modal.Sandbox.create(app=sb_app)
562
+ f = sb.open("/test.txt", "w")
563
+ f.write("hello")
564
+ f.close()
565
+ ```
566
+ """
567
+ task_id = await self._get_task_id()
568
+ return await _FileIO.create(path, mode, self._client, task_id)
569
+
530
570
  @property
531
571
  def stdout(self) -> _StreamReader[str]:
532
572
  """
modal/sandbox.pyi CHANGED
@@ -1,3 +1,4 @@
1
+ import _typeshed
1
2
  import collections.abc
2
3
  import google.protobuf.message
3
4
  import modal._tunnel
@@ -5,6 +6,7 @@ import modal.app
5
6
  import modal.client
6
7
  import modal.cloud_bucket_mount
7
8
  import modal.container_process
9
+ import modal.file_io
8
10
  import modal.gpu
9
11
  import modal.image
10
12
  import modal.io_streams
@@ -122,6 +124,10 @@ class _Sandbox(modal.object._Object):
122
124
  bufsize: typing.Literal[-1, 1] = -1,
123
125
  _pty_info: typing.Optional[modal_proto.api_pb2.PTYInfo] = None,
124
126
  ) -> modal.container_process._ContainerProcess[bytes]: ...
127
+ @typing.overload
128
+ async def open(self, path: str, mode: _typeshed.OpenTextMode) -> modal.file_io._FileIO[str]: ...
129
+ @typing.overload
130
+ async def open(self, path: str, mode: _typeshed.OpenBinaryMode) -> modal.file_io._FileIO[bytes]: ...
125
131
  @property
126
132
  def stdout(self) -> modal.io_streams._StreamReader[str]: ...
127
133
  @property
@@ -349,6 +355,18 @@ class Sandbox(modal.object.Object):
349
355
 
350
356
  exec: __exec_spec
351
357
 
358
+ class __open_spec(typing_extensions.Protocol):
359
+ @typing.overload
360
+ def __call__(self, path: str, mode: _typeshed.OpenTextMode) -> modal.file_io.FileIO[str]: ...
361
+ @typing.overload
362
+ def __call__(self, path: str, mode: _typeshed.OpenBinaryMode) -> modal.file_io.FileIO[bytes]: ...
363
+ @typing.overload
364
+ async def aio(self, path: str, mode: _typeshed.OpenTextMode) -> modal.file_io.FileIO[str]: ...
365
+ @typing.overload
366
+ async def aio(self, path: str, mode: _typeshed.OpenBinaryMode) -> modal.file_io.FileIO[bytes]: ...
367
+
368
+ open: __open_spec
369
+
352
370
  @property
353
371
  def stdout(self) -> modal.io_streams.StreamReader[str]: ...
354
372
  @property
modal/volume.py CHANGED
@@ -632,7 +632,11 @@ class _VolumeUploadContextManager:
632
632
  logger.debug(f"Creating blob file for {file_spec.source_description} ({file_spec.size} bytes)")
633
633
  with file_spec.source() as fp:
634
634
  blob_id = await blob_upload_file(
635
- fp, self._client.stub, functools.partial(self._progress_cb, progress_task_id)
635
+ fp,
636
+ self._client.stub,
637
+ functools.partial(self._progress_cb, progress_task_id),
638
+ sha256_hex=file_spec.sha256_hex,
639
+ md5_hex=file_spec.md5_hex,
636
640
  )
637
641
  logger.debug(f"Uploading blob file {file_spec.source_description} as {remote_filename}")
638
642
  request2 = api_pb2.MountPutFileRequest(data_blob_id=blob_id, sha256_hex=file_spec.sha256_hex)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: modal
3
- Version: 0.67.43
3
+ Version: 0.68.24
4
4
  Summary: Python client library for Modal
5
5
  Author: Modal Labs
6
6
  Author-email: support@modal.com
@@ -21,7 +21,7 @@ Requires-Dist: fastapi
21
21
  Requires-Dist: grpclib (==0.4.7)
22
22
  Requires-Dist: protobuf (!=4.24.0,<6.0,>=3.19)
23
23
  Requires-Dist: rich (>=12.0.0)
24
- Requires-Dist: synchronicity (~=0.9.4)
24
+ Requires-Dist: synchronicity (~=0.9.6)
25
25
  Requires-Dist: toml
26
26
  Requires-Dist: typer (>=0.9)
27
27
  Requires-Dist: types-certifi
@@ -1,9 +1,9 @@
1
- modal/__init__.py,sha256=Yn8zS7Jxl5uZjPM331Pc4FdSmp9Rt6VdE7TiE4ZKRc8,2151
1
+ 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=Tae8hAbgN62HM9Q_UFuCyyswfdh1rOey2zzXkbG4Cns,28795
6
- modal/_ipython.py,sha256=HF_DYy0e0qM9WnGDmTY30s1RxzGya9GeORCauCEpRaE,450
5
+ modal/_container_entrypoint.py,sha256=wk10vA5vRZZsVwQ0yINOLd0i-NwH7x6XbhTslumvGjo,28910
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
9
9
  modal/_proxy_tunnel.py,sha256=gnKyCfmVB7x2d1A6c-JDysNIP3kEFxmXzhcXhPrzPn0,1906
@@ -11,19 +11,19 @@ modal/_pty.py,sha256=JZfPDDpzqICZqtyPI_oMJf_9w-p_lLNuzHhwhodUXio,1329
11
11
  modal/_resolver.py,sha256=TtowKu2LdZ7NpiYkSXs058BZ4ivY8KVYdchqLfREkiA,6775
12
12
  modal/_resources.py,sha256=5qmcirXUI8dSH926nwkUaeX9H25mqYu9mXD_KuT79-o,1733
13
13
  modal/_serialization.py,sha256=qPLH6OUEBas1CT-a6i5pOP1hPGt5AfKr9q7RMUTFOMc,18722
14
- modal/_traceback.py,sha256=tueIGN5DbPaQlo23F-GrFMjl-HpDxBxfSAkqjU39zwg,4389
14
+ modal/_traceback.py,sha256=orZ7rsCk9ekV7ZoFjZTH_H00azCypwRKaLh0MZb1dR8,4898
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
18
  modal/app.py,sha256=EJ7FUN6rWnSwLJoYJh8nmKg_t-8hdN8_rt0OrkP7JvQ,46084
19
19
  modal/app.pyi,sha256=BE5SlR5tRECuc6-e2lUuOknDdov3zxgZ4N0AsLb5ZVQ,25270
20
20
  modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
21
- modal/client.py,sha256=cmylZhU35txmrx4nltNYuuqXRgeoMtm0ow1J9wJkEYQ,16400
22
- modal/client.pyi,sha256=4PTumnNQ0bz1iY7cJ9H9YbH76flPkTjCk-1pk-7WLAQ,7354
21
+ modal/client.py,sha256=JAnd4-GCN093BwkvOFAK5a6iy5ycxofjpUncMxlrIMw,15253
22
+ modal/client.pyi,sha256=cGr_WLDO9rrvE2HfYkrzrN6U-XZ_tBEwDBBS1akt94M,7280
23
23
  modal/cloud_bucket_mount.py,sha256=G7T7jWLD0QkmrfKR75mSTwdUZ2xNfj7pkVqb4ipmxmI,5735
24
24
  modal/cloud_bucket_mount.pyi,sha256=CEi7vrH3kDUF4LAy4qP6tfImy2UJuFRcRbsgRNM1wo8,1403
25
- modal/cls.py,sha256=OJqzj_V-n1g48BY_4Jg_BOTQdftEEl4kTWN0X4FOOdg,27378
26
- modal/cls.pyi,sha256=47jaIT06fz8PSUrs-MaNn6r03PHsAyUGsKuK5e9RMhQ,8140
25
+ modal/cls.py,sha256=ONnrfZ2vPcaY2JuKypPiBA9eTiyg8Qfg-Ull40nn9zs,30956
26
+ modal/cls.pyi,sha256=uoOEANXgCFT9Au3e-_bU98M6ZfAgQWF5ngj8f4c6qpY,8225
27
27
  modal/config.py,sha256=1KhNJkjYsJkX1V8RPPdRYPlM2HE-ZZs0JVSxbiXjmrw,11010
28
28
  modal/container_process.py,sha256=zDxCLk6KfJT1G9FfNtjom6gekBQ46op3TWepT7-Hkbg,6077
29
29
  modal/container_process.pyi,sha256=dqtqBmyRpXXpRrDooESL6WBVU_1Rh6OG-66P2Hk9E5U,2666
@@ -31,37 +31,40 @@ modal/dict.py,sha256=RmJlEwFJOdSfAYcVa50hbbFccV8e7BvC5tc5g1HXF-c,12622
31
31
  modal/dict.pyi,sha256=2cYgOqBxYZih4BYgMV0c3rNPuxYR6-cB1GBXzFkHA5c,7265
32
32
  modal/environments.py,sha256=5cgA-zbm6ngKLsRA19zSOgtgo9-BarJK3FJK0BiF2Lo,6505
33
33
  modal/environments.pyi,sha256=XalNpiPkAtHWAvOU2Cotq0ozmtl-Jv0FDsR8h9mr27Q,3521
34
- modal/exception.py,sha256=EBkdWVved2XEPsXaoPRu56xfxFFHL9iuqvUsdj42WDA,6392
34
+ modal/exception.py,sha256=dRK789TD1HaB63kHhu1yZuvS2vP_Vua3iLMBtA6dgqk,7128
35
35
  modal/experimental.py,sha256=jFuNbwrNHos47viMB9q-cHJSvf2RDxDdoEcss9plaZE,2302
36
- modal/functions.py,sha256=3GjjFbf40XciWAa4rTmh0erkZjPzRjKHqWxUu91mHOU,66685
37
- modal/functions.pyi,sha256=IyuM9TV79JfrtfTaJ4yq3EcWp3yHuxLavpxTOwSWEDw,24988
36
+ modal/file_io.py,sha256=q8s872qf6Ntdw7dPogDlpYbixxGkwCA0BlQn2UUoVhY,14637
37
+ modal/file_io.pyi,sha256=pfkmJiaBpMCZReE6-KCjYOzB1dVtyYDYokJoYX8ARK4,6932
38
+ modal/file_pattern_matcher.py,sha256=vX6MjWRGdonE4I8QPdjFUnz6moBjSzvgD6417BNQrW4,4021
39
+ modal/functions.py,sha256=IIdHw0FNOdoMksG1b2zvkn8f-xskhJu07ZvHMey9iq4,67667
40
+ modal/functions.pyi,sha256=bHbJiWW5TbFKKjDn7bSCFvOcUcAjPFqTStS-NAHPSeM,25068
38
41
  modal/gpu.py,sha256=r4rL6uH3UJIQthzYvfWauXNyh01WqCPtKZCmmSX1fd4,6881
39
- modal/image.py,sha256=cQ6WP1xHXZT_nY8z3aEFiGwKzrTV0yxi3Ab8JzF91eo,79653
40
- modal/image.pyi,sha256=PIKH6JBA4L5TfdJrQu3pm2ykyIITmiP920TpP8cdyQA,24585
42
+ modal/image.py,sha256=xQAC1gWOG0L77QfVfAbHfLwfVkvMYi2sy0V_Ah7GWPg,82253
43
+ modal/image.pyi,sha256=8R8Ac9eZ83ocM_1qrFUvH3rCbI5zRnq-Eq0xaAQq4nI,25105
41
44
  modal/io_streams.py,sha256=QkQiizKRzd5bnbKQsap31LJgBYlAnj4-XkV_50xPYX0,15079
42
45
  modal/io_streams.pyi,sha256=bCCVSxkMcosYd8O3PQDDwJw7TQ8JEcnYonLJ5t27TQs,4804
43
- modal/mount.py,sha256=liaid5p42o0OKnzoocJJ_oCovDVderk3-JuCTa5pqtA,27656
44
- modal/mount.pyi,sha256=3e4nkXUeeVmUmOyK8Tiyk_EQlHeWruN3yGJVnmDUVrI,9761
45
- modal/network_file_system.py,sha256=NKZgh_p8MyJyyJgP92lhRgTmwA3kOPw7m8AbYlchhCE,14530
46
+ modal/mount.py,sha256=QKvrgpS_FMqrGdoyVZWeWnkNpQeDSLpuiwZFSGgRp_Y,29017
47
+ modal/mount.pyi,sha256=a0WAFmT7kZvoq_ZAu6R6fwxiEUR6QSmeC_avUpJKGWM,10495
48
+ modal/network_file_system.py,sha256=kwwQLCJVO086FTiAWSF_jz9BkqijZLpSbEYXpFvS0Ik,14600
46
49
  modal/network_file_system.pyi,sha256=8mHKXuRkxHPazF6ljIW7g4M5aVqLSl6eKUPLgDCug5c,7901
47
- modal/object.py,sha256=KmtWRDd5ntHGSO9ASHe9MJcIgjNRqaDXGc3rWOXwrmA,9646
50
+ modal/object.py,sha256=HZs3N59C6JxlMuPQWJYvrWV1FEEkH9txUovVDorVUbs,9763
48
51
  modal/object.pyi,sha256=MO78H9yFSE5i1gExPEwyyQzLdlshkcGHN1aQ0ylyvq0,8802
49
52
  modal/output.py,sha256=N0xf4qeudEaYrslzdAl35VKV8rapstgIM2e9wO8_iy0,1967
50
53
  modal/parallel_map.py,sha256=4aoMXIrlG3wl5Ifk2YDNOQkXsGRsm6Xbfm6WtJ2t3WY,16002
51
54
  modal/parallel_map.pyi,sha256=pOhT0P3DDYlwLx0fR3PTsecA7DI8uOdXC1N8i-ZkyOY,2328
52
- modal/partial_function.py,sha256=938kcVJHcdGXKWsO7NE_FBxPldZ304a_GyhjxD79wHE,28215
53
- modal/partial_function.pyi,sha256=EafGOzZdEq-yE5bYRoMfnMqw-o8Hk_So8MRPDSB99_0,8982
55
+ modal/partial_function.py,sha256=zr_tFmTdoFxpTDw8cSwo_IjiWwZAyROCmQyl2z-Z6MY,29201
56
+ modal/partial_function.pyi,sha256=pO6kf8i5HVsZ7CF0z_KkzLk4Aeq7NJhFJ_VNIycRXaU,9260
54
57
  modal/proxy.py,sha256=ZrOsuQP7dSZFq1OrIxalNnt0Zvsnp1h86Th679sSL40,1417
55
58
  modal/proxy.pyi,sha256=UvygdOYneLTuoDY6hVaMNCyZ947Tmx93IdLjErUqkvM,368
56
59
  modal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
60
  modal/queue.py,sha256=fJYFfpdrlVj_doc3QxgvJvv7c8BGHjjja5q_9HCtSqs,18658
58
61
  modal/queue.pyi,sha256=di3ownBw4jc6d4X7ygXtbpjlUMOK69qyaD3lVsJbpoM,9900
59
62
  modal/retries.py,sha256=HKR2Q9aNPWkMjQ5nwobqYTuZaSuw0a8lI2zrtY5IW98,5230
60
- modal/runner.py,sha256=AiBGoc_BZxQenjA0T9yQ7hf515Va6G05ULYRGnTT5Y0,24453
61
- modal/runner.pyi,sha256=Fa6HjaqH---CJhsefLm6Ce6DRLKZdz_Bng_gn9arJdw,5126
63
+ modal/runner.py,sha256=Q02VdfLCO7YKpnOSqqh58XL3hR2XHaDeiJVYW3MKz_8,24580
64
+ modal/runner.pyi,sha256=BvMS1ZVzWSn8B8q0KnIZOJKPkN5L-i5b-USbV6SWWHQ,5177
62
65
  modal/running_app.py,sha256=CshNvGDJtagOdKW54uYjY8HY73j2TpnsL9jkPFZAsfA,560
63
- modal/sandbox.py,sha256=Yd__KipEINH2euDPOcm5MPBnagRv19Sa5z5tJCvGOQs,26360
64
- modal/sandbox.pyi,sha256=fRl32Pt5F6TbK7aYewjlcL4WQxxmp7m6Ybktmkd2VOk,18108
66
+ modal/sandbox.py,sha256=abmprnPtA-WVsHKu4J1deoltpAUvXtIHQHX-ZpYjYPE,27293
67
+ modal/sandbox.pyi,sha256=QPNuiTLNoKwYf8JK_fmfUBXpdGYlukyaksFV1DpCd2g,18987
65
68
  modal/schedule.py,sha256=0ZFpKs1bOxeo5n3HZjoL7OE2ktsb-_oGtq-WJEPO4tY,2615
66
69
  modal/scheduler_placement.py,sha256=BAREdOY5HzHpzSBqt6jDVR6YC_jYfHMVqOzkyqQfngU,1235
67
70
  modal/secret.py,sha256=Y1WgybQIkfkxdzH9CQ1h-Wd1DJJpzipigMhyyvSxTww,10007
@@ -71,37 +74,38 @@ modal/serving.pyi,sha256=ncV-9jY_vZYFnGs5ZnMb3ffrX8LmcLdIMHBC56xRbtE,1711
71
74
  modal/stream_type.py,sha256=A6320qoAAWhEfwOCZfGtymQTu5AfLfJXXgARqooTPvY,417
72
75
  modal/token_flow.py,sha256=LcgSce_MSQ2p7j55DPwpVRpiAtCDe8GRSEwzO7muNR8,6774
73
76
  modal/token_flow.pyi,sha256=gOYtYujrWt_JFZeiI8EmfahXPx5GCR5Na-VaPQcWgEY,1937
74
- modal/volume.py,sha256=IISuMeXq9MoSkhXg8Q6JG0F-2n9NTkWk0xGuJB8l3d8,29159
77
+ modal/volume.py,sha256=PGzbninvRU-IhSwJgM2jZKzD8llRhZhadsOxZ-YNwaM,29316
75
78
  modal/volume.pyi,sha256=St0mDiaojfep6Bs4sBbkRJmeacYHF6lh6FKOWGmheHA,11182
76
79
  modal/_runtime/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
77
- modal/_runtime/asgi.py,sha256=GvuxZqWnIHMIR-Bx5f7toCQlkERaJO8CHjTPNM9IFIw,21537
78
- modal/_runtime/container_io_manager.py,sha256=8NyX5uuwmHEJgxMwdoY9PpEO-IHA8LGdYdbdHLIafK8,44131
80
+ modal/_runtime/asgi.py,sha256=H68KAN8bz8Zp7EcRl2c_ite1Y3kP1MHvjQAf-uUpCx8,21691
81
+ modal/_runtime/container_io_manager.py,sha256=ctgyNFiHjq1brCrabXmlurkAXjnrCeWPRvTVa735vRw,44215
79
82
  modal/_runtime/execution_context.py,sha256=E6ofm6j1POXGPxS841X3V7JU6NheVb8OkQc7JpLq4Kg,2712
80
83
  modal/_runtime/telemetry.py,sha256=T1RoAGyjBDr1swiM6pPsGRSITm7LI5FDK18oNXxY08U,5163
81
- modal/_runtime/user_code_imports.py,sha256=q_3JOYqCPDcVFZWCHEjyEqj8yzdFsQ49HzeqYmFDLbk,14521
84
+ modal/_runtime/user_code_imports.py,sha256=n4CQOojzSdf0jwSKSy6MEnVX3IWl3t3Dq54-x9VS2Ds,14663
82
85
  modal/_utils/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
83
86
  modal/_utils/app_utils.py,sha256=88BT4TPLWfYAQwKTHcyzNQRHg8n9B-QE2UyJs96iV-0,108
84
87
  modal/_utils/async_utils.py,sha256=9ubwMkwiDB4gzOYG2jL9j7Fs-5dxHjcifZe3r7JRg-k,25091
85
- modal/_utils/blob_utils.py,sha256=0k_qUpO5GHnz538wjRhyRw4NdJ5O322N7QSilIu32jw,16601
86
- modal/_utils/function_utils.py,sha256=GV-mq6sSGXQIX5PcExYWJMaWY9YLjChjsiQjg-oPvm8,24902
87
- modal/_utils/grpc_testing.py,sha256=iqM9n5M0cWUUIIWNaEDer_pIfPnzXdZBO4L8FVbNepQ,8309
88
+ modal/_utils/blob_utils.py,sha256=N66LtZI8PpCkZ7maA7GLW5CAmYUoNJdG-GjaAUR4_NQ,14509
89
+ modal/_utils/bytes_io_segment_payload.py,sha256=uunxVJS4PE1LojF_UpURMzVK9GuvmYWRqQo_bxEj5TU,3385
90
+ modal/_utils/function_utils.py,sha256=LgcveUUb4XU_dWxtqgK_3ujZBvS3cGVzcDOkljyFZ2w,25066
91
+ modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
88
92
  modal/_utils/grpc_utils.py,sha256=PPB5ay-vXencXNIWPVw5modr3EH7gfq2QPcO5YJ1lMU,7737
89
- modal/_utils/hash_utils.py,sha256=xKwSI1eQobyWNdJwyLO59eB241LOXmQ6QvtzJsyIMcw,1784
90
- modal/_utils/http_utils.py,sha256=VKXYNPJtrSwZ1ttcXVGQUWmn8cLAXiOTv05g2ac3GbU,2179
93
+ modal/_utils/hash_utils.py,sha256=zg3J6OGxTFGSFri1qQ12giDz90lWk8bzaxCTUCRtiX4,3034
94
+ modal/_utils/http_utils.py,sha256=yeTFsXYr0rYMEhB7vBP7audG9Uc7OLhzKBANFDZWVt0,2451
91
95
  modal/_utils/logger.py,sha256=ePzdudrtx9jJCjuO6-bcL_kwUJfi4AwloUmIiNtqkY0,1330
92
96
  modal/_utils/mount_utils.py,sha256=J-FRZbPQv1i__Tob-FIpbB1oXWpFLAwZiB4OCiJpFG0,3206
93
97
  modal/_utils/name_utils.py,sha256=TW1iyJedvDNPEJ5UVp93u8xuD5J2gQL_CUt1mgov_aI,1939
94
98
  modal/_utils/package_utils.py,sha256=LcL2olGN4xaUzu2Tbv-C-Ft9Qp6bsLxEfETOAVd-mjU,2073
95
- modal/_utils/pattern_matcher.py,sha256=sssw9Cmck2f-TvOE1i96fbdsJr9DKLpbebyCwNr3wHY,9246
99
+ modal/_utils/pattern_utils.py,sha256=ZUffaECfe2iYBhH6cvCB-0-UWhmEBTZEl_TwG_So3ag,6714
96
100
  modal/_utils/rand_pb_testing.py,sha256=NYM8W6HF-6_bzxJCAj4ITvItZYrclacEZlBhTptOT_Q,3845
97
- modal/_utils/shell_utils.py,sha256=6P0ykuE5qU2MkCu2HHc8yqJzp8CgTm79ws3snsV9OkU,1946
101
+ modal/_utils/shell_utils.py,sha256=hWHzv730Br2Xyj6cGPiMZ-198Z3RZuOu3pDXhFSZ22c,2157
98
102
  modal/_vendor/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
99
103
  modal/_vendor/a2wsgi_wsgi.py,sha256=Q1AsjpV_Q_vzQsz_cSqmP9jWzsGsB-ARFU6vpQYml8k,21878
100
104
  modal/_vendor/cloudpickle.py,sha256=Loq12qo7PBNbE4LFVEW6BdMMwY10MG94EOW1SCpcnQ0,55217
101
105
  modal/_vendor/tblib.py,sha256=g1O7QUDd3sDoLd8YPFltkXkih7r_fyZOjgmGuligv3s,9722
102
106
  modal/cli/__init__.py,sha256=waLjl5c6IPDhSsdWAm9Bji4e2PVxamYABKAze6CHVXY,28
103
107
  modal/cli/_download.py,sha256=t6BXZwjTd9MgznDvbsV8rp0FZWggdzC-lUAGZU4xx1g,3984
104
- modal/cli/_traceback.py,sha256=Tm0g4V_fr4XAlmuh_4MNgZKtjJly9wsWtnKKvOJFM7Q,7130
108
+ modal/cli/_traceback.py,sha256=QlLa_iw3fAOA-mqCqjS8qAxvNT48J3YY3errtVVc2cw,7316
105
109
  modal/cli/app.py,sha256=KOU3tKdcw50612rmN2LmO-N8cT1M1-UgLs7tw68Kgds,7717
106
110
  modal/cli/config.py,sha256=pXPLmX0bIoV57rQNqIPK7V-yllj-GPRY4jiBO_EklGg,1667
107
111
  modal/cli/container.py,sha256=nCySVD10VJPzmX3ghTsGmpxdYeVYYMW6ofjsyt2gQcM,3667
@@ -113,7 +117,7 @@ modal/cli/launch.py,sha256=uyI-ouGvYRjHLGxGQ2lYBZq32BiRT1i0L8ksz5iy7K8,2935
113
117
  modal/cli/network_file_system.py,sha256=3QbAxKEoRc6RCMsYE3OS-GcuiI4GMkz_wAKsIBbN1qg,8186
114
118
  modal/cli/profile.py,sha256=rLXfjJObfPNjaZvNfHGIKqs7y9bGYyGe-K7V0w-Ni0M,3110
115
119
  modal/cli/queues.py,sha256=MIh2OsliNE2QeL1erubfsRsNuG4fxqcqWA2vgIfQ4Mg,4494
116
- modal/cli/run.py,sha256=MitoSFA_QaqkIVjBRi91w1ekz6UlCwL3htE3_RI3yjA,17353
120
+ modal/cli/run.py,sha256=W9isFpIQTNCxKafVfI_PUjxNrDMl5V8N9y15F3wtPXk,17831
117
121
  modal/cli/secret.py,sha256=uQpwYrMY98iMCWeZOQTcktOYhPTZ8IHnyealDc2CZqo,4206
118
122
  modal/cli/token.py,sha256=mxSgOWakXG6N71hQb1ko61XAR9ZGkTMZD-Txn7gmTac,1924
119
123
  modal/cli/utils.py,sha256=hZmjyzcPjDnQSkLvycZD2LhGdcsfdZshs_rOU78EpvI,3717
@@ -131,7 +135,7 @@ modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,
131
135
  modal/requirements/base-images.json,sha256=kLNo5Sqmnhp9H6Hr9IcaGJFrRaRg1yfuepUWkm-y8iQ,571
132
136
  modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
133
137
  modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
134
- modal_docs/gen_reference_docs.py,sha256=AI8h-JKfwn7Tohm3P3D5G0SivSpdGgN6gnw-fED-S0s,6613
138
+ modal_docs/gen_reference_docs.py,sha256=aDcUSSDtAAZ4eeFWyroeIg2TOzyRoYcic-d9Zh9TdLY,6656
135
139
  modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
136
140
  modal_docs/mdmd/mdmd.py,sha256=F6EXKkjwrTbOiG6I7wKtNGVVmmeWLAJ5pnE7DUkDpvM,6231
137
141
  modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
@@ -142,10 +146,10 @@ modal_global_objects/mounts/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0
142
146
  modal_global_objects/mounts/modal_client_package.py,sha256=W0E_yShsRojPzWm6LtIQqNVolapdnrZkm2hVEQuZK_4,767
143
147
  modal_global_objects/mounts/python_standalone.py,sha256=SL_riIxpd8mP4i4CLDCWiFFNj0Ltknm9c_UIGfX5d60,1836
144
148
  modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
145
- modal_proto/api.proto,sha256=zd8V-GFVMtUP8YwxnlVvaJIuocpWKchRCeUZSlMMk74,78818
149
+ modal_proto/api.proto,sha256=K1QnKJ3UuBkOJ4bCsrKqn-kDeitAiaoBK8Lq2Wzs28Y,79552
146
150
  modal_proto/api_grpc.py,sha256=DveC4ejFYEhCLiWbQShnmY31_FWGYU675Bmr7nHhsgs,101342
147
- modal_proto/api_pb2.py,sha256=l88JT2IcEuSqCnk7WRTQrBoHtJyAQD4hHAoWmiCQr0A,287100
148
- modal_proto/api_pb2.pyi,sha256=a303c1L3sRnSk9wZXa7DuQWwBZm8u6EShoJImMYxt98,384236
151
+ modal_proto/api_pb2.py,sha256=HoQkd_G9iIPPcXyBQ_50NJFNXxcckZ6VyzGWdaurkgE,292334
152
+ modal_proto/api_pb2.pyi,sha256=EqUBkMJr0CKILSvS9AwAAOxlyo26ftZBnMOECfOAzTA,390736
149
153
  modal_proto/api_pb2_grpc.py,sha256=2PEP6JPOoTw2rDC5qYjLNuumP68ZwAouRhCoayisAhY,219162
150
154
  modal_proto/api_pb2_grpc.pyi,sha256=uWtCxVEd0cFpOZ1oOGfZNO7Dv45OP4kp09jMnNyx9D4,51098
151
155
  modal_proto/modal_api_grpc.py,sha256=-8mLby_om5MYo6yu1zA_hqhz0yLsQW7k2YWBVZW1iVs,13546
@@ -157,12 +161,12 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
157
161
  modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
158
162
  modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
159
163
  modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
- modal_version/__init__.py,sha256=3IY-AWLH55r35_mQXIaut0jrJvoPuf1NZJBQQfSbPuo,470
164
+ modal_version/__init__.py,sha256=RT6zPoOdFO99u5Wcxxaoir4ZCuPTbQ22cvzFAXl3vUY,470
161
165
  modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
162
- modal_version/_version_generated.py,sha256=tPxVZVhTZ80YH1CvSZDHAkJ_azeUcv00GgLvebLfni8,149
163
- modal-0.67.43.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
164
- modal-0.67.43.dist-info/METADATA,sha256=tTXXCu0njTf-8EjJlrBL7TjvMP0e90efMYpHA5y1VRw,2329
165
- modal-0.67.43.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
166
- modal-0.67.43.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
167
- modal-0.67.43.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
168
- modal-0.67.43.dist-info/RECORD,,
166
+ modal_version/_version_generated.py,sha256=SUn_R6s_ZfRkN0JPzGPm4Xkd0kC9ITNqjncXWymKoQY,149
167
+ modal-0.68.24.dist-info/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
168
+ modal-0.68.24.dist-info/METADATA,sha256=guiG7ul7yJSYcVcKVXvJErv3Y8DuKpDh5tjdZEzGplU,2329
169
+ modal-0.68.24.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
170
+ modal-0.68.24.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
171
+ modal-0.68.24.dist-info/top_level.txt,sha256=1nvYbOSIKcmU50fNrpnQnrrOpj269ei3LzgB6j9xGqg,64
172
+ modal-0.68.24.dist-info/RECORD,,
@@ -86,6 +86,7 @@ def run(output_dir: str = None):
86
86
  ("modal.Sandbox", "modal.sandbox"),
87
87
  ("modal.ContainerProcess", "modal.container_process"),
88
88
  ("modal.io_streams", "modal.io_streams"),
89
+ ("modal.FileIO", "modal.file_io"),
89
90
  ]
90
91
  # These aren't defined in `modal`, but should still be documented as top-level entries.
91
92
  forced_members = {"web_endpoint", "asgi_app", "method", "wsgi_app", "forward"}