{"id":55029,"plugin_id":"plugin_asdk_app_6a608e436adc8191affb546011f744cf","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-26T00:04:41.587Z","digest":"9ce7096655683a0c4f49fa0683b87b8c5b0ec091074e4afdbc8951e80f7bd3c2","against":null,"payload":{"description":"Use when the user wants ad creatives for a product launch, sale, new collection, restock or seasonal campaign from a photo of their product and a message or offer, such as a coordinated set of square, 4:5 and story ads. Not for plain store photos without a message (use ecommerce-product-photos), for resizing an ad they already have (use ad-placement-adaptation) or for a video ad (use product-motion).","included_files":[],"name":"product-ad-set","skill_md_contents":"---\nname: product-ad-set\ndescription: Use when the user wants ad creatives for a product launch, sale, new collection, restock or seasonal campaign from a photo of their product and a message or offer, such as a coordinated set of square, 4:5 and story ads. Not for plain store photos without a message (use ecommerce-product-photos), for resizing an ad they already have (use ad-placement-adaptation) or for a video ad (use product-motion).\n---\n\n# Product Ad Campaign\n\nMake a coordinated set of static ads from one product photo and one message: one image per placement, the same product, the same headline and the same look. The images are for the user to post or run themselves. This connection does not publish anything.\n\n## What you need\n\n- A photo of the product, attached or as a public image URL.\n- The message: what is promoted and the exact offer, if any (\"New Lavender Candle\", \"20% off this weekend\", \"Back in stock\").\n- Optional: brand colors or mood, and which placements. Default to the three below.\n\nNo photo? Ask for one first. Never make up an offer, price, discount, rating or claim. Use only what the user gave you.\n\n## Default placements\n\n| Placement | Aspect ratio | Layout |\n|---|---|---|\n| Feed | 1:1 | Product large and centered, headline at the top. |\n| Portrait feed | 4:5 | Product in a styled scene, headline in the clear space above it. |\n| Story / Reels | 9:16 | Product in the middle third, headline near the top, bottom fifth left empty for the platform's buttons. |\n\n## Recipe\n\n1. **Brand.** Call `get_brand_context` once and use its colors and tone in every placement.\n\n```json\n{ \"tool\": \"get_brand_context\", \"arguments\": {} }\n```\n\nIf it is empty, ask for one color or mood, or keep it neutral.\n\n2. **Headline.** Six words or fewer, in quotes inside the prompt. If the user has none, suggest three, let them pick and keep their choice verbatim:\n\n```json\n{ \"tool\": \"generate_text\", \"arguments\": {\n  \"config\": { \"model\": \"gemini/gemini-3.5-flash\", \"instructions\": \"Suggest three ad headlines of six words or fewer, one per line. Use only the facts given. No prices or claims that are not in the facts.\" },\n  \"inputs\": { \"input_text_prompt\": \"Lavender soy candle, hand-poured. Offer: 20% off this weekend.\" },\n  \"confirm_above_credits\": 10,\n  \"idempotency_key\": \"product-ad-set-1\"\n} }\n```\n\n3. **Store the photo** with `upload_asset({ url })`, then cut the product out once. Ads put the product on a designed backdrop; edited from the raw photo, the model sometimes pastes the whole photo, old background included, as a framed card. A cutout prevents that.\n\n```json\n{ \"tool\": \"remove_background\", \"arguments\": { \"config\": {}, \"inputs\": { \"input_image\": { \"kind\": \"image\", \"assetId\": \"<asset_id>\" } } } }\n```\n\nUse the cutout's asset id (from `orisu_media.items`) as `input_image` for every placement.\n\n4. **Feed placement first.** It sets the look; the others follow it.\n\n```json\n{ \"tool\": \"edit_image\", \"arguments\": {\n  \"config\": { \"model\": \"nano-banana-2\", \"aspectRatio\": \"1:1\", \"resolution\": \"2K\", \"prompt\": \"Square social ad. Place this exact product, unchanged, large and centered on a soft lavender background with a gentle natural shadow beneath it. Add the headline \\\"20% off this weekend\\\" in clean bold sans-serif type at the top. No other text, badges, prices or frames.\" },\n  \"inputs\": { \"input_image\": { \"kind\": \"image\", \"assetId\": \"<cutout asset_id>\" } },\n  \"confirm_above_credits\": 40,\n  \"idempotency_key\": \"product-ad-set-2\"\n} }\n```\n\n5. **Check the headline and product** (see \"Quality check\"), then make the 4:5 and 9:16 placements with the same call, the table's layout and the same background, type and colors described in the same words.\n6. **Deliver.** `preview_asset` with the three asset ids from the results' `orisu_media.items`, labeled by placement, and the headline used.\n\n## Cost and waiting\n\nGive every paid call its own `idempotency_key`, unique to that request (for example `mug-packshot-1`). Send the same key again only to resend a call that was interrupted or whose result you never saw, such as after a permission or file-download prompt; the first result then comes back instead of a second charge. Before re-running anything, check `list_runs` or `get_run` for a result that already finished. To redo something on purpose (a failed run, an image that missed, changed settings), use a new key: the old one would replay the same result, failure included.\n\n- One paid generation per placement plus one cutout (about 10 credits per 2K image, a couple for the cutout). Pass `confirm_above_credits` (40 per image). On `COST_CONFIRMATION_REQUIRED`, show the estimate and wait for the user's go-ahead.\n- `timed_out: true` means the run continues: call `wait_for_run` with its `id`.\n- Redo only the placement that failed.\n\n## Quality check\n\n- The headline is spelled exactly as approved, once, and readable at phone size. Generated lettering is not guaranteed. If it is wrong, retry that placement once with the exact same headline. If it is still wrong, show the user what came out and offer options: try again, a shorter wording they choose, or the ad without text. Never change the approved wording yourself, and don't present a misspelled ad as finished.\n- The product matches the photo: shape, label, color, count. It sits on the backdrop, not inside a pasted rectangle of the original photo.\n- No invented offers, prices, badges or claims.\n- Story placement keeps the bottom fifth clear. All three look like one campaign.\n\n## Next edits to offer\n\n- More placements from a finished ad: the ad-placement-adaptation skill.\n- Different creative directions to test: the ad-concept-variations skill.\n- A motion version: the product-motion skill, starting from the 9:16 ad or the product photo.\n- A voiceover for the campaign: the ad-voiceover skill.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}