modal 1.5.5.dev12__tar.gz → 1.5.5.dev13__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.5.5.dev12 → modal-1.5.5.dev13}/PKG-INFO +1 -1
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/client.pyi +2 -2
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/experimental/flash.py +23 -4
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/experimental/flash.pyi +12 -6
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_version/__init__.py +1 -1
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/LICENSE +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/README.md +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/__main__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_billing.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_clustered_functions.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_clustered_functions.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_container_entrypoint.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_environments.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_function_variants.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_functions.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_grpc_client.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_image.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_ipython.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_load_context.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_location.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_logs.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_logs_manager.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_logs_manager.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_object.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_output/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_output/manager.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_output/pty.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_output/rich.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_output/status.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_partial_function.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_resolver.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_resources.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/asgi.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/execution_context.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/telemetry.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_serialization.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_server.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_supports_logs.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_traceback.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_tunnel.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_tunnel.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_type_manager.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/app_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/async_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/blob_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/browser_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/curl_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/deprecation.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/display_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/docker_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/function_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/git_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/hash_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/http_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/logger.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/mount_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/name_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/package_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/proxy_support.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/shell_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/task_command_router_client.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_utils/time_utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_vendor/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_vendor/tblib.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_vendor/version.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_watcher.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/_workspace.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/app.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/app.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/billing.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/billing.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/builder/2023.12.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/builder/2024.04.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/builder/2024.10.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/builder/2025.06.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/builder/README.md +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/builder/base-images.json +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/call_graph.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/_download.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/_help.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/_traceback.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/app.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/billing.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/bootstrap.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/changelog.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/cluster.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/config.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/container.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/curl.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/dashboard.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/dict.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/endpoint.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/entry_point.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/environment.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/image.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/import_refs.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/launch.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/logo.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/network_file_system.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/profile.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/programs/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/programs/run_jupyter.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/programs/vscode.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/queues.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/run.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/secret.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/selector.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/shell.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/skills.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/token.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/utils.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/volume.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cli/workspace.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/client.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cls.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/cls.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/config.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/container_process.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/container_process.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/dict.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/dict.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/environments.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/environments.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/exception.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/experimental/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/experimental/ipython.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/file_io.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/file_io.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/file_pattern_matcher.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/functions.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/functions.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/image.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/image.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/io_streams.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/io_streams.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/mount.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/mount.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/network_file_system.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/network_file_system.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/object.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/object.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/output.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/parallel_map.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/parallel_map.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/partial_function.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/partial_function.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/proxy.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/proxy.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/py.typed +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/queue.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/queue.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/retries.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/runner.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/runner.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/running_app.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/sandbox.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/sandbox.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/sandbox_fs.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/sandbox_fs.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/schedule.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/scheduler_placement.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/secret.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/secret.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/server.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/server.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/serving.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/serving.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/snapshot.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/snapshot.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/stream_type.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/token_flow.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/token_flow.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/types.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/volume.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/volume.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/workspace.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal/workspace.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal.egg-info/SOURCES.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal.egg-info/requires.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal.egg-info/top_level.txt +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/mdmd/types.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_docs/reference_intro.md +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/__init__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/api_grpc.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/api_pb2.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/api_pb2.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/api_pb2_grpc.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/api_pb2_grpc.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/modal_api_grpc.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/py.typed +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/modal_version/__main__.py +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/pyproject.toml +0 -0
- {modal-1.5.5.dev12 → modal-1.5.5.dev13}/setup.cfg +0 -0
|
@@ -38,7 +38,7 @@ class _Client:
|
|
|
38
38
|
server_url: str,
|
|
39
39
|
client_type: int,
|
|
40
40
|
credentials: typing.Optional[tuple[str, str]],
|
|
41
|
-
version: str = "1.5.5.
|
|
41
|
+
version: str = "1.5.5.dev13",
|
|
42
42
|
):
|
|
43
43
|
"""mdmd:hidden
|
|
44
44
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -209,7 +209,7 @@ class Client:
|
|
|
209
209
|
server_url: str,
|
|
210
210
|
client_type: int,
|
|
211
211
|
credentials: typing.Optional[tuple[str, str]],
|
|
212
|
-
version: str = "1.5.5.
|
|
212
|
+
version: str = "1.5.5.dev13",
|
|
213
213
|
):
|
|
214
214
|
"""mdmd:hidden
|
|
215
215
|
The Modal client object is not intended to be instantiated directly by users.
|
|
@@ -25,6 +25,7 @@ from ..client import _Client
|
|
|
25
25
|
from ..config import logger
|
|
26
26
|
from ..exception import InvalidError
|
|
27
27
|
|
|
28
|
+
_FLASH_UPSTREAM_HEADER = "modal-flash-upstream"
|
|
28
29
|
_MAX_FAILURES = 10
|
|
29
30
|
|
|
30
31
|
|
|
@@ -337,9 +338,14 @@ class _FlashPrometheusAutoscaler:
|
|
|
337
338
|
)
|
|
338
339
|
|
|
339
340
|
self.autoscaler_thread: asyncio.Task | None = None
|
|
341
|
+
self._flash_service_url: str | None = None
|
|
340
342
|
|
|
341
343
|
async def start(self):
|
|
342
344
|
await self.fn.hydrate(client=self.client)
|
|
345
|
+
flash_service_urls = await self.fn._experimental_get_flash_urls()
|
|
346
|
+
if not flash_service_urls:
|
|
347
|
+
raise InvalidError(f"Could not find a Flash service URL for {self.app_name}.{self.cls_name}")
|
|
348
|
+
self._flash_service_url = flash_service_urls[0]
|
|
343
349
|
self.autoscaler_thread = asyncio.create_task(self._run_autoscaler_loop())
|
|
344
350
|
|
|
345
351
|
async def _run_autoscaler_loop(self):
|
|
@@ -496,13 +502,20 @@ class _FlashPrometheusAutoscaler:
|
|
|
496
502
|
return desired_replicas
|
|
497
503
|
|
|
498
504
|
async def _get_scaling_info(self, containers) -> tuple[float, int]:
|
|
499
|
-
"""Get metrics
|
|
505
|
+
"""Get metrics from each container through the Flash service."""
|
|
506
|
+
if self._flash_service_url is None:
|
|
507
|
+
raise RuntimeError("Flash Prometheus autoscaler has not been started")
|
|
508
|
+
|
|
500
509
|
sum_metric = 0
|
|
501
510
|
n_containers_with_metrics = 0
|
|
511
|
+
metrics_url = f"{self._flash_service_url.rstrip('/')}/{self.metrics_endpoint.lstrip('/')}"
|
|
502
512
|
|
|
503
513
|
container_metrics_list = await asyncio.gather(
|
|
504
514
|
*[
|
|
505
|
-
self._get_metrics(
|
|
515
|
+
self._get_metrics(
|
|
516
|
+
metrics_url,
|
|
517
|
+
headers={_FLASH_UPSTREAM_HEADER: f"{container.host}:{container.port}"},
|
|
518
|
+
)
|
|
506
519
|
for container in containers
|
|
507
520
|
]
|
|
508
521
|
)
|
|
@@ -519,14 +532,20 @@ class _FlashPrometheusAutoscaler:
|
|
|
519
532
|
|
|
520
533
|
return sum_metric, n_containers_with_metrics
|
|
521
534
|
|
|
522
|
-
async def _get_metrics(
|
|
535
|
+
async def _get_metrics(
|
|
536
|
+
self, url: str, headers: dict[str, str] | None = None
|
|
537
|
+
) -> dict[str, list[Any]] | None: # technically any should be Sample
|
|
523
538
|
import aiohttp
|
|
524
539
|
from prometheus_client.parser import text_string_to_metric_families
|
|
525
540
|
from prometheus_client.samples import Sample
|
|
526
541
|
|
|
527
542
|
# Fetch the metrics from the endpoint
|
|
528
543
|
try:
|
|
529
|
-
response = await self.http_client.get(
|
|
544
|
+
response = await self.http_client.get(
|
|
545
|
+
url,
|
|
546
|
+
headers=headers,
|
|
547
|
+
timeout=aiohttp.ClientTimeout(total=3),
|
|
548
|
+
)
|
|
530
549
|
response.raise_for_status()
|
|
531
550
|
except asyncio.TimeoutError:
|
|
532
551
|
logger.warning(f"[Modal Flash] Timeout getting metrics from {url}")
|
|
@@ -196,10 +196,12 @@ class _FlashPrometheusAutoscaler:
|
|
|
196
196
|
...
|
|
197
197
|
|
|
198
198
|
async def _get_scaling_info(self, containers) -> tuple[float, int]:
|
|
199
|
-
"""Get metrics
|
|
199
|
+
"""Get metrics from each container through the Flash service."""
|
|
200
200
|
...
|
|
201
201
|
|
|
202
|
-
async def _get_metrics(
|
|
202
|
+
async def _get_metrics(
|
|
203
|
+
self, url: str, headers: typing.Optional[dict[str, str]] = None
|
|
204
|
+
) -> typing.Optional[dict[str, list[typing.Any]]]: ...
|
|
203
205
|
async def _get_all_containers(self): ...
|
|
204
206
|
async def _set_target_slots(self, target_slots: int): ...
|
|
205
207
|
def _make_scaling_decision(
|
|
@@ -287,18 +289,22 @@ class FlashPrometheusAutoscaler:
|
|
|
287
289
|
|
|
288
290
|
class ___get_scaling_info_spec(typing_extensions.Protocol):
|
|
289
291
|
def __call__(self, /, containers) -> tuple[float, int]:
|
|
290
|
-
"""Get metrics
|
|
292
|
+
"""Get metrics from each container through the Flash service."""
|
|
291
293
|
...
|
|
292
294
|
|
|
293
295
|
async def aio(self, /, containers) -> tuple[float, int]:
|
|
294
|
-
"""Get metrics
|
|
296
|
+
"""Get metrics from each container through the Flash service."""
|
|
295
297
|
...
|
|
296
298
|
|
|
297
299
|
_get_scaling_info: ___get_scaling_info_spec
|
|
298
300
|
|
|
299
301
|
class ___get_metrics_spec(typing_extensions.Protocol):
|
|
300
|
-
def __call__(
|
|
301
|
-
|
|
302
|
+
def __call__(
|
|
303
|
+
self, /, url: str, headers: typing.Optional[dict[str, str]] = None
|
|
304
|
+
) -> typing.Optional[dict[str, list[typing.Any]]]: ...
|
|
305
|
+
async def aio(
|
|
306
|
+
self, /, url: str, headers: typing.Optional[dict[str, str]] = None
|
|
307
|
+
) -> typing.Optional[dict[str, list[typing.Any]]]: ...
|
|
302
308
|
|
|
303
309
|
_get_metrics: ___get_metrics_spec
|
|
304
310
|
|
|
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
|
|
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
|