embedcache
Content-addressed local embedding cache. Skip duplicate embedding API calls. Rust core, Python frontend.
The problem
You re-embed the same documents over and over. Some are identical, some differ by a trailing newline, all of them cost real money (and time) to embed at the provider. The fix is a content-addressed cache keyed on the exact bytes you would have sent: same input + same model → cached vector, otherwise compute.
embedcache is that cache, fast enough that the lookup overhead is below the
network round-trip you would have paid otherwise.
Install
pip install embedcache
30-second quickstart
import numpy as np
from embedcache import EmbedCache
cache = EmbedCache("./.embedcache.redb", ttl_seconds=86400 * 30)
def embed(text: str) -> np.ndarray:
# your real call: openai.embeddings.create(...), bedrock, cohere, etc.
return np.zeros(384, dtype=np.float32)
vec = cache.get_or_compute("hello world", "text-embedding-3-small", embed)
For bulk ingestion, get_or_compute_many calls your batch function only on
the misses:
texts = ["a", "b", "c", "d"]
def embed_batch(missing: list[str]) -> list[np.ndarray]:
return [np.zeros(384, dtype=np.float32) for _ in missing]
vectors = cache.get_or_compute_many(texts, "text-embedding-3-small", embed_batch)
Why it is fast
- Hashing. blake3 keys (~5x faster than SHA-256 on the 1–10 KB strings most prompts are).
- Storage. redb is an embedded ACID KV store with a single-file format, log-structured, no Python in the hot path.
- GIL. PyO3 releases the GIL on every
get/put, so a Python thread pool calling the cache from a batch loop does not serialize on the cache.
API
class EmbedCache:
def __init__(
self,
path: str | Path,
*,
ttl_seconds: int | None = None,
) -> None: ...
def get(self, text: str, model: str) -> NDArray[np.float32] | None: ...
def put(self, text: str, model: str, vector: NDArray[np.float32]) -> None: ...
def get_or_compute(
self,
text: str,
model: str,
compute: Callable[[str], NDArray[np.float32]],
) -> NDArray[np.float32]: ...
def get_or_compute_many(
self,
texts: Sequence[str],
model: str,
compute_batch: Callable[[list[str]], list[NDArray[np.float32]]],
) -> list[NDArray[np.float32]]: ...
def purge_expired(self) -> int: ...
def purge_to_size(self, max_bytes: int) -> int: ...
def clear(self) -> None: ...
def stats(self) -> dict[str, int]: ...
def __len__(self) -> int: ...
License
Dual-licensed under MIT or Apache-2.0 at your option.
Metadata
Release files for embedcache 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| embedcache-0.1.1-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
Release files / embedcache-0.1.1-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | embedcache-0.1.1-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 551.6 kB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
974dc934604cc9811ea1145b8de749e64e7353b840c86d164fca3dd2706ea041
|
|
BLAKE2b-256 checksum How to use checksums |
04d73d520479a80740a9226df4797476a6575b032ffce333c6e40881e0582ec4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Security for embedcache 0.1.1
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.
To learn more about protecting yourself from malicious actors, visit our package security documentation.