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.
Files changed (399) hide show
  1. lmcache/__init__.py +84 -0
  2. lmcache/_version.py +24 -0
  3. lmcache/cli/__init__.py +1 -0
  4. lmcache/cli/commands/__init__.py +34 -0
  5. lmcache/cli/commands/base.py +157 -0
  6. lmcache/cli/commands/bench/__init__.py +557 -0
  7. lmcache/cli/commands/bench/engine_bench/__init__.py +1 -0
  8. lmcache/cli/commands/bench/engine_bench/config.py +245 -0
  9. lmcache/cli/commands/bench/engine_bench/interactive/__init__.py +274 -0
  10. lmcache/cli/commands/bench/engine_bench/interactive/config.json +10 -0
  11. lmcache/cli/commands/bench/engine_bench/interactive/schema.py +352 -0
  12. lmcache/cli/commands/bench/engine_bench/interactive/state.py +327 -0
  13. lmcache/cli/commands/bench/engine_bench/interactive/terminal.py +291 -0
  14. lmcache/cli/commands/bench/engine_bench/progress.py +145 -0
  15. lmcache/cli/commands/bench/engine_bench/request_sender.py +232 -0
  16. lmcache/cli/commands/bench/engine_bench/stats.py +275 -0
  17. lmcache/cli/commands/bench/engine_bench/workloads/__init__.py +153 -0
  18. lmcache/cli/commands/bench/engine_bench/workloads/base.py +122 -0
  19. lmcache/cli/commands/bench/engine_bench/workloads/long_doc_permutator.py +435 -0
  20. lmcache/cli/commands/bench/engine_bench/workloads/long_doc_qa.py +281 -0
  21. lmcache/cli/commands/bench/engine_bench/workloads/multi_round_chat.py +337 -0
  22. lmcache/cli/commands/bench/engine_bench/workloads/random_prefill.py +178 -0
  23. lmcache/cli/commands/describe.py +310 -0
  24. lmcache/cli/commands/kvcache.py +133 -0
  25. lmcache/cli/commands/mock.py +75 -0
  26. lmcache/cli/commands/ping.py +113 -0
  27. lmcache/cli/commands/query/__init__.py +155 -0
  28. lmcache/cli/commands/query/prompt.py +134 -0
  29. lmcache/cli/commands/query/request.py +357 -0
  30. lmcache/cli/commands/server.py +99 -0
  31. lmcache/cli/commands/tool/__init__.py +63 -0
  32. lmcache/cli/commands/tool/cache_simulator.py +113 -0
  33. lmcache/cli/commands/trace/__init__.py +505 -0
  34. lmcache/cli/commands/trace/dispatch.py +249 -0
  35. lmcache/cli/commands/trace/driver.py +372 -0
  36. lmcache/cli/commands/trace/stats.py +289 -0
  37. lmcache/cli/documents/lmcache.txt +11 -0
  38. lmcache/cli/main.py +42 -0
  39. lmcache/cli/metrics/__init__.py +29 -0
  40. lmcache/cli/metrics/formatter.py +171 -0
  41. lmcache/cli/metrics/handler.py +94 -0
  42. lmcache/cli/metrics/metrics.py +161 -0
  43. lmcache/cli/metrics/section.py +77 -0
  44. lmcache/connections.py +173 -0
  45. lmcache/integration/__init__.py +2 -0
  46. lmcache/integration/base_service_factory.py +165 -0
  47. lmcache/integration/request_telemetry/__init__.py +1 -0
  48. lmcache/integration/request_telemetry/base.py +51 -0
  49. lmcache/integration/request_telemetry/factory.py +113 -0
  50. lmcache/integration/request_telemetry/fastapi.py +109 -0
  51. lmcache/integration/request_telemetry/noop.py +35 -0
  52. lmcache/integration/sglang/__init__.py +2 -0
  53. lmcache/integration/sglang/sglang_adapter.py +326 -0
  54. lmcache/integration/sglang/utils.py +39 -0
  55. lmcache/integration/vllm/__init__.py +1 -0
  56. lmcache/integration/vllm/lmcache_connector_v1.py +213 -0
  57. lmcache/integration/vllm/lmcache_connector_v1_085.py +150 -0
  58. lmcache/integration/vllm/lmcache_mp_connector_0180.py +1072 -0
  59. lmcache/integration/vllm/tests/test_mm_hash_utils.py +112 -0
  60. lmcache/integration/vllm/utils.py +433 -0
  61. lmcache/integration/vllm/vllm_multi_process_adapter.py +1090 -0
  62. lmcache/integration/vllm/vllm_service_factory.py +339 -0
  63. lmcache/integration/vllm/vllm_v1_adapter.py +1713 -0
  64. lmcache/logging.py +107 -0
  65. lmcache/native_storage_ops.pyi +230 -0
  66. lmcache/non_cuda_equivalents.py +1424 -0
  67. lmcache/observability.py +1958 -0
  68. lmcache/storage_backend/serde/__init__.py +1 -0
  69. lmcache/storage_backend/serde/cachegen_basics.py +210 -0
  70. lmcache/storage_backend/serde/cachegen_decoder.py +207 -0
  71. lmcache/storage_backend/serde/cachegen_encoder.py +394 -0
  72. lmcache/storage_backend/serde/serde.py +75 -0
  73. lmcache/tools/__init__.py +1 -0
  74. lmcache/tools/cache_simulator/README.md +392 -0
  75. lmcache/tools/cache_simulator/__init__.py +1 -0
  76. lmcache/tools/cache_simulator/docs/simulate_example.png +0 -0
  77. lmcache/tools/cache_simulator/docs/sweep_example.png +0 -0
  78. lmcache/tools/cache_simulator/gen_bench_dataset.py +360 -0
  79. lmcache/tools/cache_simulator/lru_cache.py +124 -0
  80. lmcache/tools/cache_simulator/plot_hit_rate.py +231 -0
  81. lmcache/tools/cache_simulator/simulator.py +795 -0
  82. lmcache/tools/controller_benchmark/README.md +161 -0
  83. lmcache/tools/controller_benchmark/__init__.py +1 -0
  84. lmcache/tools/controller_benchmark/__main__.py +331 -0
  85. lmcache/tools/controller_benchmark/benchmark.py +660 -0
  86. lmcache/tools/controller_benchmark/config.py +44 -0
  87. lmcache/tools/controller_benchmark/constants.py +10 -0
  88. lmcache/tools/controller_benchmark/handlers/__init__.py +46 -0
  89. lmcache/tools/controller_benchmark/handlers/admit.py +52 -0
  90. lmcache/tools/controller_benchmark/handlers/base.py +47 -0
  91. lmcache/tools/controller_benchmark/handlers/deregister.py +49 -0
  92. lmcache/tools/controller_benchmark/handlers/evict.py +52 -0
  93. lmcache/tools/controller_benchmark/handlers/heartbeat.py +56 -0
  94. lmcache/tools/controller_benchmark/handlers/p2p_lookup.py +47 -0
  95. lmcache/tools/controller_benchmark/handlers/register.py +56 -0
  96. lmcache/tools/mp_status_viewer/__init__.py +1 -0
  97. lmcache/tools/mp_status_viewer/__main__.py +95 -0
  98. lmcache/usage_context.py +417 -0
  99. lmcache/utils.py +665 -0
  100. lmcache/v1/__init__.py +2 -0
  101. lmcache/v1/api_server/__init__.py +2 -0
  102. lmcache/v1/api_server/__main__.py +537 -0
  103. lmcache/v1/basic_check.py +112 -0
  104. lmcache/v1/cache_controller/__init__.py +9 -0
  105. lmcache/v1/cache_controller/commands/__init__.py +15 -0
  106. lmcache/v1/cache_controller/commands/base.py +35 -0
  107. lmcache/v1/cache_controller/commands/full_sync.py +49 -0
  108. lmcache/v1/cache_controller/config.py +176 -0
  109. lmcache/v1/cache_controller/controller_manager.py +535 -0
  110. lmcache/v1/cache_controller/controllers/__init__.py +11 -0
  111. lmcache/v1/cache_controller/controllers/full_sync_tracker.py +473 -0
  112. lmcache/v1/cache_controller/controllers/kv_controller.py +439 -0
  113. lmcache/v1/cache_controller/controllers/registration_controller.py +282 -0
  114. lmcache/v1/cache_controller/executor.py +463 -0
  115. lmcache/v1/cache_controller/frontend/static/css/style.css +201 -0
  116. lmcache/v1/cache_controller/frontend/static/img/logo.png +0 -0
  117. lmcache/v1/cache_controller/frontend/static/index.html +234 -0
  118. lmcache/v1/cache_controller/frontend/static/js/controller_app.js +660 -0
  119. lmcache/v1/cache_controller/full_sync_sender.py +475 -0
  120. lmcache/v1/cache_controller/locks.py +149 -0
  121. lmcache/v1/cache_controller/message.py +828 -0
  122. lmcache/v1/cache_controller/observability.py +208 -0
  123. lmcache/v1/cache_controller/utils.py +679 -0
  124. lmcache/v1/cache_controller/worker.py +665 -0
  125. lmcache/v1/cache_engine.py +2058 -0
  126. lmcache/v1/cache_interface.py +19 -0
  127. lmcache/v1/check/__init__.py +74 -0
  128. lmcache/v1/check/check_mode_gen.py +86 -0
  129. lmcache/v1/check/check_mode_test_l2_adapter.py +284 -0
  130. lmcache/v1/check/check_mode_test_remote.py +155 -0
  131. lmcache/v1/check/check_mode_test_storage_manager.py +142 -0
  132. lmcache/v1/check/utils.py +571 -0
  133. lmcache/v1/compute/__init__.py +2 -0
  134. lmcache/v1/compute/attention/__init__.py +0 -0
  135. lmcache/v1/compute/attention/abstract.py +39 -0
  136. lmcache/v1/compute/attention/flash_attn.py +129 -0
  137. lmcache/v1/compute/attention/flash_infer_sparse.py +284 -0
  138. lmcache/v1/compute/attention/metadata.py +85 -0
  139. lmcache/v1/compute/attention/utils.py +14 -0
  140. lmcache/v1/compute/blend/__init__.py +7 -0
  141. lmcache/v1/compute/blend/blender.py +168 -0
  142. lmcache/v1/compute/blend/metadata.py +34 -0
  143. lmcache/v1/compute/blend/utils.py +63 -0
  144. lmcache/v1/compute/models/__init__.py +0 -0
  145. lmcache/v1/compute/models/base.py +141 -0
  146. lmcache/v1/compute/models/llama.py +9 -0
  147. lmcache/v1/compute/models/qwen3.py +24 -0
  148. lmcache/v1/compute/models/utils.py +68 -0
  149. lmcache/v1/compute/positional_encoding.py +199 -0
  150. lmcache/v1/config.py +848 -0
  151. lmcache/v1/config_base.py +848 -0
  152. lmcache/v1/distributed/api.py +248 -0
  153. lmcache/v1/distributed/config.py +321 -0
  154. lmcache/v1/distributed/error.py +64 -0
  155. lmcache/v1/distributed/eviction.py +192 -0
  156. lmcache/v1/distributed/eviction_policy/__init__.py +21 -0
  157. lmcache/v1/distributed/eviction_policy/factory.py +27 -0
  158. lmcache/v1/distributed/eviction_policy/lru.py +244 -0
  159. lmcache/v1/distributed/eviction_policy/noop.py +50 -0
  160. lmcache/v1/distributed/internal_api.py +170 -0
  161. lmcache/v1/distributed/l1_manager.py +835 -0
  162. lmcache/v1/distributed/l2_adapters/__init__.py +67 -0
  163. lmcache/v1/distributed/l2_adapters/base.py +360 -0
  164. lmcache/v1/distributed/l2_adapters/config.py +385 -0
  165. lmcache/v1/distributed/l2_adapters/factory.py +205 -0
  166. lmcache/v1/distributed/l2_adapters/fs_l2_adapter.py +747 -0
  167. lmcache/v1/distributed/l2_adapters/fs_native_l2_adapter.py +167 -0
  168. lmcache/v1/distributed/l2_adapters/mock_l2_adapter.py +516 -0
  169. lmcache/v1/distributed/l2_adapters/mooncake_store_l2_adapter.py +135 -0
  170. lmcache/v1/distributed/l2_adapters/native_connector_l2_adapter.py +468 -0
  171. lmcache/v1/distributed/l2_adapters/native_plugin_l2_adapter.py +199 -0
  172. lmcache/v1/distributed/l2_adapters/nixl_store_dynamic_l2_adapter.py +831 -0
  173. lmcache/v1/distributed/l2_adapters/nixl_store_l2_adapter.py +983 -0
  174. lmcache/v1/distributed/l2_adapters/plugin_l2_adapter.py +210 -0
  175. lmcache/v1/distributed/l2_adapters/resp_l2_adapter.py +176 -0
  176. lmcache/v1/distributed/memory_manager.py +179 -0
  177. lmcache/v1/distributed/storage_controller.py +39 -0
  178. lmcache/v1/distributed/storage_controllers/__init__.py +43 -0
  179. lmcache/v1/distributed/storage_controllers/eviction_controller.py +242 -0
  180. lmcache/v1/distributed/storage_controllers/prefetch_controller.py +830 -0
  181. lmcache/v1/distributed/storage_controllers/prefetch_policy.py +193 -0
  182. lmcache/v1/distributed/storage_controllers/store_controller.py +452 -0
  183. lmcache/v1/distributed/storage_controllers/store_policy.py +213 -0
  184. lmcache/v1/distributed/storage_manager.py +532 -0
  185. lmcache/v1/event_manager.py +145 -0
  186. lmcache/v1/exceptions/__init__.py +16 -0
  187. lmcache/v1/gpu_connector/__init__.py +126 -0
  188. lmcache/v1/gpu_connector/gpu_connectors.py +1906 -0
  189. lmcache/v1/gpu_connector/gpu_ops.py +85 -0
  190. lmcache/v1/gpu_connector/hpu_connector.py +326 -0
  191. lmcache/v1/gpu_connector/mock_gpu_connector.py +67 -0
  192. lmcache/v1/gpu_connector/utils.py +890 -0
  193. lmcache/v1/gpu_connector/xpu_connectors.py +916 -0
  194. lmcache/v1/health_monitor/__init__.py +1 -0
  195. lmcache/v1/health_monitor/base.py +587 -0
  196. lmcache/v1/health_monitor/checks/__init__.py +1 -0
  197. lmcache/v1/health_monitor/checks/remote_backend_check.py +304 -0
  198. lmcache/v1/health_monitor/constants.py +36 -0
  199. lmcache/v1/internal_api_server/__init__.py +0 -0
  200. lmcache/v1/internal_api_server/api_registry.py +59 -0
  201. lmcache/v1/internal_api_server/api_server.py +120 -0
  202. lmcache/v1/internal_api_server/common/__init__.py +1 -0
  203. lmcache/v1/internal_api_server/common/env_api.py +22 -0
  204. lmcache/v1/internal_api_server/common/loglevel_api.py +57 -0
  205. lmcache/v1/internal_api_server/common/metrics_api.py +29 -0
  206. lmcache/v1/internal_api_server/common/periodic_thread_api.py +138 -0
  207. lmcache/v1/internal_api_server/common/run_script_api.py +73 -0
  208. lmcache/v1/internal_api_server/common/thread_api.py +63 -0
  209. lmcache/v1/internal_api_server/controller/__init__.py +1 -0
  210. lmcache/v1/internal_api_server/controller/key_stats_api.py +81 -0
  211. lmcache/v1/internal_api_server/controller/worker_info_api.py +136 -0
  212. lmcache/v1/internal_api_server/utils.py +43 -0
  213. lmcache/v1/internal_api_server/vllm/__init__.py +1 -0
  214. lmcache/v1/internal_api_server/vllm/backend_api.py +221 -0
  215. lmcache/v1/internal_api_server/vllm/bypass_api.py +204 -0
  216. lmcache/v1/internal_api_server/vllm/cache_api.py +895 -0
  217. lmcache/v1/internal_api_server/vllm/chunk_statistics_api.py +141 -0
  218. lmcache/v1/internal_api_server/vllm/conf_api.py +147 -0
  219. lmcache/v1/internal_api_server/vllm/freeze_api.py +172 -0
  220. lmcache/v1/internal_api_server/vllm/hot_cache_api.py +184 -0
  221. lmcache/v1/internal_api_server/vllm/inference_api.py +65 -0
  222. lmcache/v1/internal_api_server/vllm/load_fs_chunks_api.py +320 -0
  223. lmcache/v1/internal_api_server/vllm/lookup_api.py +145 -0
  224. lmcache/v1/internal_api_server/vllm/version_api.py +25 -0
  225. lmcache/v1/kv_layer_groups.py +267 -0
  226. lmcache/v1/lazy_memory_allocator.py +284 -0
  227. lmcache/v1/lookup_client/__init__.py +25 -0
  228. lmcache/v1/lookup_client/abstract_client.py +77 -0
  229. lmcache/v1/lookup_client/async_lookup_message.py +50 -0
  230. lmcache/v1/lookup_client/chunk_statistics_lookup_client.py +200 -0
  231. lmcache/v1/lookup_client/factory.py +251 -0
  232. lmcache/v1/lookup_client/hit_limit_lookup_client.py +86 -0
  233. lmcache/v1/lookup_client/lmcache_async_lookup_client.py +407 -0
  234. lmcache/v1/lookup_client/lmcache_lookup_client.py +285 -0
  235. lmcache/v1/lookup_client/lmcache_lookup_client_bypass.py +99 -0
  236. lmcache/v1/lookup_client/mooncake_lookup_client.py +87 -0
  237. lmcache/v1/lookup_client/record_strategies/__init__.py +77 -0
  238. lmcache/v1/lookup_client/record_strategies/base.py +327 -0
  239. lmcache/v1/lookup_client/record_strategies/file_hash.py +130 -0
  240. lmcache/v1/lookup_client/record_strategies/memory_bloom_filter.py +81 -0
  241. lmcache/v1/manager.py +539 -0
  242. lmcache/v1/memory_management.py +2619 -0
  243. lmcache/v1/metadata.py +114 -0
  244. lmcache/v1/mp_observability/AGENTS.override.md +21 -0
  245. lmcache/v1/mp_observability/README.md +204 -0
  246. lmcache/v1/mp_observability/config.py +340 -0
  247. lmcache/v1/mp_observability/event.py +100 -0
  248. lmcache/v1/mp_observability/event_bus.py +313 -0
  249. lmcache/v1/mp_observability/otel_init.py +145 -0
  250. lmcache/v1/mp_observability/subscribers/__init__.py +28 -0
  251. lmcache/v1/mp_observability/subscribers/logging/__init__.py +19 -0
  252. lmcache/v1/mp_observability/subscribers/logging/l1.py +56 -0
  253. lmcache/v1/mp_observability/subscribers/logging/l2.py +73 -0
  254. lmcache/v1/mp_observability/subscribers/logging/lookup_hash.py +209 -0
  255. lmcache/v1/mp_observability/subscribers/logging/mp_server.py +90 -0
  256. lmcache/v1/mp_observability/subscribers/logging/sm.py +59 -0
  257. lmcache/v1/mp_observability/subscribers/metrics/__init__.py +20 -0
  258. lmcache/v1/mp_observability/subscribers/metrics/l0_lifecycle.py +290 -0
  259. lmcache/v1/mp_observability/subscribers/metrics/l1.py +55 -0
  260. lmcache/v1/mp_observability/subscribers/metrics/l1_lifecycle.py +166 -0
  261. lmcache/v1/mp_observability/subscribers/metrics/l2.py +121 -0
  262. lmcache/v1/mp_observability/subscribers/metrics/sm.py +69 -0
  263. lmcache/v1/mp_observability/subscribers/tracing/__init__.py +12 -0
  264. lmcache/v1/mp_observability/subscribers/tracing/mp_server.py +333 -0
  265. lmcache/v1/mp_observability/subscribers/tracing/span_registry.py +148 -0
  266. lmcache/v1/mp_observability/trace/__init__.py +50 -0
  267. lmcache/v1/mp_observability/trace/codecs.py +255 -0
  268. lmcache/v1/mp_observability/trace/decorator.py +147 -0
  269. lmcache/v1/mp_observability/trace/format.py +132 -0
  270. lmcache/v1/mp_observability/trace/lifecycle.py +83 -0
  271. lmcache/v1/mp_observability/trace/reader.py +167 -0
  272. lmcache/v1/mp_observability/trace/recorder.py +300 -0
  273. lmcache/v1/multiprocess/__init__.py +0 -0
  274. lmcache/v1/multiprocess/affinity_pool.py +102 -0
  275. lmcache/v1/multiprocess/blend_server_v2.py +891 -0
  276. lmcache/v1/multiprocess/config.py +253 -0
  277. lmcache/v1/multiprocess/custom_types.py +281 -0
  278. lmcache/v1/multiprocess/futures.py +194 -0
  279. lmcache/v1/multiprocess/gpu_context.py +511 -0
  280. lmcache/v1/multiprocess/http_server.py +235 -0
  281. lmcache/v1/multiprocess/mp_runtime_plugin_launcher.py +130 -0
  282. lmcache/v1/multiprocess/mq.py +732 -0
  283. lmcache/v1/multiprocess/protocol.py +86 -0
  284. lmcache/v1/multiprocess/protocols/README.md +213 -0
  285. lmcache/v1/multiprocess/protocols/__init__.py +127 -0
  286. lmcache/v1/multiprocess/protocols/base.py +89 -0
  287. lmcache/v1/multiprocess/protocols/blend.py +109 -0
  288. lmcache/v1/multiprocess/protocols/blend_v2.py +57 -0
  289. lmcache/v1/multiprocess/protocols/controller.py +53 -0
  290. lmcache/v1/multiprocess/protocols/debug.py +34 -0
  291. lmcache/v1/multiprocess/protocols/engine.py +146 -0
  292. lmcache/v1/multiprocess/protocols/observability.py +39 -0
  293. lmcache/v1/multiprocess/server.py +1134 -0
  294. lmcache/v1/multiprocess/session.py +190 -0
  295. lmcache/v1/multiprocess/token_hasher.py +441 -0
  296. lmcache/v1/offload_server/__init__.py +17 -0
  297. lmcache/v1/offload_server/abstract_server.py +37 -0
  298. lmcache/v1/offload_server/message.py +30 -0
  299. lmcache/v1/offload_server/zmq_server.py +122 -0
  300. lmcache/v1/periodic_thread.py +579 -0
  301. lmcache/v1/pin_monitor.py +246 -0
  302. lmcache/v1/plugin/__init__.py +0 -0
  303. lmcache/v1/plugin/runtime_plugin_launcher.py +211 -0
  304. lmcache/v1/protocol.py +317 -0
  305. lmcache/v1/rpc/__init__.py +17 -0
  306. lmcache/v1/rpc/transport.py +105 -0
  307. lmcache/v1/rpc/zmq_transport.py +213 -0
  308. lmcache/v1/rpc_utils.py +165 -0
  309. lmcache/v1/server/__init__.py +2 -0
  310. lmcache/v1/server/__main__.py +170 -0
  311. lmcache/v1/server/storage_backend/__init__.py +21 -0
  312. lmcache/v1/server/storage_backend/abstract_backend.py +80 -0
  313. lmcache/v1/server/storage_backend/local_backend.py +75 -0
  314. lmcache/v1/server/utils.py +21 -0
  315. lmcache/v1/standalone/__init__.py +1 -0
  316. lmcache/v1/standalone/__main__.py +583 -0
  317. lmcache/v1/standalone/manager.py +80 -0
  318. lmcache/v1/standalone/standalone_service_factory.py +86 -0
  319. lmcache/v1/storage_backend/__init__.py +313 -0
  320. lmcache/v1/storage_backend/abstract_backend.py +445 -0
  321. lmcache/v1/storage_backend/audit_backend.py +233 -0
  322. lmcache/v1/storage_backend/batched_message_sender.py +222 -0
  323. lmcache/v1/storage_backend/cache_policy/__init__.py +45 -0
  324. lmcache/v1/storage_backend/cache_policy/base_policy.py +87 -0
  325. lmcache/v1/storage_backend/cache_policy/fifo.py +58 -0
  326. lmcache/v1/storage_backend/cache_policy/lfu.py +105 -0
  327. lmcache/v1/storage_backend/cache_policy/lru.py +81 -0
  328. lmcache/v1/storage_backend/cache_policy/mru.py +61 -0
  329. lmcache/v1/storage_backend/connector/__init__.py +443 -0
  330. lmcache/v1/storage_backend/connector/audit_adapter.py +77 -0
  331. lmcache/v1/storage_backend/connector/audit_connector.py +320 -0
  332. lmcache/v1/storage_backend/connector/base_connector.py +379 -0
  333. lmcache/v1/storage_backend/connector/blackhole_adapter.py +21 -0
  334. lmcache/v1/storage_backend/connector/blackhole_connector.py +37 -0
  335. lmcache/v1/storage_backend/connector/eic_adapter.py +31 -0
  336. lmcache/v1/storage_backend/connector/eic_connector.py +757 -0
  337. lmcache/v1/storage_backend/connector/external_adapter.py +79 -0
  338. lmcache/v1/storage_backend/connector/fs_adapter.py +51 -0
  339. lmcache/v1/storage_backend/connector/fs_connector.py +403 -0
  340. lmcache/v1/storage_backend/connector/infinistore_adapter.py +56 -0
  341. lmcache/v1/storage_backend/connector/infinistore_connector.py +177 -0
  342. lmcache/v1/storage_backend/connector/instrumented_connector.py +219 -0
  343. lmcache/v1/storage_backend/connector/lm_adapter.py +31 -0
  344. lmcache/v1/storage_backend/connector/lm_connector.py +176 -0
  345. lmcache/v1/storage_backend/connector/mock_adapter.py +57 -0
  346. lmcache/v1/storage_backend/connector/mock_connector.py +349 -0
  347. lmcache/v1/storage_backend/connector/mooncakestore_adapter.py +43 -0
  348. lmcache/v1/storage_backend/connector/mooncakestore_connector.py +614 -0
  349. lmcache/v1/storage_backend/connector/redis_adapter.py +181 -0
  350. lmcache/v1/storage_backend/connector/redis_connector.py +828 -0
  351. lmcache/v1/storage_backend/connector/s3_adapter.py +59 -0
  352. lmcache/v1/storage_backend/connector/s3_connector.py +699 -0
  353. lmcache/v1/storage_backend/connector/sagemaker_hyperpod_adapter.py +233 -0
  354. lmcache/v1/storage_backend/connector/sagemaker_hyperpod_connector.py +987 -0
  355. lmcache/v1/storage_backend/connector/valkey_adapter.py +114 -0
  356. lmcache/v1/storage_backend/connector/valkey_connector.py +627 -0
  357. lmcache/v1/storage_backend/gds_backend.py +1199 -0
  358. lmcache/v1/storage_backend/job_executor/__init__.py +0 -0
  359. lmcache/v1/storage_backend/job_executor/base_executor.py +34 -0
  360. lmcache/v1/storage_backend/job_executor/pq_executor.py +235 -0
  361. lmcache/v1/storage_backend/local_cpu_backend.py +810 -0
  362. lmcache/v1/storage_backend/local_disk_backend.py +656 -0
  363. lmcache/v1/storage_backend/maru_backend.py +734 -0
  364. lmcache/v1/storage_backend/naive_serde/__init__.py +50 -0
  365. lmcache/v1/storage_backend/naive_serde/cachegen_basics.py +133 -0
  366. lmcache/v1/storage_backend/naive_serde/cachegen_decoder.py +135 -0
  367. lmcache/v1/storage_backend/naive_serde/cachegen_encoder.py +83 -0
  368. lmcache/v1/storage_backend/naive_serde/kivi_serde.py +22 -0
  369. lmcache/v1/storage_backend/naive_serde/naive_serde.py +18 -0
  370. lmcache/v1/storage_backend/naive_serde/serde.py +37 -0
  371. lmcache/v1/storage_backend/native_clients/connector_client_base.py +165 -0
  372. lmcache/v1/storage_backend/native_clients/resp_client.py +35 -0
  373. lmcache/v1/storage_backend/nixl_storage_backend.py +1400 -0
  374. lmcache/v1/storage_backend/p2p_backend.py +788 -0
  375. lmcache/v1/storage_backend/path_sharder.py +117 -0
  376. lmcache/v1/storage_backend/pd_backend.py +646 -0
  377. lmcache/v1/storage_backend/plugins/dax_backend.py +1443 -0
  378. lmcache/v1/storage_backend/plugins/rust_raw_block_backend.py +1361 -0
  379. lmcache/v1/storage_backend/remote_backend.py +624 -0
  380. lmcache/v1/storage_backend/resp_client.py +227 -0
  381. lmcache/v1/storage_backend/storage_backend_listener.py +19 -0
  382. lmcache/v1/storage_backend/storage_manager.py +1352 -0
  383. lmcache/v1/system_detection.py +110 -0
  384. lmcache/v1/token_database.py +551 -0
  385. lmcache/v1/transfer_channel/__init__.py +83 -0
  386. lmcache/v1/transfer_channel/abstract.py +285 -0
  387. lmcache/v1/transfer_channel/mock_memory_channel.py +156 -0
  388. lmcache/v1/transfer_channel/nixl_channel.py +639 -0
  389. lmcache/v1/transfer_channel/py_socket_channel.py +260 -0
  390. lmcache/v1/transfer_channel/transfer_utils.py +63 -0
  391. lmcache/v1/utils/__init__.py +1 -0
  392. lmcache/v1/utils/bloom_filter.py +109 -0
  393. lmcache/v1/utils/cache_utils.py +125 -0
  394. lmcache_cli-0.4.5.dev0.dist-info/METADATA +185 -0
  395. lmcache_cli-0.4.5.dev0.dist-info/RECORD +399 -0
  396. lmcache_cli-0.4.5.dev0.dist-info/WHEEL +5 -0
  397. lmcache_cli-0.4.5.dev0.dist-info/entry_points.txt +2 -0
  398. lmcache_cli-0.4.5.dev0.dist-info/licenses/LICENSE +201 -0
  399. lmcache_cli-0.4.5.dev0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,113 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """``lmcache ping`` — liveness check for LMCache and vLLM servers.
3
+
4
+ Usage::
5
+
6
+ lmcache ping kvcache --url http://localhost:8080
7
+ lmcache ping engine --url http://localhost:8000
8
+ """
9
+
10
+ # Standard
11
+ import argparse
12
+ import sys
13
+ import time
14
+ import urllib.error
15
+ import urllib.request
16
+
17
+ # First Party
18
+ from lmcache.cli.commands.base import BaseCommand
19
+ from lmcache.cli.commands.describe import normalize_url
20
+
21
+ # -------------------------------------------------------------------
22
+ # Constants
23
+ # -------------------------------------------------------------------
24
+
25
+ HEALTH_ENDPOINTS: dict[str, str] = {
26
+ "kvcache": "/api/healthcheck",
27
+ "engine": "/health",
28
+ }
29
+
30
+ DEFAULT_URLS: dict[str, str] = {
31
+ "kvcache": "http://localhost:8080",
32
+ "engine": "http://localhost:8000",
33
+ }
34
+
35
+ TITLES: dict[str, str] = {
36
+ "kvcache": "Ping KV Cache",
37
+ "engine": "Ping Engine",
38
+ }
39
+
40
+ # -------------------------------------------------------------------
41
+ # Helper
42
+ # -------------------------------------------------------------------
43
+
44
+
45
+ def ping(url: str, timeout: int = 10) -> tuple[str, float, str | None]:
46
+ """GET *url* and return ``(status, rtt_ms, error_msg)``.
47
+
48
+ Returns:
49
+ ``("OK", rtt_ms, None)`` on HTTP 200.
50
+ ``("FAIL", rtt_ms, detail)`` on any error.
51
+ """
52
+ start = time.monotonic()
53
+ try:
54
+ with urllib.request.urlopen(
55
+ urllib.request.Request(url), timeout=timeout
56
+ ) as resp:
57
+ rtt_ms = (time.monotonic() - start) * 1000
58
+ if resp.status == 200:
59
+ return ("OK", rtt_ms, None)
60
+ return ("FAIL", rtt_ms, f"HTTP {resp.status}")
61
+ except urllib.error.HTTPError as exc:
62
+ rtt_ms = (time.monotonic() - start) * 1000
63
+ return ("FAIL", rtt_ms, f"HTTP {exc.code}: {exc.reason}")
64
+ except (urllib.error.URLError, OSError) as exc:
65
+ rtt_ms = (time.monotonic() - start) * 1000
66
+ reason = getattr(exc, "reason", str(exc))
67
+ return ("FAIL", rtt_ms, f"Cannot connect to {url}: {reason}")
68
+
69
+
70
+ # -------------------------------------------------------------------
71
+ # Command
72
+ # -------------------------------------------------------------------
73
+
74
+
75
+ class PingCommand(BaseCommand):
76
+ """Ping LMCache or vLLM server (liveness check)."""
77
+
78
+ def name(self) -> str:
79
+ return "ping"
80
+
81
+ def help(self) -> str:
82
+ return "Ping LMCache or vLLM server (liveness check)."
83
+
84
+ def add_arguments(self, parser: argparse.ArgumentParser) -> None:
85
+ parser.add_argument(
86
+ "target",
87
+ choices=["kvcache", "engine"],
88
+ help="What to ping.",
89
+ )
90
+ parser.add_argument(
91
+ "--url",
92
+ default=None,
93
+ help=(
94
+ "Server URL (default: http://localhost:8080 for kvcache, "
95
+ "http://localhost:8000 for engine)."
96
+ ),
97
+ )
98
+
99
+ def execute(self, args: argparse.Namespace) -> None:
100
+ base_url = normalize_url(args.url or DEFAULT_URLS[args.target])
101
+ endpoint = HEALTH_ENDPOINTS[args.target]
102
+ title = TITLES[args.target]
103
+
104
+ status, rtt_ms, error = ping(f"{base_url}{endpoint}")
105
+
106
+ metrics = self.create_metrics(title, args, width=30)
107
+ metrics.add("status", "Status", status)
108
+ metrics.add("round_trip_time_ms", "Round trip time (ms)", round(rtt_ms, 2))
109
+ metrics.emit()
110
+
111
+ if error:
112
+ print(error, file=sys.stderr)
113
+ sys.exit(1)
@@ -0,0 +1,155 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Run one OpenAI-compatible inference request and report token/latency metrics."""
3
+
4
+ # Standard
5
+ import argparse
6
+ import sys
7
+
8
+ # First Party
9
+ from lmcache.cli.commands.base import BaseCommand, _add_output_args
10
+ from lmcache.cli.commands.query.prompt import PromptBuilder
11
+ from lmcache.cli.commands.query.request import Request
12
+
13
+
14
+ class QueryCommand(BaseCommand):
15
+ """CLI command that sends one request to a serving engine."""
16
+
17
+ def name(self) -> str:
18
+ return "query"
19
+
20
+ def help(self) -> str:
21
+ return "Run one inference request and report metrics."
22
+
23
+ def add_arguments(self, _parser: argparse.ArgumentParser) -> None:
24
+ pass
25
+
26
+ def register(self, subparsers: argparse._SubParsersAction) -> None:
27
+ parser = subparsers.add_parser(
28
+ self.name(),
29
+ help=self.help(),
30
+ description=(
31
+ "Run one OpenAI-compatible inference request and report metrics."
32
+ ),
33
+ )
34
+ inner = parser.add_subparsers(
35
+ dest="query_target",
36
+ required=True,
37
+ metavar="{engine,kvcache}",
38
+ )
39
+ self._register_engine(inner)
40
+ self._register_kvcache(inner)
41
+
42
+ def _register_engine(self, subparsers: argparse._SubParsersAction) -> None:
43
+ parser = subparsers.add_parser(
44
+ "engine",
45
+ help="Send one request to an OpenAI-compatible HTTP API.",
46
+ )
47
+ parser.add_argument("--url", required=True, help="Serving engine base URL.")
48
+ parser.add_argument(
49
+ "--prompt",
50
+ required=True,
51
+ help="Prompt text with optional {name} placeholders.",
52
+ )
53
+ parser.add_argument(
54
+ "--model",
55
+ default=None,
56
+ metavar="ID",
57
+ help="Model ID for the serving engine.",
58
+ )
59
+ parser.add_argument(
60
+ "--max-tokens",
61
+ type=int,
62
+ default=128,
63
+ help="Maximum completion tokens (default: 128).",
64
+ )
65
+ parser.add_argument(
66
+ "--timeout",
67
+ type=float,
68
+ default=30.0,
69
+ help="HTTP timeout in seconds (default: 30).",
70
+ )
71
+ parser.add_argument(
72
+ "--documents",
73
+ action="extend",
74
+ nargs="+",
75
+ default=[],
76
+ metavar="NAME=PATH",
77
+ help=(
78
+ "Load file text for {NAME} in --prompt. "
79
+ "Accepts one or more NAME=PATH values."
80
+ ),
81
+ )
82
+ parser.add_argument(
83
+ "--path",
84
+ dest="documents",
85
+ action="extend",
86
+ nargs="+",
87
+ metavar="NAME=PATH",
88
+ help=argparse.SUPPRESS,
89
+ )
90
+ parser.add_argument(
91
+ "--completions",
92
+ action="store_true",
93
+ help="Use POST /v1/completions only.",
94
+ )
95
+ parser.add_argument(
96
+ "--chat-first",
97
+ action="store_true",
98
+ help="Try /v1/chat/completions first, then fall back to /v1/completions.",
99
+ )
100
+ _add_output_args(parser)
101
+ parser.set_defaults(func=self.execute)
102
+
103
+ def _register_kvcache(self, subparsers: argparse._SubParsersAction) -> None:
104
+ parser = subparsers.add_parser(
105
+ "kvcache",
106
+ help="Query KV-cache endpoints (not implemented yet).",
107
+ )
108
+ _add_output_args(parser)
109
+ parser.set_defaults(func=self.execute)
110
+
111
+ def execute(self, args: argparse.Namespace) -> None:
112
+ handlers = {
113
+ "engine": self.query_engine,
114
+ "kvcache": self.query_kvcache,
115
+ }
116
+ handler = handlers.get(args.query_target)
117
+ if handler is None:
118
+ print(f"Unknown query target: {args.query_target}", file=sys.stderr)
119
+ sys.exit(1)
120
+ handler(args)
121
+
122
+ def query_engine(self, args: argparse.Namespace) -> None:
123
+ try:
124
+ prompt_builder = PromptBuilder(args.prompt, args.documents)
125
+ sender = Request(
126
+ base=args.url,
127
+ model=args.model,
128
+ max_tokens=args.max_tokens,
129
+ timeout=args.timeout,
130
+ completions_only=args.completions,
131
+ chat_first=args.chat_first,
132
+ )
133
+ engine_stats = sender.send_request(prompt_builder.complete_prompt)
134
+
135
+ model_id = args.model or str(engine_stats["model"][1])
136
+ metrics = self.create_metrics("Query Engine", args)
137
+ metrics.add("model", "Model", model_id)
138
+ prompt_name, prompt_value = engine_stats["prompt_tokens"]
139
+ metrics.add("prompt_tokens", prompt_name, int(prompt_value))
140
+ output_name, output_value = engine_stats["output_tokens"]
141
+ metrics.add("output_tokens", output_name, int(output_value))
142
+
143
+ latency = metrics.add_section("latency", "Latency Metrics")
144
+ for key, (name, value) in engine_stats.items():
145
+ if key in ("model", "prompt_tokens", "output_tokens"):
146
+ continue
147
+ latency.add(key, name, round(float(value), 2))
148
+
149
+ metrics.emit()
150
+ except (RuntimeError, ValueError) as err:
151
+ print(str(err), file=sys.stderr)
152
+ sys.exit(1)
153
+
154
+ def query_kvcache(self, args: argparse.Namespace) -> None:
155
+ pass
@@ -0,0 +1,134 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """Prompt placeholder expansion helpers for ``lmcache query``."""
3
+
4
+ # Standard
5
+ from pathlib import Path
6
+ from typing import Optional
7
+ import re
8
+
9
+ PLACEHOLDER = re.compile(r"\{(\w+)\}")
10
+ BUILTIN_DOCUMENT_PATHS = {
11
+ "lmcache": (
12
+ Path(__file__).resolve().parent.parent.parent / "documents" / "lmcache.txt"
13
+ ),
14
+ }
15
+
16
+
17
+ class PromptBuilder:
18
+ """Build a complete prompt from CLI inputs."""
19
+
20
+ def __init__(self, prompt: str, documents_args: Optional[list[str]] = None) -> None:
21
+ self._complete_prompt = self.expand_prompt(prompt, documents_args or [])
22
+
23
+ @property
24
+ def complete_prompt(self) -> str:
25
+ """Return the expanded prompt from constructor inputs."""
26
+ return self._complete_prompt
27
+
28
+ def expand_prompt(
29
+ self,
30
+ prompt: str,
31
+ documents_args: Optional[list[str]] = None,
32
+ ) -> str:
33
+ """Expand placeholders and return the complete prompt text.
34
+
35
+ Args:
36
+ prompt: The prompt template string with {name} placeholders.
37
+ documents_args: Optional list of document paths or NAME=PATH strings.
38
+
39
+ Returns:
40
+ The expanded prompt string.
41
+ """
42
+ docs_args = documents_args or []
43
+ documents, appended_text = resolve_documents(prompt, docs_args)
44
+
45
+ for key in _unique_placeholders(prompt):
46
+ if key not in documents:
47
+ unknown_documents(key)
48
+
49
+ complete_prompt = PLACEHOLDER.sub(
50
+ lambda match: documents[match.group(1)], prompt
51
+ )
52
+ if appended_text:
53
+ complete_prompt = (
54
+ f"{complete_prompt}\n{appended_text}"
55
+ if complete_prompt
56
+ else appended_text
57
+ )
58
+ return complete_prompt
59
+
60
+
61
+ def resolve_documents(
62
+ prompt_template: str, documents_args: list[str]
63
+ ) -> tuple[dict[str, str], str]:
64
+ """Resolve ``--documents`` args into placeholder mapping and trailing text.
65
+
66
+ Args:
67
+ prompt_template: The prompt string containing placeholders.
68
+ documents_args: List of document arguments from the CLI.
69
+
70
+ Returns:
71
+ A tuple containing a dictionary mapping placeholder names to document
72
+ content and a string containing any appended document text.
73
+ """
74
+ placeholders = _unique_placeholders(prompt_template)
75
+ documents: dict[str, str] = {}
76
+ plain_docs: list[str] = []
77
+ for item in documents_args:
78
+ if "=" not in item:
79
+ plain_docs.append(_read_document_file(item))
80
+ continue
81
+ name, path = [x.strip() for x in item.split("=", 1)]
82
+ if not name:
83
+ raise ValueError(f"Invalid --documents {item!r}; empty name")
84
+ documents[name] = _read_document_file(path, name=name)
85
+
86
+ unresolved = [key for key in placeholders if key not in documents]
87
+ for idx, key in enumerate(unresolved[: len(plain_docs)]):
88
+ documents[key] = plain_docs[idx]
89
+ appended_docs = plain_docs[len(unresolved) :]
90
+
91
+ for key in placeholders:
92
+ if key in documents:
93
+ continue
94
+ builtin_path = BUILTIN_DOCUMENT_PATHS.get(key)
95
+ if builtin_path is None:
96
+ continue
97
+ documents[key] = _read_document_file(str(builtin_path), name=key)
98
+
99
+ return documents, "\n".join(appended_docs).strip()
100
+
101
+
102
+ def unknown_documents(key: str) -> None:
103
+ """Raise an error for a missing documents placeholder.
104
+
105
+ Args:
106
+ key: The name of the missing placeholder.
107
+
108
+ Raises:
109
+ ValueError: Always raised with a descriptive message.
110
+ """
111
+ raise ValueError(
112
+ f"Unknown documents {key!r}. Define it with --documents {key}=PATH "
113
+ )
114
+
115
+
116
+ def _read_document_file(path: str, *, name: Optional[str] = None) -> str:
117
+ file_path = Path(path).expanduser()
118
+ if not file_path.is_file():
119
+ if name is not None:
120
+ raise ValueError(f"documents file not found for {name!r}: {file_path}")
121
+ raise ValueError(f"documents file not found: {file_path}")
122
+ return file_path.read_text(encoding="utf-8", errors="replace")
123
+
124
+
125
+ def _unique_placeholders(prompt_template: str) -> list[str]:
126
+ seen: set[str] = set()
127
+ keys: list[str] = []
128
+ for match in PLACEHOLDER.finditer(prompt_template):
129
+ key = match.group(1)
130
+ if key in seen:
131
+ continue
132
+ seen.add(key)
133
+ keys.append(key)
134
+ return keys