Skip to content

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

qdrant://<collection>/<operation>?url=http://localhost:6333&apiKey=...

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: [...]}.

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.ids comma-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 — processSearch issues a one-vector search. For multi-vector batches, build the request manually with http://.
  • Response cap — io.LimitReader at 100 MB per response.
  • with_vector: false on scroll — the default keeps responses small. Override by sending a custom request shape upstream.
  • Authentication — Qdrant Cloud requires the api-key header. 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