Plan an ad concept
plan_adTurn a brand and product brief into an ad concept with copy variants, image prompt or timed video storyboard, plus render recipe and model IDs; then pass the output to render tools.
Instructions
Plan an ad: turns a brand and a product or brief into an ad concept, with copy variants (headline, primary text, call to action) and either an image prompt or a timed video storyboard, plus the recipe and the model ids to render with. It renders nothing; pass its output to render_ad, generate_image or generate_video. When the user names a length ("a 30 second ad", "make it 45s"), pass it as durationSeconds: the storyboard is written to that length and render_ad renders it as one clip or as joined clips. Without it the planner chooses a length that suits the format, so a length the user asked for belongs in durationSeconds rather than only in the brief. The user’s own screenshots or pictures to show inside the video go in inserts. Uses credits for the planning step.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| hook | No | force the VISUAL scroll-stop mechanic the opening beat is built on — a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "macro_asmr"). Omit to let the planner pick. A hook that cannot be delivered in this brief is DROPPED with the reason rather than rendered wrongly — an on-screen-text hook on an authentic/UGC ad is the one that bites, because that register carries zero on-screen text. | |
| brand | No | brand name, or a brand profile object {name,domain,category,palette,products,…}. OMIT to use the workspace’s SAVED brand + memory automatically (see get_brand); use draft_brand to onboard a new one | |
| draft | No | Only after a video refusal that offered a lighter draft: the {model, durationSeconds} that refusal named. The plan is then written to that length and priced on that model. Use only the values the refusal gave; when an account cannot cover a video, the refusal comes before planning with three options (an image, adding credits, or this draft when one fits) and the user chooses. | |
| format | No | 'image', 'video', or 'auto' when unspecified | |
| recipe | No | a recipe id from hermoso_capabilities to force an archetype | |
| talent | No | who is on camera; omit to follow the format. Say 'someone new' in product to skip reusing a saved creator. | |
| inserts | No | VIDEO ONLY: the user's own SCREENS (an app, a page, a dashboard, a document, a review, a chart) shown at these seconds as a rounded card over the upper middle of the footage, which keeps playing around it (look 'full' covers the frame, only when the user asked), the voice running underneath. Fewer and shorter: about one per 4 s of film, 1.2-2 s each, on the line that talks about it; never in the first second or the last 1.5 s. The plan frames those shots for the card, keeps them free of screens, and returns the pictures as creative.inserts for render_ad to lay in (about 2 credits). A photo of a person, product or place (kind 'photo') is not laid in: pass a product photo as the brand's product photo and a person as a saved creator. One that does not fit is left out and the reply says so. | |
| product | Yes | what to advertise + any angle/offer the user specified | |
| setting | No | force the WHERE — a setting id from list_hooks (e.g. "kitchen", "gym", or a surreal one like "volcano_rim" / "airplane_wing", which are played 100% straight and never acknowledged). Omit for a neutral setting. | |
| language | No | output language for the ad copy (e.g. Spanish) — default English | |
| reference | No | a reference to clone: an ad-library link (Facebook Ad Library, LinkedIn Ad Library, Google Ads Transparency — its real copy/advertiser are fetched) OR a VIDEO link — a TikTok, Instagram Reel, Facebook video, X post, YouTube Short/video or a direct video file — which is WATCHED first (frames + voiceover/on-screen-text transcript) so the concept keeps its hook, structure and pacing. To remake one video for this brand at its own length, clone_video is the direct tool | |
| durationSeconds | No | For video: the total length the user asked for, in seconds (30 for "a 30 second ad"). The storyboard’s scenes add up to it and the script is sized for it. Supported range 4 to 180 seconds; a value outside the range is clamped and the reply says so. A length that fits one clip of the render model renders as one continuous clip; a longer one is joined from clips filled to that model’s clip maximum, remainder last (on a 15s-clip model, 40 becomes 15+15+10 and 17 becomes 13+4), and is never sped up. The clip maximum depends on the model: 15s on most, 30s on the longest-clip model, so a 30s ad can be one take. Leave it out when the user named no length; the planner then picks one that suits the format. |