modal 1.0.6.dev10__py3-none-any.whl → 1.0.6.dev12__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/_functions.py +19 -1
- modal/_utils/function_utils.py +4 -3
- modal/client.pyi +2 -2
- modal/image.py +108 -0
- modal/image.pyi +60 -0
- modal/parallel_map.py +8 -1
- {modal-1.0.6.dev10.dist-info → modal-1.0.6.dev12.dist-info}/METADATA +1 -1
- {modal-1.0.6.dev10.dist-info → modal-1.0.6.dev12.dist-info}/RECORD +16 -16
- modal_proto/api.proto +2 -0
- modal_proto/api_pb2.py +510 -510
- modal_proto/api_pb2.pyi +8 -2
- modal_version/__init__.py +1 -1
- {modal-1.0.6.dev10.dist-info → modal-1.0.6.dev12.dist-info}/WHEEL +0 -0
- {modal-1.0.6.dev10.dist-info → modal-1.0.6.dev12.dist-info}/entry_points.txt +0 -0
- {modal-1.0.6.dev10.dist-info → modal-1.0.6.dev12.dist-info}/licenses/LICENSE +0 -0
- {modal-1.0.6.dev10.dist-info → modal-1.0.6.dev12.dist-info}/top_level.txt +0 -0
modal/_functions.py
CHANGED
|
@@ -40,6 +40,7 @@ from ._utils.async_utils import (
|
|
|
40
40
|
synchronizer,
|
|
41
41
|
warn_if_generator_is_not_consumed,
|
|
42
42
|
)
|
|
43
|
+
from ._utils.blob_utils import MAX_OBJECT_SIZE_BYTES
|
|
43
44
|
from ._utils.deprecation import deprecation_warning, warn_if_passing_namespace
|
|
44
45
|
from ._utils.function_utils import (
|
|
45
46
|
ATTEMPT_TIMEOUT_GRACE_PERIOD,
|
|
@@ -145,6 +146,7 @@ class _Invocation:
|
|
|
145
146
|
args,
|
|
146
147
|
kwargs,
|
|
147
148
|
stub,
|
|
149
|
+
max_object_size_bytes=function._max_object_size_bytes,
|
|
148
150
|
method_name=function._use_method_name,
|
|
149
151
|
function_call_invocation_type=function_call_invocation_type,
|
|
150
152
|
)
|
|
@@ -386,7 +388,13 @@ class _InputPlaneInvocation:
|
|
|
386
388
|
function_id = function.object_id
|
|
387
389
|
control_plane_stub = client.stub
|
|
388
390
|
# Note: Blob upload is done on the control plane stub, not the input plane stub!
|
|
389
|
-
input_item = await _create_input(
|
|
391
|
+
input_item = await _create_input(
|
|
392
|
+
args,
|
|
393
|
+
kwargs,
|
|
394
|
+
control_plane_stub,
|
|
395
|
+
max_object_size_bytes=function._max_object_size_bytes,
|
|
396
|
+
method_name=function._use_method_name,
|
|
397
|
+
)
|
|
390
398
|
|
|
391
399
|
request = api_pb2.AttemptStartRequest(
|
|
392
400
|
function_id=function_id,
|
|
@@ -1414,6 +1422,15 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1414
1422
|
self._definition_id = metadata.definition_id
|
|
1415
1423
|
self._input_plane_url = metadata.input_plane_url
|
|
1416
1424
|
self._input_plane_region = metadata.input_plane_region
|
|
1425
|
+
# The server may pass back a larger max object size for some input plane users. This applies to input plane
|
|
1426
|
+
# users only - anyone using the control plane will get the standard limit.
|
|
1427
|
+
# There are some cases like FunctionPrecreate where this value is not set at all. We expect that this field
|
|
1428
|
+
# will eventually be hydrated with the correct value, but just to be defensive, if the field is not set we use
|
|
1429
|
+
# MAX_OBJECT_SIZE_BYTES, otherwise it would get set to 0. Accidentally using 0 would cause us to blob upload
|
|
1430
|
+
# everything, so let's avoid that.
|
|
1431
|
+
self._max_object_size_bytes = (
|
|
1432
|
+
metadata.max_object_size_bytes if metadata.HasField("max_object_size_bytes") else MAX_OBJECT_SIZE_BYTES
|
|
1433
|
+
)
|
|
1417
1434
|
|
|
1418
1435
|
def _get_metadata(self):
|
|
1419
1436
|
# Overridden concrete implementation of base class method
|
|
@@ -1430,6 +1447,7 @@ class _Function(typing.Generic[P, ReturnType, OriginalReturnType], _Object, type
|
|
|
1430
1447
|
function_schema=self._metadata.function_schema if self._metadata else None,
|
|
1431
1448
|
input_plane_url=self._input_plane_url,
|
|
1432
1449
|
input_plane_region=self._input_plane_region,
|
|
1450
|
+
max_object_size_bytes=self._max_object_size_bytes,
|
|
1433
1451
|
)
|
|
1434
1452
|
|
|
1435
1453
|
def _check_no_web_url(self, fn_name: str):
|
modal/_utils/function_utils.py
CHANGED
|
@@ -34,7 +34,6 @@ from ..exception import (
|
|
|
34
34
|
from ..mount import ROOT_DIR, _is_modal_path, _Mount
|
|
35
35
|
from .blob_utils import (
|
|
36
36
|
MAX_ASYNC_OBJECT_SIZE_BYTES,
|
|
37
|
-
MAX_OBJECT_SIZE_BYTES,
|
|
38
37
|
blob_download,
|
|
39
38
|
blob_upload_with_r2_failure_info,
|
|
40
39
|
)
|
|
@@ -518,12 +517,13 @@ async def _process_result(result: api_pb2.GenericResult, data_format: int, stub,
|
|
|
518
517
|
|
|
519
518
|
def should_upload(
|
|
520
519
|
num_bytes: int,
|
|
520
|
+
max_object_size_bytes: int,
|
|
521
521
|
function_call_invocation_type: Optional["api_pb2.FunctionCallInvocationType.ValueType"],
|
|
522
522
|
) -> bool:
|
|
523
523
|
"""
|
|
524
524
|
Determine if the input should be uploaded to blob storage.
|
|
525
525
|
"""
|
|
526
|
-
return num_bytes >
|
|
526
|
+
return num_bytes > max_object_size_bytes or (
|
|
527
527
|
function_call_invocation_type == api_pb2.FUNCTION_CALL_INVOCATION_TYPE_ASYNC
|
|
528
528
|
and num_bytes > MAX_ASYNC_OBJECT_SIZE_BYTES
|
|
529
529
|
)
|
|
@@ -534,6 +534,7 @@ async def _create_input(
|
|
|
534
534
|
kwargs,
|
|
535
535
|
stub: ModalClientModal,
|
|
536
536
|
*,
|
|
537
|
+
max_object_size_bytes: int,
|
|
537
538
|
idx: Optional[int] = None,
|
|
538
539
|
method_name: Optional[str] = None,
|
|
539
540
|
function_call_invocation_type: Optional["api_pb2.FunctionCallInvocationType.ValueType"] = None,
|
|
@@ -548,7 +549,7 @@ async def _create_input(
|
|
|
548
549
|
|
|
549
550
|
args_serialized = serialize((args, kwargs))
|
|
550
551
|
|
|
551
|
-
if should_upload(len(args_serialized), function_call_invocation_type):
|
|
552
|
+
if should_upload(len(args_serialized), max_object_size_bytes, function_call_invocation_type):
|
|
552
553
|
args_blob_id, r2_failed, r2_latency_ms = await blob_upload_with_r2_failure_info(args_serialized, stub)
|
|
553
554
|
return api_pb2.FunctionPutInputsItem(
|
|
554
555
|
input=api_pb2.FunctionInput(
|
modal/client.pyi
CHANGED
|
@@ -31,7 +31,7 @@ class _Client:
|
|
|
31
31
|
server_url: str,
|
|
32
32
|
client_type: int,
|
|
33
33
|
credentials: typing.Optional[tuple[str, str]],
|
|
34
|
-
version: str = "1.0.6.
|
|
34
|
+
version: str = "1.0.6.dev12",
|
|
35
35
|
):
|
|
36
36
|
"""mdmd:hidden
|
|
37
37
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -160,7 +160,7 @@ class Client:
|
|
|
160
160
|
server_url: str,
|
|
161
161
|
client_type: int,
|
|
162
162
|
credentials: typing.Optional[tuple[str, str]],
|
|
163
|
-
version: str = "1.0.6.
|
|
163
|
+
version: str = "1.0.6.dev12",
|
|
164
164
|
):
|
|
165
165
|
"""mdmd:hidden
|
|
166
166
|
The Modal client object is not intended to be instantiated directly by users.
|
modal/image.py
CHANGED
|
@@ -1222,6 +1222,114 @@ class _Image(_Object, type_prefix="im"):
|
|
|
1222
1222
|
gpu_config=parse_gpu_config(gpu),
|
|
1223
1223
|
)
|
|
1224
1224
|
|
|
1225
|
+
def uv_pip_install(
|
|
1226
|
+
self,
|
|
1227
|
+
*packages: Union[str, list[str]], # A list of Python packages, eg. ["numpy", "matplotlib>=3.5.0"]
|
|
1228
|
+
requirements: Optional[list[str]] = None, # Passes -r (--requirements) to uv pip install
|
|
1229
|
+
find_links: Optional[str] = None, # Passes -f (--find-links) to uv pip install
|
|
1230
|
+
index_url: Optional[str] = None, # Passes -i (--index-url) to uv pip install
|
|
1231
|
+
extra_index_url: Optional[str] = None, # Passes --extra-index-url to uv pip install
|
|
1232
|
+
pre: bool = False, # Allow pre-releases using uv pip install --prerelease allow
|
|
1233
|
+
extra_options: str = "", # Additional options to pass to pip install, e.g. "--no-build-isolation"
|
|
1234
|
+
force_build: bool = False, # Ignore cached builds, similar to 'docker build --no-cache'
|
|
1235
|
+
uv_version: Optional[str] = None, # uv version to use
|
|
1236
|
+
secrets: Sequence[_Secret] = [],
|
|
1237
|
+
gpu: GPU_T = None,
|
|
1238
|
+
) -> "_Image":
|
|
1239
|
+
"""Install a list of Python packages using uv pip install.
|
|
1240
|
+
|
|
1241
|
+
**Examples**
|
|
1242
|
+
|
|
1243
|
+
Simple installation:
|
|
1244
|
+
```python
|
|
1245
|
+
image = modal.Image.debian_slim().uv_pip_install("torch==2.7.1", "numpy")
|
|
1246
|
+
```
|
|
1247
|
+
|
|
1248
|
+
This method assumes that:
|
|
1249
|
+
- Python is on the `$PATH` and dependencies are installed with the first Python on the `$PATH`.
|
|
1250
|
+
- Shell supports backticks for substitution
|
|
1251
|
+
- `which` command is on the `$PATH`
|
|
1252
|
+
"""
|
|
1253
|
+
pkgs = _flatten_str_args("uv_pip_install", "packages", packages)
|
|
1254
|
+
|
|
1255
|
+
if requirements is None or isinstance(requirements, list):
|
|
1256
|
+
requirements = requirements or []
|
|
1257
|
+
else:
|
|
1258
|
+
raise InvalidError("requirements must be None or a list of strings")
|
|
1259
|
+
|
|
1260
|
+
if not pkgs and not requirements:
|
|
1261
|
+
return self
|
|
1262
|
+
elif not _validate_packages(pkgs):
|
|
1263
|
+
raise InvalidError(
|
|
1264
|
+
"Package list for `Image.uv_pip_install` cannot contain other arguments;"
|
|
1265
|
+
" try the `extra_options` parameter instead."
|
|
1266
|
+
)
|
|
1267
|
+
|
|
1268
|
+
def build_dockerfile(version: ImageBuilderVersion) -> DockerfileSpec:
|
|
1269
|
+
commands = ["FROM base"]
|
|
1270
|
+
UV_ROOT = "/.uv"
|
|
1271
|
+
if uv_version is None:
|
|
1272
|
+
commands.append(f"COPY --from=ghcr.io/astral-sh/uv:latest /uv {UV_ROOT}/uv")
|
|
1273
|
+
else:
|
|
1274
|
+
commands.append(f"COPY --from=ghcr.io/astral-sh/uv:{uv_version} /uv {UV_ROOT}/uv")
|
|
1275
|
+
|
|
1276
|
+
# NOTE: Using `which python` assumes:
|
|
1277
|
+
# - python is on the PATH and uv is installing into the first python in the PATH
|
|
1278
|
+
# - the shell supports backticks for substitution
|
|
1279
|
+
# - `which` command is on the PATH
|
|
1280
|
+
uv_pip_args = ["--python `which python`", "--compile-bytecode"]
|
|
1281
|
+
context_files = {}
|
|
1282
|
+
|
|
1283
|
+
if find_links:
|
|
1284
|
+
uv_pip_args.append(f"--find-links {shlex.quote(find_links)}")
|
|
1285
|
+
if index_url:
|
|
1286
|
+
uv_pip_args.append(f"--index-url {shlex.quote(index_url)}")
|
|
1287
|
+
if extra_index_url:
|
|
1288
|
+
uv_pip_args.append(f"--extra-index-url {shlex.quote(extra_index_url)}")
|
|
1289
|
+
if pre:
|
|
1290
|
+
uv_pip_args.append("--prerelease allow")
|
|
1291
|
+
if extra_options:
|
|
1292
|
+
uv_pip_args.append(extra_options)
|
|
1293
|
+
|
|
1294
|
+
if requirements:
|
|
1295
|
+
|
|
1296
|
+
def _generate_paths(idx: int, req: str) -> dict:
|
|
1297
|
+
local_path = os.path.expanduser(req)
|
|
1298
|
+
basename = os.path.basename(req)
|
|
1299
|
+
|
|
1300
|
+
# The requirement files can have the same name but in different directories:
|
|
1301
|
+
# requirements=["test/requirements.txt", "a/b/c/requirements.txt"]
|
|
1302
|
+
# To uniquely identify these files, we add a `idx` prefix to every file's basename
|
|
1303
|
+
# - `test/requirements.txt` -> `/.0_requirements.txt` in context -> `/.uv/0/requirements.txt` to uv
|
|
1304
|
+
# - `a/b/c/requirements.txt` -> `/.1_requirements.txt` in context -> `/.uv/1/requirements.txt` to uv
|
|
1305
|
+
return {
|
|
1306
|
+
"local_path": local_path,
|
|
1307
|
+
"context_path": f"/.{idx}_{basename}",
|
|
1308
|
+
"dest_path": f"{UV_ROOT}/{idx}/{basename}",
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
requirement_paths = [_generate_paths(idx, req) for idx, req in enumerate(requirements)]
|
|
1312
|
+
requirements_cli = " ".join(f"--requirements {req['dest_path']}" for req in requirement_paths)
|
|
1313
|
+
uv_pip_args.append(requirements_cli)
|
|
1314
|
+
|
|
1315
|
+
commands.extend([f"COPY {req['context_path']} {req['dest_path']}" for req in requirement_paths])
|
|
1316
|
+
context_files.update({req["context_path"]: req["local_path"] for req in requirement_paths})
|
|
1317
|
+
|
|
1318
|
+
uv_pip_args.extend(shlex.quote(p) for p in sorted(pkgs))
|
|
1319
|
+
uv_pip_args_joined = " ".join(uv_pip_args)
|
|
1320
|
+
|
|
1321
|
+
commands.append(f"RUN {UV_ROOT}/uv pip install {uv_pip_args_joined}")
|
|
1322
|
+
|
|
1323
|
+
return DockerfileSpec(commands=commands, context_files=context_files)
|
|
1324
|
+
|
|
1325
|
+
return _Image._from_args(
|
|
1326
|
+
base_images={"base": self},
|
|
1327
|
+
dockerfile_function=build_dockerfile,
|
|
1328
|
+
force_build=self.force_build or force_build,
|
|
1329
|
+
gpu_config=parse_gpu_config(gpu),
|
|
1330
|
+
secrets=secrets,
|
|
1331
|
+
)
|
|
1332
|
+
|
|
1225
1333
|
def poetry_install_from_file(
|
|
1226
1334
|
self,
|
|
1227
1335
|
poetry_pyproject_toml: str,
|
modal/image.pyi
CHANGED
|
@@ -505,6 +505,36 @@ class _Image(modal._object._Object):
|
|
|
505
505
|
"""
|
|
506
506
|
...
|
|
507
507
|
|
|
508
|
+
def uv_pip_install(
|
|
509
|
+
self,
|
|
510
|
+
*packages: typing.Union[str, list[str]],
|
|
511
|
+
requirements: typing.Optional[list[str]] = None,
|
|
512
|
+
find_links: typing.Optional[str] = None,
|
|
513
|
+
index_url: typing.Optional[str] = None,
|
|
514
|
+
extra_index_url: typing.Optional[str] = None,
|
|
515
|
+
pre: bool = False,
|
|
516
|
+
extra_options: str = "",
|
|
517
|
+
force_build: bool = False,
|
|
518
|
+
uv_version: typing.Optional[str] = None,
|
|
519
|
+
secrets: collections.abc.Sequence[modal.secret._Secret] = [],
|
|
520
|
+
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
521
|
+
) -> _Image:
|
|
522
|
+
"""Install a list of Python packages using uv pip install.
|
|
523
|
+
|
|
524
|
+
**Examples**
|
|
525
|
+
|
|
526
|
+
Simple installation:
|
|
527
|
+
```python
|
|
528
|
+
image = modal.Image.debian_slim().uv_pip_install("torch==2.7.1", "numpy")
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
This method assumes that:
|
|
532
|
+
- Python is on the `$PATH` and dependencies are installed with the first Python on the `$PATH`.
|
|
533
|
+
- Shell supports backticks for substitution
|
|
534
|
+
- `which` command is on the `$PATH`
|
|
535
|
+
"""
|
|
536
|
+
...
|
|
537
|
+
|
|
508
538
|
def poetry_install_from_file(
|
|
509
539
|
self,
|
|
510
540
|
poetry_pyproject_toml: str,
|
|
@@ -1348,6 +1378,36 @@ class Image(modal.object.Object):
|
|
|
1348
1378
|
"""
|
|
1349
1379
|
...
|
|
1350
1380
|
|
|
1381
|
+
def uv_pip_install(
|
|
1382
|
+
self,
|
|
1383
|
+
*packages: typing.Union[str, list[str]],
|
|
1384
|
+
requirements: typing.Optional[list[str]] = None,
|
|
1385
|
+
find_links: typing.Optional[str] = None,
|
|
1386
|
+
index_url: typing.Optional[str] = None,
|
|
1387
|
+
extra_index_url: typing.Optional[str] = None,
|
|
1388
|
+
pre: bool = False,
|
|
1389
|
+
extra_options: str = "",
|
|
1390
|
+
force_build: bool = False,
|
|
1391
|
+
uv_version: typing.Optional[str] = None,
|
|
1392
|
+
secrets: collections.abc.Sequence[modal.secret.Secret] = [],
|
|
1393
|
+
gpu: typing.Union[None, str, modal.gpu._GPUConfig] = None,
|
|
1394
|
+
) -> Image:
|
|
1395
|
+
"""Install a list of Python packages using uv pip install.
|
|
1396
|
+
|
|
1397
|
+
**Examples**
|
|
1398
|
+
|
|
1399
|
+
Simple installation:
|
|
1400
|
+
```python
|
|
1401
|
+
image = modal.Image.debian_slim().uv_pip_install("torch==2.7.1", "numpy")
|
|
1402
|
+
```
|
|
1403
|
+
|
|
1404
|
+
This method assumes that:
|
|
1405
|
+
- Python is on the `$PATH` and dependencies are installed with the first Python on the `$PATH`.
|
|
1406
|
+
- Shell supports backticks for substitution
|
|
1407
|
+
- `which` command is on the `$PATH`
|
|
1408
|
+
"""
|
|
1409
|
+
...
|
|
1410
|
+
|
|
1351
1411
|
def poetry_install_from_file(
|
|
1352
1412
|
self,
|
|
1353
1413
|
poetry_pyproject_toml: str,
|
modal/parallel_map.py
CHANGED
|
@@ -139,7 +139,14 @@ async def _map_invocation(
|
|
|
139
139
|
idx = inputs_created
|
|
140
140
|
update_state(set_inputs_created=inputs_created + 1)
|
|
141
141
|
(args, kwargs) = argskwargs
|
|
142
|
-
return await _create_input(
|
|
142
|
+
return await _create_input(
|
|
143
|
+
args,
|
|
144
|
+
kwargs,
|
|
145
|
+
client.stub,
|
|
146
|
+
max_object_size_bytes=function._max_object_size_bytes,
|
|
147
|
+
idx=idx,
|
|
148
|
+
method_name=function._use_method_name,
|
|
149
|
+
)
|
|
143
150
|
|
|
144
151
|
async def input_iter():
|
|
145
152
|
while 1:
|
|
@@ -3,7 +3,7 @@ modal/__main__.py,sha256=sTJcc9EbDuCKSwg3tL6ZckFw9WWdlkXW8mId1IvJCNc,2846
|
|
|
3
3
|
modal/_clustered_functions.py,sha256=kTf-9YBXY88NutC1akI-gCbvf01RhMPCw-zoOI_YIUE,2700
|
|
4
4
|
modal/_clustered_functions.pyi,sha256=_QKM87tdYwcALSGth8a0-9qXl02fZK6zMfEGEoYz7eA,1007
|
|
5
5
|
modal/_container_entrypoint.py,sha256=2Zx9O_EMJg0H77EdnC2vGKs6uFMWwbP1NLFf-qYmWmU,28962
|
|
6
|
-
modal/_functions.py,sha256=
|
|
6
|
+
modal/_functions.py,sha256=cF17ZyB_Dmy0LHr8sbBULoGv-wheKFqkNwBN2djO4wo,82141
|
|
7
7
|
modal/_ipython.py,sha256=TW1fkVOmZL3YYqdS2YlM1hqpf654Yf8ZyybHdBnlhSw,301
|
|
8
8
|
modal/_location.py,sha256=joiX-0ZeutEUDTrrqLF1GHXCdVLF-rHzstocbMcd_-k,366
|
|
9
9
|
modal/_object.py,sha256=QWyUGjrGLupITkyvJru2cekizsaVdteAhwMQlw_tE4k,11172
|
|
@@ -22,7 +22,7 @@ modal/app.py,sha256=fCKq3TJ2Y5LB2WKNs6pp_5XECNH5avUL01jQljuoYRU,46603
|
|
|
22
22
|
modal/app.pyi,sha256=Z6wi_dkXywiaM2rvAvguj2Wgu9ZgPjMSLl1nH1a7EYI,42243
|
|
23
23
|
modal/call_graph.py,sha256=1g2DGcMIJvRy-xKicuf63IVE98gJSnQsr8R_NVMptNc,2581
|
|
24
24
|
modal/client.py,sha256=OwISJvkgMb-rHm9Gc4i-7YcDgGiZgwJ7F_PzwZH7a6Q,16847
|
|
25
|
-
modal/client.pyi,sha256=
|
|
25
|
+
modal/client.pyi,sha256=CyTf35ksjuSZFtTIS2si_oUalgKm6MjDSj77390VX4g,15081
|
|
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=EFrM949jNXJpmwB2G_1d28b8IpHShfKIEIaiPkZqeOU,39881
|
|
@@ -41,8 +41,8 @@ modal/file_pattern_matcher.py,sha256=urAue8es8jxqX94k9EYoZxxhtfgOlsEES8lbFHOorzc
|
|
|
41
41
|
modal/functions.py,sha256=kcNHvqeGBxPI7Cgd57NIBBghkfbeFJzXO44WW0jSmao,325
|
|
42
42
|
modal/functions.pyi,sha256=FJe_91dSrMCRNVT-YV1UhtxFKzIvL_C5q8xdk08-wT8,34840
|
|
43
43
|
modal/gpu.py,sha256=Fe5ORvVPDIstSq1xjmM6OoNgLYFWvogP9r5BgmD3hYg,6769
|
|
44
|
-
modal/image.py,sha256=
|
|
45
|
-
modal/image.pyi,sha256=
|
|
44
|
+
modal/image.py,sha256=IuK__pPaqMpJoCtgUGO0kJoT3GK_Oostp9EGfFEoglA,99341
|
|
45
|
+
modal/image.pyi,sha256=pGuNaaDq1QEyCiIZYx_82wy5ER7iYDGUxzlJorPJJ7w,70338
|
|
46
46
|
modal/io_streams.py,sha256=FUDpBsVK8isqwyC7DtAcQZhaHlMFSaNZGhYJOg-SFW0,15590
|
|
47
47
|
modal/io_streams.pyi,sha256=5b3b93ztZeR8IpJtNIGffX24QLPgocE4-gAps8y7CKU,13824
|
|
48
48
|
modal/mount.py,sha256=VrExPZApUnuh9shJx-tzdmQJ9ASTSK-SEaYHDBkQl-k,36632
|
|
@@ -52,7 +52,7 @@ modal/network_file_system.pyi,sha256=Td_IobHr84iLo_9LZKQ4tNdUB60yjX8QWBaFiUvhfi8
|
|
|
52
52
|
modal/object.py,sha256=bTeskuY8JFrESjU4_UL_nTwYlBQdOLmVaOX3X6EMxsg,164
|
|
53
53
|
modal/object.pyi,sha256=751TV6BntarPsErf0HDQPsvePjWFf0JZK8ZAiRpM1yg,6627
|
|
54
54
|
modal/output.py,sha256=q4T9uHduunj4NwY-YSwkHGgjZlCXMuJbfQ5UFaAGRAc,1968
|
|
55
|
-
modal/parallel_map.py,sha256=
|
|
55
|
+
modal/parallel_map.py,sha256=hoyGd6DPz87f3WiwsncB2jls3qA1aIYK7G8e1SyO-wQ,40903
|
|
56
56
|
modal/parallel_map.pyi,sha256=-t3nZ-SvKEK8_xC4A_AmAq6UVpt4ZFtq7rPnWzHGhfg,10290
|
|
57
57
|
modal/partial_function.py,sha256=SwuAAj2wj4SO6F6nkSnwNZrczEmm9w9YdlQTHh6hr04,1195
|
|
58
58
|
modal/partial_function.pyi,sha256=-rhLIgXtLpP5weJw7U4aMcDxtFMwXJ1wf-nncPowUMg,14991
|
|
@@ -96,7 +96,7 @@ modal/_utils/blob_utils.py,sha256=4R-X3VNUJkc8EDSyGNfgcR5fAAkdpQ9W0O5Fy3PyOlU,20
|
|
|
96
96
|
modal/_utils/bytes_io_segment_payload.py,sha256=vaXPq8b52-x6G2hwE7SrjS58pg_aRm7gV3bn3yjmTzQ,4261
|
|
97
97
|
modal/_utils/deprecation.py,sha256=-Bgg7jZdcJU8lROy18YyVnQYbM8hue-hVmwJqlWAGH0,5504
|
|
98
98
|
modal/_utils/docker_utils.py,sha256=h1uETghR40mp_y3fSWuZAfbIASH1HMzuphJHghAL6DU,3722
|
|
99
|
-
modal/_utils/function_utils.py,sha256=
|
|
99
|
+
modal/_utils/function_utils.py,sha256=wFJcfmGC8RuYeQUORGKg6soLj31Mzw9qfay6CyPSAZE,28130
|
|
100
100
|
modal/_utils/git_utils.py,sha256=qtUU6JAttF55ZxYq51y55OR58B0tDPZsZWK5dJe6W5g,3182
|
|
101
101
|
modal/_utils/grpc_testing.py,sha256=H1zHqthv19eGPJz2HKXDyWXWGSqO4BRsxah3L5Xaa8A,8619
|
|
102
102
|
modal/_utils/grpc_utils.py,sha256=aFDJIK3Idn9r0iqLRmQqCKsPhRCueyeaA64mZUvDNKA,11118
|
|
@@ -147,7 +147,7 @@ modal/requirements/2024.10.txt,sha256=qD-5cVIVM9wXesJ6JC89Ew-3m2KjEElUz3jaw_MddR
|
|
|
147
147
|
modal/requirements/PREVIEW.txt,sha256=KxDaVTOwatHvboDo4lorlgJ7-n-MfAwbPwxJ0zcJqrs,312
|
|
148
148
|
modal/requirements/README.md,sha256=9tK76KP0Uph7O0M5oUgsSwEZDj5y-dcUPsnpR0Sc-Ik,854
|
|
149
149
|
modal/requirements/base-images.json,sha256=3oKVHov9vE88hMQGnn1OqDQK-ohxNF_TEL2DNPKg09s,1051
|
|
150
|
-
modal-1.0.6.
|
|
150
|
+
modal-1.0.6.dev12.dist-info/licenses/LICENSE,sha256=psuoW8kuDP96RQsdhzwOqi6fyWv0ct8CR6Jr7He_P_k,10173
|
|
151
151
|
modal_docs/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,28
|
|
152
152
|
modal_docs/gen_cli_docs.py,sha256=c1yfBS_x--gL5bs0N4ihMwqwX8l3IBWSkBAKNNIi6bQ,3801
|
|
153
153
|
modal_docs/gen_reference_docs.py,sha256=d_CQUGQ0rfw28u75I2mov9AlS773z9rG40-yq5o7g2U,6359
|
|
@@ -155,10 +155,10 @@ modal_docs/mdmd/__init__.py,sha256=svYKtV8HDwDCN86zbdWqyq5T8sMdGDj0PVlzc2tIxDM,2
|
|
|
155
155
|
modal_docs/mdmd/mdmd.py,sha256=eW5MzrEl7mSclDo4Uv64sQ1-4IyLggldbgUJdBVLDdI,6449
|
|
156
156
|
modal_docs/mdmd/signatures.py,sha256=XJaZrK7Mdepk5fdX51A8uENiLFNil85Ud0d4MH8H5f0,3218
|
|
157
157
|
modal_proto/__init__.py,sha256=MIEP8jhXUeGq_eCjYFcqN5b1bxBM4fdk0VESpjWR0fc,28
|
|
158
|
-
modal_proto/api.proto,sha256=
|
|
158
|
+
modal_proto/api.proto,sha256=OUvsHwZhB-WMAhzAdHF4g0huOQtVDpSI93s1wngEX94,98254
|
|
159
159
|
modal_proto/api_grpc.py,sha256=Y2-UcWleygG_-WPkC1u4hYejehB6WEwQtaTfTNYxLPU,120808
|
|
160
|
-
modal_proto/api_pb2.py,sha256=
|
|
161
|
-
modal_proto/api_pb2.pyi,sha256=
|
|
160
|
+
modal_proto/api_pb2.py,sha256=gaZc4r_7wfH-sDbKoZNWUNqEkypGc1o8o2XKI4gyADo,346573
|
|
161
|
+
modal_proto/api_pb2.pyi,sha256=LXiJ27WnWQb9SpcDTPPnjpAF_Ua_-0cB0nsK4KDSt0U,472099
|
|
162
162
|
modal_proto/api_pb2_grpc.py,sha256=Owh9lQBI_fIf7imQhUY0htttwxMNwVUlArU0-mjItpc,261040
|
|
163
163
|
modal_proto/api_pb2_grpc.pyi,sha256=Oshss4U3PFWkZe9DckYiuw4jv_4_Ri3sRJ_YxIuXfic,61160
|
|
164
164
|
modal_proto/modal_api_grpc.py,sha256=VuqkS-sNufg1VHjN0um5pVeXDz-MlbKbufbbEqv_ElQ,18263
|
|
@@ -170,10 +170,10 @@ modal_proto/options_pb2.pyi,sha256=l7DBrbLO7q3Ir-XDkWsajm0d0TQqqrfuX54i4BMpdQg,1
|
|
|
170
170
|
modal_proto/options_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
|
|
171
171
|
modal_proto/options_pb2_grpc.pyi,sha256=CImmhxHsYnF09iENPoe8S4J-n93jtgUYD2JPAc0yJSI,247
|
|
172
172
|
modal_proto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
173
|
-
modal_version/__init__.py,sha256=
|
|
173
|
+
modal_version/__init__.py,sha256=BrUvkqiEK_ozM88NmqgW86Tjrim4cnV78o5CwsC0QCQ,121
|
|
174
174
|
modal_version/__main__.py,sha256=2FO0yYQQwDTh6udt1h-cBnGd1c4ZyHnHSI4BksxzVac,105
|
|
175
|
-
modal-1.0.6.
|
|
176
|
-
modal-1.0.6.
|
|
177
|
-
modal-1.0.6.
|
|
178
|
-
modal-1.0.6.
|
|
179
|
-
modal-1.0.6.
|
|
175
|
+
modal-1.0.6.dev12.dist-info/METADATA,sha256=JFjiNd2cvgC6aMWeNkEoC10PKl0IGzlZPNeg_KazQ3s,2462
|
|
176
|
+
modal-1.0.6.dev12.dist-info/WHEEL,sha256=1tXe9gY0PYatrMPMDd6jXqjfpz_B-Wqm32CPfRC58XU,91
|
|
177
|
+
modal-1.0.6.dev12.dist-info/entry_points.txt,sha256=An-wYgeEUnm6xzrAP9_NTSTSciYvvEWsMZILtYrvpAI,46
|
|
178
|
+
modal-1.0.6.dev12.dist-info/top_level.txt,sha256=4BWzoKYREKUZ5iyPzZpjqx4G8uB5TWxXPDwibLcVa7k,43
|
|
179
|
+
modal-1.0.6.dev12.dist-info/RECORD,,
|
modal_proto/api.proto
CHANGED
|
@@ -1724,6 +1724,8 @@ message FunctionHandleMetadata {
|
|
|
1724
1724
|
FunctionSchema function_schema = 45;
|
|
1725
1725
|
optional string input_plane_url = 46;
|
|
1726
1726
|
optional string input_plane_region = 47;
|
|
1727
|
+
// Use optional to ensure unset values default to None instead of 0
|
|
1728
|
+
optional uint64 max_object_size_bytes = 48;
|
|
1727
1729
|
}
|
|
1728
1730
|
|
|
1729
1731
|
message FunctionInput {
|