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.
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.