---
title: "Crop photos embedded with Voyage and saved to Qdrant"
kind: "Kit"
category: "Developer"
price: "Free"
seller: "Mindket"
version: "1"
url: "https://mindket.com/p/f5a7e4e6-7767-43bc-a3dc-81aa49cbf0af"
updated: "2026-11-12"
---

# Crop photos embedded with Voyage and saved to Qdrant

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

An n8n workflow you start by hand: it lists crop photos in a Google Cloud Storage bucket and embeds them with Voyage AI. The vectors are saved in a Qdrant collection, four photos at a time.

Crop photos embedded with Voyage and saved to Qdrant 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 fills a Qdrant collection with picture vectors. A manual trigger starts it. It checks whether the collection exists and creates it, with an index on `crop_name`, when it does not. Then it lists the photos in a Google Cloud Storage bucket, leaves out the tomato folder and asks Voyage AI for an embedding of each photo, four at a time. Every photo becomes a point with its crop name and its address. Thirteen nodes do the work, beside twelve sticky notes that explain the steps.

### Who it suits

Developers and data teams who want a labelled image collection in a vector database, for search, classification or anomaly checks. Skip it if your pictures are private. Voyage downloads each photo from a public address, so the bucket files must be readable without signing in.

Who uses it, and how

| Industry | Who uses it | How they use it | Example |
| --- | --- | --- | --- |
| Agriculture | Data teams | Index labelled crop photos for later classification | A team loads photos sorted in folders by crop, such as cucumber and wheat. |
| E-commerce | Catalog engineers | Build an image index for products sorted by category | An engineer loads product photos from folders named after each category. |
| Machine learning | ML engineers | Prepare a labelled collection for a nearest neighbour test | An engineer loads one folder for each class and tests a classifier on the points. |
| Research | Analysts | Keep an image dataset in a vector database to search it by meaning | An analyst keeps the photos and their folder names together in one collection. |

You need some n8n and a little cloud know-how: three credentials, a public bucket and a Qdrant cluster.

### Where to use it

Any n8n that can reach Qdrant, Voyage AI and Google Cloud Storage will run it. Qdrant can be a Cloud cluster or a server of your own.

- n8n Cloud: import the file into a new workflow there
- Your own n8n server: the same file and steps
- Qdrant Cloud or your own Qdrant: the collection that holds the vectors
- Another bucket or folder: change the bucket name and the prefix to load a different image set

### How to set it up

Download saves a zip with `workflow.json` and Mindket’s setup notes in your downloads folder. Four accounts are involved.

What you need first

| Need | Detail |
| --- | --- |
| n8n | On n8n Cloud or on a server of your own |
| Qdrant | A cluster with its address and an API key, saved in a Qdrant API credential |
| Voyage AI | An API key, saved in a Header Auth credential named \`Authorization\` with the value \`Bearer\` and your key |
| Google Cloud Storage | A bucket with public pictures sorted in folders by class, and a Google Cloud Storage credential |

1. In n8n, create a workflow, open its menu, choose Import from File and pick `workflow.json`.
2. Add the Qdrant API credential and select it in the four nodes that call Qdrant: `Check Qdrant Collection Existence`, `Create Qdrant Collection`, `Payload index on crop_name` and `Batch Upload to Qdrant`.
3. Add the Voyage Header Auth credential and select it in `Embed crop image`.
4. Add a Google Cloud Storage credential. Select it in `Google Cloud Storage`, replace `<YOUR_BUCKET_NAME>` with your bucket and set `prefix` to the folder that holds the class folders.
5. Open `Qdrant cluster variables` and replace `<YOUR_QDRANT_CLUSTER_URL>` with your cluster address. Check the collection name, the batch size of 4 and the vector size of 1024.
6. Look at `Filtering out tomato to test anomalies`. It skips the tomato folder on purpose, so delete or edit it if you want every class.
7. Press Execute workflow.

### How to use it

Press Execute workflow. The run creates the collection when it is missing, lists the bucket, embeds the photos in batches and saves them. Run it once for each collection, because a second run saves every photo again.

What to change for a different result

| To change | Where |
| --- | --- |
| The bucket and the folder | \`bucketName\` and \`prefix\` in \`Google Cloud Storage\` |
| The collection, the batch size and the vector size | The values in \`Qdrant cluster variables\` |
| The folders that are skipped | The condition in \`Filtering out tomato to test anomalies\` |
| The fields saved with each photo | \`batchPayloadQdrant\` in \`Batches in the API's format\` |
| The embedding model | \`model\` in \`Embed crop image\`, with the vector size to match |

### Example

A bucket holds `agricultural-crops/cucumber/` and `agricultural-crops/wheat/` with a few photos in each, and a `tomato` folder.

The run skips the tomato photos. Every other photo becomes a point in the collection with the vector `voyage`, a `crop_name` such as `cucumber` and an `image_path` that links to the photo.

### 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 one has two stages. The first prepares the Qdrant collection. The second turns the photos into vectors and saves them. Try it on a bucket with ten photos first.

**For experts.** Qdrant and Voyage are called with plain HTTP Request nodes, so the named vector `voyage` and the batch point format stay in your hands.

Where to look closer

| Node | What it does | What to know |
| --- | --- | --- |
| \`Check Qdrant Collection Existence\` | Asks Qdrant whether the collection exists | \`If collection exists\` reads \`result.exists\` |
| \`Create Qdrant Collection\` | Makes the collection with one named vector, Cosine distance | The vector size has to match the model, 1024 for the file’s model |
| \`Payload index on crop\_name\` | Adds a keyword index on \`crop\_name\` | Counting the photos of each crop later needs this index |
| \`Batch Upload to Qdrant\` | Saves ids, vectors and payloads in the batch format | The ids are the UUIDs made in the Code node |

### Good to know

The batching step was rewritten in JavaScript, and a second run saves every photo again.

- Code: the original batching step was a Python Code node. In n8n 2, native Python has no \`\_input\` and blocks standard library imports such as \`uuid\` unless the instance allows them (n8n’s docs, read on 12 November 2026). Mindket’s copy does the same job in JavaScript
- Second runs: the UUIDs are random on every run, so a second run adds every photo again as new points
- Public photos: Voyage fetches each picture from its address. Its docs, read on 12 November 2026, allow PNG, JPEG, WEBP and GIF up to 20 MB and 16 million pixels
- Model: the file uses \`voyage-multimodal-3\`, which those docs still list as a recommended model
- Calls: with the batch size of 4, one hundred photos make 25 calls to Voyage and 25 to Qdrant
- Your data: the photo addresses go to Voyage, and the addresses and crop names go to Qdrant. The file holds no credential

## README

```markdown
# Crop photos embedded with Voyage and saved to Qdrant

An n8n workflow you start by hand. It lists the crop photos in a Google Cloud Storage bucket, turns each one into an embedding with Voyage AI and saves the vectors in a Qdrant collection, four photos at a time.

## What is inside

- `workflow.json`: the workflow as n8n exports it, twenty-five nodes. Thirteen do the work and twelve are sticky notes that explain the steps. It holds no credential.
- `README.md`: these notes.

## What we changed from the original copy

- The step that splits the photos into batches and gives each one a UUID was a Python Code node. In n8n 2, native Python offers only `_items` and `_item`, has no `_input`, and blocks standard library imports such as `uuid` unless the instance allows them (n8n's docs, read on 12 November 2026). Mindket's copy does the same job in JavaScript.
- The Qdrant cluster address and the bucket name belonged to the original author. They are now the placeholders `<YOUR_QDRANT_CLUSTER_URL>` and `<YOUR_BUCKET_NAME>`.
- Several nodes were linked to credentials in the author's n8n. The links are gone, so select your own.
- Nothing else. The tomato filter, the batch size and the sticky notes are the file's own.

## Before you start

- An n8n instance, on n8n Cloud or your own server.
- A Qdrant cluster, on Qdrant Cloud or your own server, with its address and an API key.
- A Voyage AI API key.
- A Google Cloud Storage bucket whose pictures anyone can read without signing in, sorted in folders by class, such as `agricultural-crops/cucumber/photo-1.jpg`. Voyage downloads every picture from its address.

## Set it up

1. In n8n, create a workflow, open its menu and choose Import from File. Pick `workflow.json`.
2. Add a Qdrant API credential with your cluster address and key. Select it in `Check Qdrant Collection Existence`, `Create Qdrant Collection`, `Payload index on crop_name` and `Batch Upload to Qdrant`.
3. Add a Header Auth credential for Voyage. Name it `Authorization` and give it the value `Bearer <YOUR_VOYAGE_KEY>` with your own key. Select it in `Embed crop image`.
4. Add a Google Cloud Storage credential and select it in `Google Cloud Storage`.
5. In that node, replace `<YOUR_BUCKET_NAME>` with your bucket. Set `prefix` to the folder that holds the class folders. The file uses `agricultural-crops`.
6. Open `Qdrant cluster variables` and replace `<YOUR_QDRANT_CLUSTER_URL>` with your cluster address, with `https://` in front and no slash at the end. Check the collection name, the batch size of 4 and the vector size of 1024.
7. Look at `Filtering out tomato to test anomalies`. It skips the tomato folder on purpose. Delete the node or edit it if you want every class.
8. Press Execute workflow.

## How a run goes

1. The manual trigger starts the run when you press Execute workflow, and `Qdrant cluster variables` sets the cluster address, the collection name, the vector size and the batch size.
2. `Check Qdrant Collection Existence` (HTTP Request 4.2) asks Qdrant whether the collection exists, and `If collection exists` reads the answer.
3. If it does not exist, `Create Qdrant Collection` makes it with one named vector, `voyage`, compared by Cosine distance. `Payload index on crop_name` then adds a keyword index on the `crop_name` field.
4. `Google Cloud Storage` lists every object under the prefix. `Get fields for Qdrant` builds a `publicLink` for each photo and takes the `cropName` from the folder that holds it.
5. `Filtering out tomato to test anomalies` drops the tomato photos.
6. A Code node groups the photos into batches of `batchSize` and gives each photo a UUID, because Qdrant does not make point ids. `Batches in the API's format` reshapes each batch for Voyage and for Qdrant.
7. `Embed crop image` sends a batch to Voyage's multimodal embeddings API with the model `voyage-multimodal-3` and `input_type` set to `document`. `Batch Upload to Qdrant` saves the batch with its ids, vectors and payloads.

## Change the result

- Bucket and folder: `bucketName` and `prefix` in `Google Cloud Storage`.
- Collection, batch size and vector size: the values in `Qdrant cluster variables`.
- Skipped folders: the condition in `Filtering out tomato to test anomalies`.
- Fields saved with each photo: `batchPayloadQdrant` in `Batches in the API's format`.
- Embedding model: `model` in `Embed crop image`. Change the vector size to match and use a new collection.

## Good to know

- Run it once for each collection. The UUIDs are random on every run, so a second run saves every photo again as new points.
- Voyage fetches each picture from its address, so the files must be public. Voyage's docs, read on 12 November 2026, say a picture must be a PNG, JPEG, WEBP or GIF, at most 20 MB and 16 million pixels. Its address must also answer with a content length and respect robots.txt.
- The file uses `voyage-multimodal-3`, which those docs still list as a recommended model.
- With the batch size of 4, one hundred photos make 25 calls to Voyage and 25 to Qdrant.
- Voyage bills the embeddings to your key, and Qdrant keeps the vectors in your cluster.
- The public address of each photo goes to Voyage, and the address and crop name go to Qdrant.
- The file holds no credential and no key.
```

## What is in it

3 files, 27 KB, downloaded as a zip.

```text
NOTICE.md  749 B
README.md  5 KB
workflow.json  22 KB
```

## Workflow check

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

- Steps: 13 steps, starting by hand
- AI: No step calls an AI model
- Sign-ins: Signs in to: Qdrant, Google Cloud Storage and api.voyageai.com
- API keys: No API key is left in the file
- Step types: Mindket’s checker reads all 7 of its step types

## Get it

- [Get it on your Mindket account](https://account.mindket.com/account/?product=mindket#/market/f5a7e4e6-7767-43bc-a3dc-81aa49cbf0af)
- [Its page on Mindket](https://mindket.com/p/f5a7e4e6-7767-43bc-a3dc-81aa49cbf0af)
