lmcache-cli 0.4.5.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lmcache/__init__.py +84 -0
- lmcache/_version.py +24 -0
- lmcache/cli/__init__.py +1 -0
- lmcache/cli/commands/__init__.py +34 -0
- lmcache/cli/commands/base.py +157 -0
- lmcache/cli/commands/bench/__init__.py +557 -0
- lmcache/cli/commands/bench/engine_bench/__init__.py +1 -0
- lmcache/cli/commands/bench/engine_bench/config.py +245 -0
- lmcache/cli/commands/bench/engine_bench/interactive/__init__.py +274 -0
- lmcache/cli/commands/bench/engine_bench/interactive/config.json +10 -0
- lmcache/cli/commands/bench/engine_bench/interactive/schema.py +352 -0
- lmcache/cli/commands/bench/engine_bench/interactive/state.py +327 -0
- lmcache/cli/commands/bench/engine_bench/interactive/terminal.py +291 -0
- lmcache/cli/commands/bench/engine_bench/progress.py +145 -0
- lmcache/cli/commands/bench/engine_bench/request_sender.py +232 -0
- lmcache/cli/commands/bench/engine_bench/stats.py +275 -0
- lmcache/cli/commands/bench/engine_bench/workloads/__init__.py +153 -0
- lmcache/cli/commands/bench/engine_bench/workloads/base.py +122 -0
- lmcache/cli/commands/bench/engine_bench/workloads/long_doc_permutator.py +435 -0
- lmcache/cli/commands/bench/engine_bench/workloads/long_doc_qa.py +281 -0
- lmcache/cli/commands/bench/engine_bench/workloads/multi_round_chat.py +337 -0
- lmcache/cli/commands/bench/engine_bench/workloads/random_prefill.py +178 -0
- lmcache/cli/commands/describe.py +310 -0
- lmcache/cli/commands/kvcache.py +133 -0
- lmcache/cli/commands/mock.py +75 -0
- lmcache/cli/commands/ping.py +113 -0
- lmcache/cli/commands/query/__init__.py +155 -0
- lmcache/cli/commands/query/prompt.py +134 -0
- lmcache/cli/commands/query/request.py +357 -0
- lmcache/cli/commands/server.py +99 -0
- lmcache/cli/commands/tool/__init__.py +63 -0
- lmcache/cli/commands/tool/cache_simulator.py +113 -0
- lmcache/cli/commands/trace/__init__.py +505 -0
- lmcache/cli/commands/trace/dispatch.py +249 -0
- lmcache/cli/commands/trace/driver.py +372 -0
- lmcache/cli/commands/trace/stats.py +289 -0
- lmcache/cli/documents/lmcache.txt +11 -0
- lmcache/cli/main.py +42 -0
- lmcache/cli/metrics/__init__.py +29 -0
- lmcache/cli/metrics/formatter.py +171 -0
- lmcache/cli/metrics/handler.py +94 -0
- lmcache/cli/metrics/metrics.py +161 -0
- lmcache/cli/metrics/section.py +77 -0
- lmcache/connections.py +173 -0
- lmcache/integration/__init__.py +2 -0
- lmcache/integration/base_service_factory.py +165 -0
- lmcache/integration/request_telemetry/__init__.py +1 -0
- lmcache/integration/request_telemetry/base.py +51 -0
- lmcache/integration/request_telemetry/factory.py +113 -0
- lmcache/integration/request_telemetry/fastapi.py +109 -0
- lmcache/integration/request_telemetry/noop.py +35 -0
- lmcache/integration/sglang/__init__.py +2 -0
- lmcache/integration/sglang/sglang_adapter.py +326 -0
- lmcache/integration/sglang/utils.py +39 -0
- lmcache/integration/vllm/__init__.py +1 -0
- lmcache/integration/vllm/lmcache_connector_v1.py +213 -0
- lmcache/integration/vllm/lmcache_connector_v1_085.py +150 -0
- lmcache/integration/vllm/lmcache_mp_connector_0180.py +1072 -0
- lmcache/integration/vllm/tests/test_mm_hash_utils.py +112 -0
- lmcache/integration/vllm/utils.py +433 -0
- lmcache/integration/vllm/vllm_multi_process_adapter.py +1090 -0
- lmcache/integration/vllm/vllm_service_factory.py +339 -0
- lmcache/integration/vllm/vllm_v1_adapter.py +1713 -0
- lmcache/logging.py +107 -0
- lmcache/native_storage_ops.pyi +230 -0
- lmcache/non_cuda_equivalents.py +1424 -0
- lmcache/observability.py +1958 -0
- lmcache/storage_backend/serde/__init__.py +1 -0
- lmcache/storage_backend/serde/cachegen_basics.py +210 -0
- lmcache/storage_backend/serde/cachegen_decoder.py +207 -0
- lmcache/storage_backend/serde/cachegen_encoder.py +394 -0
- lmcache/storage_backend/serde/serde.py +75 -0
- lmcache/tools/__init__.py +1 -0
- lmcache/tools/cache_simulator/README.md +392 -0
- lmcache/tools/cache_simulator/__init__.py +1 -0
- lmcache/tools/cache_simulator/docs/simulate_example.png +0 -0
- lmcache/tools/cache_simulator/docs/sweep_example.png +0 -0
- lmcache/tools/cache_simulator/gen_bench_dataset.py +360 -0
- lmcache/tools/cache_simulator/lru_cache.py +124 -0
- lmcache/tools/cache_simulator/plot_hit_rate.py +231 -0
- lmcache/tools/cache_simulator/simulator.py +795 -0
- lmcache/tools/controller_benchmark/README.md +161 -0
- lmcache/tools/controller_benchmark/__init__.py +1 -0
- lmcache/tools/controller_benchmark/__main__.py +331 -0
- lmcache/tools/controller_benchmark/benchmark.py +660 -0
- lmcache/tools/controller_benchmark/config.py +44 -0
- lmcache/tools/controller_benchmark/constants.py +10 -0
- lmcache/tools/controller_benchmark/handlers/__init__.py +46 -0
- lmcache/tools/controller_benchmark/handlers/admit.py +52 -0
- lmcache/tools/controller_benchmark/handlers/base.py +47 -0
- lmcache/tools/controller_benchmark/handlers/deregister.py +49 -0
- lmcache/tools/controller_benchmark/handlers/evict.py +52 -0
- lmcache/tools/controller_benchmark/handlers/heartbeat.py +56 -0
- lmcache/tools/controller_benchmark/handlers/p2p_lookup.py +47 -0
- lmcache/tools/controller_benchmark/handlers/register.py +56 -0
- lmcache/tools/mp_status_viewer/__init__.py +1 -0
- lmcache/tools/mp_status_viewer/__main__.py +95 -0
- lmcache/usage_context.py +417 -0
- lmcache/utils.py +665 -0
- lmcache/v1/__init__.py +2 -0
- lmcache/v1/api_server/__init__.py +2 -0
- lmcache/v1/api_server/__main__.py +537 -0
- lmcache/v1/basic_check.py +112 -0
- lmcache/v1/cache_controller/__init__.py +9 -0
- lmcache/v1/cache_controller/commands/__init__.py +15 -0
- lmcache/v1/cache_controller/commands/base.py +35 -0
- lmcache/v1/cache_controller/commands/full_sync.py +49 -0
- lmcache/v1/cache_controller/config.py +176 -0
- lmcache/v1/cache_controller/controller_manager.py +535 -0
- lmcache/v1/cache_controller/controllers/__init__.py +11 -0
- lmcache/v1/cache_controller/controllers/full_sync_tracker.py +473 -0
- lmcache/v1/cache_controller/controllers/kv_controller.py +439 -0
- lmcache/v1/cache_controller/controllers/registration_controller.py +282 -0
- lmcache/v1/cache_controller/executor.py +463 -0
- lmcache/v1/cache_controller/frontend/static/css/style.css +201 -0
- lmcache/v1/cache_controller/frontend/static/img/logo.png +0 -0
- lmcache/v1/cache_controller/frontend/static/index.html +234 -0
- lmcache/v1/cache_controller/frontend/static/js/controller_app.js +660 -0
- lmcache/v1/cache_controller/full_sync_sender.py +475 -0
- lmcache/v1/cache_controller/locks.py +149 -0
- lmcache/v1/cache_controller/message.py +828 -0
- lmcache/v1/cache_controller/observability.py +208 -0
- lmcache/v1/cache_controller/utils.py +679 -0
- lmcache/v1/cache_controller/worker.py +665 -0
- lmcache/v1/cache_engine.py +2058 -0
- lmcache/v1/cache_interface.py +19 -0
- lmcache/v1/check/__init__.py +74 -0
- lmcache/v1/check/check_mode_gen.py +86 -0
- lmcache/v1/check/check_mode_test_l2_adapter.py +284 -0
- lmcache/v1/check/check_mode_test_remote.py +155 -0
- lmcache/v1/check/check_mode_test_storage_manager.py +142 -0
- lmcache/v1/check/utils.py +571 -0
- lmcache/v1/compute/__init__.py +2 -0
- lmcache/v1/compute/attention/__init__.py +0 -0
- lmcache/v1/compute/attention/abstract.py +39 -0
- lmcache/v1/compute/attention/flash_attn.py +129 -0
- lmcache/v1/compute/attention/flash_infer_sparse.py +284 -0
- lmcache/v1/compute/attention/metadata.py +85 -0
- lmcache/v1/compute/attention/utils.py +14 -0
- lmcache/v1/compute/blend/__init__.py +7 -0
- lmcache/v1/compute/blend/blender.py +168 -0
- lmcache/v1/compute/blend/metadata.py +34 -0
- lmcache/v1/compute/blend/utils.py +63 -0
- lmcache/v1/compute/models/__init__.py +0 -0
- lmcache/v1/compute/models/base.py +141 -0
- lmcache/v1/compute/models/llama.py +9 -0
- lmcache/v1/compute/models/qwen3.py +24 -0
- lmcache/v1/compute/models/utils.py +68 -0
- lmcache/v1/compute/positional_encoding.py +199 -0
- lmcache/v1/config.py +848 -0
- lmcache/v1/config_base.py +848 -0
- lmcache/v1/distributed/api.py +248 -0
- lmcache/v1/distributed/config.py +321 -0
- lmcache/v1/distributed/error.py +64 -0
- lmcache/v1/distributed/eviction.py +192 -0
- lmcache/v1/distributed/eviction_policy/__init__.py +21 -0
- lmcache/v1/distributed/eviction_policy/factory.py +27 -0
- lmcache/v1/distributed/eviction_policy/lru.py +244 -0
- lmcache/v1/distributed/eviction_policy/noop.py +50 -0
- lmcache/v1/distributed/internal_api.py +170 -0
- lmcache/v1/distributed/l1_manager.py +835 -0
- lmcache/v1/distributed/l2_adapters/__init__.py +67 -0
- lmcache/v1/distributed/l2_adapters/base.py +360 -0
- lmcache/v1/distributed/l2_adapters/config.py +385 -0
- lmcache/v1/distributed/l2_adapters/factory.py +205 -0
- lmcache/v1/distributed/l2_adapters/fs_l2_adapter.py +747 -0
- lmcache/v1/distributed/l2_adapters/fs_native_l2_adapter.py +167 -0
- lmcache/v1/distributed/l2_adapters/mock_l2_adapter.py +516 -0
- lmcache/v1/distributed/l2_adapters/mooncake_store_l2_adapter.py +135 -0
- lmcache/v1/distributed/l2_adapters/native_connector_l2_adapter.py +468 -0
- lmcache/v1/distributed/l2_adapters/native_plugin_l2_adapter.py +199 -0
- lmcache/v1/distributed/l2_adapters/nixl_store_dynamic_l2_adapter.py +831 -0
- lmcache/v1/distributed/l2_adapters/nixl_store_l2_adapter.py +983 -0
- lmcache/v1/distributed/l2_adapters/plugin_l2_adapter.py +210 -0
- lmcache/v1/distributed/l2_adapters/resp_l2_adapter.py +176 -0
- lmcache/v1/distributed/memory_manager.py +179 -0
- lmcache/v1/distributed/storage_controller.py +39 -0
- lmcache/v1/distributed/storage_controllers/__init__.py +43 -0
- lmcache/v1/distributed/storage_controllers/eviction_controller.py +242 -0
- lmcache/v1/distributed/storage_controllers/prefetch_controller.py +830 -0
- lmcache/v1/distributed/storage_controllers/prefetch_policy.py +193 -0
- lmcache/v1/distributed/storage_controllers/store_controller.py +452 -0
- lmcache/v1/distributed/storage_controllers/store_policy.py +213 -0
- lmcache/v1/distributed/storage_manager.py +532 -0
- lmcache/v1/event_manager.py +145 -0
- lmcache/v1/exceptions/__init__.py +16 -0
- lmcache/v1/gpu_connector/__init__.py +126 -0
- lmcache/v1/gpu_connector/gpu_connectors.py +1906 -0
- lmcache/v1/gpu_connector/gpu_ops.py +85 -0
- lmcache/v1/gpu_connector/hpu_connector.py +326 -0
- lmcache/v1/gpu_connector/mock_gpu_connector.py +67 -0
- lmcache/v1/gpu_connector/utils.py +890 -0
- lmcache/v1/gpu_connector/xpu_connectors.py +916 -0
- lmcache/v1/health_monitor/__init__.py +1 -0
- lmcache/v1/health_monitor/base.py +587 -0
- lmcache/v1/health_monitor/checks/__init__.py +1 -0
- lmcache/v1/health_monitor/checks/remote_backend_check.py +304 -0
- lmcache/v1/health_monitor/constants.py +36 -0
- lmcache/v1/internal_api_server/__init__.py +0 -0
- lmcache/v1/internal_api_server/api_registry.py +59 -0
- lmcache/v1/internal_api_server/api_server.py +120 -0
- lmcache/v1/internal_api_server/common/__init__.py +1 -0
- lmcache/v1/internal_api_server/common/env_api.py +22 -0
- lmcache/v1/internal_api_server/common/loglevel_api.py +57 -0
- lmcache/v1/internal_api_server/common/metrics_api.py +29 -0
- lmcache/v1/internal_api_server/common/periodic_thread_api.py +138 -0
- lmcache/v1/internal_api_server/common/run_script_api.py +73 -0
- lmcache/v1/internal_api_server/common/thread_api.py +63 -0
- lmcache/v1/internal_api_server/controller/__init__.py +1 -0
- lmcache/v1/internal_api_server/controller/key_stats_api.py +81 -0
- lmcache/v1/internal_api_server/controller/worker_info_api.py +136 -0
- lmcache/v1/internal_api_server/utils.py +43 -0
- lmcache/v1/internal_api_server/vllm/__init__.py +1 -0
- lmcache/v1/internal_api_server/vllm/backend_api.py +221 -0
- lmcache/v1/internal_api_server/vllm/bypass_api.py +204 -0
- lmcache/v1/internal_api_server/vllm/cache_api.py +895 -0
- lmcache/v1/internal_api_server/vllm/chunk_statistics_api.py +141 -0
- lmcache/v1/internal_api_server/vllm/conf_api.py +147 -0
- lmcache/v1/internal_api_server/vllm/freeze_api.py +172 -0
- lmcache/v1/internal_api_server/vllm/hot_cache_api.py +184 -0
- lmcache/v1/internal_api_server/vllm/inference_api.py +65 -0
- lmcache/v1/internal_api_server/vllm/load_fs_chunks_api.py +320 -0
- lmcache/v1/internal_api_server/vllm/lookup_api.py +145 -0
- lmcache/v1/internal_api_server/vllm/version_api.py +25 -0
- lmcache/v1/kv_layer_groups.py +267 -0
- lmcache/v1/lazy_memory_allocator.py +284 -0
- lmcache/v1/lookup_client/__init__.py +25 -0
- lmcache/v1/lookup_client/abstract_client.py +77 -0
- lmcache/v1/lookup_client/async_lookup_message.py +50 -0
- lmcache/v1/lookup_client/chunk_statistics_lookup_client.py +200 -0
- lmcache/v1/lookup_client/factory.py +251 -0
- lmcache/v1/lookup_client/hit_limit_lookup_client.py +86 -0
- lmcache/v1/lookup_client/lmcache_async_lookup_client.py +407 -0
- lmcache/v1/lookup_client/lmcache_lookup_client.py +285 -0
- lmcache/v1/lookup_client/lmcache_lookup_client_bypass.py +99 -0
- lmcache/v1/lookup_client/mooncake_lookup_client.py +87 -0
- lmcache/v1/lookup_client/record_strategies/__init__.py +77 -0
- lmcache/v1/lookup_client/record_strategies/base.py +327 -0
- lmcache/v1/lookup_client/record_strategies/file_hash.py +130 -0
- lmcache/v1/lookup_client/record_strategies/memory_bloom_filter.py +81 -0
- lmcache/v1/manager.py +539 -0
- lmcache/v1/memory_management.py +2619 -0
- lmcache/v1/metadata.py +114 -0
- lmcache/v1/mp_observability/AGENTS.override.md +21 -0
- lmcache/v1/mp_observability/README.md +204 -0
- lmcache/v1/mp_observability/config.py +340 -0
- lmcache/v1/mp_observability/event.py +100 -0
- lmcache/v1/mp_observability/event_bus.py +313 -0
- lmcache/v1/mp_observability/otel_init.py +145 -0
- lmcache/v1/mp_observability/subscribers/__init__.py +28 -0
- lmcache/v1/mp_observability/subscribers/logging/__init__.py +19 -0
- lmcache/v1/mp_observability/subscribers/logging/l1.py +56 -0
- lmcache/v1/mp_observability/subscribers/logging/l2.py +73 -0
- lmcache/v1/mp_observability/subscribers/logging/lookup_hash.py +209 -0
- lmcache/v1/mp_observability/subscribers/logging/mp_server.py +90 -0
- lmcache/v1/mp_observability/subscribers/logging/sm.py +59 -0
- lmcache/v1/mp_observability/subscribers/metrics/__init__.py +20 -0
- lmcache/v1/mp_observability/subscribers/metrics/l0_lifecycle.py +290 -0
- lmcache/v1/mp_observability/subscribers/metrics/l1.py +55 -0
- lmcache/v1/mp_observability/subscribers/metrics/l1_lifecycle.py +166 -0
- lmcache/v1/mp_observability/subscribers/metrics/l2.py +121 -0
- lmcache/v1/mp_observability/subscribers/metrics/sm.py +69 -0
- lmcache/v1/mp_observability/subscribers/tracing/__init__.py +12 -0
- lmcache/v1/mp_observability/subscribers/tracing/mp_server.py +333 -0
- lmcache/v1/mp_observability/subscribers/tracing/span_registry.py +148 -0
- lmcache/v1/mp_observability/trace/__init__.py +50 -0
- lmcache/v1/mp_observability/trace/codecs.py +255 -0
- lmcache/v1/mp_observability/trace/decorator.py +147 -0
- lmcache/v1/mp_observability/trace/format.py +132 -0
- lmcache/v1/mp_observability/trace/lifecycle.py +83 -0
- lmcache/v1/mp_observability/trace/reader.py +167 -0
- lmcache/v1/mp_observability/trace/recorder.py +300 -0
- lmcache/v1/multiprocess/__init__.py +0 -0
- lmcache/v1/multiprocess/affinity_pool.py +102 -0
- lmcache/v1/multiprocess/blend_server_v2.py +891 -0
- lmcache/v1/multiprocess/config.py +253 -0
- lmcache/v1/multiprocess/custom_types.py +281 -0
- lmcache/v1/multiprocess/futures.py +194 -0
- lmcache/v1/multiprocess/gpu_context.py +511 -0
- lmcache/v1/multiprocess/http_server.py +235 -0
- lmcache/v1/multiprocess/mp_runtime_plugin_launcher.py +130 -0
- lmcache/v1/multiprocess/mq.py +732 -0
- lmcache/v1/multiprocess/protocol.py +86 -0
- lmcache/v1/multiprocess/protocols/README.md +213 -0
- lmcache/v1/multiprocess/protocols/__init__.py +127 -0
- lmcache/v1/multiprocess/protocols/base.py +89 -0
- lmcache/v1/multiprocess/protocols/blend.py +109 -0
- lmcache/v1/multiprocess/protocols/blend_v2.py +57 -0
- lmcache/v1/multiprocess/protocols/controller.py +53 -0
- lmcache/v1/multiprocess/protocols/debug.py +34 -0
- lmcache/v1/multiprocess/protocols/engine.py +146 -0
- lmcache/v1/multiprocess/protocols/observability.py +39 -0
- lmcache/v1/multiprocess/server.py +1134 -0
- lmcache/v1/multiprocess/session.py +190 -0
- lmcache/v1/multiprocess/token_hasher.py +441 -0
- lmcache/v1/offload_server/__init__.py +17 -0
- lmcache/v1/offload_server/abstract_server.py +37 -0
- lmcache/v1/offload_server/message.py +30 -0
- lmcache/v1/offload_server/zmq_server.py +122 -0
- lmcache/v1/periodic_thread.py +579 -0
- lmcache/v1/pin_monitor.py +246 -0
- lmcache/v1/plugin/__init__.py +0 -0
- lmcache/v1/plugin/runtime_plugin_launcher.py +211 -0
- lmcache/v1/protocol.py +317 -0
- lmcache/v1/rpc/__init__.py +17 -0
- lmcache/v1/rpc/transport.py +105 -0
- lmcache/v1/rpc/zmq_transport.py +213 -0
- lmcache/v1/rpc_utils.py +165 -0
- lmcache/v1/server/__init__.py +2 -0
- lmcache/v1/server/__main__.py +170 -0
- lmcache/v1/server/storage_backend/__init__.py +21 -0
- lmcache/v1/server/storage_backend/abstract_backend.py +80 -0
- lmcache/v1/server/storage_backend/local_backend.py +75 -0
- lmcache/v1/server/utils.py +21 -0
- lmcache/v1/standalone/__init__.py +1 -0
- lmcache/v1/standalone/__main__.py +583 -0
- lmcache/v1/standalone/manager.py +80 -0
- lmcache/v1/standalone/standalone_service_factory.py +86 -0
- lmcache/v1/storage_backend/__init__.py +313 -0
- lmcache/v1/storage_backend/abstract_backend.py +445 -0
- lmcache/v1/storage_backend/audit_backend.py +233 -0
- lmcache/v1/storage_backend/batched_message_sender.py +222 -0
- lmcache/v1/storage_backend/cache_policy/__init__.py +45 -0
- lmcache/v1/storage_backend/cache_policy/base_policy.py +87 -0
- lmcache/v1/storage_backend/cache_policy/fifo.py +58 -0
- lmcache/v1/storage_backend/cache_policy/lfu.py +105 -0
- lmcache/v1/storage_backend/cache_policy/lru.py +81 -0
- lmcache/v1/storage_backend/cache_policy/mru.py +61 -0
- lmcache/v1/storage_backend/connector/__init__.py +443 -0
- lmcache/v1/storage_backend/connector/audit_adapter.py +77 -0
- lmcache/v1/storage_backend/connector/audit_connector.py +320 -0
- lmcache/v1/storage_backend/connector/base_connector.py +379 -0
- lmcache/v1/storage_backend/connector/blackhole_adapter.py +21 -0
- lmcache/v1/storage_backend/connector/blackhole_connector.py +37 -0
- lmcache/v1/storage_backend/connector/eic_adapter.py +31 -0
- lmcache/v1/storage_backend/connector/eic_connector.py +757 -0
- lmcache/v1/storage_backend/connector/external_adapter.py +79 -0
- lmcache/v1/storage_backend/connector/fs_adapter.py +51 -0
- lmcache/v1/storage_backend/connector/fs_connector.py +403 -0
- lmcache/v1/storage_backend/connector/infinistore_adapter.py +56 -0
- lmcache/v1/storage_backend/connector/infinistore_connector.py +177 -0
- lmcache/v1/storage_backend/connector/instrumented_connector.py +219 -0
- lmcache/v1/storage_backend/connector/lm_adapter.py +31 -0
- lmcache/v1/storage_backend/connector/lm_connector.py +176 -0
- lmcache/v1/storage_backend/connector/mock_adapter.py +57 -0
- lmcache/v1/storage_backend/connector/mock_connector.py +349 -0
- lmcache/v1/storage_backend/connector/mooncakestore_adapter.py +43 -0
- lmcache/v1/storage_backend/connector/mooncakestore_connector.py +614 -0
- lmcache/v1/storage_backend/connector/redis_adapter.py +181 -0
- lmcache/v1/storage_backend/connector/redis_connector.py +828 -0
- lmcache/v1/storage_backend/connector/s3_adapter.py +59 -0
- lmcache/v1/storage_backend/connector/s3_connector.py +699 -0
- lmcache/v1/storage_backend/connector/sagemaker_hyperpod_adapter.py +233 -0
- lmcache/v1/storage_backend/connector/sagemaker_hyperpod_connector.py +987 -0
- lmcache/v1/storage_backend/connector/valkey_adapter.py +114 -0
- lmcache/v1/storage_backend/connector/valkey_connector.py +627 -0
- lmcache/v1/storage_backend/gds_backend.py +1199 -0
- lmcache/v1/storage_backend/job_executor/__init__.py +0 -0
- lmcache/v1/storage_backend/job_executor/base_executor.py +34 -0
- lmcache/v1/storage_backend/job_executor/pq_executor.py +235 -0
- lmcache/v1/storage_backend/local_cpu_backend.py +810 -0
- lmcache/v1/storage_backend/local_disk_backend.py +656 -0
- lmcache/v1/storage_backend/maru_backend.py +734 -0
- lmcache/v1/storage_backend/naive_serde/__init__.py +50 -0
- lmcache/v1/storage_backend/naive_serde/cachegen_basics.py +133 -0
- lmcache/v1/storage_backend/naive_serde/cachegen_decoder.py +135 -0
- lmcache/v1/storage_backend/naive_serde/cachegen_encoder.py +83 -0
- lmcache/v1/storage_backend/naive_serde/kivi_serde.py +22 -0
- lmcache/v1/storage_backend/naive_serde/naive_serde.py +18 -0
- lmcache/v1/storage_backend/naive_serde/serde.py +37 -0
- lmcache/v1/storage_backend/native_clients/connector_client_base.py +165 -0
- lmcache/v1/storage_backend/native_clients/resp_client.py +35 -0
- lmcache/v1/storage_backend/nixl_storage_backend.py +1400 -0
- lmcache/v1/storage_backend/p2p_backend.py +788 -0
- lmcache/v1/storage_backend/path_sharder.py +117 -0
- lmcache/v1/storage_backend/pd_backend.py +646 -0
- lmcache/v1/storage_backend/plugins/dax_backend.py +1443 -0
- lmcache/v1/storage_backend/plugins/rust_raw_block_backend.py +1361 -0
- lmcache/v1/storage_backend/remote_backend.py +624 -0
- lmcache/v1/storage_backend/resp_client.py +227 -0
- lmcache/v1/storage_backend/storage_backend_listener.py +19 -0
- lmcache/v1/storage_backend/storage_manager.py +1352 -0
- lmcache/v1/system_detection.py +110 -0
- lmcache/v1/token_database.py +551 -0
- lmcache/v1/transfer_channel/__init__.py +83 -0
- lmcache/v1/transfer_channel/abstract.py +285 -0
- lmcache/v1/transfer_channel/mock_memory_channel.py +156 -0
- lmcache/v1/transfer_channel/nixl_channel.py +639 -0
- lmcache/v1/transfer_channel/py_socket_channel.py +260 -0
- lmcache/v1/transfer_channel/transfer_utils.py +63 -0
- lmcache/v1/utils/__init__.py +1 -0
- lmcache/v1/utils/bloom_filter.py +109 -0
- lmcache/v1/utils/cache_utils.py +125 -0
- lmcache_cli-0.4.5.dev0.dist-info/METADATA +185 -0
- lmcache_cli-0.4.5.dev0.dist-info/RECORD +399 -0
- lmcache_cli-0.4.5.dev0.dist-info/WHEEL +5 -0
- lmcache_cli-0.4.5.dev0.dist-info/entry_points.txt +2 -0
- lmcache_cli-0.4.5.dev0.dist-info/licenses/LICENSE +201 -0
- lmcache_cli-0.4.5.dev0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Third Party
|
|
3
|
+
from fastapi import APIRouter
|
|
4
|
+
from starlette.requests import Request
|
|
5
|
+
from starlette.responses import JSONResponse
|
|
6
|
+
|
|
7
|
+
# First Party
|
|
8
|
+
from lmcache.logging import init_logger
|
|
9
|
+
|
|
10
|
+
logger = init_logger(__name__)
|
|
11
|
+
|
|
12
|
+
router = APIRouter()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _get_storage_manager(request: Request):
|
|
16
|
+
"""Extract storage_manager from the request app state.
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
The StorageManager instance, or None if unavailable.
|
|
20
|
+
"""
|
|
21
|
+
engine = getattr(
|
|
22
|
+
request.app.state.lmcache_adapter,
|
|
23
|
+
"lmcache_engine",
|
|
24
|
+
None,
|
|
25
|
+
)
|
|
26
|
+
if engine is None:
|
|
27
|
+
return None
|
|
28
|
+
return getattr(engine, "storage_manager", None)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _unavailable_response(endpoint: str) -> JSONResponse:
|
|
32
|
+
"""Return a 503 response when the engine is unavailable."""
|
|
33
|
+
return JSONResponse(
|
|
34
|
+
content={
|
|
35
|
+
"error": "%s API is unavailable" % endpoint,
|
|
36
|
+
"message": "LMCache engine not configured.",
|
|
37
|
+
},
|
|
38
|
+
status_code=503,
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@router.get("/backends")
|
|
43
|
+
async def list_backends(request: Request):
|
|
44
|
+
"""List all active storage backends.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
JSONResponse: JSON dict mapping backend name
|
|
48
|
+
to class name.
|
|
49
|
+
|
|
50
|
+
Example:
|
|
51
|
+
.. code-block:: bash
|
|
52
|
+
|
|
53
|
+
curl http://localhost:7000/backends
|
|
54
|
+
"""
|
|
55
|
+
sm = _get_storage_manager(request)
|
|
56
|
+
if sm is None:
|
|
57
|
+
return _unavailable_response("/backends")
|
|
58
|
+
|
|
59
|
+
try:
|
|
60
|
+
backends = sm.list_backends()
|
|
61
|
+
return JSONResponse(content=backends)
|
|
62
|
+
except Exception as e:
|
|
63
|
+
logger.exception("Failed to list backends")
|
|
64
|
+
return JSONResponse(
|
|
65
|
+
content={
|
|
66
|
+
"error": "Failed to list backends",
|
|
67
|
+
"message": str(e),
|
|
68
|
+
},
|
|
69
|
+
status_code=500,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@router.delete("/backends/{backend_name}")
|
|
74
|
+
async def close_backend(request: Request, backend_name: str):
|
|
75
|
+
"""Close and remove a specific storage backend.
|
|
76
|
+
|
|
77
|
+
The backend will be closed and removed from the internal
|
|
78
|
+
dict so that no stale references remain.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
backend_name: Name of the backend to close
|
|
82
|
+
(e.g. ``RemoteBackend``, ``LocalDiskBackend``).
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
JSONResponse: Status of the close operation.
|
|
86
|
+
|
|
87
|
+
Example:
|
|
88
|
+
.. code-block:: bash
|
|
89
|
+
|
|
90
|
+
curl -X DELETE \\
|
|
91
|
+
http://localhost:7000/backends/RemoteBackend
|
|
92
|
+
"""
|
|
93
|
+
sm = _get_storage_manager(request)
|
|
94
|
+
if sm is None:
|
|
95
|
+
return _unavailable_response("/backends")
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
success = sm.close_backend(backend_name)
|
|
99
|
+
if success:
|
|
100
|
+
return JSONResponse(
|
|
101
|
+
content={
|
|
102
|
+
"status": "success",
|
|
103
|
+
"message": "Backend %s closed" % backend_name,
|
|
104
|
+
"backends": sm.list_backends(),
|
|
105
|
+
},
|
|
106
|
+
)
|
|
107
|
+
return JSONResponse(
|
|
108
|
+
content={
|
|
109
|
+
"status": "not_found",
|
|
110
|
+
"message": "Backend %s not found" % backend_name,
|
|
111
|
+
"backends": sm.list_backends(),
|
|
112
|
+
},
|
|
113
|
+
status_code=404,
|
|
114
|
+
)
|
|
115
|
+
except Exception as e:
|
|
116
|
+
logger.exception("Failed to close backend: %s", backend_name)
|
|
117
|
+
return JSONResponse(
|
|
118
|
+
content={
|
|
119
|
+
"error": "Failed to close backend",
|
|
120
|
+
"message": str(e),
|
|
121
|
+
},
|
|
122
|
+
status_code=500,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
@router.post("/backends")
|
|
127
|
+
async def create_backends(request: Request):
|
|
128
|
+
"""Create new storage backends from current config.
|
|
129
|
+
|
|
130
|
+
Backends that are already present will be skipped.
|
|
131
|
+
This allows a workflow of:
|
|
132
|
+
|
|
133
|
+
1. ``DELETE /backends/RemoteBackend`` — close old backend
|
|
134
|
+
2. ``POST /conf`` — update config (e.g. ``remote_url``)
|
|
135
|
+
3. ``POST /backends`` — create new backends from config
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
JSONResponse: Dict of newly created backends and the
|
|
139
|
+
full list of active backends.
|
|
140
|
+
|
|
141
|
+
Example:
|
|
142
|
+
.. code-block:: bash
|
|
143
|
+
|
|
144
|
+
curl -X POST http://localhost:7000/backends
|
|
145
|
+
"""
|
|
146
|
+
sm = _get_storage_manager(request)
|
|
147
|
+
if sm is None:
|
|
148
|
+
return _unavailable_response("/backends")
|
|
149
|
+
|
|
150
|
+
try:
|
|
151
|
+
created = sm.create_backends()
|
|
152
|
+
return JSONResponse(
|
|
153
|
+
content={
|
|
154
|
+
"status": "success",
|
|
155
|
+
"created": created,
|
|
156
|
+
"backends": sm.list_backends(),
|
|
157
|
+
},
|
|
158
|
+
)
|
|
159
|
+
except Exception as e:
|
|
160
|
+
logger.exception("Failed to create backends")
|
|
161
|
+
return JSONResponse(
|
|
162
|
+
content={
|
|
163
|
+
"error": "Failed to create backends",
|
|
164
|
+
"message": str(e),
|
|
165
|
+
},
|
|
166
|
+
status_code=500,
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
@router.post("/backends/{backend_name}/recreate")
|
|
171
|
+
async def recreate_backend(request: Request, backend_name: str):
|
|
172
|
+
"""Recreate a specific storage backend atomically.
|
|
173
|
+
|
|
174
|
+
The backend will be closed and recreated from the current
|
|
175
|
+
config in a single step.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
backend_name: Name of the backend to recreate
|
|
179
|
+
(e.g. ``RemoteBackend``).
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
JSONResponse: Dict of recreated backends and the
|
|
183
|
+
full list of active backends.
|
|
184
|
+
|
|
185
|
+
Example:
|
|
186
|
+
.. code-block:: bash
|
|
187
|
+
|
|
188
|
+
curl -X POST \\
|
|
189
|
+
http://localhost:7000/backends/RemoteBackend/recreate
|
|
190
|
+
"""
|
|
191
|
+
sm = _get_storage_manager(request)
|
|
192
|
+
if sm is None:
|
|
193
|
+
return _unavailable_response("/backends")
|
|
194
|
+
|
|
195
|
+
try:
|
|
196
|
+
created = sm.recreate_backend(backend_name)
|
|
197
|
+
return JSONResponse(
|
|
198
|
+
content={
|
|
199
|
+
"status": "success",
|
|
200
|
+
"recreated": created,
|
|
201
|
+
"backends": sm.list_backends(),
|
|
202
|
+
},
|
|
203
|
+
)
|
|
204
|
+
except KeyError:
|
|
205
|
+
return JSONResponse(
|
|
206
|
+
content={
|
|
207
|
+
"status": "not_found",
|
|
208
|
+
"message": ("Backend %s not found" % backend_name),
|
|
209
|
+
"backends": sm.list_backends(),
|
|
210
|
+
},
|
|
211
|
+
status_code=404,
|
|
212
|
+
)
|
|
213
|
+
except Exception as e:
|
|
214
|
+
logger.exception("Failed to recreate backend: %s", backend_name)
|
|
215
|
+
return JSONResponse(
|
|
216
|
+
content={
|
|
217
|
+
"error": "Failed to recreate backend",
|
|
218
|
+
"message": str(e),
|
|
219
|
+
},
|
|
220
|
+
status_code=500,
|
|
221
|
+
)
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
# Third Party
|
|
3
|
+
from fastapi import APIRouter
|
|
4
|
+
from starlette.requests import Request
|
|
5
|
+
from starlette.responses import JSONResponse
|
|
6
|
+
|
|
7
|
+
router = APIRouter()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _get_storage_manager(request: Request):
|
|
11
|
+
"""
|
|
12
|
+
Get the StorageManager from the request's app state.
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
Tuple of (storage_manager, error_response).
|
|
16
|
+
If storage_manager is None, error_response is set.
|
|
17
|
+
"""
|
|
18
|
+
lmcache_adapter = request.app.state.lmcache_adapter
|
|
19
|
+
lmcache_engine = getattr(lmcache_adapter, "lmcache_engine", None)
|
|
20
|
+
if not lmcache_engine:
|
|
21
|
+
error_info = {
|
|
22
|
+
"error": "Bypass API is unavailable",
|
|
23
|
+
"message": "LMCache engine not configured.",
|
|
24
|
+
}
|
|
25
|
+
return None, JSONResponse(
|
|
26
|
+
content=error_info,
|
|
27
|
+
status_code=503,
|
|
28
|
+
)
|
|
29
|
+
sm = lmcache_engine.storage_manager
|
|
30
|
+
if sm is None:
|
|
31
|
+
error_info = {
|
|
32
|
+
"error": "Bypass API is unavailable",
|
|
33
|
+
"message": "StorageManager not initialized.",
|
|
34
|
+
}
|
|
35
|
+
return None, JSONResponse(
|
|
36
|
+
content=error_info,
|
|
37
|
+
status_code=503,
|
|
38
|
+
)
|
|
39
|
+
return sm, None
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@router.get("/bypass/list")
|
|
43
|
+
async def list_bypassed_backends(request: Request):
|
|
44
|
+
"""
|
|
45
|
+
List all currently bypassed backends and all available
|
|
46
|
+
backend names.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
request: The FastAPI request object.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
JSONResponse: JSON with bypassed and all backends.
|
|
53
|
+
"""
|
|
54
|
+
try:
|
|
55
|
+
sm, err = _get_storage_manager(request)
|
|
56
|
+
if err:
|
|
57
|
+
return err
|
|
58
|
+
|
|
59
|
+
result = {
|
|
60
|
+
"status": "success",
|
|
61
|
+
"bypassed_backends": sm.get_bypassed_backends(),
|
|
62
|
+
"all_backends": sm.get_all_backend_names(),
|
|
63
|
+
}
|
|
64
|
+
return JSONResponse(content=result)
|
|
65
|
+
except Exception as e:
|
|
66
|
+
error_info = {
|
|
67
|
+
"error": "Failed to list bypassed backends",
|
|
68
|
+
"message": str(e),
|
|
69
|
+
}
|
|
70
|
+
return JSONResponse(
|
|
71
|
+
content=error_info,
|
|
72
|
+
status_code=500,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@router.put("/bypass/add")
|
|
77
|
+
async def add_bypass_backend(request: Request):
|
|
78
|
+
"""
|
|
79
|
+
Add a backend to the bypass list.
|
|
80
|
+
|
|
81
|
+
Query Parameters:
|
|
82
|
+
backend_name: The name of the backend to bypass.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
request: The FastAPI request object.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
JSONResponse: JSON with operation result.
|
|
89
|
+
"""
|
|
90
|
+
try:
|
|
91
|
+
sm, err = _get_storage_manager(request)
|
|
92
|
+
if err:
|
|
93
|
+
return err
|
|
94
|
+
|
|
95
|
+
backend_name = request.query_params.get("backend_name", "")
|
|
96
|
+
if not backend_name:
|
|
97
|
+
error_info = {
|
|
98
|
+
"error": "Missing parameter",
|
|
99
|
+
"message": "backend_name is required",
|
|
100
|
+
}
|
|
101
|
+
return JSONResponse(
|
|
102
|
+
content=error_info,
|
|
103
|
+
status_code=400,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
all_names = sm.get_all_backend_names()
|
|
107
|
+
if backend_name not in all_names:
|
|
108
|
+
error_info = {
|
|
109
|
+
"error": "Unknown backend",
|
|
110
|
+
"message": "Backend '%s' not found. "
|
|
111
|
+
"Available: %s" % (backend_name, all_names),
|
|
112
|
+
}
|
|
113
|
+
return JSONResponse(
|
|
114
|
+
content=error_info,
|
|
115
|
+
status_code=400,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
already = sm.is_backend_bypassed(backend_name)
|
|
119
|
+
if not already:
|
|
120
|
+
sm.set_backend_bypass(backend_name, True)
|
|
121
|
+
|
|
122
|
+
result = {
|
|
123
|
+
"status": "success",
|
|
124
|
+
"backend_name": backend_name,
|
|
125
|
+
"bypassed": True,
|
|
126
|
+
"was_already_bypassed": already,
|
|
127
|
+
"bypassed_backends": sm.get_bypassed_backends(),
|
|
128
|
+
}
|
|
129
|
+
return JSONResponse(content=result)
|
|
130
|
+
except Exception as e:
|
|
131
|
+
error_info = {
|
|
132
|
+
"error": "Failed to add bypass backend",
|
|
133
|
+
"message": str(e),
|
|
134
|
+
}
|
|
135
|
+
return JSONResponse(
|
|
136
|
+
content=error_info,
|
|
137
|
+
status_code=500,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
@router.put("/bypass/remove")
|
|
142
|
+
async def remove_bypass_backend(request: Request):
|
|
143
|
+
"""
|
|
144
|
+
Remove a backend from the bypass list, restoring it
|
|
145
|
+
to normal operation.
|
|
146
|
+
|
|
147
|
+
Query Parameters:
|
|
148
|
+
backend_name: The backend name to restore.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
request: The FastAPI request object.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
JSONResponse: JSON with operation result.
|
|
155
|
+
"""
|
|
156
|
+
try:
|
|
157
|
+
sm, err = _get_storage_manager(request)
|
|
158
|
+
if err:
|
|
159
|
+
return err
|
|
160
|
+
|
|
161
|
+
backend_name = request.query_params.get("backend_name", "")
|
|
162
|
+
if not backend_name:
|
|
163
|
+
error_info = {
|
|
164
|
+
"error": "Missing parameter",
|
|
165
|
+
"message": "backend_name is required",
|
|
166
|
+
}
|
|
167
|
+
return JSONResponse(
|
|
168
|
+
content=error_info,
|
|
169
|
+
status_code=400,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
all_names = sm.get_all_backend_names()
|
|
173
|
+
if backend_name not in all_names:
|
|
174
|
+
error_info = {
|
|
175
|
+
"error": "Unknown backend",
|
|
176
|
+
"message": "Backend '%s' not found. "
|
|
177
|
+
"Available: %s" % (backend_name, all_names),
|
|
178
|
+
}
|
|
179
|
+
return JSONResponse(
|
|
180
|
+
content=error_info,
|
|
181
|
+
status_code=400,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
was_bypassed = sm.is_backend_bypassed(backend_name)
|
|
185
|
+
if was_bypassed:
|
|
186
|
+
sm.set_backend_bypass(backend_name, False)
|
|
187
|
+
|
|
188
|
+
result = {
|
|
189
|
+
"status": "success",
|
|
190
|
+
"backend_name": backend_name,
|
|
191
|
+
"bypassed": False,
|
|
192
|
+
"was_bypassed": was_bypassed,
|
|
193
|
+
"bypassed_backends": sm.get_bypassed_backends(),
|
|
194
|
+
}
|
|
195
|
+
return JSONResponse(content=result)
|
|
196
|
+
except Exception as e:
|
|
197
|
+
error_info = {
|
|
198
|
+
"error": "Failed to remove bypass backend",
|
|
199
|
+
"message": str(e),
|
|
200
|
+
}
|
|
201
|
+
return JSONResponse(
|
|
202
|
+
content=error_info,
|
|
203
|
+
status_code=500,
|
|
204
|
+
)
|