agentleFS
brandonbryant12brandonbryant12/clearframe/skills/veo-video/SKILL.md

veo-video

Skill1 starsChanged 24 days agoMITView on GitHub

Generate short footage with Google Veo 3.1 via the Gemini API — defaults to the cheapest model (veo-3.1-lite-generate-preview, 720p, 4 s ≈ $0.20) — with the exact predictLongRunning contract, polling and download, image-to-video from a Gemini still for style consistency, constraints, pricing, and prompt recipes for calm establishing plates. Use rarely: only for an establishing shot code can't fake, ≤ 20% of runtime, never to carry information.

5 other projects use a version of this.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

4 rules. 0 are common, 2 are distinctive, and 2 are very specific to this project.

  • 0

    Common

    Most of the 3 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Read the URI at response.generateVideoResponse.generatedSamples[0].video.uri, then download it with the x-goog-api-key header, following …

    line 39
  2. Distinctive:

    Don't rely on it for text, numbers, charts, UI, logos, faces or recognisable people.

    line 72
  3. Very specific:

    No fast motion, handheld shake, whip pans or "epic" drone swoops.

    line 73
  4. Distinctive:

    Don't generate footage to fill time.

    line 74

“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

ClearFrame defaults generated clips to Gemini Omni Flash 1.1. Select a Veo model explicitly to use this alternate provider.

Veo footage

Last resort, by design. A ClearFrame film is typography, numbers and diagrams. Footage earns its place only as an establishing plate: a place, a physical process, a texture in motion that code can't fake. It never carries information, since text and numbers in generated video are unreliable. Put the words and numbers over the plate in code.

Budget rule: ≤ 20% of runtime, clips of 4 s, and one or two per film. clearframe plan warns above 20%.

Use it

"assets": [
  { "id": "atrium", "kind": "image", "prompt": "Architectural photograph of an empty modern atrium at dawn … No people, no text." },
  { "id": "atrium-move", "kind": "clip", "from": "atrium", "seconds": 4,
    "prompt": "Very slow forward dolly through the atrium, soft dawn light shifting across the floor, calm, no people, no text, no camera shake." }
]
clearframe images <dir> && clearframe clips <dir>     # still first, then animate it (style consistency)
node packages/engine/dist/skills/veo-video/scripts/veo.mjs --prompt "…" --image still.jpg --seconds 4 --out clip.mp4 [--dry-run]

In a scene: <video src="assets/clips/atrium-move.mp4" data-start="hook" muted playsinline></video>. The runtime seeks it frame-accurately, and its audio is ignored because ClearFrame mixes sound separately.

Contract (verified 2026-09-27 against ai.google.dev/gemini-api/docs/veo)

POST https://generativelanguage.googleapis.com/v1beta/models/veo-3.1-lite-generate-preview:predictLongRunning with header x-goog-api-key

{ "instances": [{ "prompt": "…",
    "image": { "inlineData": { "mimeType": "image/jpeg", "data": "<base64>" } } }],
  "parameters": { "aspectRatio": "16:9", "resolution": "720p", "durationSeconds": 4 } }
  1. The call returns { "name": "<operation>" }.
  2. Poll GET https://generativelanguage.googleapis.com/v1beta/<operation> every ~10 s until "done": true. Latency runs from 11 s to 6 min.
  3. Read the URI at response.generateVideoResponse.generatedSamples[0].video.uri, then download it with the x-goog-api-key header, following redirects. Files stay on the server for 2 days.

Constraints:

  • aspectRatio: 16:9 or 9:16.
  • durationSeconds: 4, 6 or 8, sent as an integer (live calls on 2026-10-04 accepted integers; the string form in older docs is unverified). 1080p and 4k require 8 s, and Lite has no 4k.
  • personGeneration: allow_all is the only value for text-to-video and allow_adult the only value for image-to-video. ClearFrame omits it, and the prompts avoid people.
  • lastFrame (interpolation) requires image.
  • referenceImages and extension are available on 3.1 and 3.1 Fast only.
  • negativePrompt is not documented on the Gemini API, so put exclusions in the prompt.
  • Output is MP4 at 24 fps with native audio (always on) and a SynthID watermark.
Model720p1080p4k
veo-3.1-lite-generate-preview (default, cheapest)$0.05/s$0.08/s—
veo-3.1-fast-generate-preview$0.10/s$0.12/s$0.30/s
veo-3.1-generate-preview$0.40/s$0.40/s$0.60/s

A 4 s Lite clip at 720p costs $0.20. In a 2026-10-04 sizzle production, Standard at 1080p was 80% of the spend and only about 3 s of each 8 s clip was used: explore on Lite or Fast, and keep Standard for close-ups (see docs/google-generation-field-notes.md). Upscaling a 720p plate under grain and a vignette at 1080p is usually invisible; use 1080p (8 s, $0.64) only for full-bleed hero plates.

Prompt recipes (calm plates)

Structure: camera move → subject → light → palette → pace → exclusions.

  • "Very slow forward dolly across a sunlit wooden desk with neatly stacked paper, shallow depth of field, warm morning light, muted palette, calm, no people, no text, no logos, no camera shake."
  • "Locked-off wide shot of clouds drifting over a quiet city skyline at dusk, soft haze, slate-blue palette, slow and steady, no text, no people in frame."
  • "Macro slow pan across flowing ink dispersing in water, cobalt on off-white, soft light, graceful and slow, no text."
  • For vertical, use --aspect 9:16 and compose with the top 11% and bottom 20% kept clear.

Image-to-video from a Gemini still is the house technique. Generate the look with gemini-image, then animate it, so every plate matches the theme's palette.

Continuing a shot: pass the previous clip's last frame as image and describe the camera move away from it. That produced a seamless pull-out in one production. Also add "consistent lighting, no lens flares" to counter late-clip drift, and expect actions prompted for "the end" to land mid-clip. Field notes: docs/google-generation-field-notes.md.

Don't

  • Don't rely on it for text, numbers, charts, UI, logos, faces or recognisable people.
  • No fast motion, handheld shake, whip pans or "epic" drone swoops. They fight the calm grammar. A footage-led brief (a sizzle reel or brand spot: docs/hero-footage.md) may ask for that energy; then follow the field notes above.
  • Don't generate footage to fill time. If a beat feels empty, the script or the visual idea is the problem.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.