veccore
A ports-and-adapters vector substrate: embed → index → search → hydrate, backend- and embedder-agnostic.
veccore ships generic mechanisms and clean seams for semantic retrieval. You register a collection
(choosing a backend + embedder), embed and upsert your items, and search — veccore returns
{id, score, payload} and you hydrate the full record from your own system of record. Nothing about your
domain lives in veccore; you never reinvent embedding, indexing, or idempotency.
pip install veccore # core (numpy only)
pip install 'veccore[qdrant]' # + Qdrant server backend
pip install 'veccore[openai]' # + OpenAI embedder (gated egress you inject)
pip install 'veccore[fastembed]' # + on-device fastembed embedder (no API key, no network)
pip install 'veccore[st]' # + sentence-transformers embedder
Quickstart
from veccore import (VecCore, CollectionRegistry, CollectionSpec, AuditEnvelope,
MockEmbedder, SqliteNumpyStore)
store = SqliteNumpyStore(path="/tmp/notes.sqlite")
core = VecCore(registry=CollectionRegistry(),
stores={"sqlite_numpy": store},
embedders={"mock": MockEmbedder()})
core.register(CollectionSpec(name="notes", backend="sqlite_numpy", embedder="mock", dim=64))
# every call carries an audit envelope: who + why (where/what are filled by veccore)
audit = AuditEnvelope(who="my_tool", why="index notes")
core.embed_upsert("notes",
[{"id": "n1", "text": "vector search over notes", "payload": {"src": "n1"}}],
audit)
hits = core.search("notes", "nearest ideas", k=5,
audit=AuditEnvelope(who="my_tool", why="find related"))
for h in hits: # each hit is {id, score, payload}
... # hydrate the full record from YOUR store by h.id
What's in the box
- Core ports —
EmbedderPort,VectorStorePort, andGatePort(injected, so veccore stays free of any spend/telemetry dependency — you hand it your gate, orNullGatefor local/free embedders). - Backends —
SqliteNumpyStore(in-process, brute-force cosine; implements the optionalmatrix()analytics seam) andQdrantStore(server; implementssearch(filters=…)metadata/ACL push-down + Batch ingest). Future backends slot in by implementingVectorStorePort. - Embedders —
MockEmbedder(deterministic, zero-spend),OpenAIEmbedder(network, gated),LocalEmbedder(fastembed / sentence-transformers, on-device), andCompositeEmbedder(fuse several embedders so a plain dot product equals their weighted fused cosine). - Content-sha idempotency — re-embed a row only when its text changes; a rerun over an unchanged corpus embeds nothing, and changing one item's text re-embeds exactly that one.
- Typed errors —
Unavailable(code=…)andNotSupported(capability, backend)— never a silent degrade. - Estimate-first —
core.estimate(...)sizes a job (tokens +$) with zero spend before you embed. - Batch ingest —
BatchIngestfor large corpora via a provider Batch API: chunked, resumable, a durable handle ledger, every result accounted; realtime and non-blocking collect both supported. - Optional seams, negotiated —
capabilities()+ typedNotSupportedmean expanding usage is additive: a consumer starts onsearch(collection, q, k), later addsfilters=…, later callsmatrix(), with no rewrite.
Design
veccore's line is mechanism vs policy: veccore ships the generic mechanisms + seams; each consumer builds
its domain policy on top. The gate (spend/egress) and any observability sink are injected, so veccore has
one hard dependency — numpy — and everything else (Qdrant, OpenAI, fastembed, sentence-transformers) is an
optional extra you install only for the adapter you choose.
License
MIT © 2026 Ash Damle. Developed in the keelworks monorepo.
Metadata
Release files for veccore 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| veccore-0.2.0.tar.gz | 62.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| veccore-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 114.5 kB
Release files / veccore-0.2.0.tar.gz
| Download URL | veccore-0.2.0.tar.gz |
|---|---|
| Size | 62.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
11b889ad5a60c221e6daa2b58de9d2ff8917dd4b63494034d5b58bea92098442
|
|
BLAKE2b-256 checksum How to use checksums |
d70aaa8c6afd6546191c2d5a917fcabd82c3e98fec8d3f78dd21e0fb959e06a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency logRelease files / veccore-0.2.0-py3-none-any.whl
| Download URL | veccore-0.2.0-py3-none-any.whl |
|---|---|
| Size | 52.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a0b7efe1ce2b121870cac69a06d2955ed9436a3a1d2b7bc3f2b95a09c44c72d0
|
|
BLAKE2b-256 checksum How to use checksums |
f550939e98208dce228d5875e3ab71f4836e26394d8b9c7b3f05261a9c796170
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency log