Tool tree
gradeNot graded
create_projectAction
Starts a new video campaign in the studio. Sets the campaign name, goal, target audience, platform, and visual style. Call this once at the very start of a new campaign, before any other studio tool. When SEED_DEMO=true (env), the studio hydrates from a pre-recorded manifest so the deployed live URL can show real Veo 3 + OpenAI artifacts without burning provider budget per click.
View tool JSON
{
"name": "create_project",
"kind": "act",
"impl": "imperative",
"description": "Starts a new video campaign in the studio. Sets the campaign name, goal, target audience, platform, and visual style. Call this once at the very start of a new campaign, before any other studio tool. When SEED_DEMO=true (env), the studio hydrates from a pre-recorded manifest so the deployed live URL can show real Veo 3 + OpenAI artifacts without burning provider budget per click.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Short, human-readable campaign name."
},
"goal": {
"type": "string",
"description": "What this video should accomplish, in plain language."
},
"audience": {
"type": "string",
"description": "Who the video is for."
},
"platform": {
"type": "string",
"enum": [
"instagram",
"youtube",
"tiktok",
"linkedin",
"generic"
],
"description": "Where this video will primarily be published."
},
"style": {
"type": "string",
"enum": [
"professional",
"casual",
"dramatic",
"playful",
"cinematic"
],
"description": "Overall creative tone for the campaign."
},
"targetDurationSeconds": {
"type": "number",
"description": "Approximate target length of the finished video, in seconds."
}
},
"required": [
"name",
"goal",
"audience",
"platform",
"style"
]
}
}generate_scriptAction
Scriptwriter agent: writes a beat-sheet video script (Hook → Pain → Promise → Proof → Objection → Payoff → CTA) as concrete, spoken narration lines powered by the project brief, platform, audience, and style. Each scene's description is a real VO line that feeds directly into Speechify TTS. Call after brand guidelines exist and before any visual or audio generation.
View tool JSON
{
"name": "generate_script",
"kind": "act",
"impl": "imperative",
"description": "Scriptwriter agent: writes a beat-sheet video script (Hook → Pain → Promise → Proof → Objection → Payoff → CTA) as concrete, spoken narration lines powered by the project brief, platform, audience, and style. Each scene's description is a real VO line that feeds directly into Speechify TTS. Call after brand guidelines exist and before any visual or audio generation.",
"inputSchema": {
"type": "object",
"properties": {
"sceneCount": {
"type": "number",
"description": "How many scenes/beats the script should have. Short-form platforms (Instagram, TikTok) work best at 5-7; YouTube and LinkedIn can take 8+."
},
"keyMessage": {
"type": "string",
"description": "The single most important idea the script must land (e.g. 'drive signups for an eco walking-shoe launch'). Falls back to the project brief goal."
}
},
"required": [
"sceneCount",
"keyMessage"
]
}
}create_storyboardAction
Graphic Designer agent: turns the existing script scenes into a storyboard by writing a concrete image-generation prompt for each scene. Call after generate_script and before generate_image.
View tool JSON
{
"name": "create_storyboard",
"kind": "act",
"impl": "imperative",
"description": "Graphic Designer agent: turns the existing script scenes into a storyboard by writing a concrete image-generation prompt for each scene. Call after generate_script and before generate_image.",
"inputSchema": {
"type": "object",
"properties": {
"visualStyleNotes": {
"type": "string",
"description": "Art-direction notes to apply across every scene."
}
},
"required": [
"visualStyleNotes"
]
}
}generate_imageAction
Graphic Designer agent: generates the still key visual for one scene from its storyboard prompt. Call once per scene after create_storyboard.
View tool JSON
{
"name": "generate_image",
"kind": "act",
"impl": "imperative",
"description": "Graphic Designer agent: generates the still key visual for one scene from its storyboard prompt. Call once per scene after create_storyboard.",
"inputSchema": {
"type": "object",
"properties": {
"sceneId": {
"type": "string",
"description": "The scene id, e.g. 'scene_1'."
},
"promptOverride": {
"type": "string",
"description": "Optional replacement prompt."
}
},
"required": [
"sceneId"
]
}
}text_to_videoAction
Motion Graphics agent: generates a short video clip for a scene from a text prompt.
View tool JSON
{
"name": "text_to_video",
"kind": "act",
"impl": "imperative",
"description": "Motion Graphics agent: generates a short video clip for a scene from a text prompt.",
"inputSchema": {
"type": "object",
"properties": {
"sceneId": {
"type": "string"
},
"durationSeconds": {
"type": "number",
"description": "Target clip length in seconds (2–10)."
},
"motionNotes": {
"type": "string"
}
},
"required": [
"sceneId",
"durationSeconds"
]
}
}image_to_videoAction
Motion Graphics agent: animates an existing scene key visual into a short video clip.
View tool JSON
{
"name": "image_to_video",
"kind": "act",
"impl": "imperative",
"description": "Motion Graphics agent: animates an existing scene key visual into a short video clip.",
"inputSchema": {
"type": "object",
"properties": {
"sceneId": {
"type": "string"
},
"durationSeconds": {
"type": "number",
"description": "Target clip length in seconds (2–10)."
},
"motionNotes": {
"type": "string",
"description": "Camera/motion direction, e.g. 'slow push in, parallax'."
}
},
"required": [
"sceneId",
"durationSeconds"
]
}
}text_to_speechAction
Voiceover agent: converts a scene's narration line into spoken audio.
View tool JSON
{
"name": "text_to_speech",
"kind": "act",
"impl": "imperative",
"description": "Voiceover agent: converts a scene's narration line into spoken audio.",
"inputSchema": {
"type": "object",
"properties": {
"sceneId": {
"type": "string"
},
"line": {
"type": "string",
"description": "The narration line to voice."
},
"voiceTone": {
"type": "string",
"enum": [
"warm",
"energetic",
"authoritative",
"calm",
"playful"
],
"description": "Vocal tone."
}
},
"required": [
"sceneId",
"line",
"voiceTone"
]
}
}write_captionAction
Copywriter agent: writes short-form on-screen text or a social caption for one scene.
View tool JSON
{
"name": "write_caption",
"kind": "act",
"impl": "imperative",
"description": "Copywriter agent: writes short-form on-screen text or a social caption for one scene.",
"inputSchema": {
"type": "object",
"properties": {
"sceneId": {
"type": "string"
},
"purpose": {
"type": "string",
"enum": [
"on_screen_text",
"post_caption",
"hook_line"
],
"description": "Type of copy."
}
},
"required": [
"sceneId",
"purpose"
]
}
}compose_videoAction
Video Editor agent: assembles all scene clips, narration, and captions into a single timeline.
View tool JSON
{
"name": "compose_video",
"kind": "act",
"impl": "imperative",
"description": "Video Editor agent: assembles all scene clips, narration, and captions into a single timeline.",
"inputSchema": {
"type": "object",
"properties": {
"transitionStyle": {
"type": "string",
"enum": [
"cut",
"crossfade",
"whip_pan",
"match_cut"
],
"description": "Style of transition between scenes."
}
},
"required": [
"transitionStyle"
]
}
}review_videoAction
Critic/QA agent. Does NOT create content. Reviews the composed video and returns APPROVED or NEEDS_REVISION with notes. Read-only.
View tool JSON
{
"name": "review_video",
"kind": "act",
"impl": "imperative",
"description": "Critic/QA agent. Does NOT create content. Reviews the composed video and returns APPROVED or NEEDS_REVISION with notes. Read-only.",
"inputSchema": {
"type": "object",
"properties": {
"checklistNotes": {
"type": "string"
}
}
}
}request_human_approvalAction
Pauses the campaign and asks the human to approve or reject before proceeding. The human veto: call it before marking a campaign complete, before anything would be published or sent externally, and any other time a specialist's output needs a human sign-off. Execution does not resume until the human responds. Use sparingly — this is a blocking checkpoint.
View tool JSON
{
"name": "request_human_approval",
"kind": "act",
"impl": "imperative",
"description": "Pauses the campaign and asks the human to approve or reject before proceeding. The human veto: call it before marking a campaign complete, before anything would be published or sent externally, and any other time a specialist's output needs a human sign-off. Execution does not resume until the human responds. Use sparingly — this is a blocking checkpoint.",
"inputSchema": {
"type": "object",
"properties": {
"summary": {
"type": "string",
"description": "One-line summary of what's being approved."
},
"detail": {
"type": "string",
"description": "Fuller context the human needs to decide."
}
},
"required": [
"summary",
"detail"
]
}
}get_project_roadmapAnswer
Project Manager agent. Does NOT create or judge content. Returns the full production roadmap and the current phase. Read-only; safe to call at any time.
View tool JSON
{
"name": "get_project_roadmap",
"kind": "answer",
"impl": "imperative",
"description": "Project Manager agent. Does NOT create or judge content. Returns the full production roadmap and the current phase. Read-only; safe to call at any time.",
"inputSchema": {
"type": "object",
"properties": {}
}
}get_project_statusAnswer
Project Manager agent. Does NOT create or judge content. Returns a snapshot of the current project: name, phase, per-scene asset completeness, and any open QA notes or pending approvals. Read-only; safe to call at any time, including before deciding what to do next.
View tool JSON
{
"name": "get_project_status",
"kind": "answer",
"impl": "imperative",
"description": "Project Manager agent. Does NOT create or judge content. Returns a snapshot of the current project: name, phase, per-scene asset completeness, and any open QA notes or pending approvals. Read-only; safe to call at any time, including before deciding what to do next.",
"inputSchema": {
"type": "object",
"properties": {}
}
}refine_sceneAction
Refines an existing scene from specific feedback and/or a list of property/value changes. Applied from the Critic/QA NEEDS_REVISION loop, or from a human asking for a targeted edit. Pass sceneId plus optional feedback (why it needs work) and a changes array covering one or more of: description, imagePrompt, caption, durationSeconds. When the scene has a key visual, the still is re-generated against the feedback.
View tool JSON
{
"name": "refine_scene",
"kind": "act",
"impl": "imperative",
"description": "Refines an existing scene from specific feedback and/or a list of property/value changes. Applied from the Critic/QA NEEDS_REVISION loop, or from a human asking for a targeted edit. Pass sceneId plus optional feedback (why it needs work) and a changes array covering one or more of: description, imagePrompt, caption, durationSeconds. When the scene has a key visual, the still is re-generated against the feedback.",
"inputSchema": {
"type": "object",
"properties": {
"sceneId": {
"type": "string",
"description": "The scene id, e.g. \"scene_2\"."
},
"feedback": {
"type": "string",
"description": "Why the scene needs refinement — this drives re-generation."
},
"changes": {
"type": "array",
"description": "Specific property/value edits to apply to the scene.",
"items": {
"type": "object",
"properties": {
"property": {
"type": "string",
"description": "One of: description, imagePrompt, caption, durationSeconds."
},
"value": {
"type": "string",
"description": "The new value."
}
}
}
}
},
"required": [
"sceneId"
]
}
}export_videoAction
Video Editor agent: confirms the composed video is ready to ship and reports what export would produce. With download=true an agent running in the browser triggers the actual file download. Without a real mp4 on disk the studio falls back to a per-scene slideshow manifest that the VideoPreview component stitches in-browser.
View tool JSON
{
"name": "export_video",
"kind": "act",
"impl": "imperative",
"description": "Video Editor agent: confirms the composed video is ready to ship and reports what export would produce. With download=true an agent running in the browser triggers the actual file download. Without a real mp4 on disk the studio falls back to a per-scene slideshow manifest that the VideoPreview component stitches in-browser.",
"inputSchema": {
"type": "object",
"properties": {
"download": {
"type": "boolean",
"description": "When true (browser-side only), trigger the actual file download."
}
}
}
}list_available_providersAnswer
Returns which generation providers are configured for each capability (image, tts, text-to-video, image-to-video, compose). Lets an external agent see whether the studio will call real APIs (OpenAI, fal.ai, Speechify, etc.) or fall back to deterministic placeholders under DEMO_MODE. Read-only.
View tool JSON
{
"name": "list_available_providers",
"kind": "answer",
"impl": "imperative",
"description": "Returns which generation providers are configured for each capability (image, tts, text-to-video, image-to-video, compose). Lets an external agent see whether the studio will call real APIs (OpenAI, fal.ai, Speechify, etc.) or fall back to deterministic placeholders under DEMO_MODE. Read-only.",
"inputSchema": {
"type": "object",
"properties": {}
}
}procedural_videoAction
Generates a real video file from a scene's still image by animating it with Ken Burns / parallax / pulse / glide / tilt-shift transforms and recording the result via MediaRecorder. Browser-only fallback used when external video providers (Veo, FAL, Luma, Runway, Replicate) are not reachable. Uploads the WebM to /public/assets/ and stores the public URL on scene.videoUrl so the scene plays as a real video, not a static image.
View tool JSON
{
"name": "procedural_video",
"kind": "act",
"impl": "imperative",
"description": "Generates a real video file from a scene's still image by animating it with Ken Burns / parallax / pulse / glide / tilt-shift transforms and recording the result via MediaRecorder. Browser-only fallback used when external video providers (Veo, FAL, Luma, Runway, Replicate) are not reachable. Uploads the WebM to /public/assets/ and stores the public URL on scene.videoUrl so the scene plays as a real video, not a static image.",
"inputSchema": {
"type": "object",
"properties": {
"sceneId": {
"type": "string",
"description": "ID of the scene to generate procedural video for. Must already have an imageUrl."
},
"pattern": {
"type": "string",
"enum": [
"kenBurns-in",
"kenBurns-out",
"parallax-drift",
"glide-up",
"pulse-zoom"
],
"description": "Ken Burns pattern. Default 'kenBurns-in'."
},
"logToActivity": {
"type": "boolean",
"description": "When true, log this call to the activity feed and update the motion-graphics agent status."
}
},
"required": [
"sceneId"
]
}
}