--- title: Qdrant icon: database description: Set up the Qdrant resource in Python, including self-hosted Qdrant and Qdrant Cloud, with local or server-side semantic search. --- The Qdrant resource mounts a [Qdrant](https://qdrant.tech/) collection as a filesystem: group-by payload fields become folders, points become files, and semantic search is the `search` command. See [Qdrant Resource](/python/resource/qdrant) for the full layout and command list. ## Dependencies ```bash uv add 'mirage-ai[qdrant]' ``` The `qdrant` extra installs `qdrant-client[fastembed]`. `fastembed` powers local, in-process query embedding for the `search` command; filesystem browsing (`ls`/`cat`/`find`/`grep`) needs only the base client. ## Connection The same `QdrantConfig` works for self-hosted and cloud. ### Self-hosted ```python from mirage import MountMode, Workspace from mirage.resource.qdrant import QdrantConfig, QdrantResource config = QdrantConfig( host="localhost", port=6333, collection="fashion", group_by=["gender", "articleType", "baseColour"], id_field="id", text_field="productDisplayName", blob_field="image_b64", blob_ext="jpg", ) ws = Workspace({"/fashion/": QdrantResource(config)}, mode=MountMode.READ) ``` ### Qdrant Cloud Use `url` plus an `api_key`: ```python import os config = QdrantConfig( url="https://xyz.cloud.qdrant.io", api_key=os.environ["QDRANT_API_KEY"], collection="fashion", group_by=["gender", "articleType", "baseColour"], id_field="id", ) ws = Workspace({"/fashion/": QdrantResource(config)}, mode=MountMode.READ) ``` ## Search setup The `search` command embeds the query and runs Qdrant vector search. The collection must already store vectors produced by the same model (`embedding_model`, default `sentence-transformers/all-MiniLM-L6-v2`). Query embedding happens one of two ways: - **Local (default):** `fastembed` embeds the query in process. - **Server-side:** set `cloud_inference=True` to have an inference-enabled Qdrant Cloud cluster embed the query. The query text is sent to the server instead of being embedded locally. ```python config = QdrantConfig( url="https://xyz.cloud.qdrant.io", api_key=os.environ["QDRANT_API_KEY"], collection="fashion", group_by=["gender"], cloud_inference=True, embedding_model="sentence-transformers/all-MiniLM-L6-v2", ) ``` ```bash search "red running shoes" /fashion # ranked .txt:score + content cat /fashion/Men/Shoes/White/3.txt # follow a result to the real file ``` ## Config reference | Field | Required | Default | Description | | ------------------ | -------- | ------------------------------------------- | ------------------------------------------------------------ | | `url` | No | | Qdrant URL (Cloud or self-hosted); overrides `host`/`port` | | `host` | No | `localhost` | Host when `url` is unset | | `port` | No | `6333` | Port when `url` is unset | | `https` | No | `false` | Use TLS for `host`/`port` connections | | `api_key` | No | | Qdrant Cloud API key | | `collection` | No | | Pin one collection; the mount root becomes that collection | | `group_by` | No | `[]` | Payload fields that become nested folder levels | | `id_field` | No | `id` | Field name shown for the point id; names point files | | `text_field` | No | | Payload field served as the `.txt` embedded source text | | `blob_field` | No | | Payload field served as the raw blob/image file | | `blob_ext` | No | `bin` | Extension for the blob file (`jpg`, `png`, ...) | | `vector_field` | No | | Payload field holding a vector, omitted from `.json` | | `search_limit` | No | `10` | Default top-k returned by `search` | | `max_rows` | No | `1000` | Cap on points scanned per folder listing | | `embedding_model` | No | `sentence-transformers/all-MiniLM-L6-v2` | Model used to embed the query | | `cloud_inference` | No | `false` | Embed the query server-side instead of with local fastembed | The mount is read-only. See [Qdrant Resource](/python/resource/qdrant) for the filesystem layout and supported commands.