From pika
Generates multi-cut jump-cut UGC product ads (15s, 9:16 vertical) with POV talking-head, native lip-sync, and 5-act narrative arc. Auto-detects category from URL (HAUL/APP/FOOD/BEAUTY/FITNESS/TECH).
How this skill is triggered — by the user, by Claude, or both
Slash command
/pika:ugc-ads <url> [avatar_url=<url>] [provider=seedance|kling] [aspect_ratio=9:16|3:4] [variants=9:16,16:9,1:1] [category=auto|HAUL|APP|FOOD|BEAUTY|FITNESS|TECH] [captions=true]<url> [avatar_url=<url>] [provider=seedance|kling] [aspect_ratio=9:16|3:4] [variants=9:16,16:9,1:1] [category=auto|HAUL|APP|FOOD|BEAUTY|FITNESS|TECH] [captions=true]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
| Param | Default | Notes |
| Param | Default | Notes |
|---|---|---|
url | required | product URL — drives category detection and beat substitution |
avatar_url | built-in fallback | persona portrait URL; fed as @Image1 reference. When omitted, the skill uses a pre-generated Pixar-style female creator portrait |
provider | seedance | seedance: strong at UGC selfie / talking-head POV with native lip-sync, multi-segment in single prompt, supports 3:4. kling: explicit shots[], 9:16/16:9 only |
aspect_ratio | 9:16 | 3:4 is seedance-only (kling rejects 3:4) |
variants | unset | Optional comma list for shared-generation exports. Supported: 9:16, 16:9, 1:1. Keeps the expensive UGC render shared, then reframes the final stage. |
category | auto | HAUL / APP / FOOD / BEAUTY / FITNESS / TECH; auto-picked from URL |
captions | true | TikTok-style word-chunked captions burned on top of the final video |
Before any paid MCP call, call identity_balance({verbose: true}) once. Surface the current balance, recent burn rate, and remaining runway, then gate the run with this exact message:
Estimated cost: about 4,000 credits (~$40) for a typical Seedance UGC ad with fallback/retry budget. This exceeds $5, so Reply
proceedto continue orcancelto stop.
Do not call any paid MCP tool until the user replies proceed. If the user replies cancel, stop without generating. The gate runs after the product URL is known and before avatar analysis, screenshot capture, video generation, captions, or paid retries.
Typical end-to-end run: 6–12 minutes. Breakdown:
generate_reference_video): ~3–5 min for seedance, ~5–7 min for klingedit_text_overlay calls, ~30s–5 min totaladd_captions call, ~30s–5 min (transcribe + burn in one shot)If the run exceeds 15 min without progress, something is wrong — inspect the tool-reported generation status and error message.
Start a timer at skill start once the product URL is available and the cost gate has passed. Time spent waiting for the user's proceed reply is not prep time and must not trigger this guard. The first paid generation call is generate_reference_video, the long-pole paid stage, and it must be invoked within 5 minutes of skill start. If you have not invoked generate_reference_video within 5 minutes of skill start, stop before any paid generation call and report failed_pre_generation_timeout with what you have so far: fetched product facts, chosen category, avatar source, screenshot status, draft dialogue, and the exact blocker. Do not keep refining script wording, prompt grounding, or shot order.
Print a single-line progress checkpoint after each prep stage and right before the paid generation call:
Stage 1/3 done — product fetched and categorized.Stage 2/3 done — avatar and screenshot ready, composing dialogue.Stage 3/3 done — prompt locked, calling Seedance now.Script and prompt iteration is maximum 2 passes. After the max 2 passes, ship what you have to generate_reference_video; do not continue polishing the hook, punchline, or screen-close-up wording.
When any long-running generation or edit call returns a task_id with or without an initial status, including {task_id}, {task_id, status: "queued"}, or an initial queued, running, or processing status, record the task id and start time immediately.
task_status({task_id}) in a tight loop until terminal (completed | failed | cancelled). No manual sleep and no Bash polling; the worker holds each status call open.queued, running, or processing: Seedance i2v queued for {N}m {S}s... still processing. Replace the provider/stage label when polling Kling, GPT-image-2, caption, or edit tasks.completed, unwrap the returned result URL and continue.failed or cancelled, surface failure to the user with task_id, status, and the last status message.task_cancel({task_id}) if the task is still non-terminal, then surface failure to the user. If cancel reports the task is already terminal, call status once more and report that terminal result.queued, running, or processing.Default to Seedance for UGC selfie/talking-head ads because it handles native lip-sync, single-prompt multi-beat pacing, and optional 3:4 output well. Use Kling when the caller explicitly passes provider=kling, or after Seedance exhausts the capped cartoonized retry only if the user chooses Kling from the stop message. Kling's tradeoff is stricter aspect-ratio support but a separate moderation path and explicit shot segmentation.
Strip flags and key=value parameters from $ARGUMENTS. If no product URL remains and there is no usable product URL in prior context, print this menu and stop:
Which product should the UGC ad promote? Required:
- Product URL — page to fetch for product name, category, visual references, and language
Optional:
avatar_url=,provider=seedance|kling,aspect_ratio=9:16|3:4,variants=9:16,16:9,1:1,category=auto|HAUL|APP|FOOD|BEAUTY|FITNESS|TECH,captions=true|false.
If the product URL is present, skip this step silently.
WebFetch the URL: pull product_name, brand_name, value prop, brand color, product form, packaging, hero copy, target user, category, and the primary language of the page. Use category= if passed; else trust the WebFetch signal; fall back to HAUL for physical, APP for digital.
Build two grounded fact lists from the fetched page:
{
"grounded_specs": [
{
"claim_text": "250W total output",
"value": "250",
"unit": "W",
"source_quote": "visible source-page text containing the exact value",
"source_url": "<product URL>"
}
],
"claims_allowlist": ["250W total output"]
}
Every numeric spec claim (W, mAh, %, minutes, ports, price, dimensions, counts, charging speeds, battery size, rankings) must come from visible source-page text and include a source_quote. If the source page does not visibly support a number, leave it out of grounded_specs and claims_allowlist. Do not infer specs from product category, model name, common knowledge, or competitor pages.
avatar_url was passed → use it as-is.https://cdn.pika.art/v2/files/agent/17d62bf9-0edb-49e4-9ba9-2c5419fa518f/seedream-1777624057811.jpeg
Pre-generated 3D animated Pixar-style portrait of a young female creator — pre-cartoonized so seedance moderation accepts it directly, neutral enough to fit any category. Note in the final summary that the fallback was used so the caller knows to supply their own portrait for persona consistency next time.Run this probe before Step 7 and before any paid generate_reference_video call. It applies to caller-supplied avatar_url, the built-in fallback, or any creator portrait chosen as @Image1. The built-in fallback is already a non-IP stylized creator, but still document its source in the final summary.
Call analyze_media once:
query: "Classify this image for paid video generation. Is it a photograph of a real human face, an AI-generated realistic portrait, a stylized / illustrated character, or a recognizable trademarked / copyrighted character such as Batman, Pikachu, or Mickey Mouse? Return strict JSON only: { \"avatar_type\": \"real_human\" | \"ai_realistic\" | \"stylized_illustrated\" | \"recognized_ip\", \"recognized_character\": string | null, \"moderation_risk\": \"low\" | \"medium\" | \"high\", \"recommendation\": \"proceed\" | \"warn\" | \"reject\" }. Use null for `recognized_character` when no specific character is recognized; never write \"none\", \"unknown\", or explanatory prose in that field."
Route from the result:
avatar_type is "recognized_ip", or recognized_character names a specific character (for example "Batman"), or when both moderation_risk is "high" and recommendation is "reject". Treat recognized_character: null, empty string, "none", "unknown", "n/a", and low/medium moderation_risk as not enough to stop by themselves. Run this check before the real/stylized routes. A chibi Batman is still Batman even when avatar_type is stylized / illustrated.The avatar appears to be a trademarked character ([X]). Most video providers will moderate this and refuse to generate. Pass avatar_url=<real-looking-photo-url> to override.Call capture_website with mode: "screenshot". Use mobile=true for handheld-product categories (APP / FITNESS / BEAUTY) so the captured page renders as a portrait phone screen; mobile=false for desktop-context categories (HAUL / TECH / FOOD).
If the call fails (timeout, browser pool down), retry once. If still failing, proceed without the screenshot — the skill is degraded but functional. The close-up beat then describes the page from prose only and Beat 2's reference_images is just [avatar_url].
Capture URL → screenshot_url (or null).
The full prompt is a single multi-beat string passed to one generate_reference_video call. Structural prose (not markdown bullets). Every beat has a Says: "..." line for lip-sync. Pacing target ~5.5–6 words per second across the whole 15-second ad (≈85–90 words total). @Image1 is the avatar, @Image2 is the screenshot when available.
Write all Says: "..." lines in the language detected from step 1's WebFetch. Both seedance and kling lip-sync handle multilingual; if the product page is Chinese / Japanese / Spanish / etc., the dialogue should be in that language. Hook archetypes from step 5 are language-agnostic — adapt the rhetorical move to the language's natural register.
Spec-grounding rule: forbid inventing numbers. Any spoken or visual number/unit claim must appear verbatim in claims_allowlist. If a number is not in claims_allowlist, rewrite the line qualitatively ("charges fast", "multiple ports", "big battery") or omit the claim. Do not say "50% in 28 minutes", "3 ports", "140W", prices, counts, or time windows unless that exact claim is source-backed.
Brand/spec text rendering rule: Do not ask Seedance or the video model to render the brand wordmark, product wordmark, packaging label, or spec text from prose. Video-model text comes out garbled. The prompt may show @Image2 as a reference, but any new brand name or spec copy that must be readable is added later by the deterministic Step 8 overlay.
HOOK (0–3 sec) <visual setting + creator framing + face/body cue>. Says to camera, fast and energetic: "<hook line>". <style anchor — POV handheld, authentic, raw>.
JUMP CUT 1 (3–6 sec) <wide POV — creator's body language, product partially in frame edge>. <face cue>, says fast: "<setup line>".
JUMP CUT 2 (6–9 sec) <next visual beat — could be the screen close-up showing @Image2 OR another reaction beat, depending on which beat the dialogue arc puts the reveal>. Says (or voice continues over the shot if it's a screen close-up), fast and confident: "<reveal line>".
JUMP CUT 3 (9–12 sec) <next visual beat — same logic; one of the JUMP CUTs is the screen close-up, the others are wide-POV reaction shots>. Says, fast: "<insight twist line>".
OUTRO (12–15 sec) <selfie POV, mid-chest framing, same setting>. Says to camera, fast: "<punchline line>".
avatar is image 1, asset is image 2
Screen-close-up beat — exactly one across the ad, position is dialogue-driven:
@Image2 exactly as-is and includes ONE finger-point gesture (a single finger entering from the frame edge, pointing at the hero text or product — no tap, no swipe, no scroll, no hover-on-CTA). The point gesture is the only screen interaction in the entire ad.Trust @Image2 — when the product page is shown, reference the image; do NOT describe its UI in prose. Describing UI triggers the model to invent extra panels / dropdowns / sidebars / animations. Reference the image; trust it.
Each essence is the brief you read before composing the 5 beats. Pick one from category in step 1 and write the actual Says: "..." lines tailored to the real product.
Category numeric guard: category archetypes are rhetoric/camera guidance, not permission to invent dates, durations, counts, discounts, costs, ratings, charging times, port counts, output figures, or urgency windows. Any numeric phrase must be rewritten unless the exact claim appears in claims_allowlist. When claims_allowlist lacks a matching number, use non-numeric language such as "after using it", "during the routine", "the source-backed spec", "launch offer", or "available now".
@Image2 is a product photo (or brand-site mobile view); the single finger-point lands on a hardware detail (chain, clasp, embossed logo).mobile=true in step 3).@Image2 is typically a real photo of the device's screen at its key UI moment (first measurement, paired status, hero feature open); if the device has no screen, a clean hero photo of it mid-use.claims_allowlist has one, otherwise qualitative headline → first-use reveal while close-up is on the device doing its thing → workflow-change insight ("this replaces / changes / fixes my X") → punchline that hands off where to find it without inventing cost or urgency.This skill has no voice-cloning input; the video model produces the spoken dialogue with its own default voice. No voice sample is fetched or passed. Proceed to step 7.
After the Avatar-type probe in step 2.5 passes, attempt the call first with the avatar resolved in step 2 (caller-supplied or built-in fallback) exactly as-is. Only when seedance rejects the call do we restyle.
Retry budget: Seedance generation gets at most 2 total video attempts: the original avatar render in 7a, plus one cartoonized-avatar retry in 7c. Do not start a third Seedance render. If the second attempt fails, surface the 7d message or switch to Kling only when the user explicitly requested provider=kling or chooses it after the stop message.
7a. First attempt — avatar as-is
Call generate_reference_video:
provider: seedance (default) or kling if user passed provider=klingaspect_ratio: 9:16 (default); 3:4 allowed only on seedanceresolution: 720p (seedance only)duration: 15reference_images: [avatar_url, screenshot_url] (drop screenshot_url if step 3 failed)prompt: the multi-beat string from step 4sound: true (default — ambient + lip-sync produced by the model)For provider=kling: convert the multi-beat prose into shots: [{prompt, duration}, ...] (5 shots × 3s = 15s sum), plus a top-level prompt summarizing the ad. References use <<<image_1>>> / <<<image_2>>> instead of @Image1 / @Image2.
If the call returns { task_id, status: "queued" }, poll task_status(task_id) using the async polling budget above until terminal (completed | failed | cancelled). On completed, capture result.url → video_url and proceed to step 8.
7b. On rejection — auto-cartoonize the avatar
If 7a returns 422 content_policy_violation on image_urls / reference_images (seedance + fal-queue moderation flags portraits that read as too photorealistic — even some Pixar-style 3D avatars get flagged), restyle the avatar in-place:
Call generate_image_edit:
provider: "seedream" (native Pixar/3D-animated look)images: [avatar_url]aspect_ratio: same as the ad's aspect ratioresolution: "1K"watermark: false (seedream-only knob — keep the restyled avatar clean of provider watermark for the downstream lip-sync re-render)prompt: "Stylized 3D game character render — Unreal Engine 5 / Overwatch / Valorant / Apex Legends visual style. Anatomically grounded facial proportions with subtle stylization: slightly larger expressive eyes, defined sculpted cheekbone planes, smooth skin shader (smoother than photoreal, no micropore detail), idealized but believable features. PBR materials with subtle subsurface scattering, strand-based hair simulation, crisp cloth shader. Cinematic three-point studio lighting with strong rim light. Clearly a stylized AAA-game-character render — NOT photorealistic person, NOT Pixar plastic-toy cartoon, NOT exaggerated big-head proportions. Same person, same glasses, same outfit, same accessories. Centered medium portrait, neutral indoor background."Capture returned URL → avatar_url_cartoon.
7c. Retry seedance with the cartoonized avatar
Re-run the exact same generate_reference_video call from 7a, swapping the avatar reference: reference_images: [avatar_url_cartoon, screenshot_url] (or [avatar_url_cartoon] if step 3 failed). All other params unchanged. Capture result.url → video_url.
7d. Final fallback — still rejected
If 7c also returns content_policy_violation, stop. Tell the user: the avatar reads as too realistic for seedance moderation even after auto-restyling; ask them to either supply a more stylized portrait themselves or rerun with provider=kling (kling has a separate moderation pipeline that accepts realistic avatars).
Before captions, add readable brand/spec copy with deterministic post-generation overlays. This is deliberately separate from the Seedance prompt because video-model text rendering corrupts brand wordmarks and spec labels.
Build overlay copy from Step 1:
{
"brand_overlay_text": "<brand_name>",
"grounded_spec_overlay_text": "<one short source-backed claim from claims_allowlist, or empty>",
"overlay_font_color": "#111111 | #ffffff"
}
Rules:
brand_overlay_text is always the exact brand_name from WebFetch. If brand_name is empty, use product_name; do not let the model invent a logo/wordmark.grounded_spec_overlay_text must be empty or one exact claim from claims_allowlist. Never overlay a number that is absent from claims_allowlist.overlay_font_color for contrast against the generated frame, not brand aesthetics. If the screenshot/product surface is light or unknown, use #111111; use #ffffff only on clearly dark footage. Post-flight OCR must be able to read the overlay.add_captions call.Call edit_text_overlay once for the brand name:
edit_text_overlay(
video_url: video_url,
text: brand_overlay_text,
position: "top_left",
font_size: 54,
font_color: overlay_font_color,
start_s: 0.2,
end_s: 15
)
Save the returned URL as brand_guarded_url. If grounded_spec_overlay_text is non-empty, call edit_text_overlay once more on brand_guarded_url:
edit_text_overlay(
video_url: brand_guarded_url,
text: grounded_spec_overlay_text,
position: "top_right",
font_size: 42,
font_color: overlay_font_color,
start_s: 6,
end_s: 10
)
Save that returned URL as guarded_video_url. If no spec overlay is needed, set guarded_video_url = brand_guarded_url. If either overlay call returns { task_id }, poll task_status using the long-running task contract. If the deterministic overlay fails, stop and surface the failure instead of delivering a video whose only readable brand/spec text depends on Seedance.
Run frame-level OCR on the overlay window before captions. Video-level analysis can miss short-lived top-corner overlays, so extract one frame while both overlays should be visible:
extract_frame(
video_url: guarded_video_url,
time_s: grounded_spec_overlay_text ? 7 : 1
)
# Save returned url as overlay_qa_frame_url
analyze_media(
media: overlay_qa_frame_url,
query: "Expected brand text: ${brand_overlay_text}
Expected spec text: ${grounded_spec_overlay_text}
Return JSON only: { \"visible_text_ocr\": string[], \"brand_visible\": boolean, \"spec_visible\": boolean, \"observations\": string[] }. OCR/read all visible text. brand_visible is true only if the exact expected brand text above is readable. spec_visible is true if expected spec text is empty or the exact expected spec text above is readable."
)
If brand_visible is false, or spec_visible is false when grounded_spec_overlay_text is non-empty, stop and rerender the deterministic overlay once with the opposite overlay_font_color (#111111 ↔ #ffffff). Re-extract overlay_qa_frame_url and rerun the same OCR check. If the retry still fails, stop and surface overlay_qa_frame_url and the OCR JSON; do not proceed to captions.
If variants is requested, do not run the single-output add_captions call in this step. Leave guarded_video_url uncaptioned and continue to Aspect-ratio variants, where each requested aspect is reframed first and captioned once after reframe.
If variants is absent and captions=false, skip caption generation and set final_url = guarded_video_url. Otherwise, use one add_captions call instead of chaining edit_text_overlay per chunk — much faster (≤5 min single call vs 5–8 min sequential), and the styles position captions correctly out of the box.
Call add_captions:
video_url: guarded_video_url from step 8style: "tiktok" (default — word-by-word purple highlight, Bebas Neue, all caps, rendered at the bottom of the frame; classic TikTok-creator look that keeps the face and screen clear). Alternatives: "hormozi" (lower-middle yellow highlight, more aggressive — overlays part of the phone-in-hand close-up beat), "classic" (plain bottom subtitle bar, safest), "karaoke" (progressive color fill, also bottom).font_size: 60 — overrides the per-style default; tuned for 9:16 readability without dominating the frame.language: pass the BCP-47 code for the page language detected in step 1 ("en", "zh", "ja", "es", etc.) — skips auto-detect and avoids misrouting CJK to a Latin-only font path.Capture the returned URL → final_url.
Use optional variants=9:16,16:9,1:1 when the user wants vertical short-form, landscape, and square feed outputs from the same UGC ad. variants overrides aspect_ratio to native 9:16; aspect_ratio=3:4 is single-output only and must not be combined with variants. If the user requests variants with aspect_ratio=3:4, use the 9:16 native variant flow and state that 3:4 applies only to single-output runs.
Call generate_reference_video once for the native 9:16 ad, then run Step 8 deterministic overlays once to produce guarded_video_url. Do not re-run product fetch, avatar analysis, screenshot capture, avatar cartoonization, Seedance/Kling generation, deterministic overlays, or any other expensive provider call for extra variants.
Do not run the single-output add_captions call from step 9. Build raw variant_sources first, then build a flat variant_urls object:
{
"9:16": "<native final_url>",
"16:9": "<edit_reframe url>",
"1:1": "<edit_reframe url>"
}
9:16, set variant_sources["9:16"] = guarded_video_url.16:9 and 1:1, call edit_reframe(video_url=guarded_video_url, target_aspect="<aspect>", fill_mode="blur") and save each returned URL into variant_sources. Blur fill preserves the full native vertical ad over a blurred background instead of cutting off the creator or captions.captions=true, caption after reframe: run add_captions on each variant_sources value so burned captions are positioned for that aspect, then save those captioned URLs into variant_urls. If captions=false, save the uncaptioned native and reframed URLs directly into variant_urls.final_url = variant_urls["9:16"] so the primary deliverable matches the native requested variant.edit_reframe and per-variant caption burn as the cheap final composite / reframe stage. If a reframe fails, return the successful variant URLs plus the failed aspect and tool error; do not resubmit the expensive generation.Heads up — variants use blur fill.
16:9and1:1keep the full native9:16ad visible over a blurred background. Keep the creator, product, and captions centered for readability, but do not describe these outputs as cropped variants.
Return final_url on one line, plus a one-line summary: which category ran, whether the avatar was caller-supplied / built-in fallback / cartoonize-recovered, whether the screenshot was used or fell back to prose, the provider chosen, the language detected for dialogue, and whether captions were burned on. If variants was requested, include the flat variant_urls object in the same response.
Before declaring success, call analyze_media on final_url when captions were burned, or on guarded_video_url when captions=false, and ask for a structured verdict. If variants was requested, run the same gate on each variant_urls value and key any warning by aspect ratio.
Before calling analyze_media, substitute concrete expectations into the query: include exact brand_name, exact product_name, and the actual claims_allowlist values as a JSON array. Do not leave placeholders for the model to infer.
Expected brand: ${brand_name}
Expected product: ${product_name}
Allowed numeric/spec claims: ${JSON.stringify(claims_allowlist)}
Return JSON only: {
"verdict": "clean" | "degraded" | "catastrophic",
"visible_text_ocr": string[],
"unauthorized_numeric_claims": string[],
"observations": string[],
"quality_warning": string | null,
"re_roll_suggestion": string | null
}
OCR / read all visible text. Use the concrete expected values above when checking that `brand_name` and `product_name` are spelled correctly anywhere they appear, deterministic brand/spec overlays are legible, captions are present when requested and not garbled, and no visible numeric claim appears unless it exactly matches one of the actual `claims_allowlist` values above. Also check that the avatar / creator remains visually stable, the product screenshot or prose fallback matches the product page, and there are no black frames or wrong-product shots.
verdict is clean, return final_url normally.verdict is degraded, return final_url plus the quality_warning so the user can review before publishing.verdict is catastrophic, if visible_text_ocr contains garbled brand/spec text, if brand_name is misspelled, or if unauthorized_numeric_claims contains any claim not in claims_allowlist, do not call the ad complete; surface the verdict and re_roll_suggestion instead of declaring success.| Symptom | Likely cause | Recovery |
|---|---|---|
| Product page cannot be fetched or captured | The page is gated, blocked, or has too little product evidence | Use caller-provided product facts only if they are explicit; otherwise stop and ask for a product summary or a better URL. |
| Avatar preflight flags recognizable IP, unsafe likeness, or unusable face framing | The provided creator image is not suitable for paid generation | Stop before paid generation and ask for a safer creator image, or fall back to the built-in stylized creator when no caller avatar was supplied. |
Provider returns 4xx or moderation_blocked during image/video generation | The prompt, source image, or product content is rejected deterministically | Do not retry the same payload. Remove the rejected input or switch to the documented fallback provider only when that stage has one. |
| Deterministic overlay OCR fails after the one color retry | The brand/spec copy is still unreadable | Stop with overlay_qa_frame_url and the OCR JSON; do not proceed to captions or final delivery. |
| Variant reframe or per-variant caption burn fails | A cheap final composite step failed after the expensive native ad succeeded | Return the successful variants plus the failed aspect/tool error; do not rerun product fetch, avatar prep, or video generation. |
These anchors keep the ad from drifting into a generic product demo:
| Phrase | Where | Why load-bearing |
|---|---|---|
HOOK + 3 JUMP CUTs + OUTRO | Prompt skeleton | Forces the TikTok-style multi-cut rhythm instead of one continuous presenter shot. |
Every beat has a Says: "..." line | Prompt skeleton | Gives the video engine explicit lip-sync material across all beats. |
Trust @Image2 | Screen close-up rule | Prevents invented product UI when a real screenshot is already supplied. |
exactly one screen-close-up beat | Prompt composition | Keeps the ad from becoming a screen recording instead of a creator-style reveal. |
Write all Says lines in the language detected from step 1 | Dialogue rule | Keeps localized product pages from getting English dialogue by default. |
forbid inventing numbers | Prompt grounding | Prevents unsupported spec claims from entering narration or overlays. |
Deterministic brand/spec overlays | Step 8 | Keeps readable brand names and spec copy out of video-model text rendering. |
single add_captions call | Caption step | Avoids quality loss and drift from chained text overlays. |
/pika:ugc-ads https://pika.me avatar_url=https://cdn/face.png → APP_REVEAL, 9:16, seedance, real screenshot, captions on/pika:ugc-ads https://maisonbrune.com avatar_url=https://cdn/face.png aspect_ratio=3:4 → HAUL_UNBOX, 3:4, seedance/pika:ugc-ads https://pika.me avatar_url=https://cdn/face.png provider=kling captions=false → APP_REVEAL, 9:16, kling shots[], no captions/pika:ugc-ads https://pika.me → no avatar_url → uses the built-in fallback Pixar-style female creator portrait, runs end-to-endnpx claudepluginhub pika-labs/pika-plugins --plugin pikaGenerates authentic UGC-style videos (testimonials, unboxings, reviews, selfie content) using the each::sense API.
Plans and runs UGC-style creator ads and social proof videos using genmedia. Generates scripts, direct-to-camera videos, product demos, and short social video content.
Generates cinematic 1080p iOS app teaser videos from real App Store screenshots with GPT-image-2 enhancement. Useful for creating app promo videos, coming soon teasers, or motion graphics from app UI.