Skip to content

Embex — Universal Vector Database Client

One API. Many Vector Databases. No Rewrites.
npm downloadsPyPI monthly downloadsGitHub stars
7+Adaptersone interface across providers
4xFaster Hot PathsRust + SIMD accelerated core
1 lineProvider Switchconfiguration, not rewrites

Every provider ships different client semantics. Embex gives your app one stable surface, then maps it to each backend adapter.

# Pinecone
index.upsert(vectors=[(id, values, metadata)])
# Qdrant
client.upsert(collection_name=name, points=points)
# Weaviate
client.data_object.create(data_object, class_name)

Terminal window
pip install embex lancedb
import asyncio
from embex import EmbexClient, Point
async def main():
client = await EmbexClient.new_async("lancedb", "./data")
collection = client.collection("docs")
await collection.create(dimension=768, distance="cosine")
await collection.insert([
Point(id="1", vector=[0.1] * 768, metadata={"topic": "intro"})
])
print(await collection.search(vector=[0.1] * 768, top_k=3))
asyncio.run(main())


ProviderClientInsert (ops/s)SpeedupSearch Latency
QdrantEmbex24,8254.3x1.95 ms
QdrantNative5,754-4.69 ms
WeaviateEmbex5,1634.1x1.77 ms
WeaviateNative1,256-4.03 ms

See full methodology in Benchmarks.


CapabilityRaw Provider SDKsLLM Framework WrappersEmbex
Stable provider-agnostic APINoPartialYes
Swap providers with minimal code changesNoUsually noYes
Rust-level performance pathRareRareYes
Embedded local startVariesVariesYes
Vector-first, no forced LLM couplingYesNoYes

Build Against One Vector Interface

Use Embex for application-level consistency and keep provider choice flexible as your scale changes.