Skip to content

[BUG]: Qdrant vector search always fails — client.search() was removed in @qdrant/js-client-rest 1.19.0 #6270

Description

@matiasrk

How are you running AnythingLLM?

AnythingLLM desktop app

What happened?

Using Qdrant as vector database and for the Embedder option: "Generic OpenAI embedding model" Nemotron-3-Embed-8B-GGUF

Every RAG retrieval against a Qdrant vector database fails. In normal chat/query
mode this silently shows up as "There is no relevant information in this
workspace to answer your query". In agent mode the error surfaces:

[AgentHandler] memory.search raised an error. e.search is not a function

TypeError: e.search is not a function
    at Wg.similarityResponse (resources\backend\server.js:875:60730)

The workspace, collection and embedder are all configured correctly — the
collection exists, the vector count shows up in the workspace's Vector Database
tab, and the embedder runs fine (the log shows GenericOpenAiEmbedder Initialized and the query prefix being applied right before the crash).

Are there known steps to reproduce?

AnythingLLM 1.16.1 ships @qdrant/js-client-rest 1.19.0. That release
removed search from the REST client. From the qdrant-js changelog for 1.19.0:

The REST client dropped search, searchBatch, searchPointGroups,
recommend, recommendBatch, recommend_batch, recommendPointGroups,
discoverPoints and discoverBatchPoints. Use query, queryBatch and
queryGroups instead

But server/utils/vectorDbProviders/qdrant/index.js still calls the old method
in similarityResponse:

const responses = await client.search(namespace, {
  vector: queryVector,
  limit: topN,
  with_payload: true,
});

I confirmed the method is gone in the shipped package:

> node -e "const p=require('@qdrant/js-client-rest'); console.log(typeof p.QdrantClient.prototype.search, typeof p.QdrantClient.prototype.query)"
undefined function

Because the TypeError is thrown client-side, no search request is ever sent.
The Qdrant server log for a full chat attempt shows only the connection and the
namespace check:

"GET /cluster HTTP/1.1" 200 78 "-" "qdrant-js/1.19.0"
"GET /collections/my_collection HTTP/1.1" 200 591 "-" "qdrant-js/1.19.0"

There is never a POST /collections/my_collection/points/search. That is what
makes this confusing to diagnose: the connection works, the settings page reads
the vector count correctly, and it looks like an embedding or configuration
problem.

Since similarityResponse is shared by all chat modes, this affects Chat, Query
and Agent equally. It is not model-dependent — I reproduced it with several
different LLMs.

Are there known steps to reproduce?

  1. Set the vector database to Qdrant (I used Qdrant server 1.19.0 in Docker).
  2. Create a workspace and embed any document, or point the workspace slug at an
    existing collection.
  3. Ask anything in the chat.
  4. Nothing is retrieved. storage/logs/backend-*.log shows
    TypeError: e.search is not a function at ... similarityResponse, and the
    Qdrant server log shows no search request.

Suggested fix

Migrate the call to query(), which is the documented replacement. It returns
{ points: [...] } instead of a bare array:

const { points: responses } = await client.query(namespace, {
  query: queryVector,
  limit: topN,
  with_payload: true,
});

It would probably also be worth pinning @qdrant/js-client-rest rather than
using a caret range, since this was a breaking change picked up automatically at
build time.

Workaround

For anyone stuck on 1.16.1: adding a small search() shim back to
node_modules/@qdrant/js-client-rest/dist/cjs/qdrant-client.js restores
retrieval. It just forwards to query() and unwraps .points:

async search(collection_name, { vector, filter, params, limit = 10, offset,
                                with_payload = true, with_vector = false,
                                score_threshold, consistency, timeout, shard_key } = {}) {
    const response = await this.query(collection_name, {
        consistency, timeout, shard_key,
        query: vector, filter, params,
        score_threshold, limit, offset,
        with_vector, with_payload,
    });
    return response?.points ?? [];
}

After that the POST /points/search requests show up in the Qdrant log and
retrieval works normally. Note this gets wiped by every app update.



### LLM Provider & Model (if applicable)

any open weight LLM with tool use capabilities.

### Embedder Provider & Model (if applicable)

Nemotron-3-Embed-8B-GGUF

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    possible bugBug was reported but is not confirmed or is unable to be replicated.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions