Embex — Universal Vector Database Client
One API. Many Vector Databases. No Rewrites.
7+Adaptersone interface across providers
4xFaster Hot PathsRust + SIMD accelerated core
1 lineProvider Switchconfiguration, not rewrites
Stop Rewriting Vector Infrastructure
Section titled “Stop Rewriting Vector Infrastructure”Every provider ships different client semantics. Embex gives your app one stable surface, then maps it to each backend adapter.
# Pineconeindex.upsert(vectors=[(id, values, metadata)])
# Qdrantclient.upsert(collection_name=name, points=points)
# Weaviateclient.data_object.create(data_object, class_name)# Same call pattern for all adaptersawait client.collection("products").insert(points)results = await client.collection("products").search(vector=query, top_k=5)client = await EmbexClient.new_async("lancedb", "./data")client = await EmbexClient.new_async("qdrant", "http://localhost:6333")Quick Start
Section titled “Quick Start”pip install embex lancedbimport asynciofrom 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())npm install @bridgerust/embex lancedbimport { EmbexClient } from "@bridgerust/embex";
const client = await EmbexClient.newAsync("lancedb", "./data");const collection = client.collection("docs");await collection.create(768, "cosine");await collection.insert([ { id: "1", vector: Array(768).fill(0.1), metadata: { topic: "intro" } },]);console.log(await collection.search(Array(768).fill(0.1), 3));Why Teams Pick Embex
Section titled “Why Teams Pick Embex” Unified Adapter Surface LanceDB, Qdrant, Pinecone, Chroma, Milvus, PgVector, Weaviate and upcoming adapters.
Runtime Stability Language boundary errors are mapped instead of crashing host apps.
Migration Path Start embedded locally, move to managed infrastructure with minimal change.
Production Readiness Connection pooling, retries, typed models, and pragmatic defaults.
Performance Snapshot
Section titled “Performance Snapshot”| Provider | Client | Insert (ops/s) | Speedup | Search Latency |
|---|---|---|---|---|
| Qdrant | Embex | 24,825 | 4.3x | 1.95 ms |
| Qdrant | Native | 5,754 | - | 4.69 ms |
| Weaviate | Embex | 5,163 | 4.1x | 1.77 ms |
| Weaviate | Native | 1,256 | - | 4.03 ms |
See full methodology in Benchmarks.
Embex vs Common Approaches
Section titled “Embex vs Common Approaches”| Capability | Raw Provider SDKs | LLM Framework Wrappers | Embex |
|---|---|---|---|
| Stable provider-agnostic API | No | Partial | Yes |
| Swap providers with minimal code changes | No | Usually no | Yes |
| Rust-level performance path | Rare | Rare | Yes |
| Embedded local start | Varies | Varies | Yes |
| Vector-first, no forced LLM coupling | Yes | No | Yes |
Build Against One Vector Interface
Use Embex for application-level consistency and keep provider choice flexible as your scale changes.