studio_job
Make films and sound in the studio. Make films and sound in the cloud studio, with no Mac. Sound: the Immersive Desk (one sound piece JSON: voice, music, effects, spatial sound, master). Picture: the Video Desk (one video piece JSON on a shared beat grid and word times, free scenes in HTML/CSS/GSAP; contract co1.video.piece.v1). kind: analyze (beats, bars, sections and word times of audio → analysis/timeline.json), check (piece problems, each with its fix; deep adds layout and contrast), preview (stills you can see), render (the film), sound_check, sound_preview (a window of up to 30 s, with a waveform), sound_render (the mix, renders/<piece>.wav). files: the text files to write first (the piece, scenes, the Desk piece, brand/brand.json from the company's brand); media: files from the company's media library into the project (asset_id + path). Rules: render and sound_render need request_key (the same key never renders twice); a film's audio is a Desk piece rendered first with sound_render; text at least 28 px; every media file has its source and licence. Rendering reaches nobody: no yes. Long work gives a job_id: poll studio_status. Motion JSON films (the easy way): motion_brief first (the brand's guide; format, style), write the piece as files, then motion_lint (piece; deep = final) → motion_stills (piece, at in seconds, max; look) → motion_render (piece, quality, request_key) → studio_status; motion_kit rebuilds the kit from brand/brand.json; motion_analyze (audio: beats, bars, words) and motion_edit_analyze (video: transcript, chapters, hook, fillers) feed the piece. 2D and 2.5D only for now. A done motion_render lands unapproved; studio_status gives film_ready: ask the owner with film_ready. Posting is a second yes: a post card (propose kind post, content_item_id + content_item_version), posted once.
Where it is
In the studio area (making films and sound in the cloud studio (Video Desk, Immersive Desk)): open it with tools_for { area: "studio" }, then call it with use_tool { name: "studio_job", args }.
Does it need a yes?
Runs at once, no yes card: it changes only the office's own working state, and nothing reaches anyone. Here: a render or check in the cloud studio: it reaches nobody (posting it is a separate yes).
Inputs
| Input | Type | Needed | About |
|---|---|---|---|
project | string | yes | The studio project, e.g. spring-reel (letters, numbers, dot, dash, underscore). · format `^[a-z0-9][a-z0-9._-]{0,63}$` |
kind | "analyze" | "check" | "preview" | "render" | "sound_check" | "sound_preview" | "sound_render" | "motion_brief" | "motion_kit" | "motion_lint" | "motion_stills" | "motion_render" | "motion_analyze" | "motion_edit_analyze" | yes | |
piece | string | no | The piece in the project: e.g. piece.json (video) or sound/piece.json (sound). · up to 200 characters |
audio | string | no | analyze: the audio or video in the project. · up to 200 characters |
words | boolean | no | analyze: false to skip word times (music only). |
deep | boolean | no | check: also compile and run the layout, contrast and craft checks. |
at | array of number or string | no | preview: seconds or anchors (bar:3, word:yes). · up to 12 items |
from | number | no | 0 or more |
to | number | no | 0 or more |
quality | "draft" | "looks" | "delivery" | no | |
files | object | no | Text files to write first, by path in the project. |
media | array of object | no | up to 10 items |
media[].asset_id | string | yes | up to 160 characters |
media[].path | string | yes | up to 200 characters |
media[].version | string | no | up to 100 characters |
request_key | string | no | render, sound_render and motion_render: your own key for this exact render. · format `^[A-Za-z0-9][A-Za-z0-9:._-]{0,99}$` |
video | string | no | motion_edit_analyze: the source video in the project. · up to 200 characters |
lang | string | no | motion_edit_analyze: the spoken language, as a 2 or 3 letter code like hi or en, or auto. · format `^(auto|[a-z]{2,3})$` |
task | integer | no | With media: the task you hold. · 1 or more |
format | "16:9" | "9:16" | "1:1" | no | motion_brief: the film's shape (default 16:9). |
style | "template" | "brand" | "wild" | no | motion_brief: how free the design is (default template). |
max | integer | no | motion_stills: how many frames (default 12). · 1 to 24 |
run_id | string | yes | The run_id from start. Pass it on every call: it keeps your task held. · 1 to 100 characters |
Example
{
"name": "studio_job",
"arguments": {
"project": "spring-reel",
"kind": "analyze",
"run_id": "the run_id from start"
}
}When it is refused
invalid: The input isn't right. The sentence names the field and the fix; nothing was done. Fix it and call again.not_found: No such thing in this company (a task, file, person, record). Check the number or name, or list first.not_allowed: Not without another step: the owner's yes, your own task held with pick_up, or a setting the owner turns on. The sentence says which.taken: Someone else holds it (another AI on that task). Pick another task.stale: It changed since you read it. Read it again and use the new version.failed: On our side or a service's, never your input. Try again in a minute; if it keeps failing, call report_problem.