High-performance key-value storage engine with Python bindings, built with Rust and PyO3.
- PegaEngine: Fast Rust-based key-value storage with Python bindings
- PegaKVConnector: vLLM KV connector for distributed inference with KV cache transfer
# Install maturin if you haven't already
pip install maturin
# Build and install in development mode
cd python
maturin develop
# Or build a wheel
maturin build --releasepip install pegaflowfrom pegaflow import PegaEngine
# Create a new engine
engine = PegaEngine()
# Store key-value pairs
engine.put("name", "PegaFlow")
engine.put("version", "0.1.0")
# Retrieve values
name = engine.get("name") # Returns "PegaFlow"
missing = engine.get("nonexistent") # Returns None
# Remove keys
removed = engine.remove("name") # Returns "PegaFlow"from vllm import LLM
from vllm.distributed.kv_transfer.kv_transfer_agent import KVTransferConfig
# Configure vLLM to use PegaKVConnector
kv_transfer_config = KVTransferConfig(
kv_connector="PegaKVConnector",
kv_role="kv_both",
kv_connector_module_path="pegaflow.connector",
)
# Create LLM with KV transfer enabled
llm = LLM(
model="gpt2",
kv_transfer_config=kv_transfer_config,
)PegaKVConnector defaults to read_write: it queries PegaFlow for reusable KV
blocks, loads matched blocks into vLLM, and saves newly computed full blocks
back to PegaFlow.
Set pegaflow.mode to save_only when another vLLM connector is responsible
for reads and PegaFlow should only persist KV blocks for later reuse. This is
intended for MultiConnector decode-side setups where an upstream connector
owns the external hit/load path, while PegaFlow records the resulting KV cache.
In save_only mode, PegaFlow does not query or load KV blocks.
vllm serve Qwen/Qwen3-0.6B \
--kv-transfer-config '{
"kv_connector": "MultiConnector",
"kv_role": "kv_both",
"kv_connector_extra_config": {
"connectors": [
{
"kv_connector": "<external-read-connector>",
"kv_role": "kv_both"
},
{
"kv_connector": "PegaKVConnector",
"kv_role": "kv_both",
"kv_connector_module_path": "pegaflow.connector",
"kv_connector_extra_config": {
"pegaflow.mode": "save_only"
}
}
]
}
}'Valid values are read_write and save_only.
See the examples directory for more usage examples.
The test suite includes integration tests that verify the EngineRpcClient can correctly communicate with a running pegaflow-server instance.
-
Build the Rust extension:
cd python maturin develop --release -
Build the server binary:
cd .. cargo build --release --bin pegaflow-server -
Ensure CUDA is available (tests require GPU):
python -c "import torch; assert torch.cuda.is_available()"
cd python
# Run all tests
pytest tests/ -v
# Run specific test file
pytest tests/test_engine_client.py -v
# Run with coverage
pytest tests/ --cov=pegaflow --cov-report=html-
tests/conftest.py: Contains pytest fixtures for:pega_server: Automatically starts/stopspegaflow-serverfor integration testsengine_client: Creates anEngineRpcClientconnected to the test serverclient_context: Provides aClientContextrepresenting a vLLM instance with GPU KV cache tensorsregistered_instance: Provides a registered instance ID for query tests
-
tests/test_engine_client.py: Integration tests for:- Server connectivity
- Query operations with various inputs
The ClientContext class abstracts a vLLM instance and provides:
register_kv_caches(): Register GPU KV cache tensors with the serverquery(block_hashes): Query available blocksunregister_context(): Unregister context from server
Example test usage:
def test_query(client_context):
"""Test query operation."""
result = client_context.query([])
assert result is not NoneMIT