Every image on this page was produced by glove-image in a single scripted run — no hand-picking, no retries, no touch-ups. The prompt, the pipeline trace and the dollar cost under each one are read back from that image's recorded Recipe, so what you see is what actually happened.
The brief: a fictional Nairobi accessories label shooting an SS26 campaign. Two inventory items, one model, five locations. It is the shape of work a product stylist does by hand, and it is where a single generate_image tool stops being enough.
Start with the mechanism. Nothing below is a diagram someone drew — it is one asset's lineage, rendered. Library definitions on the left feed the pipeline stages in the middle; the last stage hands a finished prompt to the image model on the right.
The thing to notice is where the words come from. The agent supplied one line of intent — “Amara walking, carrying the kiondo tote on her shoulder, looking off camera” — and everything else was spliced in from the library by the pipeline. The character paragraph is copied verbatim, which is the entire mechanism behind consistency: the model is not remembering Amara between turns, it is being told about her identically every single time.
fit-to-model stage is the adapter contract being enforced. This model has no negative-prompt slot, so the accumulated negatives were folded into the prompt as an Avoid: clause and the change was written into the trace — the agent is told what was altered rather than silently getting something else.A shoot starts from the client's product photos. Here they are generated as stand-ins, but in a real workflow they would be imported with glove_image_import and pinned to a character as its identity reference — which is what keeps the bag the same bag downstream.


// A product is a character too — a durable visual identity with
// reference images. Define it once; every later shot re-splices it.
glove_image_character_save({
name: "kiondo-tote",
appearance:
"a handwoven Kenyan kiondo tote bag in natural cream sisal with a band of " +
"burnt-orange and black geometric pattern, tan leather handles and trim",
ref_images: [{ asset: "img_...", label: "packshot" }],
})The same two characters against five different scenes. Only the scene argument changes between these calls — the model and the bag are never re-described.





for (const scene of ["kilimani-rooftop", "karura-forest", "maasai-market",
"nairobi-street", "nairobi-national-park"]) {
await glove_image_generate({
intent: "Amara walking, carrying the kiondo tote on her shoulder, looking off camera",
characters: ["amara", "kiondo-tote"],
scene,
});
}Look at the gold hoops, the cream linen, the tan sandals, and the burnt-orange band on the bag across all five frames. That is not luck and it is not a seed — it is the same sentences arriving at the model five times.
Add a second inventory item and the whole grid comes for free — it is a loop over two lists, not n×m prompt-writing sessions.



And because characters compose, both products can share a frame without either drifting:


Every generated asset stores how it was made. “Same shot, but at dusk” is therefore one call against the original — glove_image_regenerate replays the recorded characters, scene, style and params through the current pipeline, with the tweak appended to the original intent.


glove_image_regenerate({ asset: "img_...", tweak: "at dusk, city lights just coming on" })The practical consequence is that a client revision costs one line rather than a reconstruction of the original brief — and if a character's definition has been corrected in the meantime, the replay picks that up automatically.
A colourway change is not a regeneration — it is an edit against the existing image, which records its parent so any frame's ancestry stays recoverable.


Identical intent, identical characters, identical scene. The only difference is the styleDirective in the pipeline — which is how a single catalog gets re-shot for a different channel without rewriting a single prompt.




pipeline: [
expandCharacters(),
expandScenes(),
styleDirective("shot on grainy 35mm film, muted kodak portra palette, soft halation"),
]Spend is metered on every model-touching call and attributed by source, so a shoot can be priced instead of estimated.
| Source | Requests | Tokens in → out | Cost |
|---|---|---|---|
generate | 18 | 22,514 → 24,608 | $0.7423 |
edit | 1 | 1,337 → 1,306 | $0.0391 |
| total | 19 | 23,851 → 25,914 | $0.7814 |
19 images for $0.78. The agent can read the same figures mid-conversation with glove_image_usage, and a host can stream them into billing through the onUsage callback.
The full design is in the image workflows guide, and examples/image-studio in the repository is a runnable agent that produces work like this from plain conversation.