Huashu Design
alchaincyf · Skill
Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…
An n8n workflow that another workflow or an AI agent calls with a picture address. It embeds the picture with Voyage AI and returns the class most of its nearest Qdrant neighbours share.
Aerial photo classified by its nearest neighbours in Qdrant is an n8n workflow in the Developer category, listed by Mindket. It is free. This is version 1, last updated on . Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.
Called by another workflow
It starts when another workflow or an AI agent calls it, with one value in the item:
One item with class, the name most of the nearest labelled photos carry
What you need before you start.
Embedding model
Turns the picture into a vector with voyage-multimodal-3 from its public address.
NeedsA Voyage AI API key, in a Header Auth credential
Vector database
Returns the nearest labelled photos to the vector, with their payloads, from the collection you filled.
NeedsA Qdrant cluster address and an API key, in a Qdrant API credential, and a collection of labelled photos
Checked by Mindket on 13 Nov 2026
This n8n workflow names the land type shown in an aerial photo. Another workflow or an AI agent calls it with a picture address. It asks Voyage AI for the photo’s embedding and queries a Qdrant collection of labelled photos for the nearest ones. The class most of them share is the answer. When two classes tie, it asks for five more neighbours and votes again. Ten nodes do the work, beside eight sticky notes.
Developers who build image search or sorting on a vector database and want a ready classifier step for an agent or a pipeline. Skip it without a labelled collection. The workflow only reads one, so you must fill it first.
| Industry | Who uses it | How they use it | Example |
|---|---|---|---|
| Mapping | GIS analysts | Sort aerial tiles into land types before a manual review | An analyst sends a tile address and gets back harbor. |
| Real estate | Data teams | Label scenes in a photo archive of properties | A team labels a photo as denseresidential before filing it. |
| Agriculture | Agronomists | Tell farmland photos from roads, forest or buildings | A scout sends a photo and learns whether it shows farmland. |
| Software | Agent builders | Give an AI agent a tool that names what a picture shows | An agent calls the workflow with an address and reads the class back. |
You need solid n8n for this one: a collection that is already filled, two credentials and a way to call the workflow.
Any n8n that can reach Qdrant and Voyage AI will run it. Another workflow calls it with an Execute Workflow node, or an AI agent calls it as a tool.
query.imageURLDownload saves a zip with workflow.json and Mindket’s setup notes in your downloads folder. Qdrant and Voyage AI are the two accounts.
| Need | Detail |
|---|---|
| n8n | On n8n Cloud or on a server of your own |
| Qdrant | A cluster address and an API key in a Qdrant API credential, and a collection of labelled photos |
| Voyage AI | An API key, saved in a Header Auth credential named Authorization with the value Bearer and your key |
| Pictures | Public addresses that Voyage can download, as PNG, JPEG, WEBP or GIF files |
workflow.json.Query Qdrant.Embed image.Qdrant variables + embedding + KNN neigbours. Replace <YOUR_QDRANT_CLUSTER_URL> with your cluster address and set collectionName to your collection. The file uses land-use.limitKNN, the number of neighbours asked for first. The file uses 10.{ "query": { "imageURL": "<A_PUBLIC_PICTURE_ADDRESS>" } } on Execute Workflow Trigger with a real address and press Execute workflow.Send the workflow an item with query.imageURL. It returns one item with class, the name that most of the nearest photos carry. To test it alone, pin that item on the trigger and press Execute workflow.
| To change | Where |
|---|---|
| The collection and the first number of neighbours | collectionName and limitKNN in Qdrant variables + embedding + KNN neigbours |
| How far a tie may grow | The 100 in Check tie and the 5 in Increase limitKNN |
| The class field | The field name in Majority Vote |
| The embedding model | model in Embed image, which has to match the model that made the collection |
A call sends the address of an aerial photo of boats along a quay.
Voyage turns the photo into a vector, and Qdrant returns the ten nearest labelled photos. The vote counts their class names. If harbor has the most, the workflow returns class with the value harbor.
If you are new. n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. A vector is a list of numbers that stands for what a picture looks like. Photos that look alike get vectors that sit close together, and Qdrant finds the closest ones.
For experts. It is a k nearest neighbours vote with a tie loop. The neighbour count grows by five while the top two classes tie and the count is 100 or less.
| Node | What it does | What to know |
|---|---|---|
Query Qdrant | HTTP Request to the collection’s points query, with the vector name voyage | Payloads come back with every point, and the vote reads them |
Majority Vote | Code in JavaScript that counts the class field of the returned points | It returns the two most common classes with their counts |
Check tie | If node with three conditions | A tie only repeats while the neighbour count is 100 or less |
Propagate loop variables | Set node that keeps the result and the number of points found | On 100 points or fewer, a tie across every point can repeat without end |
The vote was rewritten in JavaScript, and the workflow always gives an answer.
Majority Vote was a Python Code node. In n8n 2, native Python blocks standard library imports unless the instance allows them (n8n’s docs, read on 12 November 2026). Mindket’s copy counts the classes in JavaScript and returns the same listvoyage, made in document mode, and a class name in the payloadAn n8n workflow that another workflow or an AI agent calls with a picture address. It embeds the picture with Voyage AI, finds its nearest neighbours in a Qdrant collection and answers with the class most of them share.
workflow.json: the workflow as n8n exports it, eighteen nodes. Ten do the work and eight are sticky notes that explain the steps. It holds no credential.README.md: these notes.Majority Vote step was a Python Code node that counted the class names with Counter. In n8n 2, native Python offers only _items and _item, has no _input, and blocks standard library imports such as collections unless the instance allows them (n8n's docs, read on 12 November 2026). Mindket's copy counts them in JavaScript and returns the same list of the two most common classes.<YOUR_QDRANT_CLUSTER_URL>.voyage, made with the Voyage model voyage-multimodal-3 and input_type set to document, and a payload field landscape_name that holds its class.workflow.json.Query Qdrant.Authorization and give it the value Bearer <YOUR_VOYAGE_KEY> with your own key. Select it in Embed image.Qdrant variables + embedding + KNN neigbours. Replace <YOUR_QDRANT_CLUSTER_URL> with your cluster address, with https:// in front and no slash at the end. Set collectionName to your collection. The file uses land-use.limitKNN, the number of neighbours asked for first. The file uses 10.Execute Workflow Trigger, pin the data { "query": { "imageURL": "<A_PUBLIC_PICTURE_ADDRESS>" } } with a real address, and press Execute workflow.query.imageURL.Execute Workflow Trigger receives the item, and Image Test URL copies query.imageURL into imageURL.Embed image (HTTP Request 4.2) sends the address to Voyage's multimodal embeddings API.Qdrant variables + embedding + KNN neigbours keeps the vector as ImageEmbedding and sets the cluster address, the collection name and limitKNN.Query Qdrant asks the collection's points query for the nearest points to that vector, with the payloads, using the vector name voyage.Propagate loop variables stores how many points came back and keeps the result. Majority Vote counts the landscape_name of those points and returns the two most common classes with their counts.Check tie looks at the two counts. If they are equal and limitKNN is 100 or less, Increase limitKNN adds five neighbours and Query Qdrant runs again.Return class returns the most common class as class.Qdrant variables + embedding + KNN neigbours.Check tie and the 5 in Increase limitKNN.landscape_name in Majority Vote.model in Embed image. It has to match the model that made the collection.document mode, save them as a named vector voyage and put the class in landscape_name.Propagate loop variables resets limitKNN to the number of points returned. On a collection of 100 points or fewer, a tie that survives every point can repeat without end.voyage-multimodal-3, which those docs still list as a recommended model.NOTICE.md 667 B README.md 5 KB workflow.json 16 KB
alchaincyf · Skill
Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…
op7418 · Skill
Skill that makes single-file HTML slide decks, slide illustrations and platform covers in two visual styles, with a presenter mode for rehearsal. For speakers…
alirezarezvani · Skill
Adds 411 ready-made skills for Claude Code and other coding agents, grouped by role from engineering and product to marketing, finance and compliance. Installs…
block · Kit
Self-hostable workspace where people and AI agents share the same rooms, built on a Nostr relay that logs every action as a signed event. For teams that want t…
backnotprop · Kit
Opens your AI coding agent's plans, specs and code changes in a browser so you can annotate or comment on them and send the feedback straight back to the agent.
alibaba · Kit
Reviews Git changes with an AI agent that reads files and searches the codebase, then writes comments tied to exact lines. It suits developers who want automat…