Skip to main content

PegaFlow Python Package

High-performance key-value storage engine with Python bindings, built with Rust and PyO3.

Features

  • PegaEngine: Fast Rust-based key-value storage with Python bindings
  • PegaKVConnector: vLLM KV connector for distributed inference with KV cache transfer

Installation

From Source

# 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 --release

From PyPI (coming soon)

pip install pegaflow

Usage

Basic KV Storage

from 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"

vLLM KV Connector

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,
)

Connector Modes

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.

TP Shards Across Hosts

CUDA IPC is host-local. When one tensor-parallel replica spans multiple hosts, run one PegaFlow server on each host and configure the connector with every server endpoint in global TP-rank order:

{
  "kv_connector": "PegaKVConnector",
  "kv_role": "kv_both",
  "kv_connector_module_path": "pegaflow.connector",
  "kv_connector_extra_config": {
    "pegaflow.tp_shard_endpoints": [
      "http://host-a:50055",
      "http://host-b:50055"
    ]
  }
}

For TP8 and two endpoints, global ranks 0-3 register with the first server and ranks 4-7 register with the second. Each server sees a local TP4 topology and must manage the four GPUs on its own host. Every vLLM process must receive the same ordered endpoint list.

The scheduler queries every shard and only reuses the prefix available from all of them. Each worker loads with the lease issued by its local server. The connector gives every shard a distinct namespace, so deployments with a different host split cannot reuse an incompatible cache layout.

TP sharding currently requires equal contiguous shards and TP-only parallelism. Pipeline, decode-context, and prefill-context parallelism are rejected when more than one endpoint is configured.

P/D Partial Tail Blocks

vLLM normally exposes hashes only for complete KV blocks. In a P/D deployment, enable pegaflow.pd_tail_save on prefill and pegaflow.pd_tail_load on decode to reuse the final partial prompt block as well. Start both vLLM processes with the same explicit PYTHONHASHSEED and --prefix-caching-hash-algo xxhash_cbor.

Prefill: {"pegaflow.pd_tail_save": true}

Decode: {"pegaflow.pd_tail_load": true, "pegaflow.wait_for_full_prefix": true}

pegaflow.wait_for_full_prefix makes decode wait (up to 30s) until the full prompt prefix is fetchable from a remote node via MetaServer + RDMA. It only applies when prefill and decode run separate engines; it does not observe saves landing in a shared/local engine and has no effect when RDMA is not configured.

Development

See the examples directory for more usage examples.

Testing

Running Unit Tests

The test suite includes integration tests that verify the EngineRpcClient can correctly communicate with a running pegaflow-server instance.

Prerequisites

  1. Build the Rust extension:

    cd python
    maturin develop --release
    
  2. Build the server binary:

    cd ..
    cargo build --release --bin pegaflow-server
    
  3. Ensure CUDA is available (tests require GPU):

    python -c "import torch; assert torch.cuda.is_available()"
    

Running Tests

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

Test Structure

  • tests/conftest.py: Contains pytest fixtures for:

    • pega_server: Automatically starts/stops pegaflow-server for integration tests
    • engine_client: Creates an EngineRpcClient connected to the test server
    • client_context: Provides a ClientContext representing a vLLM instance with GPU KV cache tensors
    • registered_instance: Provides a registered instance ID for query tests
  • tests/test_engine_client.py: Integration tests for:

    • Server connectivity
    • Query operations with various inputs

Test Fixtures

The ClientContext class abstracts a vLLM instance and provides:

  • register_kv_caches(): Register GPU KV cache tensors with the server
  • query(block_hashes): Query available blocks
  • unregister_context(): Unregister context from server

Example test usage:

def test_query(client_context):
    """Test query operation."""
    result = client_context.query([])
    assert result is not None

License

MIT

Metadata

Release files for pegaflow-llm-cu13 0.24.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distributions (wheels)

Table of built distributions (wheels) for pegaflow-llm-cu13 0.24.6
File
pegaflow_llm_cu13-0.24.6-cp314-cp314-manylinux_2_34_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.34+ x86-64 Details
pegaflow_llm_cu13-0.24.6-cp314-cp314-manylinux_2_34_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.34+ ARM64 Details
pegaflow_llm_cu13-0.24.6-cp313-cp313-manylinux_2_34_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ x86-64 Details
pegaflow_llm_cu13-0.24.6-cp313-cp313-manylinux_2_34_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.34+ ARM64 Details
pegaflow_llm_cu13-0.24.6-cp312-cp312-manylinux_2_34_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ x86-64 Details
pegaflow_llm_cu13-0.24.6-cp312-cp312-manylinux_2_34_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.34+ ARM64 Details
pegaflow_llm_cu13-0.24.6-cp311-cp311-manylinux_2_34_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ x86-64 Details
pegaflow_llm_cu13-0.24.6-cp311-cp311-manylinux_2_34_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.34+ ARM64 Details
pegaflow_llm_cu13-0.24.6-cp310-cp310-manylinux_2_34_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.34+ x86-64 Details
pegaflow_llm_cu13-0.24.6-cp310-cp310-manylinux_2_34_aarch64.whl CPython 3.10 CPython 3.10 Linux glibc 2.34+ ARM64 Details

Total release size: 79.7 MB

Release files / pegaflow_llm_cu13-0.24.6-cp314-cp314-manylinux_2_34_x86_64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp314-cp314-manylinux_2_34_x86_64.whl
Size 8.0 MB
Tags CPython 3.14 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
19ccc4814c2d6faaeee01a85ca36090f3ce18761e56be81d7739b90e12a62d85
BLAKE2b-256 checksum
How to use checksums
31b9bca912a98163112a4ebfa66822396df039315a25a4dcba5fc2e8efa5b390
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pegaflow_llm_cu13-0.24.6-cp314-cp314-manylinux_2_34_aarch64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp314-cp314-manylinux_2_34_aarch64.whl
Size 7.9 MB
Tags CPython 3.14 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
6fc74c555cf1a24cda454d4ae081df16cf73567444ce766a172421ddb823de31
BLAKE2b-256 checksum
How to use checksums
6ca122a381507386a062899ffa597e0a9e1c4557082a1fb2a057d350b93de6ae
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pegaflow_llm_cu13-0.24.6-cp313-cp313-manylinux_2_34_x86_64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp313-cp313-manylinux_2_34_x86_64.whl
Size 8.0 MB
Tags CPython 3.13 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
1ecb79399772a5ce4fbf34d9fe11feb0e19e77328149aeefbb0b0b24f3d99c1a
BLAKE2b-256 checksum
How to use checksums
fb954dc29667995b1bb11183aff8ec685594919d176ae80e5438c96ede8e6018
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pegaflow_llm_cu13-0.24.6-cp313-cp313-manylinux_2_34_aarch64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp313-cp313-manylinux_2_34_aarch64.whl
Size 7.9 MB
Tags CPython 3.13 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
2053e0151af798f73d61537b7d755a631f16152c107245b12b8d15272a9838ef
BLAKE2b-256 checksum
How to use checksums
7bb670ce003618a6c340643e42c5f2de246129609e02ff419565be179e335b0d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pegaflow_llm_cu13-0.24.6-cp312-cp312-manylinux_2_34_x86_64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp312-cp312-manylinux_2_34_x86_64.whl
Size 8.0 MB
Tags CPython 3.12 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
7d5b7fab91dc775e7c67d19e25b82b74457d28e40195477c4c09911ac67e2570
BLAKE2b-256 checksum
How to use checksums
bbca05541ca855384d281d486b01496832f531263da6266eba75f54289faa1b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pegaflow_llm_cu13-0.24.6-cp312-cp312-manylinux_2_34_aarch64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp312-cp312-manylinux_2_34_aarch64.whl
Size 7.9 MB
Tags CPython 3.12 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
9e5ffb94df22123f4796946fc9be8d2b2d7b10545b289334f593c3ace34b9829
BLAKE2b-256 checksum
How to use checksums
2c9bf42e7913643e89450408a856ccc666b9dfb094d7def8f2cd6a9ed5dc0718
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pegaflow_llm_cu13-0.24.6-cp311-cp311-manylinux_2_34_x86_64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp311-cp311-manylinux_2_34_x86_64.whl
Size 8.0 MB
Tags CPython 3.11 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
068b648fbfe9569f70e838c550c7c60be71a5fb32e1ae431fd9379979e59a592
BLAKE2b-256 checksum
How to use checksums
48d35eb645fc3fe21d10d89fa730c25b87ac1018f96df707caa5206b59fb41a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pegaflow_llm_cu13-0.24.6-cp311-cp311-manylinux_2_34_aarch64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp311-cp311-manylinux_2_34_aarch64.whl
Size 7.9 MB
Tags CPython 3.11 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
4ca6dc08cd8f9332ee6ec7a8ad959919f84313a5d40b9f9df0549a471ee3cefd
BLAKE2b-256 checksum
How to use checksums
4f4c52cf474baa918c814e6ce16f9053d9138f15c23dae2b6a44fa0ef1514ad2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pegaflow_llm_cu13-0.24.6-cp310-cp310-manylinux_2_34_x86_64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp310-cp310-manylinux_2_34_x86_64.whl
Size 8.0 MB
Tags CPython 3.10 Linux glibc 2.34+ x86-64
SHA-256 checksum
How to use checksums
7ed3baa9ec95d4707fe7382338e242a002d2d557c690ecc510b50a6925abfd59
BLAKE2b-256 checksum
How to use checksums
db06f7b7a524d6dfd44b500412e2ceb194763d69bf218e84adf4fc2a09e5c5bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / pegaflow_llm_cu13-0.24.6-cp310-cp310-manylinux_2_34_aarch64.whl

Download URL pegaflow_llm_cu13-0.24.6-cp310-cp310-manylinux_2_34_aarch64.whl
Size 7.9 MB
Tags CPython 3.10 Linux glibc 2.34+ ARM64
SHA-256 checksum
How to use checksums
8bfa9c97a8cb2848eddc867da5a0046418153d9071868b345b88fe4f5fd8f739
BLAKE2b-256 checksum
How to use checksums
d7eadf778e545b60b6e044df7600851438b1e72b2b80ca79ecf2a22ee4d47ae8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Security for pegaflow-llm-cu13 0.24.6

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.24.6 This release

10 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page