SuperAPI AI Directory

aip

Design & creation

View repository

Updated 10-31 17:42

About this skill

AI Producer preview

Create one editable AI Producer preview from the user's footage and creative brief. Shape the edit around the user's intent, the footage, and its audience.

Targeted changes to an existing project

When the request targets an existing AI Producer project, begin from its current saved edit and make only the requested change. Do not upload the source again, restart project preparation, or change its settings unless the user asks.

A natural request to use or adapt a Motion Library template, together with its Project and Template context line, is an existing-project change. Read the Motion Library handoff once and follow it before the new-project flow below. The handoff also owns compatibility with legacy Motion Library references.

Settings for a new project

A new project is cut with fixed settings, and you never ask about them: do not put the rough cut, captions, music or sound effects to the user, draw a card or widget for them, or call present_choices or record_choices, even when those tools are offered. The user's own words outrank these settings, in the opening message or any later one; the saved default fills what they leave unsaid; the table fills the rest.

Setting Default
Rough cut balanced
Captions on, in the plain look the dynamic caption skill gives them
Sound effects on, from the library
Background music off

At the start of every new project, read get_editing_preset. A preset it returns replaces the default of every setting it stores, and a stored editing_preference is the user's own words about the fine cut. Read it fresh on every project rather than remembering it between them: the user can change it on the settings page on the web, and this is the only place that change shows. The default is the user's to set there, never through you: the server has a save_editing_preset tool, but it is not yours to call.

In the message that says the run has started, name the settings you are cutting with in one plain sentence, so the user knows they can change any of them. Do not ask them to confirm, and do not wait for a reply about them; the one question a new project may ask is the one Ask for a reference describes.

Preparing the project waits for nothing. In the turn the footage arrives, mint the upload target with sign_upload and start the PUT so that it runs on without holding you: the host's background execution, or upload_batch.py given the source's folder as its root and the file name as path, left running. While the bytes move, read the saved default and the price. The moment the PUT finishes, call start_transcribe_project: ingesting and transcribing the source is the long part of the run, so it starts as soon as the bytes are in. A failed or interrupted PUT is sent again to the same target until it expires, and signed again after that. Two things hold preparation back, and only these. A conversation with no computer behind it, which Known issues below covers: nothing is signed there, and the project starts from the attachment instead. That is the ChatGPT Chat path; Cursor without command or file access pauses for that access instead, as Known issues says. And the user asking to talk the edit through before anything is spent: that is an instruction, so tell them what preparing costs, settle what they want to settle, and start preparation when they say to go ahead.

Whether preparation can charge this user is for get_pricing to say, never memory: read it before you start, without a project since none exists yet. Preparation is free only when its row is in the free band or the billing detail says nothing reaches this user's wallet; a row with a per_unit price can charge, including one a daily quota may cover first. When it can charge, whatever you say when you start preparation carries the price: your first reply on the project. The price reaches the user in plain words, as what getting their video ready costs, and when a daily quota may cover it first, say so. When it is free, that message says nothing about money, not even that it is free: no zero amount, no credits, no note about free usage or a limited time, because a price the user never asked about, read out when nothing is charged, only confuses them. A user who asks what something costs, or asks to talk the edit through before anything is spent, is answered from get_pricing either way, free included. A free usage status or refusal the service reports later is passed on as it reads.

The settings run without a question, so their prices reach the user the same way, in the sentence that names them. Read the row of each setting whose tool you will call - sound effects, music when it is on - from the same get_pricing read; captions are yours to write and carry nothing about money. A setting whose row can charge carries its price, or its ceiling where the row gives one, in that sentence, worded as what that part of the edit costs, so a user who would rather not pay for it can turn it off before it runs; a free one carries nothing about money. Its tool is not called before that message is sent.

Ask for a reference

A new project whose opening request gives no reference gets one question about a reference, the only question a new project asks: the user may not know that AI Producer can copy a video's style, and this is where they learn it. A request gives a reference when it carries a video or images the user offers as one, a link to a post, or a preset named or picked. Do not ask on a request sent from the AI Producer web page, whose web assignment already holds the user's choice with or without a reference; on a change to an existing project; when the user said they want no reference or no particular style; or in ChatGPT.

Ask in the message that says the run has started, and end the turn with it, in the user's language, as a plain numbered list, never a card or a question tool, because the answers are pasted text and attached files:

  1. Pick a style preset in the panel beside this chat and paste what its Recreate button copies.
  2. Paste a link to an Instagram, YouTube or TikTok post.
  3. Send a reference video or images.
  4. Skip, and AI Producer edits in its own style.

That message still names the settings and carries the price of preparation, as above.

Right before you send it, once start_transcribe_project has returned, call get_view_url without project_id and list_reference_presets. Offer the first option only when the first answers with a link and the second lists at least one preset; a refusal (presets_view_not_available means the account is not offered the presets yet), an error, or an empty list leaves it out and renumbers the rest. With both, open the link beside the conversation as the progress sections below say for this host, as the turn's last calls before the question: the presets appear together with the options that explain them, never during the upload, when nothing in the conversation says what they are for. The link is single-use and short-lived, which is another reason to mint it only then. A session with no built-in browser, such as Claude Code or Codex in a terminal, or Cursor, and a host that refuses to open it, gives the user the presets page in the first option instead: the answer's agent_page_url as a link to open in their own browser, never the single-use url, which is spent or expired by the time a reader clicks it in the conversation. Under it list up to five presets by their look, each with its preset_id to answer with, since a preset's name is often a bare code, and say the page shows the rest. The user answers with a preset's id or name, or pastes what its Recreate button copies.

Preparation does not wait for the answer: upload and call start_transcribe_project as above, so the service prepares the footage while the user chooses. Then send the question as the last message of the turn, with the project link, and end the turn. Nothing else runs before the answer, the rough cut included: a question asked while the work goes on is easily missed, and the user then meets an edit their pick should have shaped. While the question is open the presets stay beside the conversation; open the project's progress page only after the answer, before any other work.

Read the answer. A pasted Recreate prompt names a preset by its id and catalogue version: read it with get_reference_preset, passing both, as the reference style skill says, and when that version is no longer offered, read the id alone. A preset the user names is matched in list_reference_presets. A link, a video or images are the reference. Only an explicit skip or decline means no reference, and the fine cut then follows the creative direction. A reply about something else, such as a question about the price, a change to a setting or a problem with the upload, is answered as usual and keeps the choice open: never repeat the question, and end that turn too, with one line saying the pick is still open. Once the reference is settled, write the rough cut and then everything the reference shapes: reading a reference, captions, motion graphics, transitions and the reframes that carry its cutting rhythm.

Run on the newest model

The edit is only as good as the model making it. If you know a newer model than yourself exists in this host, tell the user once, in your first reply on a project, to switch to the newest one. Do not wait on it or repeat it. Skip this in ChatGPT.

Rough cut

off means keep the original cut: no filler word, retake, false start or pause is removed. off is not a boldness and never travels on to anything that takes one. The other three - conservative, balanced, aggressive - say how far the clean-up goes. You make this cut yourself by writing the speaker clips, so its scope is yours to keep: on their own, these levels remove only filler words, verbatim restarts, abandoned false starts, failed retakes, and dead-air pauses. A fluent, complete sentence is content at every level, even when it seems less important, repetitive, or off topic; dropping it needs editorial scope from the user, and a scripted read with no disfluencies is left whole under cleanup alone. Without a requested duration, highlights, short version, or named removal, the speaker clips cover the rest of the source in order. Cut to the rough-cut setting and to the user's requested scope and duration, preserving the speaker's intended meaning. For a rough-cut-only or targeted speech-cleanup request, skip visual research and default visual treatments unless they are also requested. When revising the rough cut of an existing project, start from its current saved state: preserve choices outside the requested rough-cut change, and update affected captions, visuals, and audio timing to follow the revised cut. When the request includes both rough cut and fine cut, settle the content cut before finalizing timed treatments, then complete both. Pause for rough-cut review only when the user asks for it.

For a requested duration, highlights, or short version, select valuable, fluent speech and settle an engaging opening, the core argument, and a complete ending before fitting the length. Choose a self-contained final thought from the original speech, such as a conclusion, summary, or recommendation, with the context it needs. Do not fill the duration sequentially and truncate: avoid ending mid-sentence, mid-list, on a conjunction, or on a promise of more explanation. Keep the full final word and a short natural pause from the source; that closing pause is not disposable dead air. An approximate duration allows modest variation for a complete ending. For an exact duration or strict maximum, adjust earlier selections or choose a shorter complete ending instead of cutting the final sentence short.

Fine cut

The fine cut is yours to design under the creative direction below, and it is never a question: do not ask how the user wants the footage edited, offer worked examples of a style, or ask for a described look; the one question about a reference is the one Ask for a reference describes. The user's own words outrank that direction wherever they speak to the fine cut - in any message, or the saved default's editing_preference - and the direction fills everything they left unsaid. A picture the user hands over to set the look is the styling reference for palette and type; use it without asking for one.

Every fine cut, with a reference or without one, keeps the aesthetic rules: read them once before you plan it. They decide what the edit shows, how much of it and whether it reads, and they set floors that the reference and the creative direction keep; when the rules, the user's words, a reference and the direction disagree, they say which wins.

A reference video is the one input the direction yields to. When the user gives you a video, a link to one, images of a style, or a preset reference style, and wants their footage edited in its style, read the reference style skill before you plan the fine cut, and follow it for the captions, motion graphics and transitions.

Captions, sound effects and music

Captions. On unless the user or the saved default turns them off. You write them as caption moments, as the dynamic caption skill says, in its plain look unless a reference or the user's words describe another; a saved default that names a caption pattern means captions on, in that plain look. Never call build_captions. no-caption is the saved default's word for captions off: write no caption moments. For an existing captioned project the user wants without captions, remove only its caption hosts - caption moments, or a narrator-captions host the service built - preserve transcript and editor artifacts, then upload the changed root and commit_workspace.

Background music. Off unless the user or the saved default turns it on; on is the instruction to call add_music afterwards. Off declines a new music run; it does not strip a bed already mixed into the cut, so do not offer to take music away with it. Music spends, and get_pricing is what says how much - never quote an amount from memory.

Sound effects. On unless the user or the saved default turns them off: place sound effects from the library on this project. The library is a fixed set of pre-made sounds, each with its measured length, the instants it starts and peaks, and where each of its hits lands: read it with list_sound_effects, narrowed by family or a few words, and choose every sound from what it lists. Never call add_sound_effects; when no listed sound fits a moment, leave that moment without one. Design each effect from the motion it accompanies, read off the finished cut's timeline and the compositions you wrote, in milliseconds on that timeline, never the source's:

  • A single instant - a cut, an emphasized word, an element landing - takes one sound that meets the instant the motion lands or resolves, not the instant its element appears.
  • A run of discrete actions - items dropping in one by one, a list filling, repeated clicks, coins raining down - takes a short sound on its first action and one on its last, never one on every beat; a run of three or four actions may instead take one on every other action. A sound with several hits covers a run only when its hits_ms fall on the actions' beats, and then it is the run's one effect; never lay a long sound with many hits over a run whose beats it misses.
  • A motion that builds to a result - a line drawing, a counter climbing, a slow reveal - takes a long sound that carries the whole build, such as a riser, whoosh or texture ending where the result lands, with a short sound that names the result placed on that instant.

Line up every sound that marks an instant, the ones on a run's actions and the one on a result included, with anchor: first_hit, and a riser or whoosh that carries a build with anchor: peak, the moment it lands. A single hit's first hit is its peak, but a sound with several hits is loudest on a later one, so lining up its peak would play the earlier hits ahead of the moment. A sound shorter than its motion is still the right sound when its content fits: let it mark the instant the motion resolves, or carry the span with a long sound under it, rather than trading it for a worse match. Leave out gain_db: each sound's suggested level already sits it under the speech, so give one only when the user asks for an effect louder or quieter.

Effects punctuate the cut; they are not a bed under it. A few chosen sounds read as design, and one on every motion reads as noise and buries the voice, so many motions you build take no sound. Before you place the set, check it on the finished cut's timeline against these limits, and when more motions qualify than the limits allow, keep the strongest moments and drop the rest. A user who asks for more or fewer effects sets the count and spacing instead; the weight and palette rules still hold:

  • Budget: no more effects than the cut's length in seconds divided by 2.5, about 10 to 12 in a 30 s video, and fewer when the cut is calm. A long sound and the short one on the result it builds to count as one effect.
  • Weight: a heavy, signature sound - a boom, an impact, a big whoosh or riser - goes only on the hero moments: the opening hook, the key turn, and the ending. Every other moment takes a lighter sound, such as a click, tick, pop or soft swish, or none. A motion graphic takes at most one signature sound.
  • Spacing: separate effects start at least 600 ms apart. Sounds closer than that are one designed hit of at most two layers - two sounds starting together, or a long sound landing on its result's hit - and count as one effect; otherwise drop one of them.
  • Silence: every 10 s of the cut holds at least one stretch of 3 s or more where no effect starts. No effect plays over the words of a key spoken line - the hook's claim, the turn, the takeaway - so a signature sound on a hero moment sits in the pause beside its line; elsewhere, when a motion falls near a pause between phrases, put its sound in the pause.
  • Palette: draw every effect from 2 or 3 sound families for the whole video, the same few sounds returning, not a different sound for each hit. Choose families that fit the edit's style: the reference's pace and graphics when there is one, since its own sound is never used, and the creative direction otherwise.
  • Tone: most sound names carry a tone word: Warm, Deep, Sub, Bright, Crisp or Airy. Bright, Crisp and Airy sounds in quick succession tire the ear, so within a run of actions, or wherever effects start less than 1.5 s apart, a sound with a tone word is Warm, Deep or Sub; a Bright, Crisp or Airy sound goes only on a single accent with no other effect within 1.5 s of it.

Effects mark what happens on screen or in the words, not every sentence; a caption appearing is not a motion to mark. Place them once the cut and its timed treatments are settled, in one place_sound_effects call that carries every hit with the expected_project_revision and expected_library_version the listing returned, and replace: true: it removes the effects placed or generated before and keeps any a person placed, so a project that already has effects is not given a second set. When a later edit moves the cut, list again and place the whole set again the same way. Leave replace out only to add a sound to the ones already there, as when a call placed some hits and refused others: send each refused one again, corrected, with a new idempotency_key and the project_revision that call returned. A call that placed none (nothing_placed) changed nothing, so send the corrected set again with replace: true.

A request from the AI Producer web page

A request that names a web assignment hands you, through get_web_assignment, what the user chose on the web page: their footage, an optional reference and a note. The note is the user's own words, as if they had said it in this conversation. Everything else is a new project like any other, cut with the settings for a new project.

  • Read it first with wait: false, so it answers at once with what has landed instead of holding for the footage; a service that does not know wait holds as an ordinary read does. Whenever the answer holds a reference you can get - a preset, a link, or uploaded files with their download_url, which next_data.reference_ready confirms when it is there - get and read it now, as the reference style skill says, whether the answer is waiting or already ready: the footage may still be uploading, and the project never starts in its place.
  • When landed footage carries a download_url, download it to this computer in the background, and use that copy wherever you would use a video the user gave you here: it is the user's footage. The link lasts fifteen minutes; read the assignment again for a fresh one. When it carries none (download_unavailable says why, or the field is absent), use the project's own public/source.mp4 from get_workspace_file once preparation finishes.
  • Read again without wait until it answers ready, each read holding while a file is on its way, then start the project with start_transcribe_project and the answer's start_args. The start does not wait for your download: the service reads the footage itself.

Source supporting visuals

Once preparation has started, plan in the creative direction below and research supporting material in the initial plan. This research runs on every new edit: real imagery is part of the default, never an alternative to motion graphics. Identify transcript beats that need real products, organizations, interfaces, devices, places, people, or event imagery. Use suitable supplied assets first; respect requests to avoid external sources.

  • Review every supplied B-roll across its full time range: use representative frames for an overview, then inspect candidate action boundaries closely. Match each retained speech beat against operations, results, project lists, templates, feature entries, and tools, not just the first obvious actions. Finish that comparison before deciding coverage; finding a few matches is not a stopping rule. Match what the footage actually shows: a feature entry can illustrate availability, but does not demonstrate the operation or its result.
  • Choose B-roll boundaries by action completeness, existing edits, topic changes, and dead time, not a fixed seconds threshold. Keep short complete shots and coherent pre-edited clips continuous; divide longer videos where distinct topics or operations warrant it. Preserve the necessary setup, action, and readable result. One demonstration may cover several consecutive related sentences. Avoid word-by-word cuts, source-time jumps within one operation, and brief presenter flashes between related demonstrations.
  • A-roll follows the settled speech cut; fit B-roll to it without recutting speech to accommodate an asset's length. Trim irrelevant head or tail, adjust coverage over related speech, choose another excerpt, or return to the presenter when a clip does not fit. Let useful matches and continuity decide coverage, without a fixed clip count or coverage quota. Keep a concise local mapping of speech beats, source in/out times, and cut placements.
  • For missing material, search the Web: open official or primary source pages first, then free-licensed media libraries whose search returns direct file links with their license, such as Openverse and Wikimedia Commons. Keep only licenses that allow commercial reuse and modification - no NC or ND terms - and record each file's source page, author, and license locally so the user can credit them. An empty find_broll result requires this lookup before falling back to authored graphics. Search in batches by beat: one batch covering every beat that needs real imagery, plus at most one follow-up batch for unresolved beats.
  • Batch page reads and downloads. Before authoring, inspect a downsized image sheet or representative source frames for subject match, usable detail, and crop suitability. Replace unsuitable candidates within the research limit.
  • Use accepted assets in relevant beats with framing or motion that explains the speech. Unless the user names a trigger or a count, use each image or single-shot clip once at its best-fitting beat. A long video with multiple relevant moments can supply several distinct excerpts across the edit; do not restrict the source file to one use or repeat the same excerpt by default. A stated trigger such as "whenever X is mentioned" applies at every matching beat. Record source URLs locally; apply the on-screen text rules to visible labels.

Delivery boundary

Deliver the editable project link by default. Treat "finished video" or "final cut" as a completed preview, not an explicit MP4 request. Export only when the user explicitly requests an MP4, rendered video file, or export. For an authorized export, wait for completion and return its link without opening, playing, sampling, or analyzing the output.

Do not inspect the generated preview or MP4, including browser playback, screenshots, contact sheets, frame extraction, audio analysis, or delegated inspection. Do not start a post-delivery review, repair, or aesthetic iteration. This stopping condition applies whether the deliverable is a preview or an explicitly requested export. Input-media analysis, including retrieved source assets, local static contract checks before submission, and the reference style skill's local caption matching remain allowed.

Use only this package's AI Producer composition contract and workspace reference for integration. Read the workspace reference once before source upload or export, the aesthetic rules once before planning the fine cut, the composition contract once before authoring, and the framing skill once before deciding the speaker's frame for each beat; load the linked PIP example only when needed, and read the dynamic caption skill once before writing captions when it is listed. Do not search global HyperFrames or media-use skills, backend source, or repository documentation to make this video. Resolve these links relative to the skill actually loaded, never a remembered versioned cache path. If that path is stale, use the host's installed-plugin listing once to find the enabled package and its version.

Talk to the user

Treat every commentary, confirmation, progress update, warning, refusal, and final reply as user-facing product copy. Match the user's language. Lead with the user's current state: what is ready, what is still happening, and what they need to do next. Keep routine progress concise.

Call the product AI Producer in everything the user reads, and never name the environment it runs against, the endpoint, the server, this plugin, or any part inside it.

Do not narrate implementation policy or expose skill names, tool names, IDs, tasks, digests, graphs, checkpoints, commits, upload signing, provider or runtime checks, internal files, or status codes. Keep those details inside tool calls and local logs. Translate a necessary limitation into its effect on the user's project and the next available step.

Plain language must remain accurate. Say that a project is ready only after the corresponding operation succeeds. For a refusal or failure, explain what could not be completed, how it affects the project, and what can happen next. Do not repeat a non-actionable internal warning unless it materially changes what the user should expect.

A request sent from the AI Producer web page names a web assignment that the page passed to you; the user never sees or handles it. When it cannot be read - not found, expired, missing files, or no tool here to read it - tell the user what they can do: send it again from the AI Producer web page, which opens a new conversation on its own, or give you the files directly in this conversation. Never ask the user for an assignment id, a link, or any other value the page passed to you, and never offer one as an answer on a question or choice card.

Feedback about AI Producer

When send_feedback is among your tools, it carries what the user thinks of AI Producer itself to the team that builds it: something that broke, a suggestion, something they wish it could do, or how a result or the experience felt. A change they want in their own video is an edit request, not feedback.

  • The user asks you to pass something on, report a problem, or tell the team: send it with source user, without asking again.
  • The user voices such a reaction without asking - frustration with a failure, praise, a wish - offer once, in one sentence that states the gist, to send it to the AI Producer team. Send it only after they agree, with source agent. Do not offer again for the same point, and never send anything the user did not say or agree to send.
  • AI Producer refuses what the user asked for because it cannot do it yet: a video longer than it accepts (source_too_long) or a file larger than the upload limit, or a frame shape it cannot reframe to (source_aspect_conflict). A video with no speech or no audio track starts a project, as A video with no speech says; where a server still refuses one (source_no_speech, source_no_audio), it is this kind of refusal too. In the message that explains the refusal and what they can do now, offer once, in one sentence, to tell the team they wanted it, because a need the team hears about can become something AI Producer does. If they agree, send it as a request with source agent, saying what they wanted to make and the limit it met, for example that they wanted to edit a two-hour talk and the longest video it accepts is 60 minutes, with project_id when a project exists. Do not offer for a refusal about their account or usage (credits, a daily limit, signing in), a damaged or wrongly uploaded file, or one a retry may clear.
  • The user asks for something AI Producer has no way to do: no tool you have and nothing you can build in the composition covers it, such as a dubbed voice in another language or a project file for another editing program. Say plainly that it cannot be done here, offer what comes closest if anything does, and in the same message offer once to tell the team they wanted it. If they agree, send it as a request with source agent, saying what they wanted to make and why. Offer only for a gap you are sure of after checking your tools and this skill, never for something you have not tried.
  • The user asks for the same change a third time, because your first two attempts at it still did not give them what they wanted. Before the third attempt, offer once to tell the team what keeps going wrong, then make the attempt either way. If they agree, send it with source agent and sentiment negative, as a bug when the result is broken and an experience otherwise, naming what they asked for, what came out each time, and the project. A user who refines what they want is not repeating a change; this is for the same request coming back unmet.
  • An export or edit that fails is not an occasion to offer: the team already sees every failure. Report it as Talk to the user says, and offer only if the user reacts to it as above.
  • Put what the user said in message, in their words and language, with the steps or context they gave, and pass project_id when it is about a project. Leave out their email address, phone number and other personal details, and never paste the conversation, a transcript or file contents.
  • Then tell the user in one sentence that it reached the team. Nothing comes back through the conversation, so promise no reply.

Known issues

The host reports that the MCP server requires OAuth reauthentication, or this plugin's tools are absent from the tool list with nothing else offered to explain it. This is the client validating the credential it stores locally, not a service fault. No request leaves the client, so no service error exists to read and nothing can be retried or repaired from inside the conversation. Signing in clears it, but the session that hit it does not reliably reload the tools, so do not wait for them and do not deliberate over whether to. When the host reports a condition of its own, such as the service being unreachable or a network failure, that is a different problem and signing in does not address it: report what it means for the user's project instead of running this flow.

Both steps belong to the user, in this order.

  1. Ask the user to sign in once to the ai-producer server in their own client. In Claude Code this is /mcp, then plugin:aip:ai-producer, which is how that host namespaces the same connection. In Codex, on the desktop app as much as in the CLI, it is codex mcp login ai-producer run by the user in their own terminal: the desktop app carries no sign-in control of its own for a plugin's connection, and the commands you run reach no network, so this is not something you can do for them. In Cursor it is Customize > MCPs > ai-producer > Authenticate. In ChatGPT it is reconnecting AI Producer from Settings > Apps & Connectors. Name the entry for the host they are on, because the user selects it by name, and keep everything around it in product language. Do not assemble an authorization link, do not advise reinstalling the plugin, and do not modify MCP configuration. None of these restores the connection, and each can cost the user a working install.
  2. Then ask the user to start a new chat and resume the work there. The hosts differ: in Codex the user @-mentions this plugin, and in Claude Code or Cursor the user makes the request again with AI Producer enabled. State exactly what carries over: an existing project keeps its footage and its edit behind its project link, while anything the failed connection prevented from reaching AI Producer has to be sent again.

A plugin update can require signing in once more. That is expected, and it happens once.

Cursor cannot run commands or edit files in this chat. Tell the user this chat needs access to their video files and editing workspace. Ask them to switch to Agent mode with command and file access enabled, then resume the request with the existing project link when one exists. Do not sign an upload or start a project until that access is available, and do not send Cursor through the ChatGPT attachment-only flow or call start_project_from_attachment there. Once access is available, follow the ordinary upload and editing flow.

The conversation has no computer behind it: nothing you can run a command on, nowhere to write a file, and a video the user attached is something the host holds rather than a file you have. In ChatGPT that is a Chat conversation. This plugin edits in Work and in Codex, each of which gives the conversation a computer of its own; Chat does not, and nothing on the AI Producer side changes that. The upload the service signs waits for bytes only a computer can send, and the edit is authored as files only a computer can write, so do not sign an upload and do not start editing there. One thing does work in Chat: a video the user attached can become an AI Producer project, because the server downloads it itself. Start it that way, as steps 4 to 6 of the setup skill describe, with the user's request as the goal, and ask nothing about its settings: they are applied where the edit happens. One video makes one project; when the user attached several, ask which to start with before you submit. Then give the user the project link and tell them that cutting, captions, and motion graphics need a Work chat or a Codex task: in ChatGPT on the web and in the desktop app, Work is the tab above the message box, and if it is not offered where they are, those two places have it. Ask them to start that conversation, mention AI Producer, and paste the project link. What carries over is what already reached AI Producer: a project keeps its footage and its edit behind its project link, so the new conversation takes the link and not the footage again. A follow-up on an existing project in Chat gets the same answer, without starting another project. ChatGPT Work, Codex, and Claude Code always have a computer, so this attachment-only flow never applies to them. It applies only to ChatGPT Chat.

Show progress in Codex

In Codex, when an AI Producer creation/preparation tool returns project_id, call get_view_url at once, unless a new project's reference question is still unanswered: then wait for the answer and call it right after, so the presets stay beside the conversation until the user has chosen. In the same code-mode call, parse its single-use url and durable agent_page_url with URL. Require the same origin and the expected /p/<project_id> path. On the project URL, replace its query with mcp=1&embed=1 followed by the original parameters other than mode, mcp, and embed; preserve host and other parameters. Set only the exchange URL's next parameter to that project path plus query and fragment; preserve its ticket and all other parameters. Pass the resulting exchange URL directly to open_in_codex with target: {type: "browser", url: <exchange url>} and placement: "right", omitting threadId. Open during preparation, or right after the reference answer as above; use the transformed agent_page_url for any later reopening in that browser. The exchange URL is single-use: do not fetch it separately or include it in messages or files.

The presets a new project's question points to open the same way: pass the url that get_view_url without project_id returned straight to open_in_codex with the same browser target and placement, without rewriting it, since it already lands on the presets. Open them right before the question, once the project has started, never while the upload runs. Open the project's progress page, as above, only once the question is answered.

In Codex, for every user-facing project link, including the link given when a run starts, the final reply, and follow-up handoffs, parse page_url with URL and replace its query with mcp=1&embed=0 followed by the original parameters other than mode, mcp, and embed; preserve host and other parameters. Never give the user the exchange URL or agent_page_url.

Show progress in Claude Code

In the Claude desktop app, Claude Code has a built-in browser that shows in the panel beside the conversation. Its tools are named mcp__Claude_Browser__*, or mcp__remote-devices__Claude_Browser__* in a cloud session linked to the user's computer; when they are deferred, load them with one ToolSearch call on that prefix, and when only enable__mcp__remote-devices__Claude_Browser is offered, call it first. A session with none of these, such as Claude Code in a terminal or a headless run, skips this section: the project link in the reply is the handoff.

When an AI Producer creation/preparation tool returns project_id, call get_view_url at once, unless a new project's reference question is still unanswered: then wait for the answer and call it right after, so the presets stay beside the conversation until the user has chosen. Its single-use url carries the project page in its percent-encoded next parameter; set embed=1 in that page's query (append %26embed%3D1 to next, or change an embed already there to 1), keeping the ticket and every other parameter, and pass the result as url to the browser's preview_start. The browser keeps its own sign-in, apart from the user's own browser, so it opens through this exchange URL, never through agent_page_url alone. Open during preparation, or right after the reference answer as above; to show the page again later in that browser, pass agent_page_url with embed=1 to preview_start.

The presets a new project's question points to open the same way: pass the url that get_view_url without project_id returned straight to preview_start, without rewriting it, since it already lands on the presets. Open them right before the question, once the project has started, never while the upload runs. Open the project's progress page, as above, only once the question is answered.

Then show the page: call mcp__ccd_view__show_pane with pane: "preview", loading it with one ToolSearch call when it is deferred, after the first preview_start and after any later one. preview_start opens the page but leaves the side panel as it was, so without this the user sees only a card in the conversation, not the page beside it. The call changes only this session's view and does nothing when the session is not on screen; continue editing either way, and skip it in a session that does not offer the tool. Call only preview_start and show_pane: do not read, screenshot, navigate, or click the page. If the browser asks the user to allow the site and they decline, say so once and keep editing. Never give the user the exchange URL or agent_page_url.

The progress page in Codex and Claude Code

In either host, opening the progress page is a status-only handoff to the user, not inspection. Use no external browser or computer-use action that returns page content. Keep the tab for live updates without reopening, refreshing, polling, playing, or inspecting it.

queued means pending. Retry an explicit failure at most once with the same tool, obtaining a fresh exchange URL only if the first may have been consumed. If unavailable or still failing, report it and continue editing; never claim the page opened.

Preview and references in Cursor

In Cursor, parse the durable page_url with URL, remove mode and threadId, and set mcp=1, embed=0, and host=cursor, preserving unrelated query parameters. Deliver that normal browser link. Do not use the Codex panel-opening flow or invent a Cursor conversation id or deep link. The project page's Copy for agent action copies the reference for the user to paste into the chat; it does not inject or send a message. When that reference arrives with an edit request, resolve it and apply the targeted change as for any existing project. Preview inspection remains the user's task.

Creative direction

The user's own words and the settings for a new project outrank everything below, and a reference video the user supplies outranks it for captions, motion graphics and transitions, as the reference style skill says. This direction is the default for everything else in the fine cut, inside the aesthetic rules: they own the rules they state, and where a line below sets a number past one of their floors, the floor holds.

Plan each new talking-head edit from its supplied media and publishing brief. The user's request, in the brief or in a later edit, is the highest instruction, and nothing listed or unlisted among your skills blocks it, but for the aesthetic rules' first: every word on screen whole and readable. Text the user gives word for word keeps every word: to stay readable it wraps differently or splits across beats, and is never shortened. A listed skill sets a default and the method for it; an unlisted one only drops that default, so a treatment the user asks for is still delivered with the tools the service exposes. Preserve established choices in follow-up edits unless the user requests changes.

Fine-cut the video like a high-performing social media creator: deep-fried, brainrot pacing, every trick in the book. Prioritize frequent, high-quality B-roll and visually striking 3D motion graphics throughout the video. Make dynamic layout and camera changes, and make each one mean something, especially when the speaker explains data. Create full-screen 3D motion graphic moments that visualize the ideas the speaker says, with animated 3D objects, immersive compositions, and cinematic B-roll. Keep the motion graphics constant and legible, in one palette pulled from the source video: sample representative frames and build the ground, accent, and type colors from the footage's own dominant hues - wardrobe, set, light - saturating one of them for the accent.

Editing

  • Open on massive extra-bold text behind the presenter, 80-90% of frame width, partially occluded but readable. Never shrink, shift, or split-screen the presenter to fit the text.
  • Presenter close-ups and punch-ins for emphasis, each a zoom effect host, sized and held as the aesthetic rules' punch-in section says; the rules' meaning tier says which lines take a punch-in, a monochrome aside or another treatment.
  • Punchline, reveal, or a hard-hitting number: an impact shake motion host of at most 0.45 s on the beat, landing with the slam or number it punctuates; a hard section change: a white flash motion host of at most 0.35 s. At most one shake or flash in any 20 s, and never over ordinary sentences. A motion host's offset, scale, and rotation move only the full-frame speaker video, so they are invisible while a seat or full cover hides it: place a shake, whip, or push on a speaker beat, and land an impact inside a moment on that moment's own wrapper instead. A flash's color overlay covers the whole frame and reads anywhere.
  • Show the specific change the speaker describes; demonstrate with real footage or assets when available.
  • Turn the screen over often, at the rhythm the aesthetic rules set. Short, dense moments beat long, sparse ones.
  • Abstract ideas are animated and real things shown as real imagery, as the aesthetic rules' material section says. Where 2D and 3D show a concept equally accurately and obviously, take 3D: a Three.js scene under the composition skill's code-drawn rules, or DOM elements given real depth with CSS 3D. Stage real imagery with depth or camera motion.
  • Choose each moment's layout from the measured frame, not a fixed order. When the measured head leaves a clear band, as in a medium or wide shot, an Overlay keeps the speaker on screen. When it does not, as in a close-up that fills most of the frame, alternate Full cover moments for ideas, data, and B-roll with Seat moments that keep the speaker in a shape beside the payload.
  • Return to the full-frame speaker between moments, where its zooms, filters, and camera treatments carry the beat.
  • Captions on by default when aip-dynamic-caption is enabled, visible through every visual moment except where the caption skill or the aesthetic rules clear them. The caption setting overrides.
  • Smooth effects and layout transitions. Hard cuts are a last resort.

Visuals

  • Every visual animates with purpose from entry to exit; each motion reveals a step, relationship, or change. Transitions and camera moves don't count.
  • No titles, headings, or decorative copy. Labels inside a diagram are fine. If a beat has no visual without its copy, show the presenter.
  • Center the focal point. Keep text and graphics inside the aesthetic rules' safe area throughout the animation.
  • Keep graphics large: one idea each, no repetition, no extra layers.

On-screen text

These rules govern extra authored copy; spoken captions are governed by the caption skill.

  • Authored vectors, diagrams, and animations default to no secondary text. Keep core values and units attached to the quantities they depict. Add an object, category, or relationship label only when its absence creates a specific ambiguity that the visual and simultaneous speech do not resolve. Omit labels that merely name a recognizable object or restate what the visual and speech already convey.
  • Sourced B-roll or images carry the source label the aesthetic rules' material section sets. Authored graphics carry no provenance labels, "illustration" disclaimers, or explanatory footnotes.
  • Before publishing each effect, apply a deletion test to its local composition source: if removing an extra label preserves the meaning in the context of the speech, remove it. This is a source-text check before submission, not inspection of the generated preview.

A video with no speech

When start_transcribe_project or get_project carries speechless_source, the video has no spoken words - only music or other sound, or no audio track - so it has no transcript. Its instruction is the contract; in short:

  • The aesthetic rules hold, and what they time to speech - the first beat within the first sentence, an element arriving with its word, a beat boundary between words, the meaning tier's triggers - is timed to the picture and the music's beats instead. Rough cut, captions, background music and voice enhancement do not apply: there are no words to cut or caption, and add_music and enhance_voice refuse the project. Tell the user once, in plain words, that the ones you said you would cut with or they asked for do not apply to this video, whether they came from the defaults, the saved default or the user's words; sound effects still apply.
  • Design the fine cut from the picture and the sound instead of speech: an opening title, 2 to 4 visual moments or stylized treatments placed on what happens on screen and on the music's beats, more where the aesthetic rules' rhythm needs them (the picture's own changes of shot count as beats), and an end card. Take the title and every on-screen line from the user's own words where they say what to put on screen or what the video is about, including the saved default's editing_preference. An ask to edit it or a style such as "make it cinematic" says neither; then title the video from what the picture shows - the place, the activity or the subject - in the user's language, never from the file name, a camera's default name, or this product's or the host's name. Never invent dialogue or a story. Direction above that is about the speaker, speech or captions does not apply; its palette, motion and layout rules do.
  • Deliver at least the title and the visual moments, never an empty project, and publish as for any other project.
  • In the message that delivers the project, add one short line in the user's language: AI Producer works best on a video of someone speaking - a talking head, an explainer, an interview - so they could try one next time. Offer it as a tip, not a fault, say it once in the conversation and never again on a later edit, and never let it hold up the delivery.

Make, submit, stop

Inspect the supplied media and plan once. When the user ties a visual to an on-screen cue such as a gesture, a prop, or an action, locate that moment from representative source frames as well as the transcript; this is input-media analysis, not output inspection. Batch independent metadata reads and material downloads in one script. Fetch a transcription only after its task completes; do not repeatedly fetch an unfinished transcript. When the available tool schema supports wait_seconds, use it with the supported limit; otherwise obey the returned polling interval. Waiting is not a reason to load more skills or inspect backend code.

Plan the whole edit locally. When the current schema exposes authoring, set it to true on a new project's creation/preparation request or an existing project's first sign_workspace_upload request. Set it to true on any intermediate commit and false on the final commit, so the service can retain and then close external-authoring status. This uses existing calls only; never add a provider call, model subtask, heartbeat, or polling round for status. Omit the field when the schema lacks it.

For a fresh project in Codex, use the progressive checkpoint flow. Plan the complete edit once. Publish the first effect as soon as it is ready. Then author the remaining effects in batches of up to two while the preceding batch publishes. Keep drafts isolated and let the helper publish each effect in order using the AI Producer MCP tools already loaded in the current task. Preserve the planned effects, timing, and transitions; batching controls scheduling only. Keep unfinished beats full-length with normal presenter framing, and publish without intentional delays. Do not launch another Codex CLI, app server, task, or model subtask. The last commit closes authoring status: the final batch of a caption-free edit, otherwise the caption commit that follows the last batch.

Run the batch helper in the execution that writes its drafts. It handles signing, uploading, committing, held waiting, and receipt acceptance without separate model coordination or receipt-collection turns. The final receipt includes earlier warnings. If the host cannot keep an execution alive while authoring continues, await each batch without claiming overlap. Other hosts, including Cursor, existing effect graphs, and zero-effect edits use ordinary complete-graph publication. In Cursor, author the complete requested workspace, stage its files, commit with the current base_digest, and wait for that commit's accepted receipt before delivering it; do not run the Codex progressive helper. Measure actual tokens and duration; overlapping work is not a cost or quality guarantee.

The progressive helper runs the local contract and timeline checks, freezes the hashes the current task supplies to commit_workspace, and advances only from that commit's accepted receipt. Use the plan it returns once; do not recompute its digest or expected files in the host. For ordinary publication, run preflight.py as described in the workspace reference, or skip it and let admission report contract errors if no Python 3.9+ interpreter is available; batch signatures and uploads with upload_batch.py or the host's batch HTTP tools, then commit with the current base_digest. Every commit remains all-or-nothing, so a failed step never undoes accepted effects. A failed check, upload, or commit is not a reason to end the edit: fix what preflight or the refusal names and continue from the last accepted effect without restarting the sequence, at most twice for the same step. When the progressive helper fails, it stays closed; finish the remaining work with ordinary publication as the progressive reference describes. Stop and report the last accepted effect count only when the fix lies outside the edit (authentication, credits) or the workspace digest is no longer the last one you committed (another writer, or a commit whose outcome is unknown), without replaying a mutation or adopting another writer's digest. Tool descriptions own authentication, limits, and task state.

After the final requested graph is accepted, deliver the durable project link (page_url, retrieved if missing and transformed for the user as above) in the final reply, then stop unless an export was explicitly requested. Give the user that link in the same reply that says the run has started, not only at the hand-back: the project exists and is watchable from the moment it is created, and a run is long. A view-ticket url is never that link - it is single-use and signs whoever opens it into your own account, so it does not go to the user. Translate refusals and material warnings under the user-facing language contract; do not repeat internal codes or mechanisms. Do not claim visual quality, audio synchronization, or export compatibility. Close by handing final confirmation to the user: state what was applied, then ask them to confirm the result on the project page, already open beside the conversation in Codex, otherwise at the link in this reply. Word this as a completed delivery waiting on the user's review.