FLORA Generative Video Resize
Hosted MCP generation inputs are plural: call flora_create_generations with { "generations": [{ "workspace_id": "ws_…", "project_id": "prj_…", "type": "image", "prompt": "…" }] } (1–20 items). Put per-generation fields, including optional model, params, and reference_node_ids, inside each item. Read generations[] in the response; retain successful entries' run_id and handle failures individually. Poll flora_list_generations with { "run_ids": ["run_…"] }, even for one run; add technique_id for technique runs. Never retry successful items because another item failed.
Use dedicated tools for this workflow, including batches. execute is deprecated; use it only for an SDK operation without a dedicated tool. SDK examples below describe orchestration: use the corresponding dedicated tools, issue independent calls concurrently, retain every run id, and poll in later calls. Do not choose execute just to combine calls.
Turn ONE source video into every target aspect ratio, generatively — no black bars, no crop — while keeping the original's subject, wardrobe, motion, lighting, grade, on-screen text, and timing.
Trigger
User supplies a video (upload or URL) and wants it in other aspect ratios/formats. Ask (or infer) target ARs — default set: 9:16, 16:9, 4:5.
Critical API fact (the #1 failure mode)
flora_create_generations silently ignores any attempt to pass a source video via params (e.g. video_url) or an inputs array — it will happily run text-to-video from your prompt and burn credits producing an unrelated clip. A v2v model ONLY receives the source through a canvas edge. Never call flora_create_generations for v2v without a wired node_id.
Steps
- Probe the source.
ffprobe → width/height/AR, duration, audio stream. Extract 2–3 frames (ffmpeg -ss N -vframes 1) and LOOK at them: note subject (identity, wardrobe, pose), scene, motion, camera move, color grade, and every piece of on-screen text/logo verbatim. These feed the prompt.
- Upload to FLORA.
flora_create_asset (URL fetch if the file has a URL; otherwise source="signed-url" → POST bytes from shell → flora_complete_asset). Create/choose a project; flora_attach_asset puts the asset on the canvas and returns its node id.
- Pick the model (all take the source via canvas edge; AR is a native output param):
- Seedance 2.5 (
v2v-seedance-2-5) — DEFAULT. ARs: 16:9, 9:16, 4:3, 3:4, 1:1, 21:9; duration up to 30s (match the source!); 480p–1080p; keeps/regenerates audio. Verified: preserves grade, wardrobe, scene, and re-typesets brand text cleanly. Actual cost ≈ 1.2 credits/sec at 1080p (the catalog's "estimated_credits: 0" for gateway models is WRONG — quote ~14 credits for a 12s 1080p run before firing).
- Kling O3 Pro Edit (
v2v-kling-o3-edit) — quality alternative, ARs 16:9/1:1/9:16 only, ~933 est. credits.
- WAN 2.6 v2v (
v2v-wan-2.6) — has 3:4/4:3, but duration caps at 10s.
- Gemini Omni 1.1 Flash v2v — 16:9/9:16 only, up to 4K.
- 4:5 is native nowhere: generate 3:4 (WAN) or 9:16 (Seedance), then the FREE
change-video-ar action to center-crop the small delta.
- Wire the graph.
flora_add_to_canvas — node type comes from the label suffix, exactly id["Label (Video)"]; use graph LR, reference the asset node by bare id:graph LR
<assetNodeId> --> r1["Reframe 9x16 (Video)"]
with node_params: {"r1": {"model": "v2v-seedance-2-5", "prompt": <prompt>, "model_parameters": {"aspect_ratio": "9:16", "resolution": "1080p", "duration": "<source seconds>"}}}. One node per target AR — add them all in one call, all edges from the same asset node.
- Run the wired nodes. Call
flora_run_canvas_nodes with workspace_id, project_id, and node_ids containing the actual canvas node ids returned by flora_add_to_canvas. It uses each node's configured model, prompt, parameters, and upstream video. Submit all AR nodes together, inspect skipped entries, and poll each started run_id with flora_list_generations (~3–5 min each).
- Prompt recipe (fill from step 1; one prompt per AR):
- Open with the transform: "Reframe this video from {source AR} to {target AR} {vertical/landscape}."
- Pin what must not change: "Keep the original composition, subject ({specific description: identity, wardrobe, prop}), camera position, {specific camera move}, lighting, color grade, and timing exactly as in the source."
- Direct the new pixels: "The original frame spans the full {width for vertical / height for horizontal} of the new frame; generate new content only in the revealed {top and bottom / left and right} margins, seamlessly continuing {specific scene elements}." (Without "spans the full width", Seedance may shrink the source into an inset window and build a reveal around it — sometimes a great effect, but not a reframe.)
- Lock the type: "Preserve all on-screen text and logos exactly, glyph for glyph: {list each string verbatim}." Small prop text (SIM cards, labels) still drifts — flag it in QC.
- Close with negatives: "Do not zoom, crop, restyle, re-time, or alter the subject."
- Post-process. Download outputs; if an output is silent but the source had audio and durations match (±0.5s), remux the source audio:
ffmpeg -i out.mp4 -i src.mp4 -map 0:v -map 1:a -c copy final.mp4. Derive 4:5 from the nearest native AR with the free change-video-ar action.
Verification
For EVERY output before delivering: ffprobe confirms target AR, duration ≈ source, audio present. Extract frames at 3 timestamps and compare against the source frames: subject identity and wardrobe intact, grade matched, every text string legible and correctly spelled, no letterboxing, no inset-window layout (unless requested). One failed check → one retry with the prompt tightened on the failing aspect (or fallback model); still failing → deliver best output with the defect named honestly. Report actual charged_cost per run and the FLORA project link.
1---2name: flora-video-resize3description: Generatively resize/reframe an input video into multiple aspect ratios (9:16, 16:9, 4:5, 1:1, etc.) using FLORA's video-to-video models, preserving the source's look, feel, subject, grade, and timing. Use whenever the user wants a video in different ARs, formats, or placements — "make a 9:16 from this ad", "resize this video for Reels/TikTok/YouTube", "different aspect ratios from this 1:1", "reframe without cropping", "outpaint this video". Also trigger on "video resize" in any FLORA/demo context.4---56# FLORA Generative Video Resize78Hosted MCP generation inputs are plural: call `flora_create_generations` with `{ "generations": [{ "workspace_id": "ws_…", "project_id": "prj_…", "type": "image", "prompt": "…" }] }` (1–20 items). Put per-generation fields, including optional `model`, `params`, and `reference_node_ids`, inside each item. Read `generations[]` in the response; retain successful entries' `run_id` and handle failures individually. Poll `flora_list_generations` with `{ "run_ids": ["run_…"] }`, even for one run; add `technique_id` for technique runs. Never retry successful items because another item failed.910Use dedicated tools for this workflow, including batches. `execute` is deprecated; use it only for an SDK operation without a dedicated tool. SDK examples below describe orchestration: use the corresponding dedicated tools, issue independent calls concurrently, retain every run id, and poll in later calls. Do not choose `execute` just to combine calls.1112Turn ONE source video into every target aspect ratio, generatively — no black bars, no crop — while keeping the original's subject, wardrobe, motion, lighting, grade, on-screen text, and timing.1314## Trigger1516User supplies a video (upload or URL) and wants it in other aspect ratios/formats. Ask (or infer) target ARs — default set: 9:16, 16:9, 4:5.1718## Critical API fact (the #1 failure mode)1920`flora_create_generations` **silently ignores** any attempt to pass a source video via `params` (e.g. `video_url`) or an `inputs` array — it will happily run text-to-video from your prompt and burn credits producing an unrelated clip. A v2v model ONLY receives the source through a **canvas edge**. Never call `flora_create_generations` for v2v without a wired `node_id`.2122## Steps23241. **Probe the source.** `ffprobe` → width/height/AR, duration, audio stream. Extract 2–3 frames (`ffmpeg -ss N -vframes 1`) and LOOK at them: note subject (identity, wardrobe, pose), scene, motion, camera move, color grade, and every piece of on-screen text/logo verbatim. These feed the prompt.252. **Upload to FLORA.** `flora_create_asset` (URL fetch if the file has a URL; otherwise `source="signed-url"` → POST bytes from shell → `flora_complete_asset`). Create/choose a project; `flora_attach_asset` puts the asset on the canvas and returns its node id.263. **Pick the model** (all take the source via canvas edge; AR is a native output param):27 - **Seedance 2.5** (`v2v-seedance-2-5`) — DEFAULT. ARs: 16:9, 9:16, 4:3, 3:4, 1:1, 21:9; duration up to 30s (match the source!); 480p–1080p; keeps/regenerates audio. Verified: preserves grade, wardrobe, scene, and re-typesets brand text cleanly. Actual cost ≈ 1.2 credits/sec at 1080p (the catalog's "estimated_credits: 0" for gateway models is WRONG — quote ~14 credits for a 12s 1080p run before firing).28 - **Kling O3 Pro Edit** (`v2v-kling-o3-edit`) — quality alternative, ARs 16:9/1:1/9:16 only, ~933 est. credits.29 - **WAN 2.6 v2v** (`v2v-wan-2.6`) — has 3:4/4:3, but duration caps at 10s.30 - **Gemini Omni 1.1 Flash v2v** — 16:9/9:16 only, up to 4K.31 - **4:5 is native nowhere**: generate 3:4 (WAN) or 9:16 (Seedance), then the FREE `change-video-ar` action to center-crop the small delta.324. **Wire the graph.** `flora_add_to_canvas` — node type comes from the label suffix, exactly `id["Label (Video)"]`; use `graph LR`, reference the asset node by bare id:33 ```34 graph LR35 <assetNodeId> --> r1["Reframe 9x16 (Video)"]36 ```37 with `node_params: {"r1": {"model": "v2v-seedance-2-5", "prompt": <prompt>, "model_parameters": {"aspect_ratio": "9:16", "resolution": "1080p", "duration": "<source seconds>"}}}`. One node per target AR — add them all in one call, all edges from the same asset node.385. **Run the wired nodes.** Call `flora_run_canvas_nodes` with `workspace_id`, `project_id`, and `node_ids` containing the actual canvas node ids returned by `flora_add_to_canvas`. It uses each node's configured model, prompt, parameters, and upstream video. Submit all AR nodes together, inspect skipped entries, and poll each started `run_id` with `flora_list_generations` (~3–5 min each).396. **Prompt recipe** (fill from step 1; one prompt per AR):40 - Open with the transform: "Reframe this video from {source AR} to {target AR} {vertical/landscape}."41 - Pin what must not change: "Keep the original composition, subject ({specific description: identity, wardrobe, prop}), camera position, {specific camera move}, lighting, color grade, and timing exactly as in the source."42 - Direct the new pixels: "The original frame spans the full {width for vertical / height for horizontal} of the new frame; generate new content only in the revealed {top and bottom / left and right} margins, seamlessly continuing {specific scene elements}." (Without "spans the full width", Seedance may shrink the source into an inset window and build a reveal around it — sometimes a great effect, but not a reframe.)43 - Lock the type: "Preserve all on-screen text and logos exactly, glyph for glyph: {list each string verbatim}." Small prop text (SIM cards, labels) still drifts — flag it in QC.44 - Close with negatives: "Do not zoom, crop, restyle, re-time, or alter the subject."457. **Post-process.** Download outputs; if an output is silent but the source had audio and durations match (±0.5s), remux the source audio: `ffmpeg -i out.mp4 -i src.mp4 -map 0:v -map 1:a -c copy final.mp4`. Derive 4:5 from the nearest native AR with the free `change-video-ar` action.4647## Verification4849For EVERY output before delivering: `ffprobe` confirms target AR, duration ≈ source, audio present. Extract frames at 3 timestamps and compare against the source frames: subject identity and wardrobe intact, grade matched, every text string legible and correctly spelled, no letterboxing, no inset-window layout (unless requested). One failed check → one retry with the prompt tightened on the failing aspect (or fallback model); still failing → deliver best output with the defect named honestly. Report actual `charged_cost` per run and the FLORA project link.