modal 1.6.2.dev1__tar.gz → 1.6.2.dev3__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.6.2.dev1 → modal-1.6.2.dev3}/PKG-INFO +1 -1
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_environments.py +2 -2
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_output/status.py +10 -7
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/name_utils.py +9 -7
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_workspace.py +3 -2
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/app.py +5 -5
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/endpoint.py +6 -1
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/environment.py +3 -3
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/client.pyi +2 -2
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/experimental/_flash_container_entry.py +1 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/functions.pyi +6 -6
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/runner.py +1 -1
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/workspace.pyi +3 -1
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/api_pb2.py +1083 -1082
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/api_pb2.pyi +34 -7
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_version/__init__.py +1 -1
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/pyproject.toml +2 -2
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/LICENSE +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/README.md +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/__main__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_billing.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_cluster.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_cluster.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_container_entrypoint.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_function_variants.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_functions.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_grpc_client.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_image.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_ipython.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_load_context.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_location.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_logs.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_logs_manager.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_logs_manager.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_object.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_outbound_policy.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_outbound_policy.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_output/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_output/manager.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_output/pty.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_output/rich.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_partial_function.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_resolver.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_resources.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/asgi.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/execution_context.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/telemetry.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_serialization.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_server.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_server.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_supports_logs.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_traceback.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_tunnel.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_tunnel.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_type_manager.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/app_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/async_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/blob_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/browser_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/curl_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/deprecation.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/display_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/docker_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/function_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/git_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/hash_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/http_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/idle_countdown.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/logger.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/mount_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/package_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/proxy_support.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/shell_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_utils/time_utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_vendor/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_vendor/tblib.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_vendor/version.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/_watcher.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/app.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/app.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/billing.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/billing.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/builder/2023.12.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/builder/2024.04.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/builder/2024.10.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/builder/2025.06.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/builder/README.md +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/builder/base-images.json +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/call_graph.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/_download.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/_help.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/_logs.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/_stats.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/_traceback.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/billing.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/changelog.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/config.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/container.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/curl.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/dashboard.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/dict.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/entry_point.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/function.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/image.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/import_refs.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/logo.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/network_file_system.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/profile.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/queues.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/run.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/secret.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/selector.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/server.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/shell.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/skills.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/token.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/utils.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/volume.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cli/workspace.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/client.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cls.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cls.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cluster.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/cluster.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/config.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/container_process.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/container_process.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/dict.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/dict.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/environments.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/environments.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/exception.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/experimental/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/experimental/flash.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/experimental/flash.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/experimental/flash_server.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/experimental/flash_server.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/experimental/ipython.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/file_pattern_matcher.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/functions.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/image.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/image.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/io_streams.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/io_streams.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/mount.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/mount.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/network_file_system.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/network_file_system.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/object.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/object.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/output.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/parallel_map.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/parallel_map.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/partial_function.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/partial_function.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/proxy.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/proxy.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/py.typed +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/queue.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/queue.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/retries.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/runner.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/running_app.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/sandbox.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/sandbox.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/sandbox_fs.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/sandbox_fs.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/schedule.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/scheduler_placement.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/secret.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/secret.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/server.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/server.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/serving.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/serving.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/snapshot.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/snapshot.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/stream_type.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/token_flow.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/token_flow.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/types.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/volume.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/volume.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal/workspace.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal.egg-info/requires.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal.egg-info/top_level.txt +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/mdmd/types.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_docs/reference_intro.md +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/__init__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/api_grpc.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/py.typed +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/modal_version/__main__.py +0 -0
- {modal-1.6.2.dev1 → modal-1.6.2.dev3}/setup.cfg +0 -0
|
@@ -54,7 +54,7 @@ class _EnvironmentManager:
|
|
|
54
54
|
modal.Environment.objects.create("my-environment")
|
|
55
55
|
```
|
|
56
56
|
"""
|
|
57
|
-
check_environment_name(name)
|
|
57
|
+
check_environment_name(name, allow_periods=False)
|
|
58
58
|
|
|
59
59
|
client = await _Client.from_env() if client is None else client
|
|
60
60
|
request = api_pb2.EnvironmentCreateRequest(name=name, is_managed=restricted)
|
|
@@ -464,7 +464,7 @@ class _Environment(_Object, type_prefix="en"):
|
|
|
464
464
|
client: _Client | None = None,
|
|
465
465
|
) -> "_Environment":
|
|
466
466
|
"""Look up an Environment object using its name."""
|
|
467
|
-
check_environment_name(name)
|
|
467
|
+
check_environment_name(name, allow_periods=True)
|
|
468
468
|
return _Environment._get_or_create(
|
|
469
469
|
name=name,
|
|
470
470
|
repr=f"Environment.from_name({name!r})",
|
|
@@ -20,6 +20,11 @@ def _get_annotation_for_web_url(url_info: api_pb2.WebUrlInfo) -> str:
|
|
|
20
20
|
return suffix
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
def _format_url(url: str) -> str:
|
|
24
|
+
# OSC 8 hyperlinks stay clickable when the URL wraps across lines
|
|
25
|
+
return f"[dim underline][link={url}]{url}[/link][/dim underline]"
|
|
26
|
+
|
|
27
|
+
|
|
23
28
|
class FunctionCreationStatus:
|
|
24
29
|
"""Context manager for tracking and displaying function creation progress."""
|
|
25
30
|
|
|
@@ -58,9 +63,9 @@ class FunctionCreationStatus:
|
|
|
58
63
|
suffix = _get_annotation_for_web_url(url_info)
|
|
59
64
|
|
|
60
65
|
self.status_row.finish(f"Created {self.type} [green]{self.name}[/green]")
|
|
61
|
-
self.status_row.details(f"
|
|
66
|
+
self.status_row.details(f"{_format_url(web_url)}{auth_suffix}{suffix}")
|
|
62
67
|
for custom_domain in self.response.function.custom_domain_info:
|
|
63
|
-
self.status_row.details(f"Custom domain:
|
|
68
|
+
self.status_row.details(f"Custom domain: {_format_url(custom_domain.url)}")
|
|
64
69
|
|
|
65
70
|
elif self.response.function.flash_service_urls:
|
|
66
71
|
# Despite the gRPC API types, Servers only have one URL
|
|
@@ -68,7 +73,7 @@ class FunctionCreationStatus:
|
|
|
68
73
|
auth_suffix = " 🔑" if authenticated else " [yellow](unauthenticated)[/yellow]"
|
|
69
74
|
self.status_row.finish(f"Created {self.type} [green]{self.name}[/green]")
|
|
70
75
|
url = self.response.function.flash_service_urls[0]
|
|
71
|
-
self.status_row.details(f"
|
|
76
|
+
self.status_row.details(f"{_format_url(url)}{auth_suffix}")
|
|
72
77
|
|
|
73
78
|
else:
|
|
74
79
|
self.status_row.finish(f"Created {self.type} [green]{self.name}[/green].")
|
|
@@ -81,10 +86,8 @@ class FunctionCreationStatus:
|
|
|
81
86
|
auth_suffix = " 🔑" if authenticated else " [yellow](unauthenticated)[/yellow]"
|
|
82
87
|
self.status_row.details(
|
|
83
88
|
f"{method_definition.function_name} -> "
|
|
84
|
-
f"
|
|
89
|
+
f"{_format_url(method_definition.web_url)}{auth_suffix}{suffix}"
|
|
85
90
|
)
|
|
86
91
|
for custom_domain in method_definition.custom_domain_info:
|
|
87
92
|
indent = len(method_definition.function_name) * " "
|
|
88
|
-
self.status_row.details(
|
|
89
|
-
f"{indent} -> [dim underline]{custom_domain.url}[/dim underline]{auth_suffix}"
|
|
90
|
-
)
|
|
93
|
+
self.status_row.details(f"{indent} -> {_format_url(custom_domain.url)}{auth_suffix}")
|
|
@@ -27,13 +27,15 @@ def is_valid_object_name(name: str) -> bool:
|
|
|
27
27
|
)
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
def is_valid_environment_name(name: str) -> bool:
|
|
30
|
+
def is_valid_environment_name(name: str, *, allow_periods: bool) -> bool:
|
|
31
31
|
# first char is alnum, the rest allows other chars
|
|
32
32
|
# The "en-" prefix is reserved for environment IDs, so that references
|
|
33
33
|
# to environments can be resolved by either name or ID unambiguously.
|
|
34
|
+
# New names cannot contain periods, but some existing Environments have them and must stay resolvable.
|
|
35
|
+
rest_chars = r"a-zA-Z0-9-_." if allow_periods else r"a-zA-Z0-9-_"
|
|
34
36
|
return (
|
|
35
37
|
len(name) <= 64
|
|
36
|
-
and re.match(
|
|
38
|
+
and re.match(rf"^[a-zA-Z0-9][{rest_chars}]*$", name) is not None
|
|
37
39
|
and not name.lower().startswith("en-")
|
|
38
40
|
)
|
|
39
41
|
|
|
@@ -67,12 +69,12 @@ def check_object_name(name: str, object_type: str) -> None:
|
|
|
67
69
|
raise InvalidError(message)
|
|
68
70
|
|
|
69
71
|
|
|
70
|
-
def check_environment_name(name: str) -> None:
|
|
72
|
+
def check_environment_name(name: str, *, allow_periods: bool) -> None:
|
|
71
73
|
message = (
|
|
72
74
|
f"Invalid Environment name: '{name}'."
|
|
73
|
-
"\n\nEnvironment names can only start with alphanumeric characters,"
|
|
74
|
-
" may contain only alphanumeric characters, dashes,
|
|
75
|
-
"
|
|
75
|
+
"\n\nEnvironment names must be 1-64 characters, can only start with alphanumeric characters,"
|
|
76
|
+
" may contain only alphanumeric characters, dashes, and underscores,"
|
|
77
|
+
" and cannot start with 'en-'."
|
|
76
78
|
)
|
|
77
|
-
if not is_valid_environment_name(name):
|
|
79
|
+
if not is_valid_environment_name(name, allow_periods=allow_periods):
|
|
78
80
|
raise InvalidError(message)
|
|
@@ -495,7 +495,8 @@ class _WorkspaceSettingsManager:
|
|
|
495
495
|
"""mdmd:namespace"""
|
|
496
496
|
|
|
497
497
|
@classmethod
|
|
498
|
-
def
|
|
498
|
+
def _valid_settings(cls):
|
|
499
|
+
"""mdmd:hidden"""
|
|
499
500
|
return ("default-environment", "image-builder-version")
|
|
500
501
|
|
|
501
502
|
def __init__(self, workspace: _Workspace):
|
|
@@ -554,4 +555,4 @@ class _WorkspaceSettingsManager:
|
|
|
554
555
|
case "default-environment":
|
|
555
556
|
await self._set_default_environment(value)
|
|
556
557
|
case _:
|
|
557
|
-
raise ValueError(f"Unknown setting {name!r}. Valid settings: {', '.join(self.
|
|
558
|
+
raise ValueError(f"Unknown setting {name!r}. Valid settings: {', '.join(self._valid_settings())}")
|
|
@@ -225,12 +225,12 @@ async def rollover(
|
|
|
225
225
|
await _stop_and_wait_for_containers(client, app_id, response.deployed_at, env)
|
|
226
226
|
except Exception as exc:
|
|
227
227
|
warnings.warn(f"App updated successfully, but containers did not all terminate. {exc}", UserWarning)
|
|
228
|
-
output_mgr.print(f"\nView Deployment: [magenta]{response.url}[/magenta]")
|
|
228
|
+
output_mgr.print(f"\nView Deployment: [magenta][link={response.url}]{response.url}[/link][/magenta]")
|
|
229
229
|
sys.exit(1)
|
|
230
230
|
|
|
231
231
|
duration = time.monotonic() - t0
|
|
232
232
|
output_mgr.step_completed(f"Rollover completed in {duration:.3f}s with {strategy} strategy! 🎉")
|
|
233
|
-
output_mgr.print(f"\nView Deployment: [magenta]{response.url}[/magenta]")
|
|
233
|
+
output_mgr.print(f"\nView Deployment: [magenta][link={response.url}]{response.url}[/link][/magenta]")
|
|
234
234
|
|
|
235
235
|
|
|
236
236
|
@app_cli.command("promote", panel="Management", no_args_is_help=True, hidden=True)
|
|
@@ -281,7 +281,7 @@ async def promote(
|
|
|
281
281
|
|
|
282
282
|
output_mgr = OutputManager.get()
|
|
283
283
|
output_mgr.print(f"[green]✓[/green] Promoted App to v{version_number}!")
|
|
284
|
-
output_mgr.print(f"\nView Deployment: [magenta]{resp.url}[/magenta]")
|
|
284
|
+
output_mgr.print(f"\nView Deployment: [magenta][link={resp.url}]{resp.url}[/link][/magenta]")
|
|
285
285
|
|
|
286
286
|
|
|
287
287
|
@app_cli.command(
|
|
@@ -356,10 +356,10 @@ async def rollback(
|
|
|
356
356
|
warnings.warn(
|
|
357
357
|
f"App rollback executed successfully, but containers did not all terminate. {exc}", UserWarning
|
|
358
358
|
)
|
|
359
|
-
output_mgr.print(f"\nView Deployment: [magenta]{resp.url}[/magenta]")
|
|
359
|
+
output_mgr.print(f"\nView Deployment: [magenta][link={resp.url}]{resp.url}[/link][/magenta]")
|
|
360
360
|
sys.exit(1)
|
|
361
361
|
output_mgr.print("[green]✓[/green] Deployment rollback successful!")
|
|
362
|
-
output_mgr.print(f"\nView Deployment: [magenta]{resp.url}[/magenta]")
|
|
362
|
+
output_mgr.print(f"\nView Deployment: [magenta][link={resp.url}]{resp.url}[/link][/magenta]")
|
|
363
363
|
|
|
364
364
|
|
|
365
365
|
@app_cli.command("stop", panel="Management", no_args_is_help=True)
|
|
@@ -260,7 +260,7 @@ async def list_(*, json: bool = False, env: Optional[str] = None):
|
|
|
260
260
|
@click.option(
|
|
261
261
|
"--name",
|
|
262
262
|
default=None,
|
|
263
|
-
help="Endpoint name.
|
|
263
|
+
help="Endpoint name. Defaults to inference-{number} if not provided.",
|
|
264
264
|
)
|
|
265
265
|
@click.option(
|
|
266
266
|
"--model",
|
|
@@ -410,6 +410,8 @@ async def create(
|
|
|
410
410
|
|
|
411
411
|
output = OutputManager.get()
|
|
412
412
|
output.print(f"[green]✓[/green] Endpoint '{resp.name}' ({resp.endpoint_id}) was created and started provisioning.")
|
|
413
|
+
if resp.model_name:
|
|
414
|
+
output.print(f' → Send [cyan]"model": "{resp.model_name}"[/cyan] in requests to the Endpoint.')
|
|
413
415
|
if resp.endpoint_page_url:
|
|
414
416
|
output.print(f" → View progress at [magenta]{resp.endpoint_page_url}[/magenta].")
|
|
415
417
|
output.print(" → The Endpoint will also appear in [cyan]modal endpoint list[/cyan].")
|
|
@@ -517,6 +519,7 @@ async def info(
|
|
|
517
519
|
{
|
|
518
520
|
"name": endpoint_info.name,
|
|
519
521
|
"endpoint_id": endpoint_id,
|
|
522
|
+
"model_name": endpoint_info.model_name or None,
|
|
520
523
|
"repo_id": endpoint_info.repo_id,
|
|
521
524
|
"revision": endpoint_info.revision or None,
|
|
522
525
|
"volume_id": endpoint_info.volume_id or None,
|
|
@@ -547,6 +550,8 @@ async def info(
|
|
|
547
550
|
header.add_row(Text("Endpoint:"), endpoint_text)
|
|
548
551
|
header.add_row(Text("Endpoint ID:"), Text(endpoint_id))
|
|
549
552
|
header.add_row(Text("State:"), Text(status))
|
|
553
|
+
if endpoint_info.model_name:
|
|
554
|
+
header.add_row(Text("Model name:"), Text(endpoint_info.model_name))
|
|
550
555
|
model_text = Text(endpoint_info.repo_id)
|
|
551
556
|
if endpoint_info.revision:
|
|
552
557
|
model_text.append(f"@{endpoint_info.revision[:7]}")
|
|
@@ -87,7 +87,7 @@ def create(
|
|
|
87
87
|
default_role: str | None = None,
|
|
88
88
|
public: bool = False,
|
|
89
89
|
):
|
|
90
|
-
check_environment_name(name)
|
|
90
|
+
check_environment_name(name, allow_periods=False)
|
|
91
91
|
Environment.objects.create(
|
|
92
92
|
name,
|
|
93
93
|
restricted=restricted,
|
|
@@ -116,8 +116,8 @@ def update(
|
|
|
116
116
|
if set_name is None and set_web_suffix is None:
|
|
117
117
|
raise UsageError("You need to at least one new property (using --set-name or --set-web-suffix)")
|
|
118
118
|
|
|
119
|
-
if set_name:
|
|
120
|
-
check_environment_name(set_name)
|
|
119
|
+
if set_name and set_name != current_name:
|
|
120
|
+
check_environment_name(set_name, allow_periods=False)
|
|
121
121
|
|
|
122
122
|
environments.update_environment(current_name, new_name=set_name, new_web_suffix=set_web_suffix)
|
|
123
123
|
rich.print("[green]✓[/green] Environment updated")
|
|
@@ -80,7 +80,7 @@ class _Client:
|
|
|
80
80
|
server_url: str,
|
|
81
81
|
client_type: int,
|
|
82
82
|
credentials: typing.Optional[tuple[str, str]],
|
|
83
|
-
version: str = "1.6.2.
|
|
83
|
+
version: str = "1.6.2.dev3",
|
|
84
84
|
*,
|
|
85
85
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
86
86
|
):
|
|
@@ -290,7 +290,7 @@ class Client:
|
|
|
290
290
|
server_url: str,
|
|
291
291
|
client_type: int,
|
|
292
292
|
credentials: typing.Optional[tuple[str, str]],
|
|
293
|
-
version: str = "1.6.2.
|
|
293
|
+
version: str = "1.6.2.dev3",
|
|
294
294
|
*,
|
|
295
295
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
296
296
|
):
|
|
@@ -613,7 +613,7 @@ class Function(
|
|
|
613
613
|
|
|
614
614
|
_call_generator: ___call_generator_spec
|
|
615
615
|
|
|
616
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
616
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
617
617
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
618
618
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result.
|
|
619
619
|
|
|
@@ -638,7 +638,7 @@ class Function(
|
|
|
638
638
|
"""
|
|
639
639
|
...
|
|
640
640
|
|
|
641
|
-
remote: __remote_spec[modal._functions.
|
|
641
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
|
|
642
642
|
|
|
643
643
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
644
644
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -688,7 +688,7 @@ class Function(
|
|
|
688
688
|
"""
|
|
689
689
|
...
|
|
690
690
|
|
|
691
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
691
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
692
692
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
693
693
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
694
694
|
|
|
@@ -721,7 +721,7 @@ class Function(
|
|
|
721
721
|
"""
|
|
722
722
|
...
|
|
723
723
|
|
|
724
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
724
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
725
725
|
|
|
726
726
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
727
727
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -729,7 +729,7 @@ class Function(
|
|
|
729
729
|
|
|
730
730
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
731
731
|
|
|
732
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
732
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
733
733
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
734
734
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
735
735
|
|
|
@@ -762,7 +762,7 @@ class Function(
|
|
|
762
762
|
"""
|
|
763
763
|
...
|
|
764
764
|
|
|
765
|
-
spawn: __spawn_spec[modal._functions.
|
|
765
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
766
766
|
|
|
767
767
|
@property
|
|
768
768
|
def _raw_f_(self) -> collections.abc.Callable[..., typing.Any]: ...
|
|
@@ -697,7 +697,7 @@ async def _deploy_app(
|
|
|
697
697
|
else:
|
|
698
698
|
output_mgr.step_completed(f"App deployed in {t:.3f}s! 🎉")
|
|
699
699
|
|
|
700
|
-
output_mgr.print(f"\nView Deployment: [magenta]{app_url}[/magenta]")
|
|
700
|
+
output_mgr.print(f"\nView Deployment: [magenta][link={app_url}]{app_url}[/link][/magenta]")
|
|
701
701
|
return DeployResult(
|
|
702
702
|
app_id=running_app.app_id,
|
|
703
703
|
app_page_url=running_app.app_page_url,
|