modal 1.6.4.dev9__tar.gz → 1.6.4.dev10__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.4.dev9 → modal-1.6.4.dev10}/PKG-INFO +1 -1
- modal-1.6.4.dev10/modal/_audit_logs/__init__.py +1 -0
- modal-1.6.4.dev10/modal/_audit_logs/_rpcs.py +66 -0
- modal-1.6.4.dev10/modal/_audit_logs/count.py +17 -0
- modal-1.6.4.dev10/modal/_audit_logs/list.py +83 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_image.py +3 -6
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/shell.py +1 -1
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/client.pyi +2 -2
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/functions.pyi +6 -6
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/PKG-INFO +1 -1
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/SOURCES.txt +4 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_grpc.py +32 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_pb2.py +1493 -1440
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_pb2.pyi +137 -14
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_pb2_grpc.py +68 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/api_pb2_grpc.pyi +24 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/modal_api_grpc.py +2 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_version/__init__.py +1 -1
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/LICENSE +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/README.md +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/__main__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_billing.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_cluster.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_cluster.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_container_entrypoint.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_environments.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_function_variants.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_functions.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_grpc_client.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_ipython.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_load_context.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_location.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_logs.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_logs_manager.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_logs_manager.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_metrics.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_metrics.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_object.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_outbound_policy.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_outbound_policy.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/manager.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/pty.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/rich.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_output/status.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_partial_function.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_resolver.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_resources.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/asgi.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/container_io_manager.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/container_io_manager.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/execution_context.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/execution_context.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/gpu_memory_snapshot.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/task_lifecycle_manager.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/task_lifecycle_manager.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/telemetry.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/user_code_event_loop.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_runtime/user_code_imports.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_serialization.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_server.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_server.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_supports_logs.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_traceback.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_tunnel.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_tunnel.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_type_manager.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/app_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/async_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/auth_token_manager.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/blob_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/browser_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/bytes_io_segment_payload.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/curl_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/deprecation.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/display_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/docker_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/function_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/git_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/grpc_testing.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/grpc_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/hash_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/http_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/idle_countdown.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/jwt_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/logger.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/mount_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/name_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/oauth.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/package_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/pattern_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/proxy_support.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/rand_pb_testing.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/sandbox_fs_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/shell_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_utils/time_utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/a2wsgi_wsgi.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/cloudpickle.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/tblib.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_vendor/version.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_watcher.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/_workspace.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/app.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/app.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/billing.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/billing.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2023.12.312.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2023.12.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2024.04.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2024.10.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2025.06.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/2026.10.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/PREVIEW.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/README.md +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/builder/base-images.json +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/call_graph.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_download.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_help.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_logs.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_stats.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/_traceback.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/app.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/billing.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/changelog.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/config.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/container.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/curl.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/dashboard.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/dict.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/endpoint.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/entry_point.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/environment.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/function.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/image.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/import_refs.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/logo.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/network_file_system.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/profile.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/queues.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/run.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/secret.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/selector.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/server.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/skills.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/token.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/utils.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/volume.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cli/workspace.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/client.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cloud_bucket_mount.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cloud_bucket_mount.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cls.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cls.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cluster.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/cluster.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/config.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/container_process.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/container_process.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/dict.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/dict.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/environments.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/environments.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/exception.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/_flash_container_entry.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/flash.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/flash.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/flash_server.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/flash_server.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/experimental/ipython.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/file_pattern_matcher.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/functions.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/image.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/image.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/io_streams.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/io_streams.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/mount.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/mount.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/network_file_system.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/network_file_system.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/object.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/object.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/output.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/parallel_map.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/parallel_map.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/partial_function.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/partial_function.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/proxy.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/proxy.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/py.typed +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/queue.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/queue.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/retries.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/runner.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/runner.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/running_app.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_common.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_filesystem.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_impl_persistent.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_impl_v1.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_impl_v2.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_sandbox.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_sidecar.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_snapshot.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/_task_command_router_client.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/sandbox.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/sandbox/sandbox.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/schedule.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/scheduler_placement.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/secret.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/secret.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/server.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/server.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/serving.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/serving.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/skills/modal/SKILL.md +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/stream_type.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/token_flow.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/token_flow.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/types.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/volume.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/volume.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/workspace.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal/workspace.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/dependency_links.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/entry_points.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/requires.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal.egg-info/top_level.txt +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/gen_cli_docs.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/gen_cli_docs_main.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/gen_reference_docs.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/gen_reference_docs_main.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/mdmd/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/mdmd/mdmd.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/mdmd/signatures.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/mdmd/types.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_docs/reference_intro.md +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/__init__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/py.typed +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_grpc.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_pb2.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_pb2.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_pb2_grpc.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_proto/task_command_router_pb2_grpc.pyi +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/modal_version/__main__.py +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/pyproject.toml +0 -0
- {modal-1.6.4.dev9 → modal-1.6.4.dev10}/setup.cfg +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Copyright Modal Labs 2026
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Copyright Modal Labs 2026
|
|
2
|
+
"""The audit log RPCs, one call each, retried with backoff. Ordering and batching live in list.py."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from collections.abc import Awaitable, Callable
|
|
7
|
+
from typing import TYPE_CHECKING, TypeVar
|
|
8
|
+
|
|
9
|
+
from modal._utils.grpc_utils import Retry
|
|
10
|
+
from modal_proto import api_pb2
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from modal.client import _Client
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
_Resp = TypeVar("_Resp")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
_MAX_RETRIES = 4
|
|
20
|
+
_PLAN_MAX_RETRIES = 2
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
async def _call(
|
|
24
|
+
rpc: Callable[..., Awaitable[_Resp]], req: object, *, timeout: float, max_retries: int = _MAX_RETRIES
|
|
25
|
+
) -> _Resp:
|
|
26
|
+
"""Call with backoff on timeouts and transient errors; rate and resource limits wait as the server says."""
|
|
27
|
+
retry = Retry(base_delay=1.0, delay_factor=2.0, max_delay=8.0, max_retries=max_retries, attempt_timeout=timeout)
|
|
28
|
+
return await rpc(req, retry=retry)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
async def get_settings(client: _Client) -> api_pb2.AuditLogSettingsGetResponse:
|
|
32
|
+
return await client._stub.AuditLogSettingsGet(api_pb2.AuditLogSettingsGetRequest())
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
async def count_entries(
|
|
36
|
+
client: _Client, q: str, oldest_ms: int, newest_ms: int, config: api_pb2.AuditLogSettingsGetResponse
|
|
37
|
+
) -> int:
|
|
38
|
+
req = api_pb2.AuditLogCountRequest(q=q, oldest_ms=oldest_ms, newest_ms=newest_ms)
|
|
39
|
+
resp = await _call(client._stub.AuditLogCount, req, timeout=config.request_timeout_secs)
|
|
40
|
+
return resp.count
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
async def list_page(
|
|
44
|
+
client: _Client,
|
|
45
|
+
q: str,
|
|
46
|
+
oldest_ms: int,
|
|
47
|
+
newest_ms: int,
|
|
48
|
+
limit: int,
|
|
49
|
+
config: api_pb2.AuditLogSettingsGetResponse,
|
|
50
|
+
newest_cursor: api_pb2.AuditLogCursor | None = None,
|
|
51
|
+
oldest_cursor: api_pb2.AuditLogCursor | None = None,
|
|
52
|
+
) -> api_pb2.AuditLogListResponse:
|
|
53
|
+
req = api_pb2.AuditLogListRequest(q=q, oldest_ms=oldest_ms, newest_ms=newest_ms, limit=limit)
|
|
54
|
+
if newest_cursor is not None:
|
|
55
|
+
req.newest_cursor.CopyFrom(newest_cursor)
|
|
56
|
+
if oldest_cursor is not None:
|
|
57
|
+
req.oldest_cursor.CopyFrom(oldest_cursor)
|
|
58
|
+
return await _call(client._stub.AuditLogList, req, timeout=config.request_timeout_secs)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
async def plan_buckets(
|
|
62
|
+
client: _Client, q: str, oldest_ms: int, newest_ms: int, config: api_pb2.AuditLogSettingsGetResponse
|
|
63
|
+
) -> list[api_pb2.AuditLogCursor]:
|
|
64
|
+
req = api_pb2.AuditLogBucketsRequest(q=q, oldest_ms=oldest_ms, newest_ms=newest_ms, bucket_size=config.bucket_size)
|
|
65
|
+
resp = await _call(client._stub.AuditLogPlan, req, timeout=config.plan_timeout_secs, max_retries=_PLAN_MAX_RETRIES)
|
|
66
|
+
return list(resp.cursors)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Copyright Modal Labs 2026
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from modal._audit_logs import _rpcs
|
|
7
|
+
from modal_proto import api_pb2
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from modal.client import _Client
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def count_audit_logs(
|
|
14
|
+
client: _Client, q: str, oldest_ms: int, newest_ms: int, config: api_pb2.AuditLogSettingsGetResponse
|
|
15
|
+
) -> int:
|
|
16
|
+
"""Count the entries in [oldest_ms, newest_ms) that match the query."""
|
|
17
|
+
return await _rpcs.count_entries(client, q, oldest_ms, newest_ms, config)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Copyright Modal Labs 2026
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from collections.abc import AsyncGenerator
|
|
5
|
+
from contextlib import aclosing
|
|
6
|
+
|
|
7
|
+
from modal._audit_logs import _rpcs
|
|
8
|
+
from modal._utils.async_utils import async_map_ordered
|
|
9
|
+
from modal.client import _Client
|
|
10
|
+
from modal_proto import api_pb2
|
|
11
|
+
|
|
12
|
+
# (newest_cursor, oldest_cursor); None where the bucket is open-ended.
|
|
13
|
+
Bucket = tuple[api_pb2.AuditLogCursor | None, api_pb2.AuditLogCursor | None]
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
async def get_bucket_cursors(
|
|
17
|
+
client: _Client, q: str, oldest_ms: int, newest_ms: int, config: api_pb2.AuditLogSettingsGetResponse
|
|
18
|
+
) -> list[Bucket]:
|
|
19
|
+
"""Split the range into buckets, as (newest_cursor, oldest_cursor) pairs ordered oldest to newest.
|
|
20
|
+
|
|
21
|
+
The first bucket has no oldest cursor and the last has no newest cursor.
|
|
22
|
+
"""
|
|
23
|
+
cursors = await _rpcs.plan_buckets(client, q, oldest_ms, newest_ms, config)
|
|
24
|
+
return list(zip([None, *cursors], [*cursors, None]))[::-1]
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
async def _fetch_bucket(
|
|
28
|
+
client: _Client,
|
|
29
|
+
q: str,
|
|
30
|
+
oldest_ms: int,
|
|
31
|
+
newest_ms: int,
|
|
32
|
+
config: api_pb2.AuditLogSettingsGetResponse,
|
|
33
|
+
bucket: Bucket,
|
|
34
|
+
) -> list[api_pb2.AuditLogEntry]:
|
|
35
|
+
"""Read one bucket's entries, oldest to newest, using pagination"""
|
|
36
|
+
newest_cursor, oldest_cursor = bucket
|
|
37
|
+
entries: list[api_pb2.AuditLogEntry] = []
|
|
38
|
+
while True:
|
|
39
|
+
resp = await _rpcs.list_page(
|
|
40
|
+
client, q, oldest_ms, newest_ms, config.page_size, config, newest_cursor, oldest_cursor
|
|
41
|
+
)
|
|
42
|
+
entries.extend(resp.items)
|
|
43
|
+
# Skips the empty request a full last page would otherwise trigger; an unset next_cursor also ends the loop.
|
|
44
|
+
if oldest_cursor is not None and resp.items and resp.items[-1].id == oldest_cursor.id:
|
|
45
|
+
break
|
|
46
|
+
if not resp.HasField("next_cursor"):
|
|
47
|
+
break
|
|
48
|
+
newest_cursor = resp.next_cursor
|
|
49
|
+
entries.reverse()
|
|
50
|
+
return entries
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
async def fetch_audit_logs(
|
|
54
|
+
q: str,
|
|
55
|
+
oldest_ms: int,
|
|
56
|
+
newest_ms: int,
|
|
57
|
+
*,
|
|
58
|
+
client: _Client | None = None,
|
|
59
|
+
config: api_pb2.AuditLogSettingsGetResponse,
|
|
60
|
+
) -> AsyncGenerator[api_pb2.AuditLogEntry]:
|
|
61
|
+
"""Yield the range's entries from the oldest to the newest, one bucket at a time.
|
|
62
|
+
|
|
63
|
+
At most `max_concurrent_requests` buckets are fetched at once, and at most `max_buffered_buckets` are fetched
|
|
64
|
+
or held at once. A new bucket is admitted only after the consumer has taken all of a bucket's entries, so a slow
|
|
65
|
+
consumer or a stalled request cannot grow memory.
|
|
66
|
+
If any request fails after its attempts, the remaining requests are cancelled and the error is raised.
|
|
67
|
+
"""
|
|
68
|
+
if client is None:
|
|
69
|
+
client = await _Client.from_env()
|
|
70
|
+
buckets = await get_bucket_cursors(client, q, oldest_ms, newest_ms, config)
|
|
71
|
+
|
|
72
|
+
async def bucket_stream() -> AsyncGenerator[Bucket]:
|
|
73
|
+
for bucket in buckets:
|
|
74
|
+
yield bucket
|
|
75
|
+
|
|
76
|
+
async def fetch(bucket: Bucket) -> list[api_pb2.AuditLogEntry]:
|
|
77
|
+
return await _fetch_bucket(client, q, oldest_ms, newest_ms, config, bucket)
|
|
78
|
+
|
|
79
|
+
fetched = async_map_ordered(bucket_stream(), fetch, config.max_concurrent_requests, config.max_buffered_buckets)
|
|
80
|
+
async with aclosing(fetched) as stream:
|
|
81
|
+
async for entries in stream:
|
|
82
|
+
for entry in entries:
|
|
83
|
+
yield entry
|
|
@@ -2064,8 +2064,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
2064
2064
|
if not isinstance(entrypoint_commands, list) or not all(isinstance(x, str) for x in entrypoint_commands):
|
|
2065
2065
|
raise InvalidError("entrypoint_commands must be a list of strings.")
|
|
2066
2066
|
args = _flatten_str_args("entrypoint", "entrypoint_commands", entrypoint_commands)
|
|
2067
|
-
|
|
2068
|
-
dockerfile_cmd = f"ENTRYPOINT [{args_str}]"
|
|
2067
|
+
dockerfile_cmd = f"ENTRYPOINT {json.dumps(args, ensure_ascii=False)}"
|
|
2069
2068
|
|
|
2070
2069
|
return self.dockerfile_commands(dockerfile_cmd)
|
|
2071
2070
|
|
|
@@ -2085,8 +2084,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
2085
2084
|
if not isinstance(shell_commands, list) or not all(isinstance(x, str) for x in shell_commands):
|
|
2086
2085
|
raise InvalidError("shell_commands must be a list of strings.")
|
|
2087
2086
|
args = _flatten_str_args("shell", "shell_commands", shell_commands)
|
|
2088
|
-
|
|
2089
|
-
dockerfile_cmd = f"SHELL [{args_str}]"
|
|
2087
|
+
dockerfile_cmd = f"SHELL {json.dumps(args, ensure_ascii=False)}"
|
|
2090
2088
|
|
|
2091
2089
|
return self.dockerfile_commands(dockerfile_cmd)
|
|
2092
2090
|
|
|
@@ -3076,8 +3074,7 @@ class _Image(_Object, type_prefix="im"):
|
|
|
3076
3074
|
raise InvalidError("Image CMD must be a list of strings.")
|
|
3077
3075
|
|
|
3078
3076
|
cmd_args = _flatten_str_args("cmd", "cmd", cmd)
|
|
3079
|
-
|
|
3080
|
-
dockerfile_cmd = f"CMD [{cmd_str}]"
|
|
3077
|
+
dockerfile_cmd = f"CMD {json.dumps(cmd_args, ensure_ascii=False)}"
|
|
3081
3078
|
|
|
3082
3079
|
return self.dockerfile_commands(dockerfile_cmd)
|
|
3083
3080
|
|
|
@@ -448,7 +448,7 @@ def shell(
|
|
|
448
448
|
app = App("modal shell")
|
|
449
449
|
|
|
450
450
|
# NB: invoking under bash makes --cmd a lot more flexible.
|
|
451
|
-
cmds =
|
|
451
|
+
cmds = ["/bin/bash", "-c", cmd]
|
|
452
452
|
timeout = 3600
|
|
453
453
|
parsed_experimental_options = _parse_experimental_options(experimental_options)
|
|
454
454
|
|
|
@@ -87,7 +87,7 @@ class _Client:
|
|
|
87
87
|
server_url: str,
|
|
88
88
|
client_type: int,
|
|
89
89
|
credentials: typing.Optional[tuple[str, str]],
|
|
90
|
-
version: str = "1.6.4.
|
|
90
|
+
version: str = "1.6.4.dev10",
|
|
91
91
|
*,
|
|
92
92
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
93
93
|
):
|
|
@@ -304,7 +304,7 @@ class Client:
|
|
|
304
304
|
server_url: str,
|
|
305
305
|
client_type: int,
|
|
306
306
|
credentials: typing.Optional[tuple[str, str]],
|
|
307
|
-
version: str = "1.6.4.
|
|
307
|
+
version: str = "1.6.4.dev10",
|
|
308
308
|
*,
|
|
309
309
|
oauth_credentials: typing.Optional[_OAuthCredentials] = None,
|
|
310
310
|
):
|
|
@@ -619,7 +619,7 @@ class Function(
|
|
|
619
619
|
|
|
620
620
|
_call_generator: ___call_generator_spec
|
|
621
621
|
|
|
622
|
-
class __remote_spec(typing_extensions.Protocol[
|
|
622
|
+
class __remote_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
623
623
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> ReturnType_INNER:
|
|
624
624
|
"""Calls the function remotely, executing it with the given arguments and returning the execution's result.
|
|
625
625
|
|
|
@@ -644,7 +644,7 @@ class Function(
|
|
|
644
644
|
"""
|
|
645
645
|
...
|
|
646
646
|
|
|
647
|
-
remote: __remote_spec[modal._functions.
|
|
647
|
+
remote: __remote_spec[modal._functions.P, modal._functions.ReturnType]
|
|
648
648
|
|
|
649
649
|
class __remote_gen_spec(typing_extensions.Protocol):
|
|
650
650
|
def __call__(self, /, *args, **kwargs) -> typing.Generator[typing.Any, None, None]:
|
|
@@ -694,7 +694,7 @@ class Function(
|
|
|
694
694
|
"""
|
|
695
695
|
...
|
|
696
696
|
|
|
697
|
-
class ___experimental_spawn_spec(typing_extensions.Protocol[
|
|
697
|
+
class ___experimental_spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
698
698
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
699
699
|
"""[Experimental] Calls the function with the given arguments, without waiting for the results.
|
|
700
700
|
|
|
@@ -727,7 +727,7 @@ class Function(
|
|
|
727
727
|
"""
|
|
728
728
|
...
|
|
729
729
|
|
|
730
|
-
_experimental_spawn: ___experimental_spawn_spec[modal._functions.
|
|
730
|
+
_experimental_spawn: ___experimental_spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
731
731
|
|
|
732
732
|
class ___spawn_map_inner_spec(typing_extensions.Protocol[P_INNER]):
|
|
733
733
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> None: ...
|
|
@@ -735,7 +735,7 @@ class Function(
|
|
|
735
735
|
|
|
736
736
|
_spawn_map_inner: ___spawn_map_inner_spec[modal._functions.P]
|
|
737
737
|
|
|
738
|
-
class __spawn_spec(typing_extensions.Protocol[
|
|
738
|
+
class __spawn_spec(typing_extensions.Protocol[P_INNER, ReturnType_INNER]):
|
|
739
739
|
def __call__(self, /, *args: P_INNER.args, **kwargs: P_INNER.kwargs) -> FunctionCall[ReturnType_INNER]:
|
|
740
740
|
"""Calls the function with the given arguments, without waiting for the results.
|
|
741
741
|
|
|
@@ -768,7 +768,7 @@ class Function(
|
|
|
768
768
|
"""
|
|
769
769
|
...
|
|
770
770
|
|
|
771
|
-
spawn: __spawn_spec[modal._functions.
|
|
771
|
+
spawn: __spawn_spec[modal._functions.P, modal._functions.ReturnType]
|
|
772
772
|
|
|
773
773
|
@property
|
|
774
774
|
def _raw_f_(self) -> collections.abc.Callable[..., typing.Any]: ...
|
|
@@ -106,6 +106,10 @@ modal.egg-info/dependency_links.txt
|
|
|
106
106
|
modal.egg-info/entry_points.txt
|
|
107
107
|
modal.egg-info/requires.txt
|
|
108
108
|
modal.egg-info/top_level.txt
|
|
109
|
+
modal/_audit_logs/__init__.py
|
|
110
|
+
modal/_audit_logs/_rpcs.py
|
|
111
|
+
modal/_audit_logs/count.py
|
|
112
|
+
modal/_audit_logs/list.py
|
|
109
113
|
modal/_output/__init__.py
|
|
110
114
|
modal/_output/manager.py
|
|
111
115
|
modal/_output/pty.py
|
|
@@ -163,6 +163,10 @@ class ModalClientBase(abc.ABC):
|
|
|
163
163
|
async def ClassGet(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.ClassGetRequest, modal_proto.api_pb2.ClassGetResponse]') -> None:
|
|
164
164
|
pass
|
|
165
165
|
|
|
166
|
+
@abc.abstractmethod
|
|
167
|
+
async def CliCommandSuggest(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.CliCommandSuggestRequest, modal_proto.api_pb2.CliCommandSuggestResponse]') -> None:
|
|
168
|
+
pass
|
|
169
|
+
|
|
166
170
|
@abc.abstractmethod
|
|
167
171
|
async def ClientHello(self, stream: 'grpclib.server.Stream[google.protobuf.empty_pb2.Empty, modal_proto.api_pb2.ClientHelloResponse]') -> None:
|
|
168
172
|
pass
|
|
@@ -587,6 +591,10 @@ class ModalClientBase(abc.ABC):
|
|
|
587
591
|
async def MountPutFile(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.MountPutFileRequest, modal_proto.api_pb2.MountPutFileResponse]') -> None:
|
|
588
592
|
pass
|
|
589
593
|
|
|
594
|
+
@abc.abstractmethod
|
|
595
|
+
async def ObjectSuggest(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.ObjectSuggestRequest, modal_proto.api_pb2.ObjectSuggestResponse]') -> None:
|
|
596
|
+
pass
|
|
597
|
+
|
|
590
598
|
@abc.abstractmethod
|
|
591
599
|
async def PersistentSandboxCreate(self, stream: 'grpclib.server.Stream[modal_proto.api_pb2.PersistentSandboxCreateRequest, modal_proto.api_pb2.PersistentSandboxCreateResponse]') -> None:
|
|
592
600
|
pass
|
|
@@ -1349,6 +1357,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1349
1357
|
modal_proto.api_pb2.ClassGetRequest,
|
|
1350
1358
|
modal_proto.api_pb2.ClassGetResponse,
|
|
1351
1359
|
),
|
|
1360
|
+
'/modal.client.ModalClient/CliCommandSuggest': grpclib.const.Handler(
|
|
1361
|
+
self.CliCommandSuggest,
|
|
1362
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
1363
|
+
modal_proto.api_pb2.CliCommandSuggestRequest,
|
|
1364
|
+
modal_proto.api_pb2.CliCommandSuggestResponse,
|
|
1365
|
+
),
|
|
1352
1366
|
'/modal.client.ModalClient/ClientHello': grpclib.const.Handler(
|
|
1353
1367
|
self.ClientHello,
|
|
1354
1368
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -1985,6 +1999,12 @@ class ModalClientBase(abc.ABC):
|
|
|
1985
1999
|
modal_proto.api_pb2.MountPutFileRequest,
|
|
1986
2000
|
modal_proto.api_pb2.MountPutFileResponse,
|
|
1987
2001
|
),
|
|
2002
|
+
'/modal.client.ModalClient/ObjectSuggest': grpclib.const.Handler(
|
|
2003
|
+
self.ObjectSuggest,
|
|
2004
|
+
grpclib.const.Cardinality.UNARY_UNARY,
|
|
2005
|
+
modal_proto.api_pb2.ObjectSuggestRequest,
|
|
2006
|
+
modal_proto.api_pb2.ObjectSuggestResponse,
|
|
2007
|
+
),
|
|
1988
2008
|
'/modal.client.ModalClient/PersistentSandboxCreate': grpclib.const.Handler(
|
|
1989
2009
|
self.PersistentSandboxCreate,
|
|
1990
2010
|
grpclib.const.Cardinality.UNARY_UNARY,
|
|
@@ -3023,6 +3043,12 @@ class ModalClientStub:
|
|
|
3023
3043
|
modal_proto.api_pb2.ClassGetRequest,
|
|
3024
3044
|
modal_proto.api_pb2.ClassGetResponse,
|
|
3025
3045
|
)
|
|
3046
|
+
self.CliCommandSuggest = grpclib.client.UnaryUnaryMethod(
|
|
3047
|
+
channel,
|
|
3048
|
+
'/modal.client.ModalClient/CliCommandSuggest',
|
|
3049
|
+
modal_proto.api_pb2.CliCommandSuggestRequest,
|
|
3050
|
+
modal_proto.api_pb2.CliCommandSuggestResponse,
|
|
3051
|
+
)
|
|
3026
3052
|
self.ClientHello = grpclib.client.UnaryUnaryMethod(
|
|
3027
3053
|
channel,
|
|
3028
3054
|
'/modal.client.ModalClient/ClientHello',
|
|
@@ -3659,6 +3685,12 @@ class ModalClientStub:
|
|
|
3659
3685
|
modal_proto.api_pb2.MountPutFileRequest,
|
|
3660
3686
|
modal_proto.api_pb2.MountPutFileResponse,
|
|
3661
3687
|
)
|
|
3688
|
+
self.ObjectSuggest = grpclib.client.UnaryUnaryMethod(
|
|
3689
|
+
channel,
|
|
3690
|
+
'/modal.client.ModalClient/ObjectSuggest',
|
|
3691
|
+
modal_proto.api_pb2.ObjectSuggestRequest,
|
|
3692
|
+
modal_proto.api_pb2.ObjectSuggestResponse,
|
|
3693
|
+
)
|
|
3662
3694
|
self.PersistentSandboxCreate = grpclib.client.UnaryUnaryMethod(
|
|
3663
3695
|
channel,
|
|
3664
3696
|
'/modal.client.ModalClient/PersistentSandboxCreate',
|