Skip to main content
Glama

Motion from a Clip

lab_reference_motion

Render a new clip FROM the motion of an existing one: your reference clip leads (camera move, blocking, timing), the model restyles what happens in it. Pass the clip's URL directly — the one you already have from lab_list_assets (asset_type 'video'), lab_job_status or lab_review_queue; nothing is looked up. Reference images bind cast, place and look; in_sec/out_sec cut the reference server-side before it ever reaches the provider, so you pay for the excerpt, not the source. Same backend path as lab_animate's source_video_id, with the fields that only exist there. Costs credits when called without get_cost. WITHOUT a reference clip (leave reference_video_url out), the images and sounds in referenzen alone guide the run — only for models whose lab_list_models entry says referenzen_ohne_video: true, and only FACELESS references (ort, stil, bild, stimme, ton): Seedance 2.5 rejects faces as reference images, even invented characters (measured 2026-09-27), so figur is refused before anything is charged. For a person, build a still with them first and animate it with lab_animate. Name the references in the prompt as 'reference only, never shown on screen', and avoid the word 'static' for short shots — it tends to return frozen frames.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tonNoWhich sound the result carries. quelle: the reference clip's own audio is laid back under the new picture after generation — the way to keep a spoken take, since models that regenerate audio replace the voice. generiert: keep the model's sound (needs generate_audio: true). keiner: no sound. Omitted: quelle when a reference clip is given and generate_audio is off, generiert when generate_audio is on, keiner otherwise. The finished run reports in metadata what actually lies underneath (ton) and how far picture and sound differ in length (ton_drift_s).
taskNoreference (default): the references guide a new clip. editing: the picture of the reference clip stays and only what the prompt names changes — e.g. 'keep the picture, generate matching sound effects, no music' with generate_audio: true. Needs a reference clip. Edit verbs in the prompt are expected here, not refused.
toolNoVideo model id — copy it verbatim from lab_list_models (kind: video), and only models the catalog marks v2v take a reference clip at all. Omit to let the backend use its own default for this path. Durations, resolutions and price live in the catalog, this text names none.
draftNoRender a cheap DRAFT first (Seedance 2.5 and wan_vace only — other models refuse it before anything is charged). On Seedance 2.5 the draft is 480p, priced at that tier, and carries a draft_id that stays valid for 7 days and only for the account that ordered it. Finish an accepted draft in 1080p ONLY with lab_fertigstellen — never by downloading and re-uploading it: that is a new run with new motion, not the draft. Any `resolution` you pass is ignored for a draft, and the answer says so.
in_secNoCut the reference clip server-side before it reaches the provider: start of the excerpt, in seconds from the clip's beginning. Only together with out_sec.
promptYesWhat the new clip should show. Describe it — do NOT phrase it as an instruction to edit or extend the reference; some models classify the run by the verb and then reject the aspect ratio and duration after queueing.
out_secNoEnd of the excerpt in the reference clip, in seconds. Must lie behind in_sec; both are set together or neither.
get_costNoPreflight: return the price in credits and your balance WITHOUT generating and without spending anything, reading the same catalog as lab_list_models. Do this before a long take or when the user should confirm the cost.
use_depthNoCondition the run on a depth pass of the reference clip. Defaults to ON (true = 'voll': depth of the whole frame); pass false to opt out. Models that do not have a depth stage ignore it — the answer says so rather than pretending it happened. 'personen': depth ONLY on the people, the original footage around them — the model stops copying build, hair and clothing of the original performers and the room keeps its colours. With 'personen' the run PAUSES after the mask: only the mask (SAM) is charged, the answer carries cost (mask) and cost_lauf (the run), and the clip waits as wartet_auf_freigabe until the human has looked at the preview (metadata.personen_referenz_url) and you call lab_freigeben. Needs a reference clip and a model with a depth stage; not together with face masks or task='editing'. To RE-FILM a take from new camera angles, pass false: a depth pass locks the geometry of the reference, and the new angles cannot happen. task='editing' ignores it anyway.
kamerapfadNoThe camera move as INPUT instead of prose: an object following shared/kamerapfad/schema.json — poses over time (position, look-at or quaternion, metres, Y up) from the Kadrage terrain flight or drawn by hand, or motion phases as lab_kamerafahrt reads them from a clip (its answer carries a ready `kamerapfad`). The backend validates it, derives phases, and adds the move as a paragraph after your prompt, before the reference markers (the reference clip still leads the motion as the first video reference). WHICH FORM that paragraph takes depends on the model: prose for most families, bracketed director commands for the MiniMax/Hailuo family, which parses them. NO MODEL RECEIVES THE POSES TODAY — the answer says which form went out (kamerapfad.angewandt = als_text or als_regiebefehle), names the family rule and the source it rests on (kamerapfad.sprache), and lists what that form could not carry. If your own prompt already carries bracketed commands, the path is NOT sent on top of them (angewandt = eigene_regie, with kamerapfad.eigene_regiebefehle naming what it found). A `zusammenfassung` inside the path is display only and is NEVER sent — the move is always rebuilt from the phases; if nothing can be built, the answer says angewandt = nicht_ableitbar with the reason, and nothing of the path is in the prompt. Mutually exclusive with kamerapfad_url.
project_idYesProject id (from lab_list_projects) — positive integer as string. On this path it travels in the request BODY, not in the URL, but it is just as required: the new clip is filed under this project.
referenzenNoThe typed successor of character_ref_urls: each reference says WHAT it is, so a place or a look no longer has to travel disguised as a character. Since 2026-09-03 it carries all three channels, not just images: motion references ride alongside the reference clip, sound references go into the model's audio slots. The position IS the address — the images are @Image1..n, the reference clip is @Video1 and the extra motion references follow it, the sounds are @Audio1..n. Image references are MEASURED before they are sent and scaled up to the model's minimum if they fall below it; a reference is never rejected for being small. Mutually exclusive with character_ref_urls — two sources for one list means one of them silently loses. What a model takes per channel is in lab_list_models (referenz_grenzen).
resolutionNoRender resolution on this path, copied verbatim from the model's resolutions in lab_list_models. The run is priced at the resolution you choose — the low tier costs a fraction of the default — so pass it for sound-only or test runs. Omitted, the model's default applies.
wechsel_vonNoThe model id this call switches AWAY from (as listed in lab_list_models), with the same references as before. The answer then carries `wechsel`: which references the switch cuts off and why, and which ones the new model picks up. Nothing is sent to the old model; the field only names the comparison.
aspect_ratioNoOutput aspect ratio on this path, written as width:height or 'auto'. Only models whose lab_list_models entry takes it on the reference path accept it; for any other model the backend refuses it before anything is charged, and the refusal lists the allowed values. Omitted, the model's fixed default applies.
ton_fuehrungNoWhat the model HEARS as guidance while it renders — not what the result carries (that is `ton`). voll (default, same as omitting it): unchanged behaviour. stimme: the backend splits the reference excerpt (after in_sec/out_sec) with demucs and sends ONLY the vocal stem, unchanged, as the single audio reference @Audio1 — so a speaking or singing performer moves the lips without the music bed dragging along. The stem is never pitch-shifted or altered in any way. The demucs split is charged per second of the excerpt and shows up in get_cost (ton_fuehrung.cost); it is cached per clip and in/out, a repeat costs nothing. Needs a reference clip and a model with an audio slot; not together with sound references in `referenzen`. keine: no audio reference at all. With ton='quelle' the original mix of the clip — not the stem — is laid back under the result.
generate_audioNoLet the model generate sound with the clip — only models whose lab_list_models entry can output audio take it on this path. Omitted = no generated sound. Generated audio REPLACES any voice in the reference — to keep a spoken take, leave it off.
kamerapfad_urlNoAddress of a kamerapfad JSON instead of the object — the url of a file in THIS project (lab_list_assets), e.g. the kamerapfad JSON that Kadrage writes next to its flight video. Fetched by the backend under the same ownership rule as every reference: a file of another project is a named rejection before anything is charged. Mutually exclusive with kamerapfad.
last_frame_urlNoGuiding frame for the END of the new clip (image URL). Same rule as first_frame_url: wan_vace only, rejected elsewhere rather than dropped.
first_frame_urlNoGuiding frame for the START of the new clip (image URL). Only the wan_vace path binds guiding frames to the provider — with any other model the backend REJECTS this field instead of swallowing it, because a swallowed guiding frame means paying for a run identical to the one without it.
duration_secondsNoLength of the NEW clip. Must lie inside the chosen model's duration grid from lab_list_models — the per-model ceiling is enforced by the backend and rejected rather than silently clamped.
raum_beschreibenNoWith depth on, a vision call describes ONLY the room of a still from the reference (place, light, colours, materials — no people) and adds it as a paragraph to the prompt, so a depth run does not come back grey. ON by default; false switches it off. The setting is remembered per project — omit it to use the project's last choice. Skipped automatically when an `ort` reference is given. The answer reports raum.angewandt and the text; metadata.prompt_gesendet holds the prompt as sent.
rechte_bestaetigtNoREQUIRED when the reference clip or a character image was uploaded (not made in FilmLab), including characters whose sheet comes from an uploaded photo. It stands for this statement by the HUMAN: 'Ich habe die Rechte an Bild und Ton dieses Clips und die Einwilligung der gezeigten Personen.' Never set it on your own — show the human the statement and pass true only after they agreed. Without it the backend refuses with rechte_fehlen before anything is charged; get_cost tells you up front (rechte_noetig).
character_ref_urlsNoReady image URLs that bind the cast's identity. The name says URLs on purpose: lab_animate's `character_refs` takes character sheet IDS, this path takes ADDRESSES, and the two are not interchangeable. Get them from lab_get_character_sheet. Omit to let the backend use the project's world-bible characters. Mutually exclusive with `referenzen`.
reference_video_urlNoURL of the clip whose motion is taken. Use the url/video_url a previous answer gave you (lab_list_assets with asset_type 'video', lab_job_status, lab_review_queue) — never a hand-built address: the bucket is not guessable and a wrong one renders and bills into a 404. Leave it out to run on `referenzen` alone (at least one image reference, no `figur`, no in_sec/out_sec, no depth) — the models that allow it carry referenzen_ohne_video in lab_list_models.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / ton_fuehrung
      Added value: +{
      +  "description": "What the model HEARS as guidance while it renders — not what the result carries (that is `ton`). voll (default, same as omitting it): unchanged behaviour. stimme: the backend splits the reference excerpt (after in_sec/out_sec) with demucs and sends ONLY the vocal stem, unchanged, as the single audio reference @Audio1 — so a speaking or singing performer moves the lips without the music bed dragging along. The stem is never pitch-shifted or altered in any way. The demucs split is charged per second of the excerpt and shows up in get_cost (ton_fuehrung.cost); it is cached per clip and in/out, a repeat costs nothing. Needs a reference clip and a model with an audio slot; not together with sound references in `referenzen`. keine: no audio reference at all. With ton='quelle' the original mix of the clip — not the stem — is laid back under the result.",
      +  "enum": [
      +    "voll",
      +    "stimme",
      +    "keine"
      +  ],
      +  "type": "string"
      +}
  2. Changed5 schema fields changed
    • addedInput schema / properties / raum_beschreiben
      Added value: +{
      +  "description": "With depth on, a vision call describes ONLY the room of a still from the reference (place, light, colours, materials — no people) and adds it as a paragraph to the prompt, so a depth run does not come back grey. ON by default; false switches it off. The setting is remembered per project — omit it to use the project's last choice. Skipped automatically when an `ort` reference is given. The answer reports raum.angewandt and the text; metadata.prompt_gesendet holds the prompt as sent.",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / rechte_bestaetigt
      Added value: +{
      +  "description": "REQUIRED when the reference clip or a character image was uploaded (not made in FilmLab), including characters whose sheet comes from an uploaded photo. It stands for this statement by the HUMAN: 'Ich habe die Rechte an Bild und Ton dieses Clips und die Einwilligung der gezeigten Personen.' Never set it on your own — show the human the statement and pass true only after they agreed. Without it the backend refuses with rechte_fehlen before anything is charged; get_cost tells you up front (rechte_noetig).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / use_depth / anyOf
      Added value: +[
      +  {
      +    "type": "boolean"
      +  },
      +  {
      +    "enum": [
      +      "voll",
      +      "personen"
      +    ],
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / use_depth / description
      Previous value: -"Condition the run on a depth pass of the reference clip. Defaults to ON in the backend; pass false to opt out. Models that do not have a depth stage ignore it — the answer says so rather than pretending it happened. To RE-FILM a take from new camera angles, pass false: a depth pass locks the geometry of the reference, and the new angles cannot happen. task='editing' ignores it anyway."New value: +"Condition the run on a depth pass of the reference clip. Defaults to ON (true = 'voll': depth of the whole frame); pass false to opt out. Models that do not have a depth stage ignore it — the answer says so rather than pretending it happened. 'personen': depth ONLY on the people, the original footage around them — the model stops copying build, hair and clothing of the original performers and the room keeps its colours. With 'personen' the run PAUSES after the mask: only the mask (SAM) is charged, the answer carries cost (mask) and cost_lauf (the run), and the clip waits as wartet_auf_freigabe until the human has looked at the preview (metadata.personen_referenz_url) and you call lab_freigeben. Needs a reference clip and a model with a depth stage; not together with face masks or task='editing'. To RE-FILM a take from new camera angles, pass false: a depth pass locks the geometry of the reference, and the new angles cannot happen. task='editing' ignores it anyway."
    • removedInput schema / properties / use_depth / type
      Removed value: -"boolean"
  3. Changed1 schema field changed
    • addedInput schema / properties / draft
      Added value: +{
      +  "description": "Render a cheap DRAFT first (Seedance 2.5 and wan_vace only — other models refuse it before anything is charged). On Seedance 2.5 the draft is 480p, priced at that tier, and carries a draft_id that stays valid for 7 days and only for the account that ordered it. Finish an accepted draft in 1080p ONLY with lab_fertigstellen — never by downloading and re-uploading it: that is a new run with new motion, not the draft. Any `resolution` you pass is ignored for a draft, and the answer says so.",
      +  "type": "boolean"
      +}
  4. Changed1 schema field changed
    • addedInput schema / additionalProperties
      Added value: +false
  5. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description must carry the behavioral load, and it does: credits are spent when called without get_cost, in_sec/out_sec excerpts are cut server-side so billing tracks the excerpt, invalid classes/models/rights are refused before anything is charged, drafts carry a 7-day account-bound draft_id, and 'personen' depth pauses the run as wartet_auf_freigabe. It also flags that no model actually receives camera poses and that kamerapfad is reduced to prose or director commands.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the primary mode are front-loaded in the first two sentences. The remainder is dense and information-bearing but runs long with several multi-clause sentences mixing routing, cost, and constraint details, so it is slightly overstuffed rather than wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 25-parameter tool with nested objects and no output schema, the description covers the two run modes, cost preflight, refusal-before-charge behavior, reference class restrictions, and the draft/freigabe hand-offs, and it sketches what answers carry (wechsel, kamerapfad.angewandt, metadata). Nothing an agent needs to invoke this correctly seems absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the per-parameter descriptions are themselves extremely detailed (ton defaults, depth semantics, referenzen addressing, rechte_bestaetigt wording), so the schema already carries nearly all parameter meaning. The description reinforces the mode split (with vs. without reference_video_url, reference images binding cast/place/look, excerpt cutting) but adds little parameter detail the schema does not already state. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Render a new clip FROM the motion of an existing one') and immediately defines the division of labor: reference clip leads camera move/blocking/timing, model restyles content. It actively distinguishes itself from siblings, naming lab_animate as the alternative for people and noting it shares lab_animate's source_video_id backend path 'with the fields that only exist there'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when/when-not branching: with a reference clip pass its URL directly and source it from lab_list_assets/lab_job_status/lab_review_queue; without one, leave reference_video_url out and rely on `referenzen` alone, restricted to models flagged referenzen_ohne_video and to faceless reference classes because Seedance 2.5 rejects faces. It also routes around itself — build a still and use lab_animate for a person — and names lab_freigeben/lab_fertigstellen for the paused and draft flows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources