| { |
| "workflow_meta": { |
| "id": "video_editing_pipeline", |
| "name": "Video Editing Workflow", |
| "description": "Automated video editing pipeline node map, including pro/normal nodes" |
| }, |
| "nodes": [ |
| { |
| "id": "load_media", |
| "name": "Load Media", |
| "kind": "load_media", |
| "pro": false, |
| "description": "Loads and indexes input media. Entry point with no dependencies; required by all downstream operations.", |
| "dependencies": [], |
| "next_nodes": [ |
| "split_shots" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Automatic mode; skip: Skip mode; default: Default mode", |
| "default": "auto" |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "media", |
| "type": "List[Media]", |
| "description": "List of media objects with metadata" |
| } |
| ] |
| }, |
| { |
| "id": "search_media", |
| "name": "Search Media", |
| "kind": "search_media", |
| "pro": false, |
| "description": "Search media from external sources (e.g., Pexels).", |
| "dependencies": [], |
| "next_nodes": [ |
| "load_media" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Automatically search media from pexels; skip: skip search; default: skip search", |
| "default": "auto" |
| }, |
| { |
| "name": "search_keyword", |
| "type": "String", |
| "description": "Keywords of the media the user wants to obtain", |
| "default": "scenery" |
| }, |
| { |
| "name": "video_number", |
| "type": "Integer", |
| "description": "The number of videos the user wants to obtain", |
| "default": 5 |
| }, |
| { |
| "name": "photo_number", |
| "type": "Integer", |
| "description": "The number of images the user wants to obtain", |
| "default": 0 |
| }, |
| { |
| "name": "orientation", |
| "type": "Enum", |
| "options": [ |
| "landscape", |
| "portrait" |
| ], |
| "description": "landscape: wider horizontally; portrait: higher vertically", |
| "default": "landscape" |
| }, |
| { |
| "name": "min_video_duration", |
| "type": "Integer", |
| "description": "The shortest duration of footage requested by the user (seconds)", |
| "default": 1 |
| }, |
| { |
| "name": "max_video_duration", |
| "type": "Integer", |
| "description": "The longest duration of footage requested by the user (seconds)", |
| "default": 30 |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "media", |
| "type": "List[Media]", |
| "description": "Retrieved media objects" |
| } |
| ] |
| }, |
| { |
| "id": "split_shots", |
| "name": "Split Shots", |
| "kind": "split_shots", |
| "pro": false, |
| "description": "Automatically segment videos into shots based on scene changes; treat images as single shots.", |
| "dependencies": [ |
| "load_media" |
| ], |
| "next_nodes": [ |
| "understand_clips" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Automatically segment shots based on scene changes, treat images as single shots; skip: Do not segment shots; default: Use default segmentation method", |
| "default": "auto" |
| }, |
| { |
| "name": "min_shot_duration", |
| "type": "Integer", |
| "description": "Segmented shots must not be shorter than this duration (milliseconds)", |
| "default": 1000 |
| }, |
| { |
| "name": "max_shot_duration", |
| "type": "Integer", |
| "description": "If a single shot exceeds this duration, force segmentation (milliseconds)", |
| "default": 10000 |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "clip_captions", |
| "type": "List[Clip]", |
| "description": "List of clips after splitting shots" |
| }, |
| { |
| "name": "overall", |
| "type": "Dict[String,String]", |
| "description": "Overall summary/metadata (key-value)" |
| } |
| ] |
| }, |
| { |
| "id": "understand_clips", |
| "name": "Understand Clips", |
| "kind": "understand_clips", |
| "pro": false, |
| "description": "Generate descriptions/captions for each clip based on media content.", |
| "dependencies": [ |
| "split_shots" |
| ], |
| "next_nodes": [ |
| "filter_clips", |
| "recommend_script_template" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Generate descriptions based on media content; skip: Do not generate descriptions; default: Use default description generation method", |
| "default": "auto" |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "clip_captions", |
| "type": "List[Clip]", |
| "description": "List of clips after understanding clips" |
| }, |
| { |
| "name": "overall", |
| "type": "Dict[String,String]", |
| "description": "Overall summary/metadata (key-value)" |
| } |
| ] |
| }, |
| { |
| "id": "filter_clips", |
| "name": "Filter Clips", |
| "kind": "filter_clips", |
| "pro": false, |
| "description": "Filter clips based on user requirements.", |
| "dependencies": [ |
| "understand_clips" |
| ], |
| "next_nodes": [ |
| "group_clips" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Filter clips based on user requirements; skip: Skip filtering; default: Use default filtering method", |
| "default": "auto" |
| }, |
| { |
| "name": "user_request", |
| "type": "String", |
| "description": "User's requirements for clip filtering; if none provided, formulate one based on materials and other editing requirements.", |
| "default": "" |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "clip_captions", |
| "type": "List[Clip]", |
| "description": "List of clips" |
| }, |
| { |
| "name": "overall", |
| "type": "Dict[String,String]", |
| "description": "Overall summary/metadata (key-value)" |
| } |
| ] |
| }, |
| { |
| "id": "group_clips", |
| "name": "Group Clips", |
| "kind": "group_clips", |
| "pro": false, |
| "description": "Organize clips into narrative groups and arrange playback order.", |
| "dependencies": [ |
| "filter_clips" |
| ], |
| "next_nodes": [ |
| "generate_script" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Organize clips in a logical order based on narrative flow and user's sequencing requirements; skip: Skip sorting; default: Use default ordering method", |
| "default": "auto" |
| }, |
| { |
| "name": "user_request", |
| "type": "String", |
| "description": "User's requirements for media organization order; if none provided, arrange in a logical narrative sequence following standard conventions.", |
| "default": "" |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "groups", |
| "type": "List[GroupClips]", |
| "description": "List of clip groups with ordering and summaries" |
| } |
| ] |
| }, |
| { |
| "id": "generate_script", |
| "name": "Generate Script", |
| "kind": "generate_script", |
| "pro": false, |
| "description": "Generate script/subtitles for each group; supports passing a custom_script override (subtitle_units removed).", |
| "dependencies": [ |
| "group_clips" |
| ], |
| "next_nodes": [ |
| "generate_voiceover", |
| "recommend_text" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Generate appropriate script based on media content and user's script requirements; skip: Skip, do not add subtitles; default: Use default script", |
| "default": "auto" |
| }, |
| { |
| "name": "user_request", |
| "type": "String", |
| "description": "User's requirements for the script.", |
| "default": "" |
| }, |
| { |
| "name": "custom_script", |
| "type": "Dict[String,Any]", |
| "description": "If user has specific character-level editing requirements for script/title, pass the edited custom script and title through this parameter. Format should be based on the original script generation output format but with the subtitle_units field removed. In this case, mode must use `auto`, other modes are prohibited.", |
| "default": {} |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "group_scripts", |
| "type": "List[GroupScript]", |
| "description": "Group-level script content including subtitle units" |
| }, |
| { |
| "name": "title", |
| "type": "Optional[String]", |
| "description": "Optional generated title" |
| } |
| ] |
| }, |
| { |
| "id": "recommend_script_template", |
| "name": "Recommend Script Template", |
| "kind": "recommend_script_template", |
| "pro": false, |
| "description": "Recommend/select a copywriting template based on material content and user's requirements. (Output schema not defined in the provided schema file.)", |
| "dependencies": [ |
| "understand_clips" |
| ], |
| "next_nodes": [], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Select an appropriate copywriting template based on the material content and user's requirements for voiceover style; skip: Skip;", |
| "default": "auto" |
| }, |
| { |
| "name": "user_request", |
| "type": "String", |
| "description": "User's specific requirements for the script style.", |
| "default": "" |
| }, |
| { |
| "name": "filter_include", |
| "type": "Dict[String,List[String]]", |
| "description": "Positive filter conditions. Multiple dimensions are combined with AND, multiple values within the same dimension are combined with OR. Supported dimensions: tags (one or more of [Life, Food, Beauty, Entertainment, Travel, Tech, Business, Vehicle, Health, Family, Pets, Knowledge]).", |
| "default": {} |
| }, |
| { |
| "name": "filter_exclude", |
| "type": "Dict[String,List[String]]", |
| "description": "Negative filter conditions. Items matching these conditions will be excluded. Supported dimensions: tags, id.", |
| "default": {} |
| } |
| ], |
| "output_schema": [] |
| }, |
| { |
| "id": "generate_voiceover", |
| "name": "Generate Voiceover", |
| "kind": "generate_voiceover", |
| "pro": false, |
| "description": "Generate voiceover/narration items (e.g., TTS) for each group.", |
| "dependencies": [ |
| "generate_script" |
| ], |
| "next_nodes": [ |
| "select_bgm", |
| "plan_timeline" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Generate appropriate voiceover based on media content and user's voice requirements; skip: Skip voiceover; default: Use default voiceover", |
| "default": "auto" |
| }, |
| { |
| "name": "user_request", |
| "type": "String", |
| "description": "User's requirements for voiceover.", |
| "default": "" |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "voiceover", |
| "type": "List[Voiceover]", |
| "description": "Voiceover list" |
| } |
| ] |
| }, |
| { |
| "id": "select_bgm", |
| "name": "Select BGM", |
| "kind": "select_bgm", |
| "pro": false, |
| "description": "Select appropriate background music (BGM) based on material content and user requirements; supports include/exclude filters.", |
| "dependencies": [ |
| "generate_script" |
| ], |
| "next_nodes": [ |
| "recommend_transition", |
| "plan_timeline" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Select appropriate music based on media content and user's music requirements; skip: Do not use music; default: Use default music", |
| "default": "auto" |
| }, |
| { |
| "name": "user_request", |
| "type": "String", |
| "description": "User's requirements for background music.", |
| "default": "" |
| }, |
| { |
| "name": "filter_include", |
| "type": "Dict[String,List[Union[String,Integer]]]", |
| "description": "Positive filter conditions. Supported dimensions: mood [Dynamic, Chill, Happy, Sorrow, Romantic, Calm, Excited, Healing, Inspirational]; scene [Vlog, Travel, Relaxing, Emotion, Transition, Outdoor, Cafe, Evening, Scenery, Food, Date, Club]; genre [Pop, BGM, Electronic, R&B/Soul, Hip Hop/Rap, Rock, Jazz, Folk, Classical, Chinese Style]; lang [bgm, en, zh, ko, ja]; id (int).", |
| "default": {} |
| }, |
| { |
| "name": "filter_exclude", |
| "type": "Dict[String,List[Union[String,Integer]]]", |
| "description": "Negative filter conditions. Items matching these conditions will be excluded. Supported dimensions: mood, scene, genre, lang, id.", |
| "default": {} |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "bgm", |
| "type": "List[BGM]", |
| "description": "BGM list" |
| } |
| ] |
| }, |
| { |
| "id": "recommend_transition", |
| "name": "Recommend Transition", |
| "kind": "recommend_transition", |
| "pro": false, |
| "description": "Recommend transitions (e.g., fade in/out) at beginning and end.", |
| "dependencies": [ |
| "select_bgm" |
| ], |
| "next_nodes": [ |
| "render_video" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: add fade in and fade out transitions at beginning and end; skip: Do not use transitions; default: Use default transitions", |
| "default": "auto" |
| }, |
| { |
| "name": "duration", |
| "type": "Integer", |
| "description": "Duration of the transition in milliseconds", |
| "default": 1000 |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "description": "auto / skip / default mode (output model is BaseInput)" |
| } |
| ] |
| }, |
| { |
| "id": "recommend_text", |
| "name": "Recommend Text", |
| "kind": "recommend_text", |
| "pro": false, |
| "description": "Recommend subtitle font style/color based on user's requirements; supports include filters.", |
| "dependencies": [ |
| "generate_script" |
| ], |
| "next_nodes": [ |
| "render_video" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Select appropriate font style and color based on user's subtitle font style requirements; default: Use default font", |
| "default": "auto" |
| }, |
| { |
| "name": "user_request", |
| "type": "String", |
| "description": "User's requirements for font style", |
| "default": "" |
| }, |
| { |
| "name": "filter_include", |
| "type": "Dict[String,List[Union[String,Integer]]]", |
| "description": "Positive filter conditions. Supported dimensions: class [Creative, Handwriting, Calligraphy, Basic].", |
| "default": {} |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "description": "auto / skip / default mode (output model is BaseInput)" |
| } |
| ] |
| }, |
| { |
| "id": "plan_timeline", |
| "name": "Plan Timeline", |
| "kind": "plan_timeline", |
| "pro": false, |
| "description": "Plan timeline tracks for video, subtitles, voiceover, and BGM; optionally sync transitions with BGM beats.", |
| "dependencies": [ |
| "group_clips", |
| "generate_script", |
| "generate_voiceover", |
| "select_bgm" |
| ], |
| "next_nodes": [ |
| "render_video" |
| ], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Automatic mode; skip: Skip mode; default: Default mode", |
| "default": "auto" |
| }, |
| { |
| "name": "use_beats", |
| "type": "Boolean", |
| "description": "Whether clip transitions should sync with BGM beats", |
| "default": true |
| } |
| ], |
| "output_schema": [ |
| { |
| "name": "tracks", |
| "type": "List[TimelineTracks]", |
| "description": "Timeline track collection" |
| } |
| ] |
| }, |
| { |
| "id": "render_video", |
| "name": "Render Video", |
| "kind": "render_video", |
| "pro": false, |
| "description": "Render/export the final video with canvas, subtitle, audio, and encoding parameters. (Output schema not defined in the provided schema file.)", |
| "dependencies": [ |
| "plan_timeline" |
| ], |
| "next_nodes": [], |
| "input_schema": [ |
| { |
| "name": "mode", |
| "type": "Enum", |
| "options": [ |
| "auto", |
| "skip", |
| "default" |
| ], |
| "description": "auto: Automatic mode; skip: Skip mode; default: Default mode", |
| "default": "auto" |
| }, |
| { |
| "name": "aspect_ratio", |
| "type": "Optional[String]", |
| "description": "Canvas aspect ratio override: one of 16:9, 4:3, 1:1, 3:4, 9:16; auto if unset.", |
| "default": null |
| }, |
| { |
| "name": "output_max_dimension_px", |
| "type": "Optional[Integer]", |
| "description": "Maximum output size in pixels (longest side); defaults to 1080 and works with the aspect ratio.", |
| "default": null |
| }, |
| { |
| "name": "clip_compose_mode", |
| "type": "String", |
| "description": "How to fit media into the canvas: 'padding' keeps aspect ratio and fills empty areas; 'crop' center-crops media to match the canvas aspect ratio.", |
| "default": "crop" |
| }, |
| { |
| "name": "bg_color", |
| "type": "Tuple[Integer,Integer,Integer] | List[Integer] | Null", |
| "description": "Background color for canvas padding, specified as an (R, G, B) tuple (no alpha channel).", |
| "default": [ |
| 0, |
| 0, |
| 0 |
| ] |
| }, |
| { |
| "name": "crf", |
| "type": "Integer", |
| "description": "CRF value (10–30), lower = better quality, larger file", |
| "default": 23 |
| }, |
| { |
| "name": "font_color", |
| "type": "Tuple[Integer,Integer,Integer,Integer]", |
| "description": "Font color, RGBA format (R, G, B, A), values range 0-255", |
| "default": [ |
| 255, |
| 255, |
| 255, |
| 255 |
| ] |
| }, |
| { |
| "name": "font_size", |
| "type": "Integer", |
| "description": "Font size in pixels. Recommended range: 28–120.", |
| "default": 40 |
| }, |
| { |
| "name": "margin_bottom", |
| "type": "Integer", |
| "description": "Bottom margin for subtitles in pixels. Defaults to 80; valid range: 40–600.", |
| "default": 80 |
| }, |
| { |
| "name": "stroke_width", |
| "type": "Integer", |
| "description": "Text stroke width (px), typically 0–8", |
| "default": 2 |
| }, |
| { |
| "name": "stroke_color", |
| "type": "Tuple[Integer,Integer,Integer,Integer]", |
| "description": "Text stroke color in RGBA format", |
| "default": [ |
| 0, |
| 0, |
| 0, |
| 255 |
| ] |
| }, |
| { |
| "name": "bgm_volume_scale", |
| "type": "Float", |
| "description": "Background music volume multiplier, range 0.0–3.0 (1.0 = default volume)", |
| "default": 1.0 |
| }, |
| { |
| "name": "tts_volume_scale", |
| "type": "Float", |
| "description": "TTS volume multiplier, range 0.0–3.0 (1.0 = default volume)", |
| "default": 1.0 |
| }, |
| { |
| "name": "include_video_audio", |
| "type": "Boolean", |
| "description": "Whether to include the original video audio track", |
| "default": false |
| } |
| ], |
| "output_schema": [] |
| } |
| ] |
| } |
|
|