Specification
Skill ID
pika-labs/pika-plugins/kiss-cam
Publisher
pika-labs
Repository
pika-plugins
Installs
0
Files
1
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

pika-labs/pika-plugins/kiss-camInstalls these files
  • SKILL.md

What this skill tells the agent

kiss-cam

A two-call pika pipeline: spectator-POV Jumbotron still (gpt-image-2) → 15-second in-arena kiss cam clip with PA-announcer commentary and crowd reaction (kling-v3-omni, first-frame-locked to the still). The trend look is calibrated — pass both reference images straight through. There is no textual substitution into the prompts; the subjects are anchored only through images. Don't reach for ${subject_a} / ${subject_b} placeholders. Step 1 and Step 2 prompts are verbatim, not scaffolds.

Prerequisites

pika MCP available in the host. Tool name prefix varies by mount point — use whatever the host exposes. Tools needed: identity balance, asset upload, image generation, reference-video generation, and async status follow-up when a generation does not complete inline.

Cost transparency gate

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 1,500-3,500 credits (~$15-$35) for the GPT-image-2 Jumbotron still, one or two Kling v3-omni pro 15s renders (includes one Step 2 corrective retry with a changed payload), and post-flight analyze_media QA. This exceeds $5, so Reply proceed to continue or cancel to stop.

Do not call any paid MCP tool until the user replies proceed. If the user replies cancel, stop without generating. This is the only yes/no gate; after proceed, the pipeline runs end-to-end.

Pre-generation wall-clock guard

Start a timer at skill start once both subject reference URLs are resolved and the cost gate has passed. The first paid generation call is Step 1 generate_image_edit, and it must be invoked within 5 minutes of skill start. If you have not invoked generate_image_edit within 5 minutes of skill start, stop before any paid generation call and report failed_pre_generation_timeout with what you have so far: subject URL status, upload status, cost-gate status, Step 1 prompt readiness, and the exact blocker. Do not keep refining the Jumbotron prompt, camera language, or style-lock wording.

Print a single-line progress checkpoint after each prep stage and right before the paid generation call:

  • Stage 1/3 done — subject references resolved and uploaded.
  • Stage 2/3 done — cost gate passed, locking the Jumbotron still prompt.
  • Stage 3/3 done — still prompt locked, calling GPT-image-2 now.

Prompt and still-check wording iteration is maximum 2 passes before Step 1. After the max 2 passes, ship what you have to generate_image_edit; do not continue polishing scoreboard details, arena atmosphere, or kiss-cam graphic language.

Long-running task_status polling

When any long-running generation 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.

  • Call 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.
  • Emit ONE visible progress line every 60s while status is queued, running, or processing: Seedance i2v queued for {N}m {S}s... still processing. Replace the provider/stage label when polling GPT-image-2 or Kling tasks.
  • On completed, unwrap the returned result URL and continue.
  • On failed or cancelled, surface failure to the user with task_id, status, and the last status message.
  • After 15 min total from the original submit, call 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.
  • Do not submit a duplicate request while the original task is still queued, running, or processing.

Stage 0 — Intake

If invoked with empty args and no usable prior context, print this menu and stop:

Which two subjects should be on the Kiss Cam? Required: - Subject A reference photo — local path or HTTPS URL - Subject B reference photo — local path or HTTPS URL

If one photo is already present, ask only for the missing photo. Running before both have arrived leaves Step 1 with a missing images entry and produces an inconsistent still.

  • Subject A reference photo (required) — local path or https URL. Save as state.subject_a_url.
  • Subject B reference photo (required) — local path or https URL. Save as state.subject_b_url.

For each: if already an https://… URL, use it as-is. If local path → upload_asset → PUT bytes to presigned_url → use public_url. On Claude Desktop, pasted inline images don't reach MCP — ask once for a URL or a .zip attachment instead (this is the one allowed clarifier; once both URLs are in, only the cost gate remains).

Either subject can be in any visual style — photoreal human, 3D rendered character, designer toy, illustrated avatar, sculpted figurine, etc. The recipe preserves whatever style the reference uses; do not redraw in a different style. No names are used anywhere — the Kiss Cam graphic does not have a chyron with names. Just two subjects caught on the Jumbotron.

Run the Cost transparency gate, then confirm back in one line ("Generating a Madison Square Garden Kiss Cam moment for these two…") and start. No further yes/no gates after the cost gate — the pipeline runs end-to-end.

Step 1 — Spectator-POV Jumbotron still (generate_image_edit, gpt-image-2)

The kiss cam graphic + scoreboard + retro frame get baked into the still at frame 0 — load-bearing, so Kling treats the entire decorative UI as pixel-locked burned-in UI in Step 2 instead of animating it mid-clip.

Why gpt-image-2 (and no fallback): sharper LED panel detail (scoreboard numerals, kiss cam typography, retro decorative edges) and stronger reference-likeness lock than alternative providers; the LED-sharpness + likeness combo is what sells the trend. On a moderation_blocked response, re-roll the same call instead of swapping providers — alternatives produced softer likeness and softer LED detail in earlier trials. We call gpt-image-2 at 1K 16:9 (1792×1024); higher-resolution variants don't help here since Kling pro outputs 1080p downstream.

Retry budget: Step 1 gpt-image-2 still generation gets at most 3 total attempts, including moderation hits and self-check re-rolls. moderation_blocked counts against this Step 1 cap. Track state.step1_attempt_count before every paid still call.

Why a Jumbotron-POV phone shot (and not a TV broadcast overlay): the first iteration produced a TV broadcast cutaway with a pink-heart kiss cam graphic on the feed — user feedback was "the kiss cam graphics is ugly, look how real kiss cam moments look in real videos." Real viral kiss-cam clips online are virtually all spectator phone shots OF the Jumbotron (Obama-era USA Basketball kiss cam, Sarah Hyland / Wells Adams kiss cam, etc.). The Jumbotron-shot framing hits the aesthetic users actually associate with "real kiss cam" — retro red border + sparkly hearts + cursive Kiss Cam script + adjacent LED scoreboard panels + arena darkness + fans filming with phones.

`prompt` (verbatim, sent as-is — no template substitutions):

A high-resolution spectator-POV phone screenshot from inside packed Madison Square Garden during a Knicks vs Bulls NBA game, filmed by a fan in the lower bowl looking up at the giant suspended Jumbotron displaying the in-arena "Kiss Cam" segment. Real fan-filmed phone footage aesthetic — TikTok / Instagram online kiss-cam clip style.

Foreground (bottom 20% of frame): silhouettes of the backs/heads of a few fans in the row in front, slightly out-of-focus, dark; a couple of phones held up filming the Jumbotron, bright phone screens visible.

Use this skill in a project

Open any RiverX project, search the Skills panel for pika-labs/pika-plugins/kiss-cam, and install it in one click.

Use this skill