Generate production-grade video with synchronized audio through Frevana's OpenRouter video endpoint using google/veo-3.1.
Model Characteristics
- Model ID:
google/veo-3.1(variants:google/veo-3.1-fast,google/veo-3.1-lite) - Resolutions:
720p(default),1080p, and4K; the Lite variant supports only720pand1080p - Aspect Ratios:
16:9(default),9:16 - Durations:
4,6,8seconds (default:6) - Frame Control: Supports both
first_frameandlast_frame(image-to-video) - Input References: Reference images (
image_url); audio and video references are unsupported - Audio: Native synchronized audio generation supported (default: enabled)
- Seed: Deterministic integer seed supported
- Passthrough Controls:
negativePrompt,personGeneration
Prerequisites & Authentication
FREVANA_TOKEN(or--token) orFREVANA_API_KEY(or--api-key) in the environment- Optional
FREVANA_AGENT_APP_INSTANCE_ID(or--agent-app-instance-id) sent asx-frevana-agent-app-instance-id curl,bash, andpython3
Invocation
# Text-to-video: submit and wait for video completion
bash skills/veo-3.1/scripts/generate_video.sh \
--prompt "A golden retriever catching a frisbee on a sunny beach in slow motion, cinematic 4K" \
--duration 6 \
--resolution 1080p \
--aspect-ratio 16:9 \
--download-dir ./output
# Image-to-video with first and last frame
bash skills/veo-3.1/scripts/generate_video.sh \
--prompt "A smooth camera zoom from wide landscape to a blooming rose" \
--first-frame ./first.jpg \
--last-frame ./last.jpg \
--duration 8 \
--download-dir ./output
# Status check
bash skills/veo-3.1/scripts/generate_video.sh status --job-id <JOB_ID>
Allowed Options
-p, --prompt TEXT: Text description of the video (required for create)--prompt-file PATH: Path to file containing prompt--model MODEL: Model slug (default:google/veo-3.1, allowed:google/veo-3.1,google/veo-3.1-fast,google/veo-3.1-lite)--duration SEC: Duration in seconds (4,6,8, default:6)--aspect-ratio RATIO:16:9,9:16(default:16:9)--resolution RES:720p,1080p,4K(default:720p);google/veo-3.1-litedoes not support4K--size WIDTHxHEIGHT: Exact output dimensions; overrides--resolutionand--aspect-ratio--first-frame, --image PATH/URL: Image path or URL for first frame--last-frame PATH/URL: Image path or URL for last frame--reference-image PATH/URL: Add a reference image; repeat for multiple images--reference-audio URL: Unsupported by these models--reference-video URL: Unsupported by these models--audio: Generate synchronized audio (default: true)--no-audio: Disable audio generation--seed INT: Deterministic integer seed for reproducible generation--negative-prompt TEXT: Negative prompt to guide generation away from unwanted artifacts--person-generation VAL: Policy for person generation (allow_adult,dont_allow)--wait: Wait for job completion and download/output (default in CLI)--no-wait: Submit job and return immediately with Job ID--poll-interval SEC: Seconds between status checks (default:10)--max-wait SEC: Maximum seconds to wait before timeout (default:600)--download-dir DIR: Directory to download completed MP4 video-o, --output FILE: Path to save output JSON or MP4 file-t, --text-only: Output only the video URL or downloaded file path--dry-run: Print request payload JSON and exit without network calls--token TOKEN: Frevana Bearer token override--api-key KEY: Frevana API key override--agent-app-instance-id ID: Agent App instance ID override
Guardrails
- For semantic requests such as "1080p landscape" or "4K vertical", use
--resolutionwith--aspect-ratio. - Use
--sizeonly when the user explicitly requires exactWIDTHxHEIGHTpixels; it overrides and replaces both semantic dimension fields in the request payload. - Validate that
--durationis strictly one of4,6, or8seconds. Values like 5 or 10 will be rejected client-side. - Validate that
--aspect-ratiois either16:9or9:16. - Validate resolution against the selected model;
google/veo-3.1-liteaccepts only720por1080p. --sizeis format-checked locally but not matched against a static model allowlist; model/provider compatibility is validated by the API.- Frame images and input references may be sent together; OpenRouter gives
frameImagesprecedence and treats the request as image-to-video.