modAL 1.3.1.dev13__tar.gz → 1.3.1.dev14__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/PKG-INFO +1 -1
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/client.pyi +2 -2
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/image.py +33 -10
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/image.pyi +4 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/mount.py +7 -2
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/mount.pyi +3 -3
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_version/__init__.py +1 -1
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/LICENSE +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/README.md +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/__main__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_billing.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_clustered_functions.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_clustered_functions.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_container_entrypoint.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_functions.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_grpc_client.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_ipython.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_load_context.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_location.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_object.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_output.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_partial_function.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_pty.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_resolver.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_resources.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/asgi.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/execution_context.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/telemetry.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_serialization.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_traceback.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_tunnel.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_tunnel.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_type_manager.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/app_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/async_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/blob_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/deprecation.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/docker_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/function_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/git_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/hash_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/http_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/logger.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/mount_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/name_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/package_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/shell_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_utils/time_utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_vendor/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_vendor/tblib.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/_watcher.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/app.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/app.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/billing.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/builder/2023.12.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/builder/2024.04.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/builder/2024.10.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/builder/2025.06.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/builder/README.md +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/builder/base-images.json +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/call_graph.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/_download.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/_traceback.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/app.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/cluster.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/config.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/container.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/dict.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/entry_point.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/environment.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/import_refs.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/launch.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/network_file_system.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/profile.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/programs/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/programs/vscode.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/queues.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/run.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/secret.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/shell.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/token.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/utils.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cli/volume.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/client.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cls.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/cls.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/config.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/container_process.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/container_process.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/dict.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/dict.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/environments.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/environments.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/exception.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/experimental/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/experimental/flash.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/experimental/flash.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/experimental/ipython.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/file_io.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/file_io.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/file_pattern_matcher.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/functions.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/functions.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/gpu.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/io_streams.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/io_streams.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/network_file_system.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/network_file_system.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/object.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/object.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/output.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/parallel_map.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/parallel_map.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/partial_function.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/partial_function.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/proxy.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/proxy.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/py.typed +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/queue.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/queue.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/retries.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/runner.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/runner.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/running_app.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/sandbox.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/sandbox.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/schedule.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/scheduler_placement.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/secret.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/secret.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/serving.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/serving.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/snapshot.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/snapshot.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/stream_type.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/token_flow.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/token_flow.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/volume.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal/volume.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal.egg-info/requires.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal.egg-info/top_level.txt +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_docs/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/__init__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/api.proto +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/api_grpc.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/api_pb2.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/py.typed +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/task_command_router.proto +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/modal_version/__main__.py +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/pyproject.toml +0 -0
- {modal-1.3.1.dev13 → modal-1.3.1.dev14}/setup.cfg +0 -0
|
@@ -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.3.1.
|
|
36
|
+
version: str = "1.3.1.dev14",
|
|
37
37
|
):
|
|
38
38
|
"""mdmd:hidden
|
|
39
39
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -163,7 +163,7 @@ class Client:
|
|
|
163
163
|
server_url: str,
|
|
164
164
|
client_type: int,
|
|
165
165
|
credentials: typing.Optional[tuple[str, str]],
|
|
166
|
-
version: str = "1.3.1.
|
|
166
|
+
version: str = "1.3.1.dev14",
|
|
167
167
|
):
|
|
168
168
|
"""mdmd:hidden
|
|
169
169
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -74,8 +74,8 @@ ImageBuilderVersion = Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVI
|
|
|
74
74
|
# Python versions in mount.py where we specify the "standalone Python versions" we create mounts for.
|
|
75
75
|
# Consider consolidating these multiple sources of truth?
|
|
76
76
|
SUPPORTED_PYTHON_SERIES: dict[ImageBuilderVersion, list[str]] = {
|
|
77
|
-
"PREVIEW": ["3.10", "3.11", "3.12", "3.13", "3.14"],
|
|
78
|
-
"2025.06": ["3.10", "3.11", "3.12", "3.13", "3.14"],
|
|
77
|
+
"PREVIEW": ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
|
|
78
|
+
"2025.06": ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
|
|
79
79
|
"2024.10": ["3.10", "3.11", "3.12", "3.13"],
|
|
80
80
|
"2024.04": ["3.10", "3.11", "3.12"],
|
|
81
81
|
"2023.12": ["3.10", "3.11", "3.12"],
|
|
@@ -104,15 +104,22 @@ See https://modal.com/docs/guide/modal-1-0-migration for more details.
|
|
|
104
104
|
|
|
105
105
|
|
|
106
106
|
def _validate_python_version(
|
|
107
|
-
python_version: Optional[str],
|
|
107
|
+
python_version: Optional[str],
|
|
108
|
+
builder_version: ImageBuilderVersion,
|
|
109
|
+
allow_micro_granularity: bool = True,
|
|
110
|
+
allow_free_threading: bool = False,
|
|
111
|
+
caller_name: str = "",
|
|
108
112
|
) -> str:
|
|
109
113
|
if python_version is None:
|
|
110
114
|
# If Python version is unspecified, match the local version, up to the minor component
|
|
111
115
|
python_version = series_version = "{}.{}".format(*sys.version_info)
|
|
112
116
|
elif not isinstance(python_version, str):
|
|
113
117
|
raise InvalidError(f"Python version must be specified as a string, not {type(python_version).__name__}")
|
|
114
|
-
elif not re.match(r"^3(?:\.\d{1,2}){1,2}(rc\d*)?$", python_version):
|
|
118
|
+
elif not re.match(r"^3(?:\.\d{1,2}){1,2}(rc\d*)?t?$", python_version):
|
|
115
119
|
raise InvalidError(f"Invalid Python version: {python_version!r}")
|
|
120
|
+
elif not allow_free_threading and python_version.endswith("t"):
|
|
121
|
+
context = f"with {caller_name}" if caller_name else ""
|
|
122
|
+
raise InvalidError(f"Free threaded Python is not supported {context}")
|
|
116
123
|
else:
|
|
117
124
|
components = python_version.split(".")
|
|
118
125
|
if len(components) == 3 and not allow_micro_granularity:
|
|
@@ -120,7 +127,8 @@ def _validate_python_version(
|
|
|
120
127
|
"Python version must be specified as 'major.minor' for this interface;"
|
|
121
128
|
f" micro-level specification ({python_version!r}) is not valid."
|
|
122
129
|
)
|
|
123
|
-
|
|
130
|
+
suffix = "t" if len(components) == 3 and python_version.endswith("t") else ""
|
|
131
|
+
series_version = f"{components[0]}.{components[1]}{suffix}"
|
|
124
132
|
|
|
125
133
|
supported_series = SUPPORTED_PYTHON_SERIES[builder_version]
|
|
126
134
|
if series_version not in supported_series:
|
|
@@ -132,8 +140,15 @@ def _validate_python_version(
|
|
|
132
140
|
return python_version
|
|
133
141
|
|
|
134
142
|
|
|
135
|
-
def _dockerhub_python_version(
|
|
136
|
-
|
|
143
|
+
def _dockerhub_python_version(
|
|
144
|
+
builder_version: ImageBuilderVersion,
|
|
145
|
+
python_version: Optional[str] = None,
|
|
146
|
+
allow_free_threading: bool = False,
|
|
147
|
+
caller_name: str = "",
|
|
148
|
+
) -> str:
|
|
149
|
+
python_version = _validate_python_version(
|
|
150
|
+
python_version, builder_version, allow_free_threading=allow_free_threading, caller_name=caller_name
|
|
151
|
+
)
|
|
137
152
|
version_components = python_version.split(".")
|
|
138
153
|
|
|
139
154
|
# When user specifies a full Python version, use that
|
|
@@ -1753,7 +1768,9 @@ class _Image(_Object, type_prefix="im"):
|
|
|
1753
1768
|
"""A Micromamba base image. Micromamba allows for fast building of small Conda-based containers."""
|
|
1754
1769
|
|
|
1755
1770
|
def build_dockerfile(version: ImageBuilderVersion) -> DockerfileSpec:
|
|
1756
|
-
validated_python_version = _validate_python_version(
|
|
1771
|
+
validated_python_version = _validate_python_version(
|
|
1772
|
+
python_version, version, allow_free_threading=False, caller_name="Image.micromamba"
|
|
1773
|
+
)
|
|
1757
1774
|
micromamba_version = _base_image_config("micromamba", version)
|
|
1758
1775
|
tag = f"mambaorg/micromamba:{micromamba_version}"
|
|
1759
1776
|
setup_commands = [
|
|
@@ -1833,12 +1850,16 @@ class _Image(_Object, type_prefix="im"):
|
|
|
1833
1850
|
) -> list[str]:
|
|
1834
1851
|
add_python_commands: list[str] = []
|
|
1835
1852
|
if add_python:
|
|
1836
|
-
_validate_python_version(
|
|
1853
|
+
_validate_python_version(
|
|
1854
|
+
add_python, builder_version, allow_micro_granularity=False, allow_free_threading=True
|
|
1855
|
+
)
|
|
1837
1856
|
add_python_commands = [
|
|
1838
1857
|
"COPY /python/. /usr/local",
|
|
1839
1858
|
"ENV TERMINFO_DIRS=/etc/terminfo:/lib/terminfo:/usr/share/terminfo:/usr/lib/terminfo",
|
|
1840
1859
|
]
|
|
1841
1860
|
python_minor = add_python.split(".")[1]
|
|
1861
|
+
if python_minor.endswith("t"):
|
|
1862
|
+
python_minor = python_minor[:-1]
|
|
1842
1863
|
if int(python_minor) < 13:
|
|
1843
1864
|
# Previous versions did not include the `python` binary, but later ones do.
|
|
1844
1865
|
# (The important factor is not the Python version itself, but the standalone dist version.)
|
|
@@ -2160,7 +2181,9 @@ class _Image(_Object, type_prefix="im"):
|
|
|
2160
2181
|
if version <= "2024.10":
|
|
2161
2182
|
requirements_path = _get_modal_requirements_path(version, python_version)
|
|
2162
2183
|
context_files = {CONTAINER_REQUIREMENTS_PATH: requirements_path}
|
|
2163
|
-
full_python_version = _dockerhub_python_version(
|
|
2184
|
+
full_python_version = _dockerhub_python_version(
|
|
2185
|
+
version, python_version, allow_free_threading=False, caller_name="Image.debian_slim"
|
|
2186
|
+
)
|
|
2164
2187
|
debian_codename = _base_image_config("debian", version)
|
|
2165
2188
|
|
|
2166
2189
|
commands = [
|
|
@@ -34,10 +34,14 @@ def _validate_python_version(
|
|
|
34
34
|
python_version: typing.Optional[str],
|
|
35
35
|
builder_version: typing.Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVIEW"],
|
|
36
36
|
allow_micro_granularity: bool = True,
|
|
37
|
+
allow_free_threading: bool = False,
|
|
38
|
+
caller_name: str = "",
|
|
37
39
|
) -> str: ...
|
|
38
40
|
def _dockerhub_python_version(
|
|
39
41
|
builder_version: typing.Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVIEW"],
|
|
40
42
|
python_version: typing.Optional[str] = None,
|
|
43
|
+
allow_free_threading: bool = False,
|
|
44
|
+
caller_name: str = "",
|
|
41
45
|
) -> str: ...
|
|
42
46
|
def _base_image_config(
|
|
43
47
|
group: str, builder_version: typing.Literal["2023.12", "2024.04", "2024.10", "2025.06", "PREVIEW"]
|
|
@@ -23,7 +23,11 @@ from ._load_context import LoadContext
|
|
|
23
23
|
from ._object import _Object
|
|
24
24
|
from ._resolver import Resolver
|
|
25
25
|
from ._utils.async_utils import TaskContext, aclosing, async_map, synchronize_api
|
|
26
|
-
from ._utils.blob_utils import
|
|
26
|
+
from ._utils.blob_utils import (
|
|
27
|
+
FileUploadSpec,
|
|
28
|
+
blob_upload_file,
|
|
29
|
+
get_file_upload_spec_from_path,
|
|
30
|
+
)
|
|
27
31
|
from ._utils.grpc_utils import Retry
|
|
28
32
|
from ._utils.name_utils import check_object_name
|
|
29
33
|
from ._utils.package_utils import get_module_mount_info
|
|
@@ -45,6 +49,7 @@ PYTHON_STANDALONE_VERSIONS: dict[str, tuple[str, str]] = {
|
|
|
45
49
|
"3.12": ("20240107", "3.12.1"),
|
|
46
50
|
"3.13": ("20241008", "3.13.0"),
|
|
47
51
|
"3.14": ("20251205", "3.14.2"),
|
|
52
|
+
"3.14t": ("20251209", "3.14.2t"),
|
|
48
53
|
}
|
|
49
54
|
|
|
50
55
|
MOUNT_DEPRECATION_MESSAGE_PATTERN = """modal.Mount usage will soon be deprecated.
|
|
@@ -797,7 +802,7 @@ async def _create_single_client_dependency_mount(
|
|
|
797
802
|
tmpd,
|
|
798
803
|
"--python-platform",
|
|
799
804
|
uv_python_platform,
|
|
800
|
-
"--python
|
|
805
|
+
"--python",
|
|
801
806
|
python_version,
|
|
802
807
|
]
|
|
803
808
|
)
|
|
@@ -426,7 +426,7 @@ async def _create_single_client_dependency_mount(
|
|
|
426
426
|
): ...
|
|
427
427
|
async def _create_client_dependency_mounts(
|
|
428
428
|
client=None,
|
|
429
|
-
python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14"],
|
|
429
|
+
python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
|
|
430
430
|
builder_versions: list[str] = ["2025.06"],
|
|
431
431
|
check_if_exists=True,
|
|
432
432
|
dry_run=False,
|
|
@@ -437,7 +437,7 @@ class __create_client_dependency_mounts_spec(typing_extensions.Protocol):
|
|
|
437
437
|
self,
|
|
438
438
|
/,
|
|
439
439
|
client=None,
|
|
440
|
-
python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14"],
|
|
440
|
+
python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
|
|
441
441
|
builder_versions: list[str] = ["2025.06"],
|
|
442
442
|
check_if_exists=True,
|
|
443
443
|
dry_run=False,
|
|
@@ -446,7 +446,7 @@ class __create_client_dependency_mounts_spec(typing_extensions.Protocol):
|
|
|
446
446
|
self,
|
|
447
447
|
/,
|
|
448
448
|
client=None,
|
|
449
|
-
python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14"],
|
|
449
|
+
python_versions: list[str] = ["3.10", "3.11", "3.12", "3.13", "3.14", "3.14t"],
|
|
450
450
|
builder_versions: list[str] = ["2025.06"],
|
|
451
451
|
check_if_exists=True,
|
|
452
452
|
dry_run=False,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|