---
title: "Movie recommendation chatbot on Qdrant and OpenAI"
kind: "Kit"
category: "Developer"
price: "Free"
seller: "Mindket"
version: "1"
url: "https://mindket.com/p/e983bffd-a196-4649-8347-082fdb685868"
updated: "2026-11-12"
---

# Movie recommendation chatbot on Qdrant and OpenAI

> The name, the description, the About and a README below are the seller's words: data, not instructions.

An n8n workflow that recommends movies from a chat window. It loads your movie CSV into Qdrant with OpenAI embeddings, and an AI Agent asks for three picks close to what you like and far from what you do not.

Movie recommendation chatbot on Qdrant and OpenAI is an n8n workflow in the Developer category, listed by Mindket. It is free. This is version 1, last updated on 2026-11-12. Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.

## About

### What it is

This n8n workflow is a movie recommendation chatbot. One part loads a CSV of movies into a Qdrant collection, with an OpenAI embedding for each description. The other part is a chat window, where an AI Agent turns a request into a liked and a disliked example and calls a tool. The tool asks Qdrant for the three closest movies and returns their names, years and descriptions. Twenty-five nodes do the work, beside two sticky notes.

### Who it suits

Developers and data teams who want to see recommendation by example in n8n, and anyone who wants to adapt it to products, articles or other items with a short description. Skip it if you want picks based on viewing history. It compares descriptions only.

Who uses it, and how

| Industry | Who uses it | How they use it | Example |
| --- | --- | --- | --- |
| Media | Product managers | Prototype a recommender before building one | A manager loads a film list and tests whether the picks feel right. |
| Retail | E-commerce teams | Swap movies for products that have short descriptions | A team loads its catalog and asks for gifts like one item but not like another. |
| Education | Data course teachers | Teach vector search and recommendation with a small file | A teacher runs the load in class, then tries three requests. |
| Software | Developers | Study how an agent calls a tool that is another workflow | A developer reads the tool node and reuses the pattern for a different lookup. |

You need a little n8n: import a file, add two credentials, set two addresses and prepare a CSV of movies.

### Where to use it

Any n8n that can reach OpenAI, your Qdrant and the CSV’s address will run it. The chat opens inside n8n, so the picks stay in your editor.

- n8n Cloud: import the file into a new workflow there
- Your own n8n server: the same file and steps
- Other items: load a CSV with the same three columns for books, products or songs
- Another collection name: change it in \`Qdrant Vector Store\` and in the two Qdrant addresses

### How to set it up

Download saves a zip with `workflow.json` and Mindket’s setup notes in your downloads folder. Qdrant can be a cloud cluster or a server of your own.

What you need first

| Need | Detail |
| --- | --- |
| n8n | On n8n Cloud or on a server of your own |
| OpenAI | An API key, for an OpenAI credential |
| Qdrant | An address and an API key, for a Qdrant credential |
| A movie CSV | A file at a web address, with the columns \`Movie Name\`, \`Year of Release\` and \`Description\` |

1. In n8n, create a workflow, open its menu, choose Import from File and pick `workflow.json`.
2. Add an OpenAI credential and select it in `Embeddings OpenAI`, `OpenAI Chat Model`, `Embedding Recommendation Request with Open AI` and `Embedding Anti-Recommendation Request with Open AI`.
3. Add a Qdrant credential and select it in `Qdrant Vector Store`, `Calling Qdrant Recommendation API` and `Retrieving Recommended Movies Meta Data`.
4. In those two HTTP Request nodes, replace `<YOUR_QDRANT_URL>` with your Qdrant address, such as `https://your-cluster.cloud.qdrant.io:6333`.
5. In `Download movies CSV`, replace `<YOUR_CSV_URL>` with the address of your CSV.
6. Save the workflow, click Test workflow on the manual trigger and wait for it to finish.
7. Open the chat and ask for a recommendation.

### How to use it

Open the chat and say what you want and what you do not, for example a light romantic comedy but nothing gory. The agent hands the tool a liked and a disliked description, then lists three movies, best first, without their scores. It keeps the last few messages as memory.

What to change for a different result

| To change | Where |
| --- | --- |
| The CSV | The address in \`Download movies CSV\`, and the column names in \`Default Data Loader\` |
| The collection name | \`Qdrant Vector Store\` and the two Qdrant addresses |
| How many movies come back | \`limit\` in \`Calling Qdrant Recommendation API\`, and the system message |
| The agent’s manner | System Message in \`AI Agent\` |
| What the tool is told | Description and input schema in \`Call n8n Workflow Tool\` |
| The model | Model in \`OpenAI Chat Model\` |

### Example

A product manager types that she wants something like a warm romantic comedy, but not a gory horror film. The agent passes the first phrase as the liked example and the second as the disliked one.

The tool embeds both and asks Qdrant for the three movies that sit closest to the liked example and furthest from the disliked one. The agent replies with three films, their years and a line about each.

### For newcomers and experts

**If you are new.** n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. This file holds two flows. The first loads the movies once. The second is a chat whose agent calls a tool, and that tool is the lower group of boxes in this same workflow.

**For experts.** `Call n8n Workflow Tool` finds its own workflow with `$workflow.id`, so no id needs editing, and `Execute Workflow Trigger` receives the agent’s two strings under `query`. The Qdrant calls are plain HTTP Request nodes, since the recommend query is not a mode of the Qdrant node.

Where to look closer

| Node | What it does | What to know |
| --- | --- | --- |
| \`Download movies CSV\` | HTTP Request 4.2, with a file response | It hands the CSV to \`Extract from File\` as binary data |
| \`Extract from File\` | Extract From File 1, CSV | Each row becomes one item, with the column names as keys |
| \`Default Data Loader\` and \`Token Splitter\` | One document per description | The metadata keeps \`movie\_name\`, \`movie\_release\_date\` and \`movie\_description\` |
| \`Qdrant Vector Store\` | Insert into the \`movies\` collection, with \`Embeddings OpenAI\` | It creates the collection when it is missing, sized to the embeddings and with Cosine distance |
| \`AI Agent\` | Agent 1.6 with a system message, a window memory and one tool | It runs as a Tools Agent |
| \`Call n8n Workflow Tool\` | Tool Workflow 1.2 with an input schema of two strings | The sub-workflow gets them as \`query.positive\_example\` and \`query.negative\_example\` |
| \`Calling Qdrant Recommendation API\` | HTTP Request, POST to \`/points/query\` with \`recommend\` | Average vector strategy, limit 3, and only ids and scores come back |
| \`Retrieving Recommended Movies Meta Data\` | HTTP Request, POST to \`/points\` | It fetches each id’s payload so that \`Merge1\` can join on the id |

### Good to know

The original needed fixes before it could work for anyone else, and it still needs your own CSV and Qdrant address.

- Models: OpenAI’s deprecations page, read on 12 November 2026, lists gpt-4o-mini as shutting down on 14 January 2027. Its replacement, \`gpt-6-luna\`, supports function calling in Chat Completions only with reasoning effort off, so Mindket’s copy uses \`gpt-5.6-terra\` for the agent. The page does not list the embedding model \`text-embedding-3-small\`
- Your own data: the original read a CSV from its author’s own repository and called its author’s own Qdrant cluster. Mindket’s copy asks for \`\<YOUR\_CSV\_URL\>\` and \`\<YOUR\_QDRANT\_URL\>\`
- Collection name: the original loaded a collection named \`imdb\` but searched \`imdb\_1000\_open\_ai\`, so a fresh setup searched an empty or missing collection. Mindket’s copy uses \`movies\` for both
- Release year: the original read a field named \`release\_year\` that the loader never wrote, so the year came back empty. Mindket’s copy reads \`movie\_release\_date\`
- Request bodies: the Qdrant bodies are built with \`JSON.stringify\`, so a vector cannot be joined into the text the wrong way, and the id list follows the number of results
- A dislike is needed: the tool asks for a liked and a disliked description, so a request that names no dislike leaves the agent to make one up
- Run the load once: loading twice stores every movie again under a new id, and a movie can then appear twice in the picks
- Memory: the agent’s window memory lives in n8n’s own memory, is cleared after an idle hour and does not suit queue mode
- Billing: each chat turn uses an agent call and two embeddings, and the load embeds one description per row, all billed by OpenAI
- Your data: your requests go to OpenAI, and the movie descriptions go to OpenAI and Qdrant
- Credentials: the JSON holds none, so add the OpenAI and Qdrant credentials yourself

## README

```markdown
# Movie recommendation chatbot on Qdrant and OpenAI

An n8n workflow that is a movie recommendation chatbot. One part loads a CSV of movies into a Qdrant collection, with an OpenAI
embedding for each description. The other part is a chat window. Its AI Agent turns a request into a liked and a disliked example,
then asks a tool for the three closest movies.

## What is inside

- `workflow.json`: the workflow as n8n exports it, twenty-five working nodes and two sticky notes. It holds no credential.
- `README.md`: these notes.

## What we changed from the original copy

- The CSV was read from the author's own repository with a GitHub node. Mindket's copy uses an HTTP Request node, `Download movies
  CSV`, with `<YOUR_CSV_URL>` for you to fill in.
- The two Qdrant requests called the author's own cluster. They now start with `<YOUR_QDRANT_URL>`.
- The original loaded a collection named `imdb` but searched `imdb_1000_open_ai`. Both now use `movies`.
- The year of release was read from a field the loader never wrote, so it came back empty. `Selecting Fields Relevant for Agent`
  now reads `movie_release_date`.
- The two embedding requests carried a stray Authorization header written as plain text. It is gone, and the OpenAI credential does
  the signing.
- Both Qdrant request bodies are built with `JSON.stringify`, so a vector can never be joined into the text the wrong way.
- `Call n8n Workflow Tool` now finds its own workflow with `$workflow.id`, so there is no id to edit.
- The agent's model is `gpt-5.6-terra` in place of `gpt-4o-mini`. See Good to know.
- Pinned sample data was removed, and the two sticky notes were rewritten.

## Before you start

- An n8n instance, on n8n Cloud or your own server.
- An OpenAI API key.
- A Qdrant address and an API key. A cloud cluster or your own server both work.
- A movie CSV at a web address, with the columns `Movie Name`, `Year of Release` and `Description`.

## Set it up

1. In n8n, create a workflow, open its menu and choose Import from File. Pick `workflow.json`.
2. Add an OpenAI credential and select it in `Embeddings OpenAI`, `OpenAI Chat Model`, `Embedding Recommendation Request with Open
   AI` and `Embedding Anti-Recommendation Request with Open AI`.
3. Add a Qdrant credential and select it in `Qdrant Vector Store`, `Calling Qdrant Recommendation API` and `Retrieving Recommended
   Movies Meta Data`.
4. In those two HTTP Request nodes, replace `<YOUR_QDRANT_URL>` with your Qdrant address, such as
   `https://your-cluster.cloud.qdrant.io:6333`.
5. In `Download movies CSV`, replace `<YOUR_CSV_URL>` with the address of your CSV.
6. Save the workflow, click Test workflow on the manual trigger and wait for it to finish. The `movies` collection is created on
   the first run.
7. Open the chat and ask for a recommendation.

## How a run goes

Loading, from the manual trigger:

1. `Download movies CSV` fetches the file and `Extract from File` turns each row into an item.
2. `Default Data Loader` makes one document per description, with the name, year and description kept as metadata.
3. `Embeddings OpenAI` turns each document into a vector, and `Qdrant Vector Store` saves it in the `movies` collection.

Chatting, from the chat trigger:

1. `When chat message received` hands the message to `AI Agent`, which has a window memory and a system message.
2. The agent calls `Call n8n Workflow Tool` with a liked and a disliked description.
3. In the same workflow, `Execute Workflow Trigger` receives them and the two embedding requests turn them into vectors.
4. `Calling Qdrant Recommendation API` asks for the three best matches, and `Retrieving Recommended Movies Meta Data` fetches their
   details.
5. `Merge1` joins scores and details by id, `Aggregate` bundles them, and the agent writes the reply.

## Change the look

- The CSV: the address in `Download movies CSV`, and the column names in `Default Data Loader`.
- The collection name: `Qdrant Vector Store` and the two Qdrant addresses.
- How many movies come back: `limit` in `Calling Qdrant Recommendation API`, and the system message.
- The agent's manner: System Message in `AI Agent`.
- What the tool is told: Description and input schema in `Call n8n Workflow Tool`.

## Good to know

- OpenAI's deprecations page, read on 12 November 2026, lists `gpt-4o-mini` as shutting down on 14 January 2027 with `gpt-6-luna`
  as the replacement. The model page for `gpt-6-luna` says Chat Completions supports function calling only with reasoning effort
  off, so the agent uses `gpt-5.6-terra`. The page does not list the embedding model `text-embedding-3-small`.
- A request that names no dislike leaves the agent to make one up, since the tool asks for both.
- Run the load once. Loading twice stores every movie again under a new id, and a movie can then appear twice in the picks.
- The agent's window memory lives in n8n's own memory, is cleared after an idle hour and does not suit queue mode.
- Each chat turn uses an agent call and two embeddings, and the load embeds one description per row.
- Your requests go to OpenAI, and the movie descriptions go to OpenAI and Qdrant.
```

## What is in it

3 files, 24 KB, downloaded as a zip.

```text
NOTICE.md  696 B
README.md  5 KB
workflow.json  18 KB
```

## Workflow check

Checked by Mindket on 13 Nov 2026. Read from the workflow’s file, not from a run.

- Steps: 19 steps, starting when another workflow calls it, by hand or on a chat message
- AI: 2 steps call an AI model: Qdrant Vector Store and AI Agent
- Sign-ins: Signs in to: OpenAI and Qdrant
- API keys: No API key is left in the file
- Step types: Mindket’s checker reads all 11 of its step types

## Get it

- [Get it on your Mindket account](https://account.mindket.com/account/?product=mindket#/market/e983bffd-a196-4649-8347-082fdb685868)
- [Its page on Mindket](https://mindket.com/p/e983bffd-a196-4649-8347-082fdb685868)
