Initial release — OpenMontage: the first open-source agentic video production system

11 production pipelines, 47 tools, 124 agent skills.
Supports cloud APIs (fal.ai, OpenAI, ElevenLabs, Suno, HeyGen, Runway) and
free local providers (diffusers, Piper TTS, WAN 2.1, Hunyuan, CogVideo).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
calesthio
2026-03-29 08:25:17 -07:00
commit a3e735cc7a
1147 changed files with 240221 additions and 0 deletions
View File
+124
View File
@@ -0,0 +1,124 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "openmontage/tools/video_stitch",
"title": "Video Stitch Tool",
"description": "Multi-clip assembly tool with validation, transitions, and spatial layouts.",
"type": "object",
"required": ["operation"],
"properties": {
"operation": {
"type": "string",
"enum": ["validate", "stitch", "preview_stitch", "spatial"],
"description": "The operation to perform"
},
"clips": {
"type": "array",
"items": { "type": "string" },
"minItems": 1,
"description": "List of input video file paths"
},
"output_path": {
"type": "string",
"description": "Path for the output video file"
},
"transition": {
"type": "string",
"enum": ["cut", "crossfade", "fade"],
"default": "cut",
"description": "Transition type between clips. 'cut' = hard cut (concat demuxer), 'crossfade' = blend between clips, 'fade' = fade through black"
},
"transition_duration": {
"type": "number",
"minimum": 0.1,
"maximum": 5.0,
"default": 0.5,
"description": "Duration of the transition in seconds (ignored for 'cut')"
},
"auto_normalize": {
"type": "boolean",
"default": false,
"description": "Re-encode clips to a common format before concatenation if they have mismatched properties"
},
"target_resolution": {
"type": "string",
"pattern": "^\\d+x\\d+$",
"description": "Target resolution for normalization (e.g. '1920x1080'). Defaults to first clip's resolution."
},
"target_fps": {
"type": "integer",
"minimum": 1,
"maximum": 120,
"description": "Target frame rate for normalization. Defaults to first clip's FPS."
},
"codec": {
"type": "string",
"default": "libx264",
"description": "Video codec for encoding"
},
"crf": {
"type": "integer",
"minimum": 0,
"maximum": 51,
"default": 23,
"description": "Constant Rate Factor for quality (lower = better)"
},
"preset": {
"type": "string",
"enum": ["ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow"],
"default": "medium",
"description": "FFmpeg encoding preset"
},
"profile": {
"type": "string",
"description": "Media profile name from media_profiles.py (e.g. 'youtube_landscape', 'tiktok')"
},
"layout": {
"type": "string",
"enum": ["side_by_side", "vertical_stack", "picture_in_picture"],
"description": "Spatial layout for the 'spatial' operation"
},
"pip_position": {
"type": "string",
"enum": ["top_left", "top_right", "bottom_left", "bottom_right"],
"default": "bottom_right",
"description": "Corner position for picture-in-picture overlay"
},
"pip_scale": {
"type": "number",
"minimum": 0.1,
"maximum": 0.5,
"default": 0.3,
"description": "Scale of PiP overlay relative to base video dimensions"
},
"pip_margin": {
"type": "integer",
"minimum": 0,
"default": 10,
"description": "Margin in pixels for PiP overlay from edges"
},
"dry_run": {
"type": "boolean",
"default": false,
"description": "If true, return what would be done without executing"
}
},
"allOf": [
{
"if": { "properties": { "operation": { "const": "stitch" } } },
"then": { "required": ["clips"] }
},
{
"if": { "properties": { "operation": { "const": "validate" } } },
"then": { "required": ["clips"] }
},
{
"if": { "properties": { "operation": { "const": "preview_stitch" } } },
"then": { "required": ["clips"] }
},
{
"if": { "properties": { "operation": { "const": "spatial" } } },
"then": { "required": ["clips", "layout"] }
}
],
"additionalProperties": false
}