/claim #273

Proposed Changes

Add Qdrant vector database support to the JavaScript SDK using the Qdrant REST API directly (no external qdrant packages), as requested in #273.

New Qdrant class (arakoodev/src/vector-db/src/lib/qdrant/qdrant.ts)

Wraps the Qdrant REST API with the same retry-based resilience pattern used by the existing Supabase class:

Method Qdrant API Endpoint Description
createCollection() PUT /collections/{name} Create a collection with vector config
deleteCollection() DELETE /collections/{name} Delete a collection
getCollection() GET /collections/{name} Get collection info
upsertPoints() PUT /collections/{name}/points Insert or update points with vectors + payload
searchPoints() POST /collections/{name}/points/search Nearest neighbor search with optional filters
getPoints() POST /collections/{name}/points Retrieve points by ID
deletePoints() POST /collections/{name}/points/delete Delete points by ID

Key design decisions

  • No external packages: Uses native fetch + Qdrant REST API directly, as requested
  • Retry logic: Exponential backoff with 5 retries (same as Supabase class)
  • API key auth: Supports api-key header for Qdrant Cloud
  • Configurable: URL/API key via constructor or env vars (QDRANT_URL, QDRANT_API_KEY)
  • TypeScript types: Full interfaces for points, search params, etc.

Files changed

  • arakoodev/src/vector-db/src/lib/qdrant/qdrant.ts — Qdrant client class
  • arakoodev/src/vector-db/src/index.ts — Export Qdrant alongside Supabase
  • arakoodev/src/vector-db/src/tests/qdrant/ — 5 test files (createCollection, upsertPoints, searchPoints, getPoints, deletePoints)
  • examples/chat-with-pdf-qdrant/ — Working example demonstrating all operations

Proof

Usage:

import { Qdrant } from "@arakoodev/edgechains.js/vector-db";
const qdrant = new Qdrant("http://localhost:6333", "optional-api-key");
// Create collection
await qdrant.createCollection({
collectionName: "documents",
vectorSize: 1536,
distance: "Cosine",
});
// Upsert vectors
await qdrant.upsertPoints({
collectionName: "documents",
points: [{
id: 1,
vector: embeddings,
payload: { content: "document text", source: "page_1" },
}],
});
// Search
const results = await qdrant.searchPoints({
collectionName: "documents",
vector: queryEmbedding,
limit: 5,
});

Checklist

  • PR created against the correct branch (ts)
  • Tests added that prove the feature works
  • No external qdrant packages used — REST API only
  • Follows existing codebase patterns (retry logic, class structure)
  • Working example included

Claim

Total prize pool $30
Total paid $0
Status Pending
Submitted March 07, 2026
Last updated March 07, 2026

Contributors

MA

maoshuorz

@maoshuorz

100%

Sponsors

AR

Arakoo.ai

@arakoodev

$30