qdrant://¶
Vector database integration for Qdrant via the REST API. The producer issues upsert, search, delete, and scroll against a collection. No external Qdrant SDK is needed — Helix talks HTTP directly.
URI shape¶
Producer-only — CreateConsumer returns an error.
| Token | Description |
|---|---|
<collection> |
Required — Qdrant collection name. |
<operation> |
Optional — upsert (default), search, delete, scroll. |
Parameters¶
| Param | Type | Default | Producer/Consumer/Both | Description |
|---|---|---|---|---|
url |
string | http://localhost:6333 |
Producer | Qdrant base URL. Trailing slash is stripped. |
apiKey |
string | — | Producer | Qdrant API key. Sent as api-key: <key>. |
topK |
integer | 5 |
Producer | limit for search. |
Operations¶
upsert¶
Body: []map[string]any (or JSON). Each element is {"id": ..., "vector": [...], "payload": {...}}. Request: PUT /collections/<col>/points with {points: [...]}.
search¶
Body: []float64 (or JSON). Request: POST /collections/<col>/points/search with {vector, limit, with_payload:true}. The response's result array becomes the new body; qdrant.results.count records the count.
delete¶
Two modes:
- By IDs (header) —
qdrant.idscomma-separated. Integer-looking IDs become integers, otherwise they're strings (Qdrant allows both). - By body — a JSON array of IDs.
Request: POST /collections/<col>/points/delete with {points: [ids]}.
scroll¶
Body: an optional JSON filter (Qdrant filter syntax) or empty. Request: POST /collections/<col>/points/scroll with {limit: 100, with_payload: true, with_vector: false, filter?}. Response's result is set as the new body.
Headers¶
Read by the producer¶
| Header | Description |
|---|---|
qdrant.ids |
delete — comma-separated IDs. Optional alternative to body. |
Written by the producer¶
| Header | Description |
|---|---|
qdrant.collection |
Collection name. |
qdrant.operation |
Operation executed. |
qdrant.results.count |
search only — number of matches. |
Examples¶
Upsert embeddings:
- transform:
starlang: |
%sl 2.0
output application/json
input payload
---
embeddings_to_qdrant(payload)
- target: qdrant://docs/upsert?url=http://qdrant.internal:6333&apiKey=${QDRANT_KEY}
Search:
- rag-embed: { provider: openai, model: text-embedding-3-small }
- target: qdrant://docs/search?url=http://qdrant.internal:6333&topK=10
Delete with mixed IDs:
- set-header:
name: qdrant.ids
constant: "42,doc-7,abc-9"
- target: qdrant://docs/delete?url=http://qdrant.internal:6333
Scroll with a metadata filter:
- set-body:
constant: |
{ "must": [ { "key": "source", "match": { "value": "blog" } } ] }
- target: qdrant://docs/scroll?url=http://qdrant.internal:6333
Behavior notes¶
- Single-vector search —
processSearchissues a one-vector search. For multi-vector batches, build the request manually withhttp://. - Response cap —
io.LimitReaderat 100 MB per response. with_vector: falseon scroll — the default keeps responses small. Override by sending a custom request shape upstream.- Authentication — Qdrant Cloud requires the
api-keyheader. Self-hosted Qdrant typically doesn't. - Collection creation — out of scope. Use
http://to drive Qdrant's collection-management API or create collections at deploy time.
Source¶
pkg/component/qdrant/qdrant.go
See also¶
- milvus, pinecone — sibling vector backends.
- memvec — pure-Go in-process alternative.
- RAG retrieve reference — RAG-level retrieval strategies.