Engine

Providers & prompts

How the engine picks a model and renders a prompt.

GenFashion is not tied to one AI vendor. Models sit in a registry and a model is selected per generation from the ones an operator has activated.

Corrected 2026-09-13. This page described a router that does not exist and a quality gate that has never run. What follows is the build.

How a model is chosen

POST /try-on takes an optional modelId. Without one, selection is: the models this deployment has a provider key for, ordered by the operator's priority and then by the catalogue's per-call price — with models that have never completed a generation here ranked last, reached only when nothing else can run.

That last clause (2026-09-14) is the only thing resembling a gate in this pipeline, and it is a deliberately low bar: it means the model has produced a finished result at least once, not that it is any good. Quality is still the operator's judgement. An unproven model is fully usable by anything passing an explicit modelId — which is how the Playground and the benchmark harness run — and one completed generation promotes it.

There is still no router in the sense the word usually means. No health checks, no circuit breakers, no failover to a second model when the first errors, no sticky per-tenant assignment. A generation that fails at the provider fails; it is not retried elsewhere. If the deployment has no usable model at all, the request returns NO_MODEL (503) — not the PROVIDER_UNAVAILABLE this page used to name, which is an internal alert code and has never been returned to a caller.

Quality is a gate, not a weight — as a decision, not as a mechanism

The rule this project holds itself to is that a model joins the routable pool only by clearing a benchmark, and that cost is optimised within that pool, never against it. In virtual try-on a subtly wrong rendering of someone's own face loses the customer silently, so quality is not a number to trade away.

That gate is not enforced by code, and has not been run. A model becomes routable when an operator activates it under Providers & models, and nothing checks a benchmark first. A harness exists and the Phase 0 gate has never been scored, so no model in the pool has cleared anything. Treat the pool as the operator's judgement, which is what it is.

One provider family today

Both wired providers — OpenAI and Gemini — are multimodal LLMs, and both take two calls: a text call to resolve the garment to a phrase, then an image call to compose it.

The specialist family that used to be described here — segment the garment, run a purpose-built try-on model, one billed call — was removed as a plan on 2026-09-12. No specialist provider will be added. Two consequences are worth stating rather than leaving implied: the two-family comparison the benchmark was designed around is unreachable, and the p50 ≤10s latency target that only a single-call endpoint could have met is abandoned. Measured latency is 45–56s across every model in the pool.

Multimodal LLM (what ships)
MechanismPrompt a general image model
Billed calls2 — describe, then compose
PromptSystem prompt + operation template
Stronger onFlexibility across categories

Of the two calls, the first — the text one — resolves the garment to a phrase like "a red plaid flannel shirt". That phrase is cached on the product, so a later generation against a product already seen skips it and makes only the image call.

This is why measured cost per try-on varies with how much of your catalogue has been used before, and the two calls are nowhere near equal: measured on 2026-09-13, the image call cost $0.1725 and the text call about $0.0011.

Prompt layering

SYSTEM PROMPT       per provider × model — role, refusal posture, output contract
OPERATION TEMPLATE  per operation — the task and its constraints
RUNTIME VARIABLES   garment phrase, category, merchant tone, locale

The composition prompt states three non-negotiable constraints: preserve identity (face, hair, body shape, skin tone, pose), realistic fit (drape, lighting, shadows), and keep background. Those are the three classic failure modes of naive try-on prompting.

Versioning

Prompts are versioned artefacts. Every generation records system_prompt_version, operation_template_version and a hash of the rendered text. To change a prompt you insert a new version and promote it — never edit an active one in place. Without that discipline a one-word edit silently regresses quality with nothing to attribute it to.

Browse the live versions under Prompts in the admin platform.