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
lmcache/v1/manager.py ADDED
@@ -0,0 +1,539 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+ """
3
+ LMCacheManager: A unified manager for LMCache internal components.
4
+
5
+ This module provides a clean interface to manage LMCache components lifecycle,
6
+ decoupling the vLLM adapter from internal LMCache implementation details.
7
+ """
8
+
9
+ # Standard
10
+ from concurrent.futures import ThreadPoolExecutor, TimeoutError
11
+ from typing import TYPE_CHECKING, Any, Optional, Union
12
+ import time
13
+ import traceback
14
+
15
+ # Third Party
16
+ import torch
17
+
18
+ # First Party
19
+ from lmcache.integration.base_service_factory import BaseServiceFactory
20
+ from lmcache.logging import init_logger
21
+ from lmcache.v1.cache_engine import LMCacheEngine, LMCacheEngineBuilder
22
+ from lmcache.v1.config import LMCacheEngineConfig
23
+ from lmcache.v1.health_monitor.base import HealthMonitor
24
+ from lmcache.v1.internal_api_server.api_server import InternalAPIServer
25
+ from lmcache.v1.lookup_client.abstract_client import LookupClientInterface
26
+ from lmcache.v1.metadata import LMCacheMetadata
27
+ from lmcache.v1.offload_server.zmq_server import ZMQOffloadServer
28
+ from lmcache.v1.plugin.runtime_plugin_launcher import RuntimePluginLauncher
29
+
30
+ if TYPE_CHECKING:
31
+ # First Party
32
+ from lmcache.v1.lookup_client.lmcache_async_lookup_client import (
33
+ LMCacheAsyncLookupServer,
34
+ )
35
+ from lmcache.v1.lookup_client.lmcache_lookup_client import LMCacheLookupServer
36
+
37
+ logger = init_logger(__name__)
38
+
39
+
40
+ class LMCacheManager:
41
+ """
42
+ LMCacheManager manages the lifecycle of LMCache internal components.
43
+
44
+ For an integration to utilize the Manager, define a ServiceFactory
45
+ that determines which components to create for which workers.
46
+
47
+ This class encapsulates the initialization and shutdown of:
48
+ - LMCacheEngine
49
+ - LookupClient / LookupServer
50
+ - OffloadServer
51
+ - InternalAPIServer
52
+ - RuntimePluginLauncher
53
+ - HealthMonitor
54
+ """
55
+
56
+ def __init__(
57
+ self,
58
+ config: LMCacheEngineConfig,
59
+ service_factory: BaseServiceFactory,
60
+ connector: Optional[Any] = None,
61
+ ):
62
+ """
63
+ Initialize LMCacheManager.
64
+
65
+ Args:
66
+ config: LMCache engine configuration
67
+ service_factory: Factory for creating service components
68
+ role: The role string ("scheduler" or "worker")
69
+ connector: Reference to LMCacheConnectorV1Impl for internal
70
+ API server
71
+ """
72
+ self._config = config
73
+ self._service_factory = service_factory
74
+ self._connector: Any = connector
75
+
76
+ # Flag to track if initialization failed
77
+ self._init_failed = False
78
+ self._init_failed_reason: str = ""
79
+
80
+ self._health_monitor: Optional[HealthMonitor] = None
81
+ self._lmcache_engine_metadata: Optional[LMCacheMetadata] = None
82
+ self._lmcache_engine: Optional[LMCacheEngine] = None
83
+ self._lookup_client: Optional[LookupClientInterface] = None
84
+ self._lookup_server: Optional[
85
+ Union["LMCacheLookupServer", "LMCacheAsyncLookupServer"]
86
+ ] = None
87
+ self._offload_server: Optional[ZMQOffloadServer] = None
88
+ self._runtime_plugin_launcher: Optional[RuntimePluginLauncher] = None
89
+ self._api_server: Optional[InternalAPIServer] = None
90
+
91
+ # Initialize components via service factory
92
+ try:
93
+ self._lmcache_engine_metadata = service_factory.get_or_create_metadata()
94
+ self._lmcache_engine = service_factory.get_or_create_lmcache_engine()
95
+ self._lookup_client = service_factory.maybe_create_lookup_client()
96
+ self._lookup_server = service_factory.maybe_create_lookup_server()
97
+ self._offload_server = service_factory.maybe_create_offload_server()
98
+ self._runtime_plugin_launcher = (
99
+ service_factory.maybe_create_runtime_plugin_launcher()
100
+ )
101
+ self._api_server = service_factory.maybe_create_internal_api_server(
102
+ lmcache_manager=self
103
+ )
104
+ except Exception as e:
105
+ self._init_failed = True
106
+ self._init_failed_reason = "".join(traceback.format_exception(e))
107
+ logger.error(
108
+ "Failed to initialize LMCacheManager components: %s. "
109
+ "System will operate in degraded mode (recompute).",
110
+ self._init_failed_reason,
111
+ )
112
+
113
+ # ==================== Property Accessors ====================
114
+
115
+ @property
116
+ def lmcache_engine(self) -> Optional[LMCacheEngine]:
117
+ """Get the LMCache engine instance."""
118
+ return self._lmcache_engine
119
+
120
+ @property
121
+ def lmcache_engine_metadata(self) -> Optional[LMCacheMetadata]:
122
+ """Get the LMCache engine metadata."""
123
+ return self._lmcache_engine_metadata
124
+
125
+ @property
126
+ def lookup_client(self) -> Optional[LookupClientInterface]:
127
+ """Get the lookup client instance."""
128
+ return self._lookup_client
129
+
130
+ @property
131
+ def lookup_server(
132
+ self,
133
+ ) -> Optional[Union["LMCacheLookupServer", "LMCacheAsyncLookupServer"]]:
134
+ """Get the lookup server instance."""
135
+ return self._lookup_server
136
+
137
+ @property
138
+ def offload_server(self) -> Optional[ZMQOffloadServer]:
139
+ """Get the offload server instance."""
140
+ return self._offload_server
141
+
142
+ @property
143
+ def api_server(self) -> Optional[InternalAPIServer]:
144
+ """Get the API server instance."""
145
+ return self._api_server
146
+
147
+ @property
148
+ def health_monitor(self) -> Optional[HealthMonitor]:
149
+ """Get the health monitor instance."""
150
+ return self._health_monitor
151
+
152
+ @property
153
+ def kv_caches(self) -> dict[str, torch.Tensor]:
154
+ if self._connector is not None and hasattr(self._connector, "kv_caches"):
155
+ return self._connector.kv_caches
156
+ return {}
157
+
158
+ @property
159
+ def config(self) -> LMCacheEngineConfig:
160
+ """Get the LMCache engine configuration."""
161
+ return self._config
162
+
163
+ # ==================== Lifecycle Methods ====================
164
+
165
+ def start_services(self) -> None:
166
+ """
167
+ Start all managed services.
168
+
169
+ Managed services include:
170
+ - InternalAPIServer: HTTP server exposing internal APIs for
171
+ monitoring and management (e.g., cache stats, flush operations).
172
+ - RuntimePluginLauncher: Launches external plugin processes defined
173
+ in the configuration (e.g., custom telemetry, cache warming).
174
+ """
175
+ if self._api_server is not None:
176
+ self._api_server.start()
177
+
178
+ if self._runtime_plugin_launcher is not None:
179
+ self._runtime_plugin_launcher.launch_plugins()
180
+
181
+ def post_init(self) -> None:
182
+ """
183
+ Post-initialization after KV caches are registered.
184
+ """
185
+ # If initialization already failed, mark engine and return early
186
+ if self._init_failed:
187
+ if self._lmcache_engine is not None:
188
+ self._lmcache_engine.mark_init_failed(self._init_failed_reason)
189
+ logger.warning("Skipping post_init due to previous initialization failure")
190
+ return
191
+
192
+ if self._lmcache_engine is None:
193
+ # Initialize health monitor for scheduler (even without engine)
194
+ self._init_health_monitor()
195
+ return
196
+
197
+ try:
198
+ # First Party
199
+ from lmcache.v1.lookup_client.lmcache_async_lookup_client import (
200
+ LMCacheAsyncLookupServer,
201
+ )
202
+
203
+ async_lookup_server = None
204
+ if self._config.enable_async_loading and self._lookup_server is not None:
205
+ assert isinstance(self._lookup_server, LMCacheAsyncLookupServer)
206
+ async_lookup_server = self._lookup_server
207
+
208
+ self._lmcache_engine.post_init(async_lookup_server=async_lookup_server)
209
+
210
+ # Initialize health monitor after engine post_init completes
211
+ self._init_health_monitor()
212
+ except Exception as e:
213
+ self._handle_post_init_failure(e)
214
+
215
+ def _init_health_monitor(self) -> None:
216
+ """Initialize the health monitor via the service factory.
217
+
218
+ Called during post_init after all components are initialized.
219
+ """
220
+ self._health_monitor = self._service_factory.maybe_create_health_monitor(
221
+ lmcache_manager=self
222
+ )
223
+
224
+ def _handle_post_init_failure(self, e: Exception) -> None:
225
+ """
226
+ Handle initialization failure during post_init.
227
+
228
+ Args:
229
+ e: The exception that caused the failure
230
+ """
231
+ self._init_failed = True
232
+ self._init_failed_reason = "".join(traceback.format_exception(e))
233
+ if self._lmcache_engine is not None:
234
+ self._lmcache_engine.mark_init_failed(self._init_failed_reason)
235
+ logger.error(
236
+ "Failed during post_init: %s. "
237
+ "System will operate in degraded mode (recompute).",
238
+ self._init_failed_reason,
239
+ )
240
+
241
+ def stop_services(self) -> None:
242
+ """Stop all managed components gracefully."""
243
+ logger.info("Stopping LMCacheManager services...")
244
+ start_time = time.time()
245
+ errors: list[tuple[str, Union[str, Exception]]] = []
246
+
247
+ def _safe_close(name: str, close_fn, timeout: float = 10.0):
248
+ """Helper to close a resource with timeout protection."""
249
+ try:
250
+ logger.info("Closing %s...", name)
251
+ with ThreadPoolExecutor(max_workers=1) as executor:
252
+ future = executor.submit(close_fn)
253
+ try:
254
+ future.result(timeout=timeout)
255
+ logger.info("%s closed successfully", name)
256
+ except TimeoutError:
257
+ logger.error(
258
+ "%s close operation timed out after %ss. "
259
+ "Continuing with shutdown...",
260
+ name,
261
+ timeout,
262
+ )
263
+ errors.append((name, "Timeout"))
264
+ except Exception as e:
265
+ logger.error("Error closing %s: %s", name, e)
266
+ errors.append((name, e))
267
+
268
+ # Stop health monitor first
269
+ if self._health_monitor is not None:
270
+ _safe_close("health_monitor", self._health_monitor.stop, timeout=5.0)
271
+
272
+ # Close offload server
273
+ if self._offload_server is not None:
274
+ _safe_close("offload_server", self._offload_server.close, timeout=10.0)
275
+
276
+ # Stop plugins
277
+ if self._runtime_plugin_launcher is not None:
278
+ _safe_close(
279
+ "runtime_plugin_launcher",
280
+ self._runtime_plugin_launcher.stop_plugins,
281
+ timeout=10.0,
282
+ )
283
+
284
+ # Stop API server
285
+ if self._api_server is not None:
286
+ _safe_close("api_server", self._api_server.stop, timeout=10.0)
287
+
288
+ # Close lookup server
289
+ if self._lookup_server is not None:
290
+ _safe_close("lookup_server", self._lookup_server.close, timeout=10.0)
291
+
292
+ # Close lookup client
293
+ if self._lookup_client is not None:
294
+ _safe_close("lookup_client", self._lookup_client.close, timeout=10.0)
295
+
296
+ # Destroy cache engine
297
+ try:
298
+ engine_instance_id = self._service_factory.get_engine_instance_id()
299
+ logger.info("Destroying LMCache engine: %s", engine_instance_id)
300
+ with ThreadPoolExecutor(max_workers=1) as executor:
301
+ future = executor.submit(
302
+ LMCacheEngineBuilder.destroy, engine_instance_id
303
+ )
304
+ try:
305
+ future.result(timeout=15.0)
306
+ logger.info("LMCache engine destroyed successfully")
307
+ except TimeoutError:
308
+ logger.error(
309
+ "Cache engine destroy timed out after 15s. "
310
+ "Continuing with shutdown..."
311
+ )
312
+ errors.append(("cache_engine", "Timeout"))
313
+ except Exception as e:
314
+ logger.error("Error destroying cache engine: %s", e)
315
+ errors.append(("cache_engine", e))
316
+
317
+ elapsed = time.time() - start_time
318
+ if errors:
319
+ logger.warning(
320
+ "Shutdown completed with %d errors in %.2fs: %s",
321
+ len(errors),
322
+ elapsed,
323
+ errors,
324
+ )
325
+ else:
326
+ logger.info(
327
+ "LMCacheManager services stopped successfully in %.2fs",
328
+ elapsed,
329
+ )
330
+
331
+ # ==================== Lookup Management ====================
332
+
333
+ def close_lookup_client(self) -> dict:
334
+ """
335
+ Close the current lookup client.
336
+
337
+ Returns:
338
+ dict: Result with old client type info.
339
+ """
340
+ old_type = self._get_lookup_type_str(self._lookup_client)
341
+ if self._lookup_client is not None:
342
+ try:
343
+ self._lookup_client.close()
344
+ self._lookup_client = None
345
+ logger.info("Closed lookup client: %s", old_type)
346
+ except Exception as e:
347
+ logger.warning("Error closing lookup client: %s", e)
348
+ return {"old": old_type}
349
+
350
+ def create_lookup_client(self, dryrun: bool = False) -> dict:
351
+ """
352
+ Create a new lookup client using the current configuration.
353
+
354
+ Args:
355
+ dryrun: If True, only return what would be created without
356
+ actually creating it.
357
+
358
+ Returns:
359
+ dict: Result with new client type info.
360
+ """
361
+ # First Party
362
+ from lmcache.v1.lookup_client.factory import LookupClientFactory
363
+
364
+ if self._lmcache_engine_metadata is None:
365
+ return {"error": "metadata not available"}
366
+
367
+ if dryrun:
368
+ client = LookupClientFactory.create_lookup_client(
369
+ self._config,
370
+ self._lmcache_engine_metadata,
371
+ self._lmcache_engine,
372
+ )
373
+ new_type = self._get_lookup_type_str(client)
374
+ client.close()
375
+ return {"new": new_type, "dryrun": True}
376
+
377
+ self._lookup_client = LookupClientFactory.create_lookup_client(
378
+ self._config,
379
+ self._lmcache_engine_metadata,
380
+ self._lmcache_engine,
381
+ )
382
+ new_type = self._get_lookup_type_str(self._lookup_client)
383
+ logger.info("Created lookup client: %s", new_type)
384
+ return {"new": new_type}
385
+
386
+ def recreate_lookup_client(self) -> dict:
387
+ """
388
+ Recreate the lookup client (close + create).
389
+
390
+ Returns:
391
+ dict: Result with old and new client type info.
392
+ """
393
+ if self._lookup_client is None:
394
+ return {"error": "lookup client not available"}
395
+ result = self.close_lookup_client()
396
+ create_result = self.create_lookup_client()
397
+ result.update(create_result)
398
+ return result
399
+
400
+ def close_lookup_server(self) -> dict:
401
+ """
402
+ Close the current lookup server.
403
+
404
+ Returns:
405
+ dict: Result with old server type info.
406
+ """
407
+ old_type = self._get_lookup_type_str(self._lookup_server)
408
+ if self._lookup_server is not None:
409
+ try:
410
+ self._lookup_server.close()
411
+ self._lookup_server = None
412
+ logger.info("Closed lookup server: %s", old_type)
413
+ except Exception as e:
414
+ logger.warning("Error closing lookup server: %s", e)
415
+ return {"old": old_type}
416
+
417
+ def create_lookup_server(self, dryrun: bool = False) -> dict:
418
+ """
419
+ Create a new lookup server using the current configuration.
420
+
421
+ Args:
422
+ dryrun: If True, only return what would be created without
423
+ actually creating it.
424
+
425
+ Returns:
426
+ dict: Result with new server type info.
427
+ """
428
+ # First Party
429
+ from lmcache.v1.lookup_client.factory import LookupClientFactory
430
+
431
+ if self._lmcache_engine is None:
432
+ return {"error": "engine not available"}
433
+ if self._lmcache_engine_metadata is None:
434
+ return {"error": "metadata not available"}
435
+
436
+ if dryrun:
437
+ server = LookupClientFactory.create_lookup_server(
438
+ self._lmcache_engine,
439
+ self._lmcache_engine_metadata,
440
+ )
441
+ new_type = self._get_lookup_type_str(server)
442
+ if server is not None:
443
+ server.close()
444
+ return {"new": new_type, "dryrun": True}
445
+
446
+ self._lookup_server = LookupClientFactory.create_lookup_server(
447
+ self._lmcache_engine,
448
+ self._lmcache_engine_metadata,
449
+ )
450
+ new_type = self._get_lookup_type_str(self._lookup_server)
451
+ logger.info("Created lookup server: %s", new_type)
452
+ return {"new": new_type}
453
+
454
+ def recreate_lookup_server(self) -> dict:
455
+ """
456
+ Recreate the lookup server (close + create).
457
+
458
+ Returns:
459
+ dict: Result with old and new server type info.
460
+ """
461
+ if self._lookup_server is None:
462
+ return {"error": "lookup server not available"}
463
+
464
+ result = self.close_lookup_server()
465
+ create_result = self.create_lookup_server()
466
+ result.update(create_result)
467
+ return result
468
+
469
+ def _get_lookup_type_str(self, obj) -> str:
470
+ """
471
+ Get type string for lookup client/server, including wrapper info.
472
+
473
+ Returns format: "OuterWrapper(InnerWrapper(CoreType))" or "None"
474
+ """
475
+ if obj is None:
476
+ return "None"
477
+
478
+ parts = []
479
+ current = obj
480
+ while True:
481
+ parts.append(type(current).__name__)
482
+ if hasattr(current, "actual_lookup_client"):
483
+ current = current.actual_lookup_client
484
+ else:
485
+ break
486
+
487
+ if len(parts) == 1:
488
+ return parts[0]
489
+ result = parts[-1]
490
+ for wrapper in reversed(parts[:-1]):
491
+ result = "%s(%s)" % (wrapper, result)
492
+ return result
493
+
494
+ def get_lookup_info(self) -> dict:
495
+ """
496
+ Get information about the current lookup client and server.
497
+
498
+ Returns:
499
+ dict: Information about lookup client/server types and role.
500
+ """
501
+ return {
502
+ "client": self._get_lookup_type_str(self._lookup_client),
503
+ "server": self._get_lookup_type_str(self._lookup_server),
504
+ }
505
+
506
+ # ==================== Health & Info ====================
507
+
508
+ def is_healthy(self) -> bool:
509
+ """
510
+ Check if the LMCacheManager is healthy.
511
+
512
+ Returns False if:
513
+ - Initialization failed
514
+ - HealthMonitor reports unhealthy
515
+ - Engine reports unhealthy
516
+
517
+ Returns:
518
+ bool: True if healthy, False otherwise
519
+ """
520
+ if self._init_failed:
521
+ return False
522
+ if self._lmcache_engine is not None and not self._lmcache_engine.is_healthy():
523
+ return False
524
+ if self._health_monitor is not None:
525
+ return self._health_monitor.is_healthy()
526
+ return True
527
+
528
+ def get_inference_info(self) -> dict:
529
+ """Get inference information by delegating to the connector.
530
+
531
+ Returns:
532
+ dict: Dictionary containing inference information,
533
+ or empty dict if connector is not available.
534
+ """
535
+ if self._connector is not None and hasattr(
536
+ self._connector, "get_inference_info"
537
+ ):
538
+ return self._connector.get_inference_info()
539
+ return {}