What changed
Every released change to the agent surface, with the exact old and new wording shown as a diff.
One entry per released version, newest first. Green lines are new, red lines are what they replaced. Additions never break a connected agent: MCP clients re-read the tool list every session, so new tools, parameters, and enum values simply appear. Anything that could break an existing integration is labeled breaking and only ships with a new major version.
The current version is always reported by get_me as apiVersion.
v8.2.0
2026-10-12Some video prices went up to match provider list prices. Seedance 2.0 at 1080p now costs 4 credits per second, and Seedance 2.5 at 1080p costs 6. Wan 3 Prime at 1080p costs 3. MiniMax H3 video-guided input at 2K costs 2 credits per reference second. Every mode in `list_reaction_video_modes` now has its own `maxCreditsPerClip`, based on that mode's highest possible charge, so longer 1080p clips fit. The top-level `maxCreditsPerClip` is the lowest of them.
- Refuse to start any clip that would cost more than this many credits. Clone modes use the source clip length and the selected model/resolution rate. A per-clip ceiling of MAX_REACTION_VIDEO_CREDITS always applies; this only tightens it.Refuse to start any clip that would cost more than this many credits. Clone modes use the source clip length and the selected model/resolution rate. The mode’s maxCreditsPerClip (from list_reaction_video_modes) always applies; this only tightens it.
v8.1.0
2026-10-06Nano Banana 2.1 is available for avatar, UGC frame, and slideshow image requests. Use `nano_banana_2_1` for avatar and UGC requests, or `nano-banana-2.1` for slideshow requests. It uses medium thinking and costs 1 credit for standard output or 1.5 credits for high resolution. The default model is unchanged.
v8.0.2
2026-10-05Template imports no longer wait for video understanding. `import_reaction_template` reaches `succeeded` as soon as the source media is ready, and `videoUnderstanding` fills in afterwards. Inspiration imports now run in the background like links and uploads, keep the clip's saved analysis, and skip re-encoding videos that are already in the right format. `generate_reaction_frames` with an `inspirationId` starts from the clip's first frame without waiting for the video to import.
- Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded means the complete source and canonical videoUnderstanding are ready to use, including sources longer than 30 seconds. Sources over 120 seconds are rejected. Costs no credits. New social/upload imports remain processing until understanding completes; inspiration imports reuse its saved result. Read get_reaction_template for status, description, contentStructure, demoType, sections, generationPrompt, and optional transcript/editing fields. Crop only when the chosen workflow needs a shorter reference. For cloning, load ghostfeed-ugc-reactions and establish which part the user wants before generation. Importing does not authorize paid generation. Deleting templates stays in the dashboard.Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded means the complete source media is ready to use, including sources longer than 30 seconds. Sources over 120 seconds are rejected. Costs no credits. videoUnderstanding is filled in afterwards in the background (inspiration imports reuse the saved result immediately); check its status on get_reaction_template when you need it. Read get_reaction_template for status, description, contentStructure, demoType, sections, generationPrompt, and optional transcript/editing fields. Crop only when the chosen workflow needs a shorter reference. For cloning, load ghostfeed-ugc-reactions and establish which part the user wants before generation. Importing does not authorize paid generation. Deleting templates stays in the dashboard.
v8.0.1
2026-09-28Prompt video requests that omit a model now use MiniMax H3 Max through fal.ai. It uses 768p and five seconds by default. Select a Seedance mode explicitly to keep using it. The dashboard also starts with MiniMax H3 Max and warns that Seedance may not work with images of real people.
- A prompt-directed mode from list_reaction_video_modes. H3 and H3 Max belong here. Defaults to seedance_2_0_fast.A prompt-directed mode from list_reaction_video_modes. H3 and H3 Max belong here. Defaults to minimax_h3_max.
v8.0.0
2026-09-24Wan 3 and MiniMax H3 Smart Motion now derive output duration from the measured guidance source in dashboard, MCP, and REST. The dashboard no longer submits its hidden duration default. Reference-guided generation no longer exposes a duration input: the backend takes it from the measured source. Legacy motion-control requests with an explicit duration are rejected before billing. MiniMax H3 uses its four-second minimum when the source is shorter. Already admitted generations keep their saved command and remain runnable.
- generate_reaction_video is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use generate_video_from_prompt for first-frame-guided written action, including H3 and H3 Max. A source template uses its canonical generationPrompt when present and legacy motion analysis otherwise. Use generate_video_from_reference for every audio-guided, video-guided, or motion-control request. Poll get_generation. Legacy behavior: PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.generate_reaction_video is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use generate_video_from_prompt for first-frame-guided written action, including H3 and H3 Max. A source template uses its canonical generationPrompt when present and legacy motion analysis otherwise. Use generate_video_from_reference for every audio-guided, video-guided, or motion-control request. Poll get_generation. Legacy behavior: PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId, and sourceTemplateId must match every frame lineage. Omit durationSeconds for guided and motion-control calls; the backend derives output duration from the measured source. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
- Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. For Wan 3, set durationSeconds explicitly (2–30 whole seconds); when cloning a crop, match its intended length because omission defaults to five seconds regardless of source length. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. Every accepted mode takes output duration from the measured source in the backend; this tool has no duration input. H3 has a four-second minimum; Wan 3 has a two-second minimum. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
v7.1.0
2026-09-24Blank slideshow creation accepts optional `aspectRatio` through MCP and REST: `3:4` (1080x1440), `1:1` (1080x1080), or `9:16` (1080x1920). Omitting it preserves the 9:16 default. Slides and text use the selected canvas from creation, so agents can build photo posts without resizing the deck afterward.
- Create an empty slideshow with N blank slides, then build it slide by slide with set_slide_background and set_slide_texts. This is how an agent creates a deck: YOU do the creative work. The empty deck is free; the deck costs 1 credit, charged on your first set_slide_background or set_slide_texts (same price as a dashboard-made deck). Later edits are free.Create an empty slideshow with N blank slides, then build it slide by slide with set_slide_background and set_slide_texts. Set aspectRatio to 3:4, 1:1 (square), or 9:16 as requested; omitted defaults to 9:16. This is how an agent creates a deck: YOU do the creative work. The empty deck is free; the deck costs 1 credit, charged on your first set_slide_background or set_slide_texts (same price as a dashboard-made deck). Later edits are free.
v7.0.1
2026-09-23Clarify that Wan 3 Video Guided clones require an explicit whole-second output duration for each cropped source segment. Without it, generation uses the model's five-second default even when the source crop is longer.
- Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free: poll the returned reaction_crop generation. On success output.id is the new template id. Use when the user supplies or approves exact start/end times and a shorter or cleaner reference is useful. The source remains usable.Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free to the user: poll the returned reaction_crop generation; on success output.id is the new template id. Crop-specific video understanding may still be processing, so read the new template before using its descriptions or prompt. Use when the user supplies or approves exact start/end times and a shorter or cleaner reference is useful. For a full clone longer than a model's reference limit, choose natural boundaries and crop adjacent ranges from the original source; each call creates one crop, not a stitched video. The source remains usable.
- Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. For Wan 3, set durationSeconds explicitly (2–30 whole seconds); when cloning a crop, match its intended length because omission defaults to five seconds regardless of source length. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
v7.0.0
2026-09-23UGC creation through MCP and REST now uses the shared dashboard image and video generation architecture. Agents can manage Brands and Products, inspect saved video understanding, choose source sections, create images and videos, and inspect or reuse generation settings. Wan 3 Video Guided keeps its inspectable system prompt without adding a custom action by default; prompt-directed video generation uses the caller-written prompt. MCP Apps provide contextual actions without starting paid work. Legacy generation tools remain available until October 15, 2026.
- BREAKING
smart_crop_reaction_templatetool removed - Add up to 20 uploaded Product images directly to a Brand. Accepts only upload keys from request_product_image_upload for this user, workspace, and Brand. Repeat the identical ordered input on retries; naming runs in the background without user credit charges.
- Read or prepare video analysis for an accessible template or uploaded VIDEO. Use understanding for saved structure, sections, and the provider-authored generationPrompt. For template standard/audio_guided/video_guided profiles, the saved canonical generationPrompt is reused without another provider request; older templates and direct media use durable legacy action analysis. Guided profiles return reference system guidance and action text in separate fields. They remain available for compatible saved MiniMax H3 workflows but are not recommended for new work; prefer Wan 3 reference guidance. Audio-only media cannot provide visual action analysis; use it directly for audio-guided generation.
- Recreate a Template or image composition with one Avatar and an optional Product image. Automatically uses the Avatar clone default or the Product-aware default, which inserts the supplied Product even if the source has none. Defaults are inspectable and replaceable via systemPrompt. Use get_source_frame to choose a precise source-video frame. Creates one image; it does not generate a video. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- Validate and save uploaded original media. Returns mediaId for generation references. Retrying the same upload is safe.
- Create a Brand from a website URL or a name and description. Website enrichment and Product image harvesting run asynchronously; poll get_brand for status.
- Create a new image by applying a requested change to one existing image or completed image upload. The default preserves unrequested content; replace it with systemPrompt when needed. The original image is preserved. Returns a generation ID to poll with get_generation. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- Create one image from a written instruction with optional Avatar, Product image, or multiple image references. Text-only creation is supported. Use clone_image for recreating a composition with an Avatar, or edit_image for a specific change. Uses shared dashboard models and durable jobs; use a stable idempotencyKey for retries. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- Create one first-frame-guided video from the prompt you write. When recreating a source, read its saved videoUnderstanding and write the requested performance yourself; this tool never inserts source text automatically. Use this for H3, H3 Max, and other prompt-directed models. Use generate_video_from_reference for every audio-guided or video-guided request. Ghostfeed does not add hidden guided text. Use a stable idempotencyKey for retries. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- Create one video controlled by reference motion or audio. Default recommendation for direct cloning: Wan 3 Smart Motion, mode wan_3 with guidance video_guided; it uses the inspectable wan3-video-guided system template and needs no custom action prompt or source analysis by default. Supply actionPrompt only for an explicit change. systemPrompt replaces the default exactly; null removes it. Use Wan 3 audio_guided for audio-led performance. Respect explicit model choices and check catalog limits/pricing. Kling 2.6 Motion Control and Kling 3 Motion Control remain alternatives when explicitly selected. MiniMax H3 guided inputs remain accepted for compatibility but are not recommended for new work. One output; stable idempotencyKey prevents duplicate charges. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- Read full Brand details, website enrichment status, and image-harvest status.
- Inspect the actual saved system, user, and compiled provider prompts of a public generation. Returns unavailable fields honestly for older records; never substitutes today’s defaults. Use get_prompt_template only when you want the current default.
- Read saved nonbilling generation settings, ordered references and prompts for reuse or debugging. Exact saved snapshots are distinguished from incomplete legacy history. Reuse reauthorizes assets and requires a new idempotency key for new work; this read does not generate anything.
- Read one accessible generated/source frame or completed image upload, including saved prompt provenance and lineage when available. Choose source upload for a mediaId. Use get_generation_prompt for an in-flight generation’s prompt.
- Read one versioned image default or guided-video system template. Image defaults and Wan 3 Video Guided select their matching templates automatically; other guided templates require an explicit systemPrompt. Inspect a submitted generation with get_generation_prompt.
- Read one public workflow skill by name. Returns the canonical instructions and content digest. Follow the user’s goal and use the described tools; this call does not start generation or change shared settings.
- Extract and save a frame at a timestamp from an accessible source template or uploaded video. Use it to inspect sections or choose the exact image to recreate.
- List Brands and their website enrichment and image-harvest status. Use list_product_images for their directly owned Product images.
- List directly owned Product images for a Brand, including editable names, naming status, and capacity. Images with deletionPending are unavailable for generation.
- Discover Ghostfeed’s public workflow skills. Read the relevant skill before composing a multi-step avatar, UGC image/video, or slideshow workflow. No separate skill installation is required to read these instructions.
- Permanently remove a Product image from its Brand, including exclusively owned stored media. Only call when the user requests removal.
- Change the editable name of a directly owned Product image.
- Request an upload URL for original image, video, or audio bytes. PUT the bytes to the URL, then complete_media_upload. No generation is started.
- Request a Brand-bound upload URL for one JPEG, PNG, or WebP image of at most 10 MB. Upload its bytes then call add_product_images.
- Update Brand details. An empty URL clears it. Updating the URL does not automatically re-run website enrichment or image harvesting.
- Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free: poll the returned reaction_crop generation. On success output.id is the new template id. Use when the user supplies or approves exact start/end times; this creates a derivative and archives the source only when the source was blocked in needs_crop.Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free: poll the returned reaction_crop generation. On success output.id is the new template id. Use when the user supplies or approves exact start/end times and a shorter or cleaner reference is useful. The source remains usable.
- Edit one existing reaction frame with a text prompt. Use frameId from list_reaction_frames. This creates a new frame and preserves the source frame plus its lineage. It charges the selected image-model and resolution cost once. The returned reaction_frame generation is normally succeeded; a concurrent idempotent replay can return the same queued generation and must be polled. On success, output.url is the edited image and output.id is the new frameId. Show the edit to the user and get approval before generate_reaction_video.edit_reaction_frame is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Call edit_image with image:{kind:"frame",frameId} and instruction. Poll the returned generation with get_generation. Legacy behavior: Edit one existing reaction frame with a text prompt. Use frameId from list_reaction_frames. This creates a new frame and preserves the source frame plus its lineage. It charges the selected image-model and resolution cost once. The returned reaction_frame generation is normally succeeded; a concurrent idempotent replay can return the same queued generation and must be polled. On success, output.url is the edited image and output.id is the new frameId. Show the edit to the user and get approval before generate_reaction_video.
- PHASE 1 of a UGC reaction: create ONE first frame per avatar. With a source, render the avatar into the source pose. Without a source, supply a non-empty stylingPrompt to create the frame directly from the avatar. Source is at most one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. For a source-based request, search list_reaction_templates first, then list_inspiration_reactions if the user did not supply an exact source. imageOutputResolution defaults to standard. Source-based work is async and must be polled. Prompt-only work normally returns succeeded reaction_frame generations; a concurrent idempotent replay can return the same queued generation and must be polled. In both flows, the finished frame is output.url and output.id is the frameId. For async generations, immediately call render_image_results with one generating frame item per generation: set generationId to the returned generation id and keep the shared prompt, image model, and requested aspect ratio. The widget polls the read-only result itself. The selected image model and resolution charge applies per avatar. Show all frames and get approval before generate_reaction_video.generate_reaction_frames is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use clone_image to recreate a source composition with an Avatar and optional Product image. Use generate_image for prompt-led creation. Each call creates one image; poll get_generation. Legacy behavior: PHASE 1 of a UGC reaction: create ONE first frame per avatar. With a source, render the avatar into the source pose. Without a source, supply a non-empty stylingPrompt to create the frame directly from the avatar. Source is at most one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. For a source-based request, search list_reaction_templates first, then list_inspiration_reactions if the user did not supply an exact source. imageOutputResolution defaults to standard. Source-based work is async and must be polled. Prompt-only work normally returns succeeded reaction_frame generations; a concurrent idempotent replay can return the same queued generation and must be polled. In both flows, the finished frame is output.url and output.id is the frameId. For async generations, immediately call render_image_results with one generating frame item per generation: set generationId to the returned generation id and keep the shared prompt, image model, and requested aspect ratio. The widget polls the read-only result itself. The selected image model and resolution charge applies per avatar. Show all frames and get approval before generate_reaction_video.
- Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds. Their returned prompt visibly includes a Mandatory reference guidance section followed by Action guidance. Show the complete returned prompt, H3 plan, settings, warning, and estimated credits to the user. Tell the user not to change Mandatory reference guidance and to make only small changes inside Action guidance. Every profile still uses the selected first frame during video generation.generate_reaction_prompt is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Read the template videoUnderstanding generationPrompt for new imports. Use analyze_video standard only when an older source has no canonical prompt; source-directed generation performs that fallback automatically. Guided generation receives no hidden MCP system text. Legacy behavior: Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds. Their returned prompt visibly includes a Mandatory reference guidance section followed by Action guidance. Show the complete returned prompt, H3 plan, settings, warning, and estimated credits to the user. Tell the user not to change Mandatory reference guidance and to make only small changes inside Action guidance. Every profile still uses the selected first frame during video generation.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.generate_reaction_video is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use generate_video_from_prompt for first-frame-guided written action, including H3 and H3 Max. A source template uses its canonical generationPrompt when present and legacy motion analysis otherwise. Use generate_video_from_reference for every audio-guided, video-guided, or motion-control request. Poll get_generation. Legacy behavior: PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
- Read one source template by its templateId (or a generated video’s sourceReactionId). New uploads and social imports become ready only after canonical videoUnderstanding is complete. The saved understanding supplies firstFrameScene, factual sections, and a provider-authored generationPrompt that must remain visible and editable before generation. Legacy opensOn and motionAnalysis fields can still be present for older templates. Use this read after list_reaction_videos to resolve each unique source once.Read one source template by its templateId (or a generated video’s sourceReactionId). Returns source media, import metadata, full opening-composition and legacy motion analysis when available, plus the canonical saved videoUnderstanding result. New uploads and social imports finish understanding before becoming ready; saved inspiration imports reuse its analysis. New crops are exact assets with their own understanding. Completed v8 understanding includes a provider-authored generationPrompt for generation as well as factual source evidence. Reading does not start a new analysis. Use analyze_video understanding only when the saved result is missing or failed and the user wants a retry.
- Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. When sourceReactionId is present, get_reaction_template reads source media and stored analysis. When generationId is known, prefer get_generation_prompt and get_generation_setup for exact saved instructions and reusable settings. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded = ready to use; needs_action = the source is 30-120s and must be cropped in the dashboard first (open dashboardUrl); >120s is rejected. Costs no credits. Managing, cropping, and deleting templates all happen in the dashboard.Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded means the complete source and canonical videoUnderstanding are ready to use, including sources longer than 30 seconds. Sources over 120 seconds are rejected. Costs no credits. New social/upload imports remain processing until understanding completes; inspiration imports reuse its saved result. Read get_reaction_template for status, description, contentStructure, demoType, sections, generationPrompt, and optional transcript/editing fields. Crop only when the chosen workflow needs a shorter reference. For cloning, load ghostfeed-ugc-reactions and establish which part the user wants before generation. Importing does not authorize paid generation. Deleting templates stays in the dashboard.
- List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot. New image/video tools accept avatarId for the base avatar identity, not a photo id. To use a specific saved photo, upload its bytes through request_media_upload and complete_media_upload, then use the returned mediaId as an upload reference. Reusing them is free; use set_slide_background type 'avatar' to cast one. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- Discover image models, quality/resolution choices, per-image prices, reference capabilities, and saved-model aliases for avatar, frame, and slideshow generation.Discover model IDs for generate_image, clone_image, edit_image, and create_avatar, including text-only/reference capabilities, quality/resolution choices, prices, and saved-model aliases. Slideshow model metadata is also included.
- SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Analyzed clips carry firstFrameScene and a provider-authored generationPrompt inside videoUnderstanding; older clips may expose legacy opensOn and motion fields. render_inspiration_browser (workspace plus optional category) loads 12 real library items per page and changes pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on firstFrameScene. A prompt-mode video may reuse the opening pose without copying the source motion. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.Browse the curated inspiration library when the user needs a source composition or motion reference. Captioned clips include opensOn and motion. render_inspiration_browser loads 12 library items per page and changes pages without another model turn; selecting a clip asks what to create and does not start paid work. Pass the inspiration id to import_reaction_template, wait for readiness, then use the returned templateId with clone_image, analyze_video, or either video generation intent. Source browsing is optional for custom generation and user-supplied references. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). To plug a product, weave it into ONE slide in a soft peer-recommendation voice: browse a linked collection with list_collection_images and cast a real product image on that slide with set_slide_background. Call this BEFORE building a deck that should plug a product.list_products is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Use list_brands to choose a Brand, then list_product_images with its brandId for directly owned Product images. The existing linkedCollections response remains available during migration. Legacy behavior: List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). To plug a product, weave it into ONE slide in a soft peer-recommendation voice: browse a linked collection with list_collection_images and cast a real product image on that slide with set_slide_background. Call this BEFORE building a deck that should plug a product.
- List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.List reusable image frames on the workspace board, newest first, including dashboard results. Filter by avatar or template when relevant. Each row carries its image, lineage, generation metadata, preferenceStatus, videoStage, and animationStatus. A completed frame remains reusable. Pass an image reference {kind: frame, frameId} to generate_video_from_prompt or generate_video_from_reference, or use edit_image to change it. Follow the user’s review preferences when choosing an existing take. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- FIRST source search for every new reaction request unless the user explicitly supplied an exact source. List reaction TEMPLATES usable in this workspace: platform stock plus your own imported/uploaded motion clips. Each has an id, name, category, duration, thumbnail, and status. Analyzed clips also carry firstFrameScene (the opening still your avatar gets rendered into) and a provider-authored generationPrompt inside videoUnderstanding; older clips may expose legacy opensOn and motion fields. Choose primarily on firstFrameScene. A prompt-mode video may reuse the opening pose without copying the source motion. If no template has a reasonable opening-pose match, search list_inspiration_reactions next.Browse source templates when the request needs an existing composition or motion reference: platform stock plus workspace imports/uploads. Custom image and prompt-directed video creation do not require a template search. Analyzed clips carry firstFrameScene and videoUnderstanding; older clips may expose opensOn and motion summaries. Use clone_image to recreate a composition. For generate_video_from_prompt, read source understanding and write the prompt yourself. Use generate_video_from_reference for media-guided motion. analyze_video gets or creates source analysis when needed.
- List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and includes its audio when present. Read these fields before creating an H3 prompt or video.List video modes for generate_video_from_prompt and generate_video_from_reference, with supported intent tools, reference capabilities, costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and includes its audio when present. Read these fields before creating an H3 prompt or video.
- List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. When sourceReactionId is present, get_reaction_template reads source media and stored analysis. get_reaction_video reads one render record; when generationId is known, get_generation_prompt and get_generation_setup provide exact saved instructions and reusable settings. Managing and deleting videos stays in the dashboard. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- Redo a frame the user was not happy with. Identify it with EITHER frameId (any frame from list_reaction_frames, including ones a person made in the dashboard) OR generationId (a frame this API started); pass exactly one. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.regenerate_reaction_frame is deprecated and scheduled to stop working on 2026-10-15. Migrate to the replacement tools. This compatibility release continues serving the existing call. Read get_generation_setup for saved generation inputs, or get_image for frame lineage. Start clone_image or generate_image with the intended settings and a new idempotencyKey. Reuse a key only to retry the same request. Legacy behavior: Redo a frame the user was not happy with. Identify it with EITHER frameId (any frame from list_reaction_frames, including ones a person made in the dashboard) OR generationId (a frame this API started); pass exactly one. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
v6.4.1
2026-09-22Template imports now finish only after their saved video understanding is ready. Prompt generation reuses that canonical result, so agents submit the exact editable prompt without triggering another source-video analysis. Wan 3 guided requests use versioned default guidance when the caller omits an instruction.
- Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, the full opensOn still description, and the full stored motion analysis. New uploads and social imports request craft and motion analysis in the background. Saved inspiration imports reuse available metadata; crops do not automatically request analysis. opensOn and motionAnalysis can be absent. videoUnderstanding is a separate factual result, not a generation prompt. list_reaction_templates only carries a one-line teaser of it. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.Read one source template by its templateId (or a generated video’s sourceReactionId). New uploads and social imports become ready only after canonical videoUnderstanding is complete. The saved understanding supplies firstFrameScene, factual sections, and a provider-authored generationPrompt that must remain visible and editable before generation. Legacy opensOn and motionAnalysis fields can still be present for older templates. Use this read after list_reaction_videos to resolve each unique source once.
- SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). render_inspiration_browser (workspace plus optional category) loads 12 real library items per page and changes pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Analyzed clips carry firstFrameScene and a provider-authored generationPrompt inside videoUnderstanding; older clips may expose legacy opensOn and motion fields. render_inspiration_browser (workspace plus optional category) loads 12 real library items per page and changes pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on firstFrameScene. A prompt-mode video may reuse the opening pose without copying the source motion. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- FIRST source search for every new reaction request unless the user explicitly supplied an exact source. List reaction TEMPLATES usable in this workspace: platform stock plus your own imported/uploaded motion clips. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. If no template has a reasonable opening-pose match, search list_inspiration_reactions next.FIRST source search for every new reaction request unless the user explicitly supplied an exact source. List reaction TEMPLATES usable in this workspace: platform stock plus your own imported/uploaded motion clips. Each has an id, name, category, duration, thumbnail, and status. Analyzed clips also carry firstFrameScene (the opening still your avatar gets rendered into) and a provider-authored generationPrompt inside videoUnderstanding; older clips may expose legacy opensOn and motion fields. Choose primarily on firstFrameScene. A prompt-mode video may reuse the opening pose without copying the source motion. If no template has a reasonable opening-pose match, search list_inspiration_reactions next.
v6.4.0
2026-09-21Inspiration and template reads add optional saved `videoUnderstanding`. New inspiration imports reuse saved results, and crop sections use crop-relative times with whole-source labels kept as source context. Old templates are not backfilled. Complete long imports no longer require a crop to become usable. Model capabilities expose the supported Kling and H3 reference-duration limits.
- Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, the full opensOn still description, and the full stored motion analysis. Every clip is analysed automatically on import, so this free read is normally where the complete motionAnalysis.prompt already is. list_reaction_templates only carries a one-line teaser of it. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, the full opensOn still description, and the full stored motion analysis. New uploads and social imports request craft and motion analysis in the background. Saved inspiration imports reuse available metadata; crops do not automatically request analysis. opensOn and motionAnalysis can be absent. videoUnderstanding is a separate factual result, not a generation prompt. list_reaction_templates only carries a one-line teaser of it. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
- Include templates that cannot be generated from yet: ones still importing, ones that failed, and ones over 30s awaiting a crop. Off by default, because generating from them is refused anyway.Include templates that cannot be generated from yet: ones still importing, ones that failed. Off by default, because generating from them is refused anyway.
v6.3.0
2026-09-18Video generation now exposes Wan 3 as one model family with first-frame, audio-guided, and video-guided reference modes. The optional `modeInput` object selects `{ guidance, prime }`; Prime uses the higher resolution-specific credit rates and the corresponding fal.ai endpoint. Wan 3 accepts explicit 2–30 second outputs, and the public mode catalog reports its reference and Prime pricing contract.
v6.2.0
2026-09-12Image model discovery now includes quality and resolution choices, their per-image credit prices, reference capabilities, display labels, generation-time estimates, and saved-model aliases. Existing `list_image_models` fields and model IDs are unchanged; slideshow discovery also identifies its compatible model IDs and reference support. REST and MCP return the same backend-owned catalog.
- List the image models create_avatar can use, with per-image credit cost, so you can offer the user options with prices.Discover image models, quality/resolution choices, per-image prices, reference capabilities, and saved-model aliases for avatar, frame, and slideshow generation.
v6.1.0
2026-09-09- Add GPT Image 2.5 Flare and Sunburst, Seedance 2.5, and MiniMax H3 Max to the applicable model catalogs. - Add optional `imageQuality` to image generation and edit requests. Saved frames return the selected quality. Existing GPT Image 2 IDs retain their quality. - Add 480p to the video resolution input. Each model retains its own supported resolution set. - Preserve existing model IDs and saved generation reuse.
- ADDED
generate_reaction_framesenum values added to imageModel: gpt_flare, gpt_sunburstUGC Reactions →
v6.0.1
2026-09-10Standard MCP tools return text JSON with all existing media URLs. Optional resource-link blocks remain on explicit MCP Apps render tools, so clients that cannot read those blocks can still use the generation and source-read tools. Video generation accepts copied frame mentions and returns a recovery step when a frame is missing or inaccessible. Tool error references now link to the connection history, including failures returned with HTTP 200.
v6.0.0
2026-08-24Slideshow text composition now has a four-element ceiling per slide, replacing the previous five-element limit. Agents should combine or redistribute copy that would require a fifth text box. The Director remains free to choose the best mix of headings and supporting text within that ceiling and the existing safe-area fit rules.
- Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Infer copy density from the user's full brief and this slide's narrative job: headings are usually 3-8 words and body copy 8-20 words, but conversational brevity/detail guidance and explicit word or line limits win. The server rejects copy beyond heading 2, subheading 3, body 4, or CTA 2 rendered lines, or outside the safe area; it never truncates. Rewrite or redistribute and retry after a fit error. Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.Replace one slide's text boxes (1-4 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Infer copy density from the user's full brief, the slide's narrative job, and the slideshow's established style. There are no default word-count or rendered-line quotas; deliberate dense copy and walls of text are valid creative choices. Explicit user limits win. The server enforces physical safe-area fit; it never truncates. Rewrite or restructure after a fit error. Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
- Replaces ALL text boxes on the slide; positions are computed server-side. Hard fit limits: heading 2 rendered lines, subheading 3, body 4, CTA 2.Replaces ALL text boxes on the slide; positions are computed server-side. There are no default word or line quotas: use the density the slide needs. The server enforces physical safe-area fit and any explicit limits from the user's brief; it never truncates.
v5.20.2
2026-08-14MiniMax H3 video-guided generation now accepts source videos without audio. When source audio exists, Ghostfeed preserves and sends it; when the source is silent, Ghostfeed sends the selected frame, reference video, and approved text without inventing an audio track. Audio-guided generation still requires a supported source-audio stream.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
- MiniMax H3 input mode. Every value uses the selected frame. prompt_based adds text only; audio_guided also sends source audio; video_guided also sends the source video and its audio.MiniMax H3 input mode. Every value uses the selected frame. prompt_based adds text only; audio_guided also sends source audio; video_guided also sends the source video and includes its audio when present.
- List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and its audio. Read these fields before creating an H3 prompt or video.List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and includes its audio when present. Read these fields before creating an H3 prompt or video.
v5.20.1
2026-08-13Data tools whose results the user can see now carry one uniform presentation rule: in an MCP Apps host, show results with the mapped render tool instead of hand-building galleries or embedding thumbnails in chat. Nine tools gained the sentence (avatars, draft avatars, avatar images, collection images, reaction frames, reaction videos, video detail, generations, inspirations). Behavior and inputs are unchanged.
- Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos.Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one.List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- List SAVED (library) avatars in the active workspace: id, name, thumbnail. Use this to find an avatarId for rename_avatar or content generation. Unapproved drafts are separate (list_draft_avatars).List SAVED (library) avatars in the active workspace: id, name, thumbnail. Use this to find an avatarId for rename_avatar or content generation. Unapproved drafts are separate (list_draft_avatars). To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- List a collection's actual images (urls + AI captions of what each shows), 30 per page. Use to hand-pick a specific image for set_slide_background.List a collection's actual images (urls + AI captions of what each shows), 30 per page. Use to hand-pick a specific image for set_slide_background. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- List draft avatars awaiting approval in the active workspace, newest first (paginated).List draft avatars awaiting approval in the active workspace, newest first (paginated). To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- List recent ASYNC agent jobs in the active workspace for polling and operational status, newest first. This ledger is not the product media library and must never be used to decide which content exists. Avatar creation is synchronous and never appears. Optionally filter by kind or state. Use show_generations when the user wants the real visual product library.List recent ASYNC agent jobs in the active workspace for polling and operational status, newest first. This ledger is not the product media library and must never be used to decide which content exists. Avatar creation is synchronous and never appears. Optionally filter by kind or state. Use show_generations when the user wants the real visual product library. To SHOW these results in an MCP Apps host, ALWAYS call render_generation_gallery; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). When the user wants a visual browser, call render_inspiration_browser with the workspace and optional category. The widget loads 12 real library items per page and can change pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). render_inspiration_browser (workspace plus optional category) loads 12 real library items per page and changes pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match. To SHOW these results in an MCP Apps host, ALWAYS call render_inspiration_browser; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved.List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved. To SHOW these results in an MCP Apps host, ALWAYS call render_image_results; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
- List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard. To SHOW these results in an MCP Apps host, ALWAYS call render_video_result; never hand-build the presentation in chat (no markdown galleries, embedded thumbnails, numbered image lists, or artifacts), even after a widget error. Outside an Apps host, describe items in text and share the dashboard link.
v5.20.0
2026-08-10Ghostfeed MCP Apps now use the product avatar setup rules. Avatar preparation uses all product traits, required fields, field locks, the server randomizer, one draft per request, and product model names and prices. Inspiration items now include their source video URL, so full-screen inspiration has native video playback and video downloads. Full-screen media now reports the complete host height and ends at the MCP App boundary above the host composer.
v5.19.0
2026-08-09Ghostfeed MCP Apps now provide six focused views: avatar builder, source crop, image results, video result, generation gallery, and inspiration browser. The gallery and inspiration browser each read their real product collection and show 12 items per page. Their controls use read-only server tools directly; they do not require a new model turn. Full-screen media uses host controls, native video controls, and host-mediated downloads.
- Edit one existing reaction frame with a text prompt. Use frameId from list_reaction_frames. This creates a new frame and preserves the source frame plus its lineage. It charges the selected image-model and resolution cost once. The returned reaction_frame generation is normally succeeded; a concurrent idempotent replay can return the same queued generation and must be polled. On success, output.url is the edited image and output.id is the new frameId. Show the edit to the user and get approval before generate_reaction_video.
- Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved. Each draft carries dashboardUrl, the dashboard door to that draft.Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved. Each draft carries dashboardUrl, the dashboard door to that draft. After a successful result, call render_image_results with one ready avatar-draft item per imageUrl so the user can review the images in chat.
- PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. imageOutputResolution is optional and defaults to standard; set it to 1080p only when the user requests a higher-resolution frame. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the selected image-model and resolution cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.PHASE 1 of a UGC reaction: create ONE first frame per avatar. With a source, render the avatar into the source pose. Without a source, supply a non-empty stylingPrompt to create the frame directly from the avatar. Source is at most one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. For a source-based request, search list_reaction_templates first, then list_inspiration_reactions if the user did not supply an exact source. imageOutputResolution defaults to standard. Source-based work is async and must be polled. Prompt-only work normally returns succeeded reaction_frame generations; a concurrent idempotent replay can return the same queued generation and must be polled. In both flows, the finished frame is output.url and output.id is the frameId. For async generations, immediately call render_image_results with one generating frame item per generation: set generationId to the returned generation id and keep the shared prompt, image model, and requested aspect ratio. The widget polls the read-only result itself. The selected image model and resolution charge applies per avatar. Show all frames and get approval before generate_reaction_video.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll. Immediately call render_video_result with status generating, the generationId, prompt, model, method, aspect ratio, and relevant frame/avatar reference images. The view polls and replaces the pending card with the playable video.
- List recent ASYNC generations in the active workspace, newest first (slideshow creations appear here). Avatar creation is synchronous and never appears. Optionally filter by kind or state.List recent ASYNC agent jobs in the active workspace for polling and operational status, newest first. This ledger is not the product media library and must never be used to decide which content exists. Avatar creation is synchronous and never appears. Optionally filter by kind or state. Use show_generations when the user wants the real visual product library.
- SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). When the user wants a visual browser, call render_inspiration_browser with the workspace and optional category. The widget loads 12 real library items per page and can change pages without another model turn. A selection asks what the user wants to create and does not start paid work. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.
v5.17.1
2026-08-08MiniMax H3 guided prompts now show every instruction sent to the provider. Audio-guided and video-guided prompt generation includes a visible `Mandatory reference guidance` section and a separate `Action guidance` section. Agents must show the complete prompt, tell the user not to change the mandatory section, and limit approved edits to the action section. Ghostfeed no longer adds hidden video-audio prompt text after approval.
- Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds: audio_guided analyzes visible performance plus source audio; video_guided adds strong motion-transfer instructions and exact hard-cut timing. Every profile still uses the selected first frame during video generation. Show the returned prompt, H3 plan, settings, warning, and estimated credits to the user before calling generate_reaction_video.Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds. Their returned prompt visibly includes a Mandatory reference guidance section followed by Action guidance. Show the complete returned prompt, H3 plan, settings, warning, and estimated credits to the user. Tell the user not to change Mandatory reference guidance and to make only small changes inside Action guidance. Every profile still uses the selected first frame during video generation.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile, show its exact prompt, settings, warning, and estimated cost, then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile and show its complete prompt. The prompt already includes visible Mandatory reference guidance; do not remove or rewrite that section. Small user-approved changes belong only inside Action guidance. Ghostfeed sends the approved prompt without adding hidden text. Then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.
v5.17.0
2026-08-07MiniMax H3 now has three explicit agent modes: `prompt_based`, `audio_guided`, and `video_guided`. All three modes require an approved first frame. Guided modes also bind the request to its source template and require an explicit output duration. Agents can generate the matching prompt on demand, show the exact prompt and cost plan for approval, and then submit the video with the same mode. Audio guidance adds the source audio at no input charge. Video guidance adds the source video, its audio, and a billed reference-video line item. The REST and MCP surfaces use the same schemas, validation, billing, idempotency, durable queue, and provider lifecycle.
- REPAIR PATH, not the first stop. Every clip is analysed automatically when it is imported, so call get_reaction_template FIRST and use its motionAnalysis.prompt; that read is free. Call this only when motionAnalysis is missing, its status is not "complete", or the source was re-cropped after it was written. It reuses an analysis of the same footage from anywhere in either library when one exists, and otherwise watches the full source video and caches the result on the template. Returns timed motion guidance plus a compact prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling); pass that prompt to generate_reaction_video. Never needed for one_to_one clone modes.Generate the exact prompt the user will review before video creation. promptProfile prompt_based returns the normal visual-action prompt and remains a repair path when the template motionAnalysis is missing. For MiniMax H3, audio_guided and video_guided are on-demand profiles and require outputDurationSeconds: audio_guided analyzes visible performance plus source audio; video_guided adds strong motion-transfer instructions and exact hard-cut timing. Every profile still uses the selected first frame during video generation. Show the returned prompt, H3 plan, settings, warning, and estimated credits to the user before calling generate_reaction_video.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). PixVerse and the Seedance 2.0 series generate synchronized audio by default; set enableAudio false for silent output. Unsupported modes default to silent and reject enableAudio true. There is no audio surcharge beyond the selected model/resolution rate. Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames and exact prompt. For MiniMax H3, set minimaxH3Mode explicitly: prompt_based sends the selected frame and text; audio_guided also sends source audio; video_guided also sends the source video and its audio. Guided H3 calls require sourceTemplateId and durationSeconds, and sourceTemplateId must match every frame lineage. First call generate_reaction_prompt with the matching profile, show its exact prompt, settings, warning, and estimated cost, then call here with promptApproved true and a protective maxCredits. Other clone modes take no prompt and follow source duration. Other prompt modes use text and may support enableAudio. H3 defaults to 768p and supports optional 2k. Async: returns one reaction_video generation per frame to poll.
- Motion prompt for prompt modes. Call list_reaction_video_modes and obey the selected mode’s maxPromptCharacters; clone modes reject prompt.
- Controls synchronized generated audio. PixVerse and the Seedance 2.0 series default to true; set false for silent output. Unsupported modes default to silent and reject true. There is no audio surcharge beyond the selected model/resolution rate.Controls synchronized generated audio for modes that advertise supportsAudio true. Unsupported modes reject true; MiniMax H3 output audio is provider-native and is not configurable here.
- Requested output resolution. Call list_reaction_video_modes first and use the selected mode’s supportedResolutions; Seedance 2.0 Fast and Mini support 720p only.Requested output resolution. Call list_reaction_video_modes first and use the selected mode’s supportedResolutions. Resolution availability and defaults are mode-specific; MiniMax H3 defaults to 768p and supports an optional 2k upgrade.
- List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, whether each needs a prompt or supports audio, and audioEnabledByDefault. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). PixVerse and Seedance 2.0, Fast, and Mini generate audio by default with no surcharge; set enableAudio false for silent output and check supportedResolutions before choosing a resolution.List the video modes for the reaction video phase, with costs, resolutions, prompt rules, and audio behavior. MiniMax H3 also returns minimaxH3Modes: prompt_based, audio_guided, and video_guided. Every H3 mode uses the selected frame. Audio-guided adds free source audio. Video-guided adds billed source-video input and its audio. Read these fields before creating an H3 prompt or video.
v5.14.0
2026-07-28UGC reaction agents now search the workspace's existing first frames before spending credits on a new one. `list_reaction_frames` exposes lineage, model, resolution, preference, and accurate animation-state metadata so an agent can show reusable candidates and let the user choose between reuse and a fresh take. Already-animated frames remain reusable for new prompts and settings.
- Create one reusable reaction template from an exact timestamp range of an existing owned/imported template. Async and free: poll the returned reaction_crop generation. On success output.id is the new template id. Use when the user supplies or approves exact start/end times; this creates a derivative and archives the source only when the source was blocked in needs_crop.
- Split an existing owned/imported reaction source into up to 8 reusable templates using FFmpeg scene-change detection. This is cut detection, not semantic highlight selection. Async and free: poll the returned reaction_smart_crop generation; outputs appear incrementally and each output.id is a new template id.
- List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, the videoStage of the shell it lives in, and isAnimated (false means nothing has been animated from it yet, so it is free to use). Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.List reusable reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard. Filter by both avatar and template before generating a new first frame. Each row carries its image, lineage and generation metadata, preferenceStatus, videoStage, and animationStatus. A complete frame is still reusable for another video. Show candidates and let the user reuse one for free or request a fresh variation; never silently assume an old take is approved.
- Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Infer copy density from the user's full brief and this slide's narrative job: headings are usually 3-8 words and body copy 8-20 words, but conversational brevity/detail guidance and explicit word or line limits win. The server rejects copy beyond heading 2, subheading 3, body 4, or CTA 2 rendered lines, or outside the safe area; it never truncates. Rewrite or redistribute and retry after a fit error. Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
- Replaces ALL text boxes on the slide; positions are computed server-side.Replaces ALL text boxes on the slide; positions are computed server-side. Hard fit limits: heading 2 rendered lines, subheading 3, body 4, CTA 2.
- Final copy for this box. Follow the user's requested density; visual overflow is rejected, never silently truncated.
v5.13.0
2026-07-27Seedance 2.0, Seedance 2.0 Fast, and Seedance 2.0 Mini now support optional synchronized generated audio in both the dashboard and agent API. Agents can discover the capability through `list_reaction_video_modes` and request it with `enableAudio`. PixVerse and every audio-capable Seedance mode default audio on; set `enableAudio: false` for silent output. Audio remains flat-priced at each selected model and resolution rate.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). PixVerse and the Seedance 2.0 series generate synchronized audio by default; set enableAudio false for silent output. Unsupported modes default to silent and reject enableAudio true. There is no audio surcharge beyond the selected model/resolution rate. Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
- Controls synchronized generated audio. PixVerse and the Seedance 2.0 series default to true; set false for silent output. Unsupported modes default to silent and reject true. There is no audio surcharge beyond the selected model/resolution rate.
- List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion, and check supportedResolutions before requesting 1080p.List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, whether each needs a prompt or supports audio, and audioEnabledByDefault. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). PixVerse and Seedance 2.0, Fast, and Mini generate audio by default with no surcharge; set enableAudio false for silent output and check supportedResolutions before choosing a resolution.
v5.12.0
2026-07-27MCP results now include native media resource links alongside the unchanged JSON envelope, so compatible clients can preview, play, or download generated images and videos directly in the conversation. Links are capped per result to keep media-heavy library searches usable.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode, show the user the exact prompt plus selected mode, duration, resolution, and audio setting; call only after explicit approval, with promptApproved true. The source template supplied only the first frame — movement comes from what the USER asked for. Never paste the template `motion` browsing summary in as the prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
v5.11.0
2026-07-27`list_reaction_video_modes` now reports `supportedResolutions` for every mode, so agents can discover that Seedance 2.0 Fast and Mini are 720p-only before calling `generate_reaction_video`. The video generation schema and tool description now point agents to that per-mode capability field.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Before setting outputResolution to 1080p, call list_reaction_video_modes and confirm that the chosen mode lists 1080p in supportedResolutions; Seedance 2.0 Fast and Mini are 720p-only. Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
- Requested output resolution. Call list_reaction_video_modes first and use the selected mode’s supportedResolutions; Seedance 2.0 Fast and Mini support 720p only.
- List the video modes for the reaction video phase, with per-second credit cost and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion.List the video modes for the reaction video phase, with per-second credit cost, supported output resolutions, and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion, and check supportedResolutions before requesting 1080p.
v5.10.0
2026-07-27`generate_reaction_frames` now accepts an optional `imageOutputResolution`. Agents can request standard output or 1080p frames, and the selected image model's resolution-specific cost is estimated and charged before video generation.
- PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. imageOutputResolution is optional and defaults to standard; set it to 1080p only when the user requests a higher-resolution frame. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the selected image-model and resolution cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
v5.9.0
2026-07-27`generate_reaction_video` now accepts an optional `outputResolution` so agents can request 720p or 1080p explicitly. The spend estimate, reservation, recovery, and settlement use the selected model's resolution-specific rate. The `maxCredits` description now explains that the ceiling is evaluated against the selected model and resolution rather than assuming one universal rate.
- Refuse to start any clip that would cost more than this many credits. Clone modes take their length from the source clip, so a 30s template is 30 credits at 1 credit/second and 60 at 2. A ceiling of MAX_REACTION_VIDEO_CREDITS credits per clip always applies; this only tightens it.Refuse to start any clip that would cost more than this many credits. Clone modes use the source clip length and the selected model/resolution rate. A per-clip ceiling of MAX_REACTION_VIDEO_CREDITS always applies; this only tightens it.
v5.8.0
2026-07-23Reported by a free-plan user whose `create_blank_slideshow` answered `internal_error`, HTTP 500, `retryable: true`. The real cause was ordinary and fixable: "Free plan includes 1 slideshow project. Upgrade for unlimited projects." A 500 tells a well-behaved agent to retry a call that can never succeed, and the scrubbing threw away the one sentence that said how to fix it.
v5.7.0
2026-07-22Found by reviewing 5.6.0 against the enrichment job that already analyses every clip: the new reaction tools read the same `motionPromptAnalysis` the ingestion pipeline writes, but presented themselves as if that analysis did not exist.
- Analyze one completed source template into a reusable prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling). This is the dashboard's “Generate prompt from original template” action: it watches the full source video, returns timed motion guidance plus a compact prompt, and caches the result on the template. Pass that prompt to generate_reaction_video with a prompt mode; do not use it for one_to_one clone modes.REPAIR PATH, not the first stop. Every clip is analysed automatically when it is imported, so call get_reaction_template FIRST and use its motionAnalysis.prompt; that read is free. Call this only when motionAnalysis is missing, its status is not "complete", or the source was re-cropped after it was written. It reuses an analysis of the same footage from anywhere in either library when one exists, and otherwise watches the full source video and caches the result on the template. Returns timed motion guidance plus a compact prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling); pass that prompt to generate_reaction_video. Never needed for one_to_one clone modes.
- Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, and the current Gemini motion analysis. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, the full opensOn still description, and the full stored motion analysis. Every clip is analysed automatically on import, so this free read is normally where the complete motionAnalysis.prompt already is. list_reaction_templates only carries a one-line teaser of it. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
- List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", and sourceReactionId when it came from a template. generation is a compact model/mode/duration summary. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", a dashboardUrl, and sourceReactionId when it came from a template. videoUrl is the canonical clip: the post-edit version once one exists, otherwise the raw render. generation is a compact model/mode/duration summary. Rows carry avatarId but not the avatar name; resolve names with list_avatars when you need them. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.
v5.6.0
2026-07-22`list_reaction_videos` now returns up to 100 compact generated-video records: the canonical generated `videoUrl`, `sourceReactionId`, and a small model/mode/duration summary. `get_reaction_template` resolves each unique source record (media, original import URL, duration, and cached Gemini analysis), while `get_reaction_video` returns the exact prompt, model, duration, and first-frame settings used for one render. `generate_reaction_prompt` is the dashboard's source-video analysis action over MCP/REST: it returns and caches a prompt for prompt-mode generation; one-to-one motion-control clones continue to need none.
- Analyze one completed source template into a reusable prompt for a prompt-mode reaction (Seedance, Grok, PixVerse, or Kling). This is the dashboard's “Generate prompt from original template” action: it watches the full source video, returns timed motion guidance plus a compact prompt, and caches the result on the template. Pass that prompt to generate_reaction_video with a prompt mode; do not use it for one_to_one clone modes.
- Read one source template by its templateId (or a generated video’s sourceReactionId). Returns the original/source clip, external import URL when present, duration, import type, and the current Gemini motion analysis. Use it after list_reaction_videos to resolve each unique source once, rather than repeating source metadata on every generated video.
- Read one reaction video’s full render record after finding it with list_reaction_videos. Returns the canonical generated video URL, sourceReactionId, exact first-frame and video prompts, selected frame, models, duration, and post-edit URL. Call get_reaction_template separately for source media and Gemini analysis. Use this only for videos you need to recreate or inspect in detail; the list stays compact enough to inventory up to 100 videos.
- List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, the avatar, and a playable videoUrl once stage is "complete". Use it to report what is finished or still rendering. Managing and deleting videos stays in the dashboard.List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, a playable videoUrl once stage is "complete", and sourceReactionId when it came from a template. generation is a compact model/mode/duration summary. Call get_reaction_template with sourceReactionId for source media and Gemini analysis, or get_reaction_video for the exact prompt/settings of one rendered video. Managing and deleting videos stays in the dashboard.
v5.3.0
2026-07-21Found by a founder building a Pinterest deck over MCP and reopening it: every slide's search box was blank.
- Search Pinterest directly (up to 8 queries, default 12 images each) and get raw image urls back. Search for SCENES, not topics. LOOK at the images yourself before picking - that is the whole point of this tool - then set_slide_background with the winner. Costs no credits.Search Pinterest directly (up to 8 queries, default 12 images each) and get raw image urls back. Search for SCENES, not topics. LOOK at the images yourself before picking - that is the whole point of this tool - then set_slide_background with the winner AND the query that found it, so the editor reopens on that search and shuffle can re-run it. Costs no credits.
- Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. For a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then pass the returned fileUrl here as type 'url'. External urls are re-hosted to durable storage automatically. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. On a Pinterest pick, pass background.query (the search_pinterest query that found it) so the editor's Pinterest tab reopens on that search. For a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then pass the returned fileUrl here as type 'url'. External urls are re-hosted to durable storage automatically. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
v5.2.2
2026-07-21Found by spending real credits against the rewritten charging path, which unit tests had covered and never exercised.
- PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. LIBRARY-FIRST RULE: unless the user explicitly supplied an exact source, call list_reaction_templates first, then list_inspiration_reactions if needed, and use a reasonable library opening-pose match. A custom motion request can still use a library first frame with prompt-mode animation. Use referenceImageUrl only after both Ghostfeed libraries lack a suitable opening pose, and tell the user why the custom fallback was necessary. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
- Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.SECOND source search for every new reaction request, after list_reaction_templates has no suitable opening pose. Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first. Only fall back to a custom referenceImageUrl after both libraries lack a reasonable match.
- List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Find a templateId here for generate_reaction_frames.FIRST source search for every new reaction request unless the user explicitly supplied an exact source. List reaction TEMPLATES usable in this workspace: platform stock plus your own imported/uploaded motion clips. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. Choose primarily on opensOn. A prompt-mode video may reuse the opening pose without copying the source motion. Use motion only to judge a requested clone, and never paste it into generate_reaction_video as the prompt. If no template has a reasonable opening-pose match, search list_inspiration_reactions next.
v5.2.1
2026-07-21Wording that 5.0.0 left behind. Both clip catalogues still told agents to "filter a large library with shotSize and energy" and listed those fields as things a captioned clip carries, for parameters that release removed. The example payloads still showed them too.
- Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip). These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
- List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy; older clips may not have them yet. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into) and motion (what happens in the clip); older clips may not have them yet. These are SELECTION aids: read them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Find a templateId here for generate_reaction_frames.
v5.2.0
2026-07-21A prioritised defect list, worked top down.
v5.1.0
2026-07-21`regenerate_reaction_frame` now accepts a `frameId` as well as a `generationId`, and needs exactly one of them.
- Redo the frame of a reaction_frame generation the user was not happy with, by its generationId. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.Redo a frame the user was not happy with. Identify it with EITHER frameId (any frame from list_reaction_frames, including ones a person made in the dashboard) OR generationId (a frame this API started); pass exactly one. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
- The generationId of a frame you started through the agent API.
v5.0.0
2026-07-21BREAKING: `shotSize`, `energy` and `holdsProduct` are gone from `list_reaction_templates` and `list_inspiration_reactions`, as fields and as filters. A clip now describes itself with two pieces of prose and nothing else: `opensOn`, the opening still your avatar is rendered into, and `motion`, what happens across the clip.
v4.10.0
2026-07-21Fixes for defects a paid field test found, where ten agents used the surface with real credits. Every one of these sat at a seam between two tools rather than inside either of them.
v4.9.1
2026-07-21Three text-heavy lists advertise a smaller maximum page. `list_reaction_templates` caps at 25, `list_products` and `list_generations` at 40, instead of the surface-wide 100. A template row now carries an opening-frame description and a motion summary, a product row carries a 400-character description plus its linked collections, and a generation row echoes its whole input and outputs — so a page of 100 measured 112KB, 80KB and 80KB, against a 60KB ceiling. That is the same context blowup the pagination work was done to prevent, rebuilt by the fields added since.
- Per page (max 40; lower than other tools because these rows carry their full input and outputs).
- Per page (max 100). Each tool documents its own default.Per page (max 40; lower than other tools because these rows carry long descriptions). Each tool documents its own default.
- Per page (max 100). Each tool documents its own default.Per page (max 25; lower than other tools because these rows carry long descriptions). Each tool documents its own default.
v4.9.0
2026-07-21`list_reaction_templates` stops offering templates you cannot generate from. Anything still importing, failed, or over 30s awaiting a crop is now hidden by default, because `generate_reaction_frames` refuses those anyway: picking one cost the agent a call and returned an error telling it to go and crop in the dashboard. Pass `includeUnusable` to see them, and the response says how many were hidden.
v4.8.0
2026-07-21Reaction videos now report what they actually cost, and cannot quietly cost a fortune. `creditsSpent` was measured as the balance before minus the balance after. On a team plan that balance is a single shared pool, so a teammate spending during your call inflated your number, a refund deflated it, and the clamp at zero could report a paid video as free. It is now summed from the price each clip was charged, which was already known before the debit.
v4.7.0
2026-07-20Paged reads now say where you are, and `list_collection_images` stops under-reporting. It returned `total` as the length of the page it had just handed back, so asking for 5 images from a 200-image collection was answered "total: 5" and an agent reasonably concluded it had seen everything and built the whole deck from those five. The real count was already being computed one call down and discarded. It now reports the collection size and carries `page` and `pages` like every other paged read. `list_slideshows` gained the `page` it was missing alongside its `total` and `pages`.
v4.6.4
2026-07-20Two import defects found by running the flow as a new user would.
v4.6.3
2026-07-20Second field-test pass. `list_reaction_video_modes` now flags exactly one mode as `isDefault` — the one you get when `mode` is omitted — with `isFamilyDefault` marking the clone and prompt defaults separately. Flagging both meant an agent that wanted a clone, omitted `mode`, and passed a prompt got prompt-mode Seedance at 1.5 credits per second instead of clone at 1, in the wrong family, with nothing in the response naming which family ran.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Target workspace: a slug, id, or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.
v4.6.2
2026-07-20Fixes from a field test where ten agents used the surface as a new user would.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
- Per page (default 50, max 100).Per page (max 100). Each tool documents its own default.
v4.6.1
2026-07-20Wording, to state an intent the code already enforced. `opensOn` and `motion` exist so an agent can CHOOSE a clip, and the tool descriptions now say that outright, including that `motion` must never be pasted into `prompt`.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) reproduces the template motion and needs a template-backed frame (no prompt); a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) copies the motion straight from the source clip and takes no prompt; a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. In PROMPT mode the source template supplied only the first frame — the movement comes from what the USER asked for, so write `prompt` from their words. Never paste the template `motion` text in as the prompt: that field exists to help you CHOOSE a clip, and using it would animate the reference performance instead of the one the user described. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
- Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than the name, and narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
- List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than guessing from the name; older clips may not have them yet. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy; older clips may not have them yet. These are SELECTION aids: use them to pick a clip and to describe it to the user, never as the prompt for generate_reaction_video. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.
v4.6.0
2026-07-20The curated inspiration library is now described too, which matters more for a new account than the template library does. A fresh workspace owns no templates, so `list_inspiration_reactions` IS the catalogue you start from, and it was returning names and thumbnails only. 4.5.0 gave templates `opensOn` and `motion` while leaving the surface a first-time user actually reaches untouched.
- Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). This is the catalogue to start from when the workspace has no templates of its own. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than the name, and narrow with shotSize/energy before paging. Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
v4.5.1
2026-07-20Wording only. `list_collections` was already returning `summary`, one line saying what a collection's images actually show, distilled from their AI captions. Nothing declared it or mentioned it, so agents kept choosing collections from a name and a count, which is the exact guessing the summaries exist to remove. A folder called "August" tells you nothing; "62 lifestyle shots of a woman in athleisure in bright home interiors" tells you whether to open it. The field is now named in the response type and the description tells the agent to read it before opening a collection.
- List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. To feature a collection's images in a deck, browse it with list_collection_images and cast the ones you want with set_slide_background (type collection). Call this BEFORE building a deck that should feature the user's own images.List the workspace's image collections (the user's own saved images): id, name, image count, dashboardUrl, and summary, one line saying what the images actually show. Read the summary to pick which collection is worth opening rather than guessing from its name, then browse that one with list_collection_images and cast the images you want with set_slide_background (type collection). Call this BEFORE building a deck that should feature the user's own images.
v4.5.0
2026-07-20The agent can see what a reaction clip actually looks like. `list_reaction_templates` used to return a name, a category and a duration, and its own description admitted the agent could not watch the motion, so choosing a template meant guessing from a title. Half the library's titles were the creator's scraped caption, which for one real template read in full as "this dress is so prettyyy".
- List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. You cannot watch the motion, so describe it from name/category if the user must choose. Find a templateId here for generate_reaction_frames.List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. Captioned clips also carry opensOn (the opening still your avatar gets rendered into), motion (what happens in the clip), shotSize, and energy, so pick on those rather than guessing from the name; older clips may not have them yet. Filter a large library with shotSize and energy before paging. Find a templateId here for generate_reaction_frames.
v4.4.0
2026-07-20Every list tool can now be asked for a page. A worked avatar accumulates one image per reaction frame ever rendered, and `list_avatar_images` returned all of them at once: 254 images came back as a 96KB response that buried an agent's context outright, mid-task. It now returns 30 per page with `total` and `pages`, and it captions only the page it hands back rather than the whole pool.
- List a saved avatar's generated photos (urls + captions). Reusing them is free; use set_slide_background type 'avatar' to cast one.List a saved avatar's generated photos (urls + captions), newest first, 30 per page. A worked avatar can hold hundreds, so this is paged: read total/pages and ask for the next page rather than expecting everything at once. The captions describe each shot, so use them to pick a specific pose or framing — that is how you cast a first frame for generate_reaction_frames via referenceImageUrl. Reusing them is free; use set_slide_background type 'avatar' to cast one.
- Page number (default 1, 30 per page).Page number (default 1).
v4.3.1
2026-07-20Wording only. `list_reaction_frames` advertised a `hasVideo` field it no longer returns. Every frame is created inside a video shell, so that flag was true for every frame and told an agent nothing. The description now names what the tool actually returns: `videoStage`, and `isAnimated`, which is false when nothing has been animated from that frame yet and it is free to use.
- List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, and hasVideo. Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, the videoStage of the shell it lives in, and isAnimated (false means nothing has been animated from it yet, so it is free to use). Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.
v4.3.0
2026-07-20Agents can now see reaction work they did not start. `list_reaction_frames` and `list_reaction_videos` read the workspace board itself rather than the agent's own ledger, so frames and clips a person made in the dashboard are visible too. That closes the gap behind a very ordinary request: animate the frame I made this morning. Frames come back with the avatar and source template that produced them and whether a video was already started; videos come back with their stage and a playable url once finished. Managing and deleting still live in the dashboard.
- List the reaction FRAMES on the workspace board, newest first, including ones a person made in the dashboard rather than through an agent. Each has a frameId, image, the avatar it used, its source template, and hasVideo. Use this to act on existing work: "animate the frame I made this morning" starts here, then pass the frameId to generate_reaction_video.
- List the reaction VIDEOS in this workspace, newest first, agent-made or not. Each has a videoId, name, stage, the avatar, and a playable videoUrl once stage is "complete". Use it to report what is finished or still rendering. Managing and deleting videos stays in the dashboard.
v4.2.0
2026-07-20Agents can put a local image on a slide. `request_slide_image_upload` mints a short-lived presigned R2 URL for a local image file, the same supply-chain shape as `request_reaction_upload`: PUT the raw bytes straight to storage (never as a tool argument), then `set_slide_background` with type `url` and the returned `fileUrl`. `set_slide_background` also gained durability on plain image urls: an external `url` background is now re-hosted to our storage automatically, so a slide never points at a link that can rot, while Pinterest picks keep their `pinterest` provenance and images already on our storage pass through untouched.
- Get a short-lived presigned R2 upload URL for a LOCAL image file (too large to pass as a tool argument). PUT the raw bytes to uploadUrl with the given Content-Type, then call set_slide_background with background.type "url" and background.url = the returned fileUrl. Costs no credits.
- Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. For a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then pass the returned fileUrl here as type 'url'. External urls are re-hosted to durable storage automatically. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
- Where this background comes from. 'pinterest' = a url from search_pinterest; 'collection'/'avatar' = a url from the matching list tool (id required); 'url' = any other image url; 'color' = solid background.Where this background comes from. 'pinterest' = a url from search_pinterest; 'collection'/'avatar' = a url from the matching list tool (id required); 'url' = any other image url, INCLUDING a fileUrl from request_slide_image_upload (an external url is re-hosted to durable storage automatically); 'color' = solid background. To use a LOCAL image file, call request_slide_image_upload first, PUT the bytes, then set type 'url' with the returned fileUrl.
- The image url (all types except color).The image url (types 'pinterest'/'collection'/'avatar'/'url').
v4.1.0
2026-07-19UGC reactions come to the agent surface: create reaction videos over chat instead of clicking through the dashboard, following the exact two-phase flow the app already uses. Eight tools ship in a new UGC Reactions group. The supply chain first: `import_reaction_template` turns a TikTok/Instagram link, a local file (uploaded to a presigned URL from `request_reaction_upload`), or a curated `list_inspiration_reactions` clip into a workspace template, with one uniform rule on every path (a clip up to 30s is ready immediately; 30 to 120s imports in full but must be cropped in the dashboard first; longer is rejected). Then the two phases: `generate_reaction_frames` renders one or more avatars into the source pose, one frame per avatar, and `generate_reaction_video` animates an approved frame, either cloning the reference motion (default `one_to_one_standard`, Kling motion-control) or from a text prompt (default `seedance_2_0_fast`). `regenerate_reaction_frame` redoes a weak frame; `list_reaction_templates` and `list_reaction_video_modes` are the discovery reads. The frame is a deliberate checkpoint: the tools and the skill push the agent to show it and get the user's approval before spending the far larger video credits. Reaction work is async and polled through the existing `get_generation` ledger, which gains three kinds (`reaction_import`, `reaction_frame`, `reaction_video`); a 30 to 120s import surfaces as `needs_action` until cropped. Bulk creation only. Managing, cropping, and deleting templates and videos all stay in the dashboard, the same human-in-the-loop line the delete removal in 4.0.0 drew.
- PHASE 1 of a UGC reaction: render one or more avatars into the source pose, ONE frame per avatar. Source is exactly one of templateId, inspirationId (auto-saved to a template first), or referenceImageUrl. Async: returns one reaction_frame generation per avatar to poll; the finished frame is output.url and output.id is the frameId. Charges the image-model cost per avatar as frames render (gemini_flash unless imageModel is set). STOP after this: show the frame(s) to the user and get approval BEFORE generate_reaction_video, because video credits are far higher.
- PHASE 2 of a UGC reaction: animate approved frame(s) into video. Only call after the user has reviewed and approved the frames. mode picks the family: a CLONE mode (one_to_one_*) reproduces the template motion and needs a template-backed frame (no prompt); a PROMPT mode (default seedance_2_0_fast) animates from text and needs a prompt. Duration is auto unless durationSeconds is set (ignored by clone modes, which follow the source clip). Async: returns one reaction_video generation per frame to poll; the clip is output.url. Charges per second of video and reports creditsSpent/creditsRemaining.
- Import a reaction TEMPLATE from exactly one source: sourceUrl (a TikTok/Instagram link), uploadedFileUrl (from request_reaction_upload, the local-file path), or inspirationId (a curated clip). Async: returns a reaction_import generation to poll with get_generation. succeeded = ready to use; needs_action = the source is 30-120s and must be cropped in the dashboard first (open dashboardUrl); >120s is rejected. Costs no credits. Managing, cropping, and deleting templates all happen in the dashboard.
- Browse the curated inspiration library of reaction clips (ids, names, categories, thumbnails). Pass an inspiration id to import_reaction_template or generate_reaction_frames and it is auto-saved to this workspace as a template first.
- List reaction TEMPLATES (the source motion clips) usable in this workspace: platform stock plus your own imported/uploaded ones. Each has an id, name, category, duration, thumbnail, and status. You cannot watch the motion, so describe it from name/category if the user must choose. Find a templateId here for generate_reaction_frames.
- List the video modes for the reaction video phase, with per-second credit cost and whether each needs a prompt or supports audio. Two families: CLONE modes reproduce a template motion (default one_to_one_standard, Kling motion-control, no prompt); PROMPT modes animate the frame from text (default seedance_2_0_fast). Use a clone mode only when the user wants to reproduce the reference video motion.
- Redo the frame of a reaction_frame generation the user was not happy with, by its generationId. Re-runs frame generation on the same avatar + source and charges another frame credit. Poll the same generation until it succeeds with a fresh frame, then get approval before generate_reaction_video.
- Get a short-lived presigned R2 upload URL for a LOCAL video file (a video is too large for a tool argument). PUT the raw bytes to uploadUrl with the given Content-Type, then pass the returned fileUrl to import_reaction_template as uploadedFileUrl. Costs no credits.
- ADDED
list_generationsenum values added to kind: reaction_import, reaction_frame, reaction_videoGenerations →
v4.0.0
2026-07-19Agents can no longer delete library objects. Founder ruling: an agent over the public API creates and organizes, but destroying content stays a human decision in the dashboard. `delete_draft_avatar` is REMOVED from the agent surface entirely, its MCP tool and its `DELETE /avatars/drafts/:id` REST twin both gone. This is the breaking removal behind the major bump. Draft avatars are now resolved one of two ways: approve the ones to keep with `approve_avatar`, and manage or discard the rest from the dashboard. The `create_avatar` and `list_draft_avatars` guidance now says exactly that. Nothing else about the avatar flow changes: drafts still never enter the library without human approval, and the underlying dashboard delete path is untouched. Note the in-session build primitive `remove_slide` is NOT a delete of a library object (it edits an in-progress deck) and is unaffected.
- BREAKING
delete_draft_avatartool removed
v3.0.1
2026-07-19Dogfood fixes. `create_variant` now tells the truth about what it is: a COPY of the base deck that YOU must differentiate, re-casting a fresh image and rewriting the copy on each slide the same way the dashboard's Director shuffles a variant. Four behavior fixes, no schema changes: `create_avatar` with an `idempotencyKey` is now truly idempotent (a same-key retry returns the ORIGINAL drafts with `creditsSpent: 0` instead of generating new avatars and mis-reporting a charge); a first Studio build edit that fails its image gate no longer charges silently (validation runs before the charge, so the credit lands only on the first edit that actually applies and always reports `creditsSpent`/`creditsRemaining`); agent-built decks now stamp `createdVia: "mcp"`; and the avatar auto-namer is heritage-aware (no more "Kenji Park" for a South Asian persona).
- Add a variant to a slideshow: a COPY of the base deck you then tweak into an A/B version by passing its variantIndex to set_slide_background / set_slide_texts. Costs 1 credit (same as a dashboard-generated variant); returns the new variantIndex and creditsSpent/creditsRemaining. Editing the variant afterwards is free.Add a variant to a slideshow: a COPY of the base deck, returned with a new variantIndex. Differentiate it the same way the dashboard shuffles variants, by passing that variantIndex to set_slide_background / set_slide_texts per slide: re-cast a FRESH image on each slide (search_pinterest + a new pick for Pinterest slides; a different image from the same collection/avatar for those) and REWRITE the copy. Keep uploaded, plain-url, and AI-generated images as-is. Costs 1 credit (same as a dashboard-generated variant); returns creditsSpent/creditsRemaining. Editing the variant afterwards is free.
v3.0.0
2026-07-19Slideshow creation on MCP is now the agent's own hand-build via Studio, not the server's one-shot composer. The founder thesis taken to its conclusion: a frontier harness out-sees the server's small vision model, so it art-directs the deck itself. `create_slideshow` (the one-shot prompt/remix composer) is REMOVED from the agent surface and stays a dashboard-only convenience; this is the breaking change behind the major bump. In its place the agent has every creation surface, all at the same dashboard-parity price of 1 credit per deck or variant: build from an idea with the Studio tools; remix a TikTok or Instagram post with the new `read_social_post` (it scrapes the source; you hand-build the remix); and make A/B variants with the new `create_variant` (a copy of the base you then tweak). Every Studio build op gains an optional `variantIndex` so you can target a specific variant. The 1-credit charge lands on the first real build edit (never the empty blank deck), is idempotent per deck, and reports `creditsSpent`/`creditsRemaining`. `list_collections` and `list_products` guidance now points at the Studio cast path.
- BREAKING
create_slideshowtool removed - Add a variant to a slideshow: a COPY of the base deck you then tweak into an A/B version by passing its variantIndex to set_slide_background / set_slide_texts. Costs 1 credit (same as a dashboard-generated variant); returns the new variantIndex and creditsSpent/creditsRemaining. Editing the variant afterwards is free.
- Read a TikTok Photo Mode or Instagram carousel post so YOU can remix it: returns the caption, slide count, and each slide image url. This is the SOURCE, not a deck. There is no server-side remix; LOOK at the images, then create_blank_slideshow and hand-build - write your own copy in the same structure and cast fresh images. Costs no credits (the deck costs 1 credit on your first build edit).
- Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server-side Director should. Costs no credits.Create an empty slideshow with N blank slides, then build it slide by slide with set_slide_background and set_slide_texts. This is how an agent creates a deck: YOU do the creative work. The empty deck is free; the deck costs 1 credit, charged on your first set_slide_background or set_slide_texts (same price as a dashboard-made deck). Later edits are free.
- Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | avatar | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | avatar | image). Variant status is pending | processing | ready | failed (the generation ledger maps ready to succeeded, pending to queued, processing to running). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
- The slideshow (project) id from create_slideshow or list_slideshows.The slideshow (project) id from list_slideshows or create_blank_slideshow.
- List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. To feature a collection's images in a deck, browse it with list_collection_images and cast the ones you want with set_slide_background (type collection). Call this BEFORE building a deck that should feature the user's own images.
- List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). To plug a product, weave it into ONE slide in a soft peer-recommendation voice: browse a linked collection with list_collection_images and cast a real product image on that slide with set_slide_background. Call this BEFORE building a deck that should plug a product.
- Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live.Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
- Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide.Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide. If this is the deck's first build edit it charges 1 credit and returns creditsSpent/creditsRemaining.
v2.2.0
2026-07-17REST is now a true transport twin of MCP. All 28 public operations are available under `/api/v2`, including workspaces, credits, transactions, library discovery, image browsing, Pinterest search, blank-deck creation, and every granular Studio edit. One canonical operation manifest drives generated REST references and a bidirectional CI gate: an MCP-only tool, a REST-only endpoint, or an undocumented method/path change now fails before merge.
- ADDED
set_slide_backgroundREST endpoint added: PUT /slideshows/:slideshowId/slides/:slideIndex/backgroundStudio → - ADDED
set_slide_textsREST endpoint added: PUT /slideshows/:slideshowId/slides/:slideIndex/textsStudio → - Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server pipeline should. Costs no credits.Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server-side Director should. Costs no credits.
- Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus any collections the brief mentions (weak batches trigger one automatic re-search). Collections are never used unless mentioned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server's Director engine composes the deck in one agentic loop: it writes the slide copy, searches Pinterest, looks at the candidate images, and casts each background from what it saw plus any collections the brief mentions. It repairs its own gaps before finishing; if it cannot finish, the generation reports failed honestly instead of shipping a broken deck. Collections are never used unless mentioned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
- Describe the slideshow: topic, angle, audience. The pipeline writes the slide copy and casts the images. Exactly one of prompt or sourceUrl.Describe the slideshow: topic, angle, audience. The Director engine writes the slide copy and casts the images. Exactly one of prompt or sourceUrl.
- A TikTok Photo Mode or Instagram post URL to remix: the pipeline rewrites the copy in the same structure and re-casts every image. Exactly one of prompt or sourceUrl.A TikTok Photo Mode or Instagram post URL to remix: the Director rewrites the copy in the same structure and casts entirely new images. Exactly one of prompt or sourceUrl.
v2.1.0
2026-07-17Library results now open what they name. `list_collections` returns a workspace-qualified `dashboardUrl` for every collection, while `list_products` returns one for every product and each linked collection. Product links land on a stable `/w/<slug>/products/<id>` route whose edit dialog survives refresh, login, and browser history.
- List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.List the workspace's image collections (the user's own saved images): id, name, image count, and dashboardUrl. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.
- List the workspace's registered products: id, name, description, url, and linkedCollections (the product's OWN photo collections). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.List the workspace's registered products: id, name, description, url, dashboardUrl, and linkedCollections (the product's OWN photo collections, each with its own dashboardUrl). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.
v2.0.0
2026-07-17Workspace intent is now deterministic. Every credential pins one default workspace for reads at consent time, while every workspace-scoped write must name its target explicitly. Dashboard links carry the workspace in the path (`/w/<slug>/...`), and dashboard navigation can no longer retarget an MCP connection behind the user's back. This is a clean development reset: reconnect existing MCP clients at `/api/v2/mcp`; v1 credentials and endpoints are not migrated.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus the project's pinned collection (weak batches trigger one automatic re-search). Collections are never used unless pinned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus any collections the brief mentions (weak batches trigger one automatic re-search). Collections are never used unless mentioned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Who am I, which workspace am I pointed at, and what does my credential allow. Call this first. credential.workspaceScope "all" means every workspace you can currently access (grantedWorkspaceIds stays empty); "listed" pins the credential to exactly grantedWorkspaceIds. Workspace-scoped tools accept a per-call workspace (id or exact name) to target any workspace within that grant.Who am I, which workspace did this read resolve to, and what does my credential allow. Call this first. credential.defaultWorkspaceId is immutable for the connection. credential.workspaceScope "all" means every workspace you can currently access (grantedWorkspaceIds stays empty); "listed" pins the credential to exactly grantedWorkspaceIds. Reads may omit workspace and use the connection default; every workspace-scoped write must pass workspace explicitly.
- List the workspaces this credential can act in, and which is active. Each has an id, name, and stable slug. Pass any of them as the workspace parameter on workspace-scoped tools; the slug is what appears in dashboardUrl links.List the live workspaces this credential can act in, its immutable defaultWorkspaceId, and the workspace resolved for this request. Each has an id, name, and stable slug. Pass the slug or id as workspace on every write; the slug appears in dashboardUrl links.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
- Target workspace: an id or exact name from list_workspaces. Omit to use this connection's default workspace. Must be inside the credential's grant and your current access; overrides the connection-level X-Workspace-Id header.Required write target: a workspace slug or id from list_workspaces. Writes never inherit the connection default.
v1.6.2
2026-07-17Pinning is now a product concept only. create_slideshow's collectionId no longer pins the collection onto the project; it records the same explicit mention an @mention in the dashboard prompt box creates, and the images join casting through that path. Products keep their own photo collections via linkedCollections, resolved live when the deck is built. Nothing structural changed: the param name, type, and optionality are identical, and existing calls keep working.
- Pin a collection: its images join every slide's casting pool and the vision judge uses them where they fit (product slides prefer them). Pinning is the ONLY way the user's own images enter casting — unpinned collections never contend. Must belong to the workspace.Mention a collection: its images join the casting pool and are used where they fit. Equivalent to @mentioning the collection in the dashboard prompt box (there is no project-level pinning; products carry their own photo collections via linkedCollections). Must belong to the workspace.
- List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — pinning is the ONLY way the user's own images enter a slideshow's casting (its images then contend for every slide, and product slides prefer them). Call this BEFORE creating a slideshow that should feature the user's own images.List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to mention that collection — mentioning is the ONLY way the user's own images enter a slideshow's casting (its images then contend where they fit; products carry their own photo collections via linkedCollections). Call this BEFORE creating a slideshow that should feature the user's own images.
v1.6.1
2026-07-17Products now hand agents their imagery. list_products returns each product's linkedCollections (its own photo collections, with names), and the tool descriptions teach the path: mention or weave a product, browse its linked collection with list_collection_images, and cast a real product image on the plug slide. This is the resolver behind product mentions.
- List the workspace's registered products: id, name, description, url. Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice. Call this BEFORE creating a slideshow that should plug a product.List the workspace's registered products: id, name, description, url, and linkedCollections (the product's OWN photo collections). Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice; for hand-built decks, browse a linked collection with list_collection_images and cast a real product image on the product slide. Call this BEFORE creating a slideshow that should plug a product.
v1.6.0
2026-07-15The agent gets its own hands. Ten Studio tools expose the slideshow editor's creation moves one at a time: search_pinterest returns raw image urls for up to 8 queries, list_collection_images and list_avatar_images show the library's actual photos, create_blank_slideshow starts an empty deck, and set_slide_background, set_slide_texts, add_slide, remove_slide, reorder_slides, and set_caption build it piece by piece with the dashboard updating live. Image picks pass the same physical gates as the pipeline (browser-displayable, 720px minimum). Nothing about create_slideshow changed; Studio exists so a frontier agent can do the taste work itself, looking at every candidate with its own eyes.
- Insert a blank slide (append by default). Decks cap at 12 slides.
- Create an empty slideshow with N blank slides, ready to be built slide by slide with set_slide_background and set_slide_texts. Use when YOU are doing the creative work; use create_slideshow when the server pipeline should. Costs no credits.
- List a saved avatar's generated photos (urls + captions). Reusing them is free; use set_slide_background type 'avatar' to cast one.
- List a collection's actual images (urls + AI captions of what each shows), 30 per page. Use to hand-pick a specific image for set_slide_background.
- Remove a slide by position. A deck keeps at least one slide.
- Reorder slides with a permutation of current positions, e.g. [2,0,1].
- Search Pinterest directly (up to 8 queries, default 12 images each) and get raw image urls back. Search for SCENES, not topics. LOOK at the images yourself before picking - that is the whole point of this tool - then set_slide_background with the winner. Costs no credits.
- Set the slideshow's post caption.
- Set one slide's background: a Pinterest url, a collection image, an avatar photo, any image url, or a solid color. Image picks are gated server-side (browser-displayable, 720px+ short side). The dashboard updates live.
- Replace one slide's text boxes (1-5 texts with placement top/center/bottom and role heading/subheading/body/cta - role sets the font size, positions are computed server-side exactly like the dashboard). Optionally mark isProductSlide.
v1.5.0
2026-07-15The casting brain traded cleverness for taste. Slideshow backgrounds now come from exactly two places, Pinterest and the collection you pinned, and nothing from the library is ever used unless you pinned it (via collectionId or a product's linked photos). In exchange the picker got much better eyes. Every slide auditions up to 12 candidates against a camera-roll rubric that rejects infographics, baked-in text, staged stock, brand-logo shots, and anything under 600px, and when an entire search comes back weak the judge can veto it and trigger one automatic re-search on a backup query. Generated variants now go through the same judged casting instead of picking at random.
- Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a vision judge casts each background from Pinterest + the user's collections. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a taste-tuned vision judge casts each background from the Pinterest results plus the project's pinned collection (weak batches trigger one automatic re-search). Collections are never used unless pinned via collectionId or a product's linked photos. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
- Pin a collection: its images join every slide's casting pool and the vision judge uses them where they fit (product slides prefer them). Other workspace collections still contend automatically by name. Must belong to the workspace.Pin a collection: its images join every slide's casting pool and the vision judge uses them where they fit (product slides prefer them). Pinning is the ONLY way the user's own images enter casting — unpinned collections never contend. Must belong to the workspace.
- List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — its images then contend for every slide and product slides prefer them. Call this BEFORE creating a slideshow that should feature the user's own images.List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — pinning is the ONLY way the user's own images enter a slideshow's casting (its images then contend for every slide, and product slides prefer them). Call this BEFORE creating a slideshow that should feature the user's own images.
v1.4.0
2026-07-12Agents can now see the workspace library. Two new tools, `list_collections` and `list_products`, surface the user's own image collections and registered products with real ids, so an agent can pin a collection (`create_slideshow` `collectionId`) or weave a product (`productId`) instead of hoping the pipeline guesses right. Behind the scenes the slideshow casting brain got smarter about the user's own images: products remember which collections hold their photos and auto-pin them on product slides, product-slide collection hints always survive the per-deck fetch budget, and image formats browsers cannot display (HEIC and friends) are filtered out of casting before they can ship as a black slide.
- List the workspace's image collections (the user's own saved images): id, name, image count. Pass an id as create_slideshow collectionId to pin that collection — its images then contend for every slide and product slides prefer them. Call this BEFORE creating a slideshow that should feature the user's own images.
- List the workspace's registered products: id, name, description, url. Pass an id as create_slideshow productId to weave that product into ONE slide in a soft peer-recommendation voice. Call this BEFORE creating a slideshow that should plug a product.
- Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | avatar | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
v1.3.0
2026-07-12Every made thing now hands you its door, and links read like English. Avatar drafts, approvals, and renames return `dashboardUrl` alongside the data, the same field slideshows already carry, and the generation poll now carries it on every check (not just at creation) so a job you come back to later still has a link. Every workspace gains a stable, human-readable `slug` (e.g. `client-beta`) that appears in those links instead of a raw id, so a pasted link says where it lands; you can target a workspace by slug, name, or id, and list/read responses now echo the resolved `workspace: {id, name, slug}` so an empty result is distinguishable from a filter that never matched. Links are canonical (production domain) and carry `ref=agent` so agent-driven visits are measurable.
- Create a TikTok photo slideshow from a prompt OR by remixing a TikTok/Instagram post url (exactly one). The server pipeline writes the slide copy, searches Pinterest, and a vision judge casts each background from Pinterest + the user's collections. Costs no credits. ASYNC: returns a gen_ id immediately; poll get_generation until terminal (typically 1-3 minutes), then read the result with get_slideshow. Free plan allows 1 project.
- Read a slideshow's full anatomy: every variant with status, caption, and per-slide texts + background image url + provenance (backgroundSource: ai | pinterest | collection | image). Use it to review what was generated; for the visually composed slides (text on image), send the user the dashboardUrl.
- List slideshow projects in the active workspace, latest activity first: id, name, variant count, whether one is still generating, and the dashboard url.
- Approve a draft avatar by its avatarId, promoting it into the library (optionally rename). Only approve drafts the USER chose to keep.Approve a draft avatar by its avatarId, promoting it into the library (optionally rename). Only approve drafts the USER chose to keep. Returns dashboardUrl for the saved avatar.
- Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved.Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved. Each draft carries dashboardUrl, the dashboard door to that draft.
- Check on an ASYNCHRONOUS generation you started, by its gen_ id: its normalized state and the finished asset urls once it succeeds. Poll until state is terminal (succeeded/failed/canceled). Avatars are created synchronously by create_avatar and are NOT polled here.Check on an ASYNCHRONOUS generation you started, by its gen_ id: its normalized state and the finished asset urls once it succeeds. Poll until state is terminal (succeeded/failed/canceled); slideshow generations typically take 1-3 minutes. Avatars are created synchronously by create_avatar and are NOT polled here.
- List recent ASYNC generations in the active workspace, newest first. Avatar creation is synchronous and never appears here; this feed serves async verticals as they ship. Optionally filter by kind or state.List recent ASYNC generations in the active workspace, newest first (slideshow creations appear here). Avatar creation is synchronous and never appears. Optionally filter by kind or state.
- List the workspaces this credential can act in, and which is active. Pass any listed id or exact name as the workspace parameter on workspace-scoped tools to act in that workspace.List the workspaces this credential can act in, and which is active. Each has an id, name, and stable slug. Pass any of them as the workspace parameter on workspace-scoped tools; the slug is what appears in dashboardUrl links.
v1.1.0
2026-07-11Spend attribution, workspace targeting, and a wider trait catalog. Your agent can now read the credit ledger behind the shared balance (`list_transactions`, with `mine: true` to isolate its own spend), aim any workspace-scoped tool at a specific workspace (`workspace`, by id or exact name), page through drafts, and see who created each avatar. The trait catalog gains ages 50s to 70+, gray and silver hair, traditional wear (Kurta, Sari, Sherwani, Hijab with modest outfit), Blazer, Messy tousled hair, and Gray-Blue eyes; none of these are ever rolled by the randomizer, so a "surprise me" avatar keeps the same register as before. Batch creation now samples a distinct scene per image, and every tool description was rewritten for zero ambiguity.
- The credit ledger behind get_credits, newest first: every charge, grant, and refund that moved the balance. Negative amount = spend. Entries made through the agent API carry attribution (which credential and client). On a shared team balance, pass mine: true to reconcile exactly what this credential spent.
- ADDED
create_avatarenum values added to traits.hairColor: Salt & Pepper, Gray, Silver, WhiteAvatars → - ADDED
create_avatarenum values added to traits.outfitStyle: Blazer, Kurta, Sari, Sherwani, Hijab with modest outfitAvatars → - Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining.Generate draft avatar(s) from appearance traits + an optional scene prompt. Returns drafts that are NOT saved to the library; the user must approve them. Any traits you omit are randomized. Costs credits per image; the result reports creditsSpent and creditsRemaining. Drafts are billed once at creation, never expire, and cost nothing to keep unapproved.
- Free-text scene / pose / mood. Anything that is NOT a fixed trait.Free-text scene / pose / mood. Anything that is NOT a fixed trait. Scene wishes are best effort, not guaranteed: view the returned image before presenting it.
- How many draft variations to generate (default 1).How many draft variations to generate (default 1). Every draft in a call shares this ONE trait spec; count gives look variations of the same persona, not distinct people. For distinct personas, make one call per persona.
- A name for each draft, index-aligned with count. YOU (the AI) should pick trait-appropriate names; omit to let the server auto-name.A name for each draft, index-aligned with count. YOU (the AI) should pick trait-appropriate names; omit to let the server auto-name. Fewer names than count is fine: the remaining drafts get server-generated names.
- Current spendable credit balance for this account.Current spendable credit balance for this account. On a team plan this is a live shared pool that teammates and their agents also draw from, so it can change between your calls; use list_transactions to attribute movements.
- Who am I, which workspace am I pointed at, and what does my credential allow. Call this first.Who am I, which workspace am I pointed at, and what does my credential allow. Call this first. credential.workspaceScope "all" means every workspace you can currently access (grantedWorkspaceIds stays empty); "listed" pins the credential to exactly grantedWorkspaceIds. Workspace-scoped tools accept a per-call workspace (id or exact name) to target any workspace within that grant.
- List draft avatars awaiting approval in the active workspace.List draft avatars awaiting approval in the active workspace, newest first (paginated).
- List recent generations in the active workspace, newest first. Optionally filter by kind or state.List recent ASYNC generations in the active workspace, newest first. Avatar creation is synchronous and never appears here; this feed serves async verticals as they ship. Optionally filter by kind or state.
- List the workspaces this credential can act in, and which is active.List the workspaces this credential can act in, and which is active. Pass any listed id or exact name as the workspace parameter on workspace-scoped tools to act in that workspace.