brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
generating-image-adsTurns a product photo or URL into a static image ad — one image, or a set. Reads the real product first and holds it identical across every frame and ratio. Triggers: "image ad", "make an ad", "static ad", "promo graphic", "offer graphic", "sale creative", "social ad", "banner ad", "ad creative", "before/after ad", "testimonial ad". Not for generating produ…
Independent GitHub snapshot · Automated classification · Original documentation governs
Turn a product into finished static ad(s).
analyzing-products, and take four things
back: what the product is; how a person physically uses it — sprayed, pumped,
worn, etc.; which parts open or move, and in what order; and the details that have to stay identical wherever it appears.image_analysis and ask it for everything this ad needs that the product facts leave out — how the surfaces take light, and whatever else the frame you end up building will have to describe.Skip this entirely when the brief already makes the ad obvious — a clear product, a clear message, and nothing load-bearing missing. The interview exists to close real gaps, not to confirm what you were already told.
Otherwise ask once, bundled into a single message. Always leave a free-text way out so the user can answer off-menu. Anything this skill already settles is not a question.
Do ask, when the answer is genuinely missing:
| Ask | When |
|---|---|
| The product — what it is, and whatever else identifies it: packaging, colour, distinguishing features | No image and no URL. Offer to wait for an upload first; a photographed product beats a described one. |
| Brand guidelines, if they have any — the color palette, the art direction they shoot to, anything they never put in frame, the typeface where text is drawn, and the register they want the frame to read at | The brief mentions none and the packaging doesn't imply them. Treat as optional: plenty of brands have none, so take what they give and move on. |
| The offer and the one claim — a discount, a launch, a benefit, the words they can stand behind | The ad has to say something and the brief doesn't say what. Only claims the user supplies are used, and used as written. |
| Where it runs — the placement and the ratios | The brief doesn't say, and the placement decides the crop and the safe zones. |
When the user waives questions and the product is already in hand, go straight to generating.
Take a single image at 1:1, a product-hero direction, and one benefit-led line drawn from the product facts. Say in a sentence which settings you took, then keep going. It is a statement, not a checkpoint.
A missing product image is the one thing still worth raising.
Read references/ad-craft.md first. Work in the discipline of the single-minded proposition: every ad resolves one tension between a consumer truth and a product truth.
For a set, each ad works from a different insight — a different human truth, a different angle into the product — not a different visual treatment of the same insight. If two ads share an insight, you have shipped one ad twice. Nothing is generated here.
Write the copy last — say only what the picture leaves unsaid. From the claims the user supplied and no others:
Every drawn string is one the brand can stand behind. Don't invent a claim, a statistic, a rating or a badge to fill the layout.
Write one description of the product, and reuse it unchanged in every prompt you send.
How much to write depends on whether a photo is going with the call. With a reference attached, the photo carries identity and the description covers only what it cannot: the angle you want, the state the moving parts are in, the action being performed. With no reference, the description is all the model has, so it carries the product in full from the list below.
Don't transcribe what the label says. Spelling out the printing invites the model to redraw it, and redrawn text comes back warped.
You read references/ad-craft.md at Step 3; hold to it here for the design it governs — the one focal point, figure-and-ground separation, where the copy sits relative to the product, the type and colour discipline, the grid and the negative space, and the safe zones each ratio has to respect.
Decide, and write down:
1:1.references/ad-craft.md.| Model | Use it when | How it wants the prompt |
|---|---|---|
gpt-image-2 | the ad is a designed, text-forward layout — drawn headline, offer, callouts, a composed page | short labelled segments on separate lines, every string quoted exactly |
nano-banana-pro | the ad leads on a photoreal product or a person, and carries lighter text | connected sentences in one narrative paragraph, the drawn copy quoted |
seedream-5 | a photoreal ad another model refused or keeps failing | a description leading with whatever matters most |
If the user has explicitly named a model, then use that first. Call list_image_models for accepted aspect_ratio values, resolution tiers and per-model reference_images limits rather than guessing — a wrong enum fails a billed call.
Nothing has been generated yet, and everything after this step costs money. Get the concept approved first.
Show, written out, in one brief, to the point message:
Then ask whether it's right, and say plainly that they can change any of it — the direction, a line, the offer, the layout, a ratio. Expect edits. Rewrite what they change, show it again, and keep going until they approve.
Wait for an answer. Don't generate a frame.
Where the user has said they don't want to be asked, say in one line what you're going with and carry on.
Call image_generate with a requests list, all in the same call so they render at once:
prompt; model; aspect_ratio; resolution; reference_images.resolution is 1k unless the user asked for a higher tier.reference_images every time. It holds identity; the prompt alone
will not.list_image_models for accepted aspect_ratio values, resolution tiers and per-model
reference_images limits rather than guessing — a wrong enum fails a billed call.Images are polled for you, but a heavy one can come back as {status: "pending", …}. That is a job handle, not a failure. Pass that exact handle to job_status to retrieve the finished image, and if it comes back pending again, call job_status again with the same handle. Never re-run a pending image through image_generate: that abandons the job you are already paying for and starts a second, separately billed one.
Share the image URLs and local file paths, once every frame has finished — never a partial set. For a set, present them in the order you outlined.
Never regenerate a deliverable without the user asking. Every re-run is billed again. Hand back what came out, say what looks wrong, and wait — including in the cases below.
gpt-image-2. Do not regenerate on your own
judgement: a second generation bills again, and the user may be happy with the first.reference_images rejected on count → the error states the limit; drop to it.generating-product-photos. A
video ad → generating-ad-videos. General artwork or a poster not selling a product →
generating-images. Route out rather than forcing it into an ad.error: "no_provider_configured" on any tool → relay the tool's hint (the user must set their key).references/ad-craft.md — the design craft, read at Step 3 and held to the final frame: the single-minded proposition, the focal point, figure and ground, visual hierarchy, type and colour, the grid and negative space, the ratio family, the safe zones per placement, brand anchors, the anti-patterns, the compliance lens, keeping the product real, and how the prompt is assembled.