← All articles
9 min read

How AI Chat Agents Process Product Images — Scoped to What Your Store Sells

A shopper takes a photo of a jacket they already own and drops it into the chat: "Do you have this?" Another sends a picture of a cracked phone case: "This arrived broken." A third snaps a lamp they saw at a friend's place: "Anything like this?" These are three different jobs, and a store chat agent that handles images well does all of them — while quietly refusing a fourth: the random selfie, meme, or screenshot that has nothing to do with what you sell.

That last part is the whole trick. General-purpose vision models will happily describe any image. A store agent should not. Its camera is pointed at your catalog and nowhere else. This post is about how to build that: the pipeline, the gate that keeps random images out, and the three things it does once an image is allowed through.

What "image processing" means for a store agent

It does not mean "the AI can see." It means the agent can turn a shopper's photo into a question about your inventory and answer it with real SKUs. The unit of truth is the same as it is for text search: your live catalog. An uploaded image is only useful to the degree it can be matched against something you actually stock.

So the design goal is narrow on purpose. Three catalog-grounded jobs, one hard guardrail:

The catalog-scoped image pipelineshopper uploadRelevance gateis this a product?Embed + searchmatch the catalogGrounded answerSKU · condition · similarDecline politelyask for a product photopassfailNothing reaches the model until the gate decides the image could be something you sell.
The pipeline in one picture. Every uploaded image hits a relevance gate first. Only images that plausibly match the catalog are embedded, searched, and answered; everything else is declined before it ever reaches the language model.

Start with the gate, not the model

The instinct is to wire the image straight into a multimodal model and ask "what is this?" Resist it. The first component you build is the relevance gate: a cheap check that answers a single question — could this image be something we sell? — and drops everything that fails before any expensive reasoning happens.

The gate is not a separate AI mood; it is the natural by-product of the matching step. You embed the uploaded image into the same vector space as your product images, look up the nearest catalog item, and read the similarity score. If the best match is strong, process it. If the best match is weak, the image is out-of-catalog by definition — a face, a landscape, a competitor's packaging, a screenshot of a spreadsheet — and the agent declines.

One threshold decides what gets processedthreshold ≈ 0.750.91Product photoprocess0.78Blurry boxprocess0.12Selfie / memedeclineBest catalog match below the line → the agent never guesses. It asks for a clearer product photo.
A single similarity threshold does the gating. A clear product photo scores high and gets processed. A blurry-but-plausible product photo squeaks over the line. A selfie or meme scores near zero and is declined — the agent asks for a product photo instead of hallucinating one.

A reasonable starting threshold is a cosine similarity around 0.75 against your catalog embeddings — then tune it on real uploads. Set it too low and the agent tries to "match" a houseplant to a hoodie; set it too high and it rejects legitimate but badly-lit photos. The failure mode you want is the safe one: when in doubt, decline and ask for a clearer product shot. A polite "I couldn't recognise a product in that image — mind sending a photo of the item itself?" beats a confident wrong answer every time.

Why the gate matters more than the model

Without a gateWith a gate
Describes any image — including private photos and memesOnly reasons about images that resemble your products
Hallucinates a "match" for things you don't sellSays "not in our catalog" and moves on
Burns tokens and latency on every uploadDrops junk with one cheap vector lookup
Becomes a general image chatbot bolted to your storeStays a shopping assistant that happens to accept photos

Job 1 — "Is this one of ours?"

This is visual search, and it runs on the same machinery as the gate. Encode the uploaded image into a vector with an image embedding model, then find the nearest product vectors in your store's catalog collection. The top hit — if it clears the threshold — is your answer; the next few are useful for "or did you mean one of these?"

Two details make this production-grade rather than a demo. First, the results are real SKUs with current price and stock, not a model's description of what it thinks the photo shows. Second, you return a ranked shortlist, not a single guess — shoppers are forgiving of "here are the three closest" and unforgiving of a wrong single answer stated with confidence.

"Is this one of ours?" — nearest neighbours in the cataloguploaded photo → vectorCozy Hoodie — Navyexact match0.94Cozy Hoodie — Slatesame style0.88Sherpa Pulloversimilar0.71
Visual search returns a ranked shortlist of real catalog items with similarity scores. The exact colourway leads; near-matches follow. The shopper picks; the agent can then add to cart, check stock, or pull up reviews — all the normal catalog tools, now reachable from a photo.

Job 2 — "Is it broken?"

Post-purchase, the most valuable image a shopper can send is a photo of something wrong. Because your catalog already holds the pristine reference image for every SKU, the agent has a baseline to compare against. Once the item is matched (Job 1), a condition check looks for the difference between "how we ship it" and "what arrived": a crack, a tear, a stain, a missing accessory, the wrong colour.

This is where scoping pays off twice. A general model asked "is this damaged?" has no idea what undamaged looks like. An agent that knows the exact product can say "the strap is torn — that's not how this ships" and route straight into your returns or warranty flow. Keep a human in the loop for the actual refund decision; let the agent do the triage that otherwise eats a support queue.

"Is it broken?" — compare against the pristine catalog imageCatalog referenceShopper photoCondition checkdefect · missing partVerdict: cracked screen — eligible for warranty returnThe reference is your own product image, so "damaged" means damaged relative to how you ship it.
Damage is judged relative to your own product image, not to some generic notion of 'a phone.' Matched SKU in hand, the agent compares the shopper's photo to the catalog reference, flags the defect, and hands off to the returns flow with the evidence attached.

Job 3 — "Find me something like it"

Sometimes the photo is not one of yours — and that is a sales opportunity, not a dead end. If the image passes the gate (it clearly depicts a product in a category you sell) but doesn't match a specific SKU closely, pivot to discovery: return the visually and categorically nearest items you do stock.

The line between "no match" and "here are similar options" is the same threshold, read differently. A near-zero score means out-of-catalog → decline. A middling score means in-category but not this exact item → "we don't carry that one, but these three are close." That single number drives all three outcomes:

Best catalog matchInterpretationAgent behaviour
High (≈ 0.85+)This is one of oursShow the SKU · add to cart · check condition
Medium (≈ 0.75–0.85)Same category, different item"Not that exact one — here are similar options"
Low (< 0.75)Not plausibly in the catalogDecline · ask for a product photo

How the matching actually works

Under the hood there is no magic — just embeddings and a vector search, the same pattern that grounds text-based product search. The build has three moving parts:

# Sketch of the request-time path
vec        = image_embed(upload)              # same model as the index
hits       = catalog.search(vec, top_k=5)     # per-store vector collection
top        = hits[0]

if top.score < 0.75:
    return decline("I couldn't spot a product in that image.")
elif top.score < 0.85:
    return similar_items(hits)                # in-category, not this SKU
else:
    return matched_product(top)               # add-to-cart, condition check

Everything downstream of the match — add to cart, check stock, start a return — is the store's existing toolkit. The image step just gives those tools a new way in. A photo becomes a SKU; a SKU is something your agent already knows how to act on.

A worked example

One upload, all four behaviours in a single conversation:

Match, condition, decline, decline — the agent never once described the shopper's face or guessed at the lamp. That restraint is the feature.

Guardrails worth building in from day one

How this fits WisWes

WisWes already grounds every answer in a per-store catalog: product search, cart actions, and policy answers all run against your live inventory rather than a model's training data. Catalog-scoped image processing is the same idea with a camera pointed at it. The store-level vector collection that powers text search is exactly the index an uploaded photo gets compared against — which is what makes the "ignore anything we don't sell" behaviour fall out naturally rather than needing a bolt-on content filter.

The practical takeaway holds whether you build it yourself or turn it on: an image feature for a store agent is not "let the AI see." It is "let a photo become a SKU, and refuse everything that can't." Build the gate first, keep the jobs narrow, and the agent stays a shopping assistant — one that now takes pictures.

Turn questions into checkout.

WisWes drops into your store and guides shoppers from browsing to buying. 14-day free trial — no card.