venice-video-harness 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/LICENSE +21 -0
- package/README.md +598 -0
- package/dist/assembly/manifest-builder.d.ts +8 -0
- package/dist/assembly/manifest-builder.d.ts.map +1 -0
- package/dist/assembly/manifest-builder.js +196 -0
- package/dist/assembly/manifest-builder.js.map +1 -0
- package/dist/assembly/remotion-scaffold.d.ts +14 -0
- package/dist/assembly/remotion-scaffold.d.ts.map +1 -0
- package/dist/assembly/remotion-scaffold.js +292 -0
- package/dist/assembly/remotion-scaffold.js.map +1 -0
- package/dist/assembly/types.d.ts +67 -0
- package/dist/assembly/types.d.ts.map +1 -0
- package/dist/assembly/types.js +5 -0
- package/dist/assembly/types.js.map +1 -0
- package/dist/characters/describer.d.ts +32 -0
- package/dist/characters/describer.d.ts.map +1 -0
- package/dist/characters/describer.js +309 -0
- package/dist/characters/describer.js.map +1 -0
- package/dist/characters/extractor.d.ts +27 -0
- package/dist/characters/extractor.d.ts.map +1 -0
- package/dist/characters/extractor.js +274 -0
- package/dist/characters/extractor.js.map +1 -0
- package/dist/characters/reference-manager.d.ts +95 -0
- package/dist/characters/reference-manager.d.ts.map +1 -0
- package/dist/characters/reference-manager.js +346 -0
- package/dist/characters/reference-manager.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +310 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +66 -0
- package/dist/config.js.map +1 -0
- package/dist/editing/aligner.d.ts +44 -0
- package/dist/editing/aligner.d.ts.map +1 -0
- package/dist/editing/aligner.js +201 -0
- package/dist/editing/aligner.js.map +1 -0
- package/dist/editing/edl.d.ts +45 -0
- package/dist/editing/edl.d.ts.map +1 -0
- package/dist/editing/edl.js +133 -0
- package/dist/editing/edl.js.map +1 -0
- package/dist/editing/overlays.d.ts +97 -0
- package/dist/editing/overlays.d.ts.map +1 -0
- package/dist/editing/overlays.js +41 -0
- package/dist/editing/overlays.js.map +1 -0
- package/dist/editing/packer.d.ts +52 -0
- package/dist/editing/packer.d.ts.map +1 -0
- package/dist/editing/packer.js +170 -0
- package/dist/editing/packer.js.map +1 -0
- package/dist/editing/providers/whisper-cpp.d.ts +32 -0
- package/dist/editing/providers/whisper-cpp.d.ts.map +1 -0
- package/dist/editing/providers/whisper-cpp.js +239 -0
- package/dist/editing/providers/whisper-cpp.js.map +1 -0
- package/dist/editing/render.d.ts +36 -0
- package/dist/editing/render.d.ts.map +1 -0
- package/dist/editing/render.js +227 -0
- package/dist/editing/render.js.map +1 -0
- package/dist/editing/self-eval.d.ts +48 -0
- package/dist/editing/self-eval.d.ts.map +1 -0
- package/dist/editing/self-eval.js +293 -0
- package/dist/editing/self-eval.js.map +1 -0
- package/dist/editing/silence.d.ts +76 -0
- package/dist/editing/silence.d.ts.map +1 -0
- package/dist/editing/silence.js +189 -0
- package/dist/editing/silence.js.map +1 -0
- package/dist/editing/types.d.ts +178 -0
- package/dist/editing/types.d.ts.map +1 -0
- package/dist/editing/types.js +13 -0
- package/dist/editing/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +12 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +78 -0
- package/dist/interactive.js.map +1 -0
- package/dist/mini-drama/assembler.d.ts +61 -0
- package/dist/mini-drama/assembler.d.ts.map +1 -0
- package/dist/mini-drama/assembler.js +466 -0
- package/dist/mini-drama/assembler.js.map +1 -0
- package/dist/mini-drama/audio-mix.d.ts +65 -0
- package/dist/mini-drama/audio-mix.d.ts.map +1 -0
- package/dist/mini-drama/audio-mix.js +118 -0
- package/dist/mini-drama/audio-mix.js.map +1 -0
- package/dist/mini-drama/cli.d.ts +3 -0
- package/dist/mini-drama/cli.d.ts.map +1 -0
- package/dist/mini-drama/cli.js +2869 -0
- package/dist/mini-drama/cli.js.map +1 -0
- package/dist/mini-drama/fcpxml-export.d.ts +2 -0
- package/dist/mini-drama/fcpxml-export.d.ts.map +1 -0
- package/dist/mini-drama/fcpxml-export.js +5 -0
- package/dist/mini-drama/fcpxml-export.js.map +1 -0
- package/dist/mini-drama/generation-planner.d.ts +24 -0
- package/dist/mini-drama/generation-planner.d.ts.map +1 -0
- package/dist/mini-drama/generation-planner.js +304 -0
- package/dist/mini-drama/generation-planner.js.map +1 -0
- package/dist/mini-drama/location-generator.d.ts +23 -0
- package/dist/mini-drama/location-generator.d.ts.map +1 -0
- package/dist/mini-drama/location-generator.js +144 -0
- package/dist/mini-drama/location-generator.js.map +1 -0
- package/dist/mini-drama/music-cues.d.ts +96 -0
- package/dist/mini-drama/music-cues.d.ts.map +1 -0
- package/dist/mini-drama/music-cues.js +332 -0
- package/dist/mini-drama/music-cues.js.map +1 -0
- package/dist/mini-drama/panel-fixer.d.ts +12 -0
- package/dist/mini-drama/panel-fixer.d.ts.map +1 -0
- package/dist/mini-drama/panel-fixer.js +319 -0
- package/dist/mini-drama/panel-fixer.js.map +1 -0
- package/dist/mini-drama/prompt-builder.d.ts +149 -0
- package/dist/mini-drama/prompt-builder.d.ts.map +1 -0
- package/dist/mini-drama/prompt-builder.js +722 -0
- package/dist/mini-drama/prompt-builder.js.map +1 -0
- package/dist/mini-drama/reference-slots.d.ts +31 -0
- package/dist/mini-drama/reference-slots.d.ts.map +1 -0
- package/dist/mini-drama/reference-slots.js +161 -0
- package/dist/mini-drama/reference-slots.js.map +1 -0
- package/dist/mini-drama/shot-paths.d.ts +77 -0
- package/dist/mini-drama/shot-paths.d.ts.map +1 -0
- package/dist/mini-drama/shot-paths.js +101 -0
- package/dist/mini-drama/shot-paths.js.map +1 -0
- package/dist/mini-drama/storyboard-reference-generator.d.ts +47 -0
- package/dist/mini-drama/storyboard-reference-generator.d.ts.map +1 -0
- package/dist/mini-drama/storyboard-reference-generator.js +293 -0
- package/dist/mini-drama/storyboard-reference-generator.js.map +1 -0
- package/dist/mini-drama/subtitle-generator.d.ts +12 -0
- package/dist/mini-drama/subtitle-generator.d.ts.map +1 -0
- package/dist/mini-drama/subtitle-generator.js +139 -0
- package/dist/mini-drama/subtitle-generator.js.map +1 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts +3 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.js +150 -0
- package/dist/mini-drama/timeline-export/davinci-fcpxml.js.map +1 -0
- package/dist/mini-drama/timeline-export/fcpxml.d.ts +11 -0
- package/dist/mini-drama/timeline-export/fcpxml.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/fcpxml.js +140 -0
- package/dist/mini-drama/timeline-export/fcpxml.js.map +1 -0
- package/dist/mini-drama/timeline-export/index.d.ts +13 -0
- package/dist/mini-drama/timeline-export/index.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/index.js +26 -0
- package/dist/mini-drama/timeline-export/index.js.map +1 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts +3 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.js +211 -0
- package/dist/mini-drama/timeline-export/premiere-xmeml.js.map +1 -0
- package/dist/mini-drama/timeline-export/probe.d.ts +53 -0
- package/dist/mini-drama/timeline-export/probe.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/probe.js +89 -0
- package/dist/mini-drama/timeline-export/probe.js.map +1 -0
- package/dist/mini-drama/timeline-export/types.d.ts +57 -0
- package/dist/mini-drama/timeline-export/types.d.ts.map +1 -0
- package/dist/mini-drama/timeline-export/types.js +14 -0
- package/dist/mini-drama/timeline-export/types.js.map +1 -0
- package/dist/mini-drama/video-generator.d.ts +22 -0
- package/dist/mini-drama/video-generator.d.ts.map +1 -0
- package/dist/mini-drama/video-generator.js +1305 -0
- package/dist/mini-drama/video-generator.js.map +1 -0
- package/dist/mini-drama/voice-reference.d.ts +42 -0
- package/dist/mini-drama/voice-reference.d.ts.map +1 -0
- package/dist/mini-drama/voice-reference.js +170 -0
- package/dist/mini-drama/voice-reference.js.map +1 -0
- package/dist/output/html-renderer.d.ts +2 -0
- package/dist/output/html-renderer.d.ts.map +1 -0
- package/dist/output/html-renderer.js +37 -0
- package/dist/output/html-renderer.js.map +1 -0
- package/dist/parsers/fountain-parser.d.ts +34 -0
- package/dist/parsers/fountain-parser.d.ts.map +1 -0
- package/dist/parsers/fountain-parser.js +71 -0
- package/dist/parsers/fountain-parser.js.map +1 -0
- package/dist/parsers/pdf-parser.d.ts +24 -0
- package/dist/parsers/pdf-parser.d.ts.map +1 -0
- package/dist/parsers/pdf-parser.js +237 -0
- package/dist/parsers/pdf-parser.js.map +1 -0
- package/dist/parsers/scene-extractor.d.ts +41 -0
- package/dist/parsers/scene-extractor.d.ts.map +1 -0
- package/dist/parsers/scene-extractor.js +400 -0
- package/dist/parsers/scene-extractor.js.map +1 -0
- package/dist/series/manager.d.ts +64 -0
- package/dist/series/manager.d.ts.map +1 -0
- package/dist/series/manager.js +282 -0
- package/dist/series/manager.js.map +1 -0
- package/dist/series/types.d.ts +641 -0
- package/dist/series/types.d.ts.map +1 -0
- package/dist/series/types.js +304 -0
- package/dist/series/types.js.map +1 -0
- package/dist/storyboard/assembler.d.ts +134 -0
- package/dist/storyboard/assembler.d.ts.map +1 -0
- package/dist/storyboard/assembler.js +319 -0
- package/dist/storyboard/assembler.js.map +1 -0
- package/dist/storyboard/prompt-builder.d.ts +113 -0
- package/dist/storyboard/prompt-builder.d.ts.map +1 -0
- package/dist/storyboard/prompt-builder.js +578 -0
- package/dist/storyboard/prompt-builder.js.map +1 -0
- package/dist/storyboard/shot-planner.d.ts +34 -0
- package/dist/storyboard/shot-planner.d.ts.map +1 -0
- package/dist/storyboard/shot-planner.js +446 -0
- package/dist/storyboard/shot-planner.js.map +1 -0
- package/dist/user-config.d.ts +15 -0
- package/dist/user-config.d.ts.map +1 -0
- package/dist/user-config.js +103 -0
- package/dist/user-config.js.map +1 -0
- package/dist/venice/audio-preflight.d.ts +80 -0
- package/dist/venice/audio-preflight.d.ts.map +1 -0
- package/dist/venice/audio-preflight.js +142 -0
- package/dist/venice/audio-preflight.js.map +1 -0
- package/dist/venice/audio.d.ts +88 -0
- package/dist/venice/audio.d.ts.map +1 -0
- package/dist/venice/audio.js +234 -0
- package/dist/venice/audio.js.map +1 -0
- package/dist/venice/client.d.ts +86 -0
- package/dist/venice/client.d.ts.map +1 -0
- package/dist/venice/client.js +375 -0
- package/dist/venice/client.js.map +1 -0
- package/dist/venice/edit.d.ts +57 -0
- package/dist/venice/edit.d.ts.map +1 -0
- package/dist/venice/edit.js +100 -0
- package/dist/venice/edit.js.map +1 -0
- package/dist/venice/generate.d.ts +47 -0
- package/dist/venice/generate.d.ts.map +1 -0
- package/dist/venice/generate.js +150 -0
- package/dist/venice/generate.js.map +1 -0
- package/dist/venice/image-bytes.d.ts +26 -0
- package/dist/venice/image-bytes.d.ts.map +1 -0
- package/dist/venice/image-bytes.js +101 -0
- package/dist/venice/image-bytes.js.map +1 -0
- package/dist/venice/models.d.ts +143 -0
- package/dist/venice/models.d.ts.map +1 -0
- package/dist/venice/models.js +984 -0
- package/dist/venice/models.js.map +1 -0
- package/dist/venice/multi-edit.d.ts +40 -0
- package/dist/venice/multi-edit.d.ts.map +1 -0
- package/dist/venice/multi-edit.js +97 -0
- package/dist/venice/multi-edit.js.map +1 -0
- package/dist/venice/provenance.d.ts +66 -0
- package/dist/venice/provenance.d.ts.map +1 -0
- package/dist/venice/provenance.js +151 -0
- package/dist/venice/provenance.js.map +1 -0
- package/dist/venice/recipe.d.ts +69 -0
- package/dist/venice/recipe.d.ts.map +1 -0
- package/dist/venice/recipe.js +103 -0
- package/dist/venice/recipe.js.map +1 -0
- package/dist/venice/rejection.d.ts +63 -0
- package/dist/venice/rejection.d.ts.map +1 -0
- package/dist/venice/rejection.js +111 -0
- package/dist/venice/rejection.js.map +1 -0
- package/dist/venice/seedance-preflight.d.ts +38 -0
- package/dist/venice/seedance-preflight.d.ts.map +1 -0
- package/dist/venice/seedance-preflight.js +29 -0
- package/dist/venice/seedance-preflight.js.map +1 -0
- package/dist/venice/types.d.ts +212 -0
- package/dist/venice/types.d.ts.map +1 -0
- package/dist/venice/types.js +9 -0
- package/dist/venice/types.js.map +1 -0
- package/dist/venice/video.d.ts +77 -0
- package/dist/venice/video.d.ts.map +1 -0
- package/dist/venice/video.js +163 -0
- package/dist/venice/video.js.map +1 -0
- package/dist/venice/voices.d.ts +40 -0
- package/dist/venice/voices.d.ts.map +1 -0
- package/dist/venice/voices.js +194 -0
- package/dist/venice/voices.js.map +1 -0
- package/package.json +79 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 2.4.0 — 2026-07-31
|
|
4
|
+
|
|
5
|
+
First standalone CLI release.
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Global `venice-video` command that runs without Cursor, Claude Code, OpenCode, MCP, or another agent host.
|
|
10
|
+
- `venice-video setup` for validated API-key and workspace configuration.
|
|
11
|
+
- `venice-video doctor` plus configuration inspection and cleanup commands.
|
|
12
|
+
- Film-first `venice-video new` wizard. Film projects may be any length.
|
|
13
|
+
- Explicit project workspaces instead of relying on the current directory.
|
|
14
|
+
- Resumable episode production with a standalone vision-QA approval gate.
|
|
15
|
+
- Importable TypeScript package surface for the Venice client, model registry, video generation, and series management.
|
|
16
|
+
- Packed-artifact tests covering setup, key masking, private file permissions, and Film creation.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Video retrieval now uses the configured Venice client instead of reading the environment directly.
|
|
21
|
+
- Sharp updated to 0.35.3 to resolve inherited 2026 libvips vulnerabilities.
|
|
22
|
+
- npm artifacts are restricted to compiled output, documentation, and the license.
|
|
23
|
+
|
|
24
|
+
### Compatibility
|
|
25
|
+
|
|
26
|
+
- Existing `video-harness` and `storyboard` executable aliases remain available.
|
|
27
|
+
- Repository `.env` and `VENICE_API_KEY` workflows remain supported.
|
|
28
|
+
- Agent orchestration files remain in the repository but are not included in the npm package.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jordan Urbs and Venice
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
# Venice Video Harness
|
|
2
|
+
|
|
3
|
+
A standalone, Venice-optimized CLI for **consistency-first video creation** at any length.
|
|
4
|
+
|
|
5
|
+
Install it, enter a Venice API key, and create films directly from the terminal. No coding agent, IDE extension, or MCP host is required. The same repository also includes optional orchestration material for agent-driven workflows.
|
|
6
|
+
|
|
7
|
+
Use it for:
|
|
8
|
+
|
|
9
|
+
- **Character-consistent video projects** (any genre, any length)
|
|
10
|
+
- **Visual-style-locked series or campaigns**
|
|
11
|
+
- **Storyboard-to-video workflows**
|
|
12
|
+
- **Short-form and long-form narrative content** (mini-dramas, documentaries, explainers)
|
|
13
|
+
- **Branded cinematic sequences, trailers, and teasers**
|
|
14
|
+
- **Recurring-character social series**
|
|
15
|
+
- **Any multi-shot Venice workflow where continuity matters**
|
|
16
|
+
- **Text-first editing of existing footage** — transcribe sources with local whisper.cpp, read the 12KB pack, propose a cut, render with 30ms audio fades, then self-eval at every cut boundary. Inspired by [browser-use/video-use](https://github.com/browser-use/video-use).
|
|
17
|
+
|
|
18
|
+
## What This Is
|
|
19
|
+
|
|
20
|
+
Most Venice integrations are thin wrappers around API calls. This package is the higher-level production layer:
|
|
21
|
+
|
|
22
|
+
- **Standalone `venice-video` CLI** with setup, diagnostics, project creation, generation, QA, assembly, and export commands
|
|
23
|
+
- **Direct Venice API client** with retries, rate limiting, deprecation warnings, and async media polling
|
|
24
|
+
- **Persistent project state** for characters, locations, episodes, references, recipes, and provenance
|
|
25
|
+
- **Comprehensive model registry** covering Venice video, image, audio, and music models
|
|
26
|
+
- **Optional agent orchestration** in `AGENTS.md` and `.claude/` for users who want natural-language operation
|
|
27
|
+
|
|
28
|
+
## Supported Venice Models (April 2026)
|
|
29
|
+
|
|
30
|
+
### Video Models
|
|
31
|
+
|
|
32
|
+
Live catalog as of **2026-05-20** (synced against `GET /api/v1/models?type=video` — 103 entries). Families the harness routes to today; private / `-video-to-video` / `-extend-video` variants exist in the live catalog but aren't surfaced here.
|
|
33
|
+
|
|
34
|
+
| Family | Image-to-Video | Text-to-Video | Max Duration | Audio | Special Features |
|
|
35
|
+
|--------|---------------|---------------|-------------|-------|-----------------|
|
|
36
|
+
| **Seedance 2.0** | i2v, R2V | t2v | 15s | Yes (stereo, lip-sync 8+ langs) | **#1 ranked.** R2V: flat `reference_image_urls`, `@Image` tags. Default routing target. |
|
|
37
|
+
| **Seedance 2.0 Fast** | i2v, R2V | t2v | 15s | Yes | Cheaper / faster Seedance 2.0 variant. Same 4-15s ladder, same provenance gate. |
|
|
38
|
+
| **Seedance 1.5 Pro** | i2v | t2v | 12s | Yes | Older Seedance line; kept for parity. |
|
|
39
|
+
| **HappyHorse 1.1** | i2v, R2V (up to 9 refs) | t2v | 15s | Yes (joint single-pass, 7-lang phoneme lip-sync) | **#1 blind-preference T2V + I2V** (Alibaba 15B). 3-15s, 720p/1080p, nine aspect ratios. Best for talking characters + multilingual localization; SFW/commercial-leaning. The `happyhorse` video-family now routes here. |
|
|
40
|
+
| **HappyHorse 1.0** | i2v, R2V | t2v | 15s | Yes | Prior line, kept for back-compat. Livelier hand-camera realism / cinematic grain vs Seedance. |
|
|
41
|
+
| **Wan 2.7** | i2v, R2V, V2V, Spicy | t2v | 15s | Wan i2v has no audio; lip-syncs via `audio_url` input | **Lip-sync flagship.** Only Venice model with proper `audio_url`-driven mouth motion. R2V exposes per-element `audio_url` for multi-speaker. Spicy = uncensored i2v variant. |
|
|
42
|
+
| **Wan 2.6** | Standard, Flash, R2V | Standard | 15s | Yes (i2v/t2v); R2V capped at 10s | Now has R2V variant with `audio_url` input. 1080p. |
|
|
43
|
+
| **Wan 2.5 Preview** | i2v | t2v | 10s | Yes | `audio_url` input. |
|
|
44
|
+
| **Wan 2.2 A14B** | — | t2v | 5s | No | Legacy text-to-video. |
|
|
45
|
+
| **Wan 2.1 Pro** | i2v | — | 6s | No | Legacy. |
|
|
46
|
+
| **Runway Gen-4.5** | Gen-4.5, Turbo, Aleph | Gen-4.5 Text | 10s | No (silent) | Strong motion physics; 7 aspect ratios. No R2V, no audio, no end-image. |
|
|
47
|
+
| **Sora 2** | Standard, Pro | Standard, Pro | Standard 12s / **Pro 20s** | Yes | Pro now reaches 20s + `true_1080p` resolution. |
|
|
48
|
+
| **Veo 3.1** | Fast, Full | Fast, Full | 8s | Yes | Up to 4K resolution. |
|
|
49
|
+
| **Veo 3** | Fast, Full | Fast, Full | 8s | Yes | |
|
|
50
|
+
| **Kling O3** | Pro, Standard, 4K + R2V variants | Pro, Standard, 4K | 15s | Yes | R2V: `elements`, `reference_image_urls`, `scene_image_urls`. 4K variants for delivery-grade output. |
|
|
51
|
+
| **Kling V3** | Pro, Standard, **4K R2V** | Pro, Standard, **4K** | 15s | Yes | 4K variants added 2026-05+. `end_image_url` on R2V. |
|
|
52
|
+
| **Kling 2.6 Pro** | i2v | t2v | 10s | Yes | `end_image_url`. |
|
|
53
|
+
| **Kling 2.5 Turbo Pro** | i2v | t2v | 10s | No | `end_image_url`. |
|
|
54
|
+
| **PixVerse C1** | i2v, R2V, Transition | t2v | **15s** | Yes | Replaces v5.6: same four resolutions but 15s ladder + new R2V variant. |
|
|
55
|
+
| **PixVerse v5.6** | Standard, Transition | Standard | 8s | Yes | Legacy; prefer C1 for new projects. |
|
|
56
|
+
| **Grok Imagine** | i2v, **R2V**, V2V | t2v | i2v/V2V/t2v 15s · R2V 5/8/10s | i2v/t2v: yes · R2V: no | R2V added 2026-05+ (no longer needs Kling fallback). 7 aspect ratios. |
|
|
57
|
+
| **LTX Video 2.0** | Fast, Full, v2.3, 19B + V2V/extend | Fast, Full, v2.3, 19B | 20s (Fast/v2.3) · 10s (Full) · 18s (19B) | Yes | Up to 4K, longest durations. |
|
|
58
|
+
| **Longcat** | Standard, Distilled | Standard, Distilled | **30s** | No | Longest single-shot for non-talking-head work. |
|
|
59
|
+
| **Vidu Q3** | i2v | t2v | 16s | Yes | `reference_image_urls`. |
|
|
60
|
+
| **OVI** | i2v | — | 5s | Yes | |
|
|
61
|
+
|
|
62
|
+
> **Seedance face rule (removed 2026-07):** Seedance 2.0 used to reject face-bearing input images that weren't produced by `seedream-v5-lite` / `seedream-v5-lite-edit`. Venice removed that restriction — any image family now works for face-bearing inputs, so the harness uses `nano-banana-2` for all panels. See [Image / Video Family Pairing](#image--video-family-pairing) below.
|
|
63
|
+
|
|
64
|
+
### Image Models (28 entries, 2026-05-20 sync)
|
|
65
|
+
|
|
66
|
+
`nano-banana-pro`, `nano-banana-2`, `gpt-image-2` (high-quality alternative to `nano-banana-pro`), `gpt-image-1-5`, `flux-2-pro`, `flux-2-max`, `grok-imagine-image`, `grok-imagine-image-quality`, `hunyuan-image-v3`, `imagineart-1.5-pro`, `qwen-image-2`, `qwen-image-2-pro`, `recraft-v4`, `recraft-v4-pro`, `seedream-v4`, `seedream-v5-lite`, `chroma`, `hidream`, `venice-sd35`, `lustify-sdxl`, `lustify-v7`, `lustify-v8`, `wai-Illustrious`, `z-image-turbo`, `ernie-image`, `ernie-image-turbo`, `wan-2-7-text-to-image`, `wan-2-7-pro-text-to-image`, `bria-bg-remover`
|
|
67
|
+
|
|
68
|
+
New since the last sync: `grok-imagine-image`, `grok-imagine-image-quality`, `lustify-v8`, `ernie-image`, `ernie-image-turbo`, `wan-2-7-text-to-image`, `wan-2-7-pro-text-to-image`. Sunset: bare `qwen-image` (use `qwen-image-2`).
|
|
69
|
+
|
|
70
|
+
### Multi-Edit Models
|
|
71
|
+
|
|
72
|
+
`qwen-edit`, `qwen-image-2-edit`, `qwen-image-2-pro-edit`, `flux-2-max-edit`, `gpt-image-2-edit` (high-quality alternative to `nano-banana-pro-edit`), `gpt-image-1-5-edit`, `grok-imagine-edit`, `nano-banana-2-edit`, `nano-banana-pro-edit`, `seedream-v4-edit`, `seedream-v5-lite-edit`
|
|
73
|
+
|
|
74
|
+
### Audio / Music Models
|
|
75
|
+
|
|
76
|
+
- **TTS**: `tts-kokoro` (50+ voices), `tts-qwen3-0-6b`, `tts-qwen3-1-7b` (style-prompted voices)
|
|
77
|
+
- **Music**: `elevenlabs-music`, `minimax-music-v2`, `minimax-music-v25`, `minimax-music-v26`, `lyria-3-pro`, `ace-step-15`, `stable-audio-25`
|
|
78
|
+
- **Expressive speech / prompt-driven audio**: `seed-audio-1-0` (BytePlus Seed Audio 1.0 — 25 named voices, speed 0.5–2, up to a 2048-char prompt; premium prompt-directed narration/VO via the async audio queue). Use `generate-audio --prompt … [--voice … --speed …]`.
|
|
79
|
+
- **SFX**: `elevenlabs-sound-effects-v2`, `mmaudio-v2-text-to-audio`
|
|
80
|
+
- **TTS (ElevenLabs)**: `elevenlabs-tts-v3`, `elevenlabs-tts-multilingual-v2`
|
|
81
|
+
|
|
82
|
+
## What Makes It Venice-Optimized
|
|
83
|
+
|
|
84
|
+
- Image prompts tuned for Venice image generation models
|
|
85
|
+
- Two-pass panel generation with Venice multi-edit refinement
|
|
86
|
+
- **Model-routing logic** for action, atmosphere, and character-consistency tiers
|
|
87
|
+
- Support for reference-aware video generation (`elements`, `reference_image_urls`, `scene_image_urls`)
|
|
88
|
+
- Environment-aware prompt adaptation (daytime vs night scenes)
|
|
89
|
+
- Venice-native audio generation paths for TTS, SFX, and music
|
|
90
|
+
- **Video quote endpoint** for cost estimation before generation
|
|
91
|
+
- Model-aware parameter building (auto-skips unsupported params per model)
|
|
92
|
+
- **Parallel editing pipeline** — transcribe existing footage locally, read a 12KB pack, render with 30ms audio fades, self-eval at every cut boundary
|
|
93
|
+
|
|
94
|
+
## Project Structure
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
AGENTS.md Agent orchestration hub
|
|
98
|
+
.claude/
|
|
99
|
+
commands/ 19 workflow playbooks (see below)
|
|
100
|
+
agents/ 6 specialized agent roles (see below)
|
|
101
|
+
skills/ 6 Venice and workflow knowledge packs (see below)
|
|
102
|
+
.cursor/rules/ IDE-level safety rules
|
|
103
|
+
src/
|
|
104
|
+
venice/ Venice API client layer
|
|
105
|
+
client.ts HTTP transport, retries, rate limiting
|
|
106
|
+
models.ts Complete model registry (50+ models)
|
|
107
|
+
video.ts Video queue/retrieve/quote/complete
|
|
108
|
+
generate.ts Image generation
|
|
109
|
+
multi-edit.ts Multi-image layered editing
|
|
110
|
+
edit.ts Upscale, background remove
|
|
111
|
+
audio.ts TTS, music, SFX, queued audio
|
|
112
|
+
voices.ts Voice catalog (Kokoro + Qwen3)
|
|
113
|
+
types.ts Full API type definitions
|
|
114
|
+
series/ Project state and character management
|
|
115
|
+
manager.ts Create/load/save series
|
|
116
|
+
types.ts Character, ShotScript, SeriesState types
|
|
117
|
+
mini-drama/ Reference narrative video implementation
|
|
118
|
+
cli.ts Commander CLI (25+ commands)
|
|
119
|
+
prompt-builder.ts Image + video prompt construction
|
|
120
|
+
video-generator.ts Video rendering with frame chaining
|
|
121
|
+
generation-planner.ts Single vs multi-shot planning
|
|
122
|
+
panel-fixer.ts Multi-edit character correction
|
|
123
|
+
subtitle-generator.ts SRT from script
|
|
124
|
+
assembler.ts Video assembly + audio mix
|
|
125
|
+
editing/ Parallel editing pipeline (inspired by browser-use/video-use)
|
|
126
|
+
types.ts WordTiming, Take, TakesPack, Edl, EditSession
|
|
127
|
+
packer.ts Collapse word streams -> takes_packed.md
|
|
128
|
+
aligner.ts Ground-truth script alignment for generated VO
|
|
129
|
+
providers/whisper-cpp.ts Local transcription provider
|
|
130
|
+
edl.ts EDL authoring + ffmpeg rendering
|
|
131
|
+
silence.ts silencedetect wrapper + filler-word detection
|
|
132
|
+
render.ts EDL -> final-edit.mp4 with 30ms audio fades
|
|
133
|
+
self-eval.ts Drive cut-qa agent, max 3 iterations
|
|
134
|
+
overlays.ts Overlay manifest types
|
|
135
|
+
storyboard/ Legacy screenplay storyboard pipeline
|
|
136
|
+
characters/ Character extraction and references
|
|
137
|
+
parsers/ Fountain + PDF screenplay parsing
|
|
138
|
+
assembly/ Remotion scaffold and manifest
|
|
139
|
+
scripts/ Utility scripts (.ts tracked, .mjs gitignored)
|
|
140
|
+
templates/ HTML storyboard viewer template
|
|
141
|
+
output/ Generated projects (gitignored)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Getting Started
|
|
145
|
+
|
|
146
|
+
### Requirements
|
|
147
|
+
|
|
148
|
+
- Node.js 20+
|
|
149
|
+
- `ffmpeg` and `ffprobe` on your PATH
|
|
150
|
+
- A Venice API key
|
|
151
|
+
- **Optional (editing pipeline):** `whisper-cpp` on PATH for local transcription
|
|
152
|
+
|
|
153
|
+
### Standalone install
|
|
154
|
+
|
|
155
|
+
The CLI works directly against the Venice API. Cursor, Claude Code, OpenCode,
|
|
156
|
+
MCP, and other agent harnesses are optional integrations, not runtime requirements.
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
npm install -g venice-video-harness
|
|
160
|
+
venice-video setup
|
|
161
|
+
venice-video doctor
|
|
162
|
+
venice-video new
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
`venice-video setup` prompts for the API key without echoing it, validates it,
|
|
166
|
+
and stores it in the OS-appropriate user configuration directory with owner-only
|
|
167
|
+
permissions. It also records a default project workspace. Environment variables
|
|
168
|
+
still take precedence for CI or ephemeral use:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
export VENICE_API_KEY=your_key
|
|
172
|
+
export VENICE_VIDEO_WORKSPACE=~/VeniceVideos
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
The `new` wizard starts with these production types:
|
|
176
|
+
|
|
177
|
+
1. **Film** — a film of any length; there is no short-duration assumption
|
|
178
|
+
2. Series
|
|
179
|
+
3. Product video
|
|
180
|
+
4. Music video
|
|
181
|
+
5. Screenplay
|
|
182
|
+
|
|
183
|
+
A non-interactive Film can also be created explicitly:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
venice-video new \
|
|
187
|
+
--type film \
|
|
188
|
+
--name "Long Horizon" \
|
|
189
|
+
--concept "A feature-length journey across a flooded world" \
|
|
190
|
+
--genre adventure \
|
|
191
|
+
--audio-strategy native \
|
|
192
|
+
--video-family auto
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Useful standalone commands:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
venice-video config show
|
|
199
|
+
venice-video config set-workspace ~/VeniceVideos
|
|
200
|
+
venice-video config unset-api-key
|
|
201
|
+
venice-video list-series
|
|
202
|
+
venice-video --help
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
For server environments, prefer `VENICE_API_KEY` instead of writing a user
|
|
206
|
+
configuration file. Credential precedence is environment variable, then stored
|
|
207
|
+
user configuration, then the repository `.env` compatibility path.
|
|
208
|
+
|
|
209
|
+
The setup command stores the key in a user-only configuration file, not the OS
|
|
210
|
+
keychain. On macOS and Linux the file mode is `0600`. Use an environment variable
|
|
211
|
+
or an external secrets manager where file-based storage is not appropriate.
|
|
212
|
+
|
|
213
|
+
### Repository development
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
npm install
|
|
217
|
+
npm run build
|
|
218
|
+
npm test
|
|
219
|
+
npm run test:legacy
|
|
220
|
+
npm run dev -- <command>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
The repository still includes agent orchestration in `AGENTS.md` and `.claude/`.
|
|
224
|
+
Those layers can operate the same execution engine, but the installed
|
|
225
|
+
`venice-video` command does not depend on them.
|
|
226
|
+
|
|
227
|
+
### Programmatic Usage
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
import { VeniceClient, generateVideo, quoteVideo, listVideoModels } from 'venice-video-harness';
|
|
231
|
+
|
|
232
|
+
const client = new VeniceClient();
|
|
233
|
+
|
|
234
|
+
// Get a cost estimate
|
|
235
|
+
const quote = await quoteVideo(client, {
|
|
236
|
+
model: 'kling-v3-pro-image-to-video',
|
|
237
|
+
duration: '8s',
|
|
238
|
+
audio: true,
|
|
239
|
+
});
|
|
240
|
+
console.log(`Estimated cost: $${quote.quote}`);
|
|
241
|
+
|
|
242
|
+
// Generate a video
|
|
243
|
+
const result = await generateVideo(client, {
|
|
244
|
+
model: 'kling-v3-pro-image-to-video',
|
|
245
|
+
prompt: 'A slow dolly shot pushes forward...',
|
|
246
|
+
duration: '8s',
|
|
247
|
+
imageUrl: 'data:image/png;base64,...',
|
|
248
|
+
audio: true,
|
|
249
|
+
outputPath: 'output/shot-001.mp4',
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
// Query model capabilities
|
|
253
|
+
const longModels = listVideoModels({ minDurationSec: 20 });
|
|
254
|
+
const refModels = listVideoModels({ supportsElements: true });
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
## Video Model Routing
|
|
258
|
+
|
|
259
|
+
The harness defaults are opinionated because consistency is the point:
|
|
260
|
+
|
|
261
|
+
**Seedance 2.0 R2V Enhanced for ALL lanes (reference-first, 2026-07-30). Kling O3 R2V fallback only when characters overflow the 9-reference budget.**
|
|
262
|
+
|
|
263
|
+
Every shot renders in **pure reference mode** — no start image — from an ordered `@ImageN` reference stack of up to 9 images: one primary angle per character, the scene beat's composed **storyboard blocking plate** (where the characters stand in the location relative to each other), multiple location angles (wide/medium/detail), and second character angles. Overflow drops second character angles first, then extra location angles; blocking plates are protected. Voice-donor clips ride alongside as `reference_audio_urls` (`@AudioN`) so each character's voice stays right take to take.
|
|
264
|
+
|
|
265
|
+
| Role | Default Model | When Used |
|
|
266
|
+
|------|--------------|-----------|
|
|
267
|
+
| **Character shots (up to ~6 characters)** | `seedance-2-0-enhanced-reference-to-video` | Default R2V — up to 9 `reference_image_urls` with `@Image` tags (chars + blocking plate + location angles), 1080p, up to 15s, native stereo audio |
|
|
268
|
+
| **Character shots (budget overflow)** | `kling-o3-standard-reference-to-video` | Auto-fallback — structured `elements` for multi-character identity |
|
|
269
|
+
| **Establishing / mood / action** | `seedance-2-0-enhanced-reference-to-video` | Anchors to location reference angles via `@Image` tags |
|
|
270
|
+
|
|
271
|
+
These defaults are overridable per-project via `series.json` → `videoDefaults`. To target a non-Seedance family (e.g. for accounts that lack Seedance access, or projects that need a different look), set `videoDefaults` to `kling-o3-standard-reference-to-video` (character consistency) and `veo3.1-fast-image-to-video` (atmosphere). Image models default to `nano-banana-2` / `nano-banana-2-edit` for all panels regardless of video family.
|
|
272
|
+
|
|
273
|
+
## Image / Video Family Pairing
|
|
274
|
+
|
|
275
|
+
**Venice removed the Seedance seedream-only face restriction (2026-07).** Seedance 2.0 previously rejected face-bearing input images that weren't produced by `seedream-v5-lite` / `seedream-v5-lite-edit`; it now accepts face-bearing images from **any** image family. The harness therefore uses a single high-quality default for every panel — character-bearing or faceless, generation or multi-edit:
|
|
276
|
+
|
|
277
|
+
| Image Role | Default | Why |
|
|
278
|
+
|------------|---------|-----|
|
|
279
|
+
| Character reference sheets | `nano-banana-2` | Any family works — no seedream requirement |
|
|
280
|
+
| Character-bearing panels | `nano-banana-2` | Any family works — no seedream requirement |
|
|
281
|
+
| Character fix via multi-edit | `nano-banana-2-edit` | Any family works |
|
|
282
|
+
| Atmosphere / establishing panels | `nano-banana-2` (configurable) | `gpt-image-2` / `nano-banana-pro` are high-quality alternatives |
|
|
283
|
+
| Style-match multi-edit (no characters) | `nano-banana-2-edit` (configurable) | `gpt-image-2-edit` is a high-quality alternative |
|
|
284
|
+
|
|
285
|
+
Defaults are configurable per-project under `series.json`:
|
|
286
|
+
|
|
287
|
+
```json
|
|
288
|
+
{
|
|
289
|
+
"videoDefaults": {
|
|
290
|
+
"actionModel": "seedance-2-0-enhanced-reference-to-video",
|
|
291
|
+
"atmosphereModel": "seedance-2-0-enhanced-reference-to-video",
|
|
292
|
+
"characterConsistencyModel": "seedance-2-0-enhanced-reference-to-video",
|
|
293
|
+
"imageDefaults": {
|
|
294
|
+
"generationModel": "nano-banana-2",
|
|
295
|
+
"editModel": "nano-banana-2-edit"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
### Seedance Pre-flight Gate (neutralized)
|
|
302
|
+
|
|
303
|
+
The former provenance-driven pre-flight gate is a **no-op** as of 2026-07. Because Seedance accepts any image family, there is nothing to validate, reroute, or launder before a Seedance call — `ensureSeedanceCompatibility()` always proceeds and `videoDefaults.seedanceCompatibility` is no longer auto-set (an explicit value is read but does nothing meaningful). Provenance sidecars (`shot-NNN.provenance.json`) are still written as metadata for other tooling but nothing gates on them. (The separate Seedance face **consent** attestation, HTTP 409 `needs_consent`, is unrelated and still handled at queue time.)
|
|
304
|
+
|
|
305
|
+
The sidecar shape:
|
|
306
|
+
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"generationModel": "nano-banana-2",
|
|
310
|
+
"editModels": ["nano-banana-2-edit"],
|
|
311
|
+
"hasFace": true,
|
|
312
|
+
"createdAt": "...",
|
|
313
|
+
"updatedAt": "..."
|
|
314
|
+
}
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
Provenance sidecars are written automatically by the storyboard assembler, panel-fixer, reference-manager, and the mini-drama panel generator. Images without a sidecar (e.g. files from before this change) are treated as "unknown" and will trigger the pre-flight gate. If you know an existing image has no face, hand-edit its sidecar to add `"hasFace": false` and the gate will pass.
|
|
318
|
+
|
|
319
|
+
If you want to skip the pre-flight entirely, target a non-Seedance video model (e.g. switch `videoDefaults` to Kling O3 + Veo).
|
|
320
|
+
|
|
321
|
+
## Reference Implementation
|
|
322
|
+
|
|
323
|
+
The `src/mini-drama/` directory contains a full working implementation for narrative mini-drama production. Use it directly or adapt the patterns for your own format:
|
|
324
|
+
|
|
325
|
+
- Series/character/episode management
|
|
326
|
+
- Script workshopping via LLM
|
|
327
|
+
- Two-pass storyboard generation (generate + multi-edit refine)
|
|
328
|
+
- Vision-based QA
|
|
329
|
+
- Video generation with frame chaining
|
|
330
|
+
- Audio post-production with layered ambient beds
|
|
331
|
+
- Subtitle burn-in and final assembly
|
|
332
|
+
|
|
333
|
+
## Editing Pipeline
|
|
334
|
+
|
|
335
|
+
Parallel to the generation pipeline. The generation side **synthesizes** new shots from prompts; the editing side **cuts** already-existing media (Venice-generated shots or real raw footage). They share ffmpeg and the burn-in-subtitles skill but are otherwise independent.
|
|
336
|
+
|
|
337
|
+
Inspired by [browser-use/video-use](https://github.com/browser-use/video-use), the pipeline is text-first: the LLM reads a compact `takes_packed.md` (~12KB per 40 min of audio) rather than frame-dumping video. Composite PNGs are only consulted at explicit decision points — comparing retakes, disambiguating a pause, verifying post-render QA.
|
|
338
|
+
|
|
339
|
+
### When to reach for editing vs generation
|
|
340
|
+
|
|
341
|
+
| Task | Pipeline | Entry |
|
|
342
|
+
|------|----------|-------|
|
|
343
|
+
| Synthesize new shots from prompts | Generation | `/produce-episode`, `/generate-episode-videos` |
|
|
344
|
+
| Re-cut a generated episode for pacing | Editing | `/edit-footage` |
|
|
345
|
+
| Trim filler words from a VO take | Editing | `/edit-footage` |
|
|
346
|
+
| Edit raw user-supplied footage | Editing | `/edit-footage` |
|
|
347
|
+
| Rescue a truncated TTS VO (rule 26) | Editing | `/edit-footage` |
|
|
348
|
+
| Add branded lower-thirds / title cards | Editing | `overlay-designer` agent |
|
|
349
|
+
| Post-assembly QA on any rendered video | Editing | `cut-qa` agent |
|
|
350
|
+
|
|
351
|
+
### The five steps
|
|
352
|
+
|
|
353
|
+
1. **Transcribe** via local whisper.cpp → per-source `*.words.json` + `takes_packed.md`
|
|
354
|
+
2. **Read pack** — LLM forms a cut strategy from text alone
|
|
355
|
+
3. **Confirm** — propose strategy to user, wait for "yes / revise / cancel"
|
|
356
|
+
4. **Render EDL** — JSON cut list → ffmpeg concat with 30ms audio fades (archive-first)
|
|
357
|
+
5. **Self-eval** — `cut-qa` agent runs 6 programmatic checks at every cut boundary; max 3 fix iterations
|
|
358
|
+
|
|
359
|
+
### Required tooling
|
|
360
|
+
|
|
361
|
+
- `whisper-cpp` on PATH (`brew install whisper-cpp`)
|
|
362
|
+
- A whisper.cpp model, e.g.:
|
|
363
|
+
```bash
|
|
364
|
+
mkdir -p ~/.cache/whisper.cpp
|
|
365
|
+
curl -L -o ~/.cache/whisper.cpp/ggml-base.en.bin \
|
|
366
|
+
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin
|
|
367
|
+
```
|
|
368
|
+
- `sharp` npm dep (bundled) for the `timeline-view` composite
|
|
369
|
+
- `ffmpeg` + `ffprobe` (already required by the generation pipeline)
|
|
370
|
+
|
|
371
|
+
### cut-qa checks
|
|
372
|
+
|
|
373
|
+
Runs automatically after every assembly or edit render. Each check produces zero or more `CutQaFinding` entries:
|
|
374
|
+
|
|
375
|
+
| Check | Kind | Typical severity |
|
|
376
|
+
|-------|------|------------------|
|
|
377
|
+
| Aspect regression vs `series.storyboardAspectRatio` | `aspect-regression` | `fail` |
|
|
378
|
+
| Frame-hash jump across a cut | `visual-jump` | `warn` (or `fail` if inside a word) |
|
|
379
|
+
| VO truncation vs ground-truth script | `vo-truncation` | `fail` |
|
|
380
|
+
| Mean-luma delta across a cut in the same location | `lighting-discontinuity` | `warn` |
|
|
381
|
+
| Audio peak > -6 dBFS within cut boundary | `audio-pop` | `fail` |
|
|
382
|
+
| Caption overlap with in-frame text | `subtitle-overlap` | `warn` |
|
|
383
|
+
|
|
384
|
+
Hard cap at 3 fix iterations before surfacing to the user with the persisting findings and the fixes that were attempted.
|
|
385
|
+
|
|
386
|
+
### Overlay pipeline
|
|
387
|
+
|
|
388
|
+
Branded motion graphics (lower-thirds, title cards, chapter markers, logo bugs) are a post-process on top of the delivered cut — never baked into the EDL render. The `overlay-designer` agent plans the overlays, spawns Remotion / ffmpeg workers in parallel, and composites via `scripts/render-overlay.ts`.
|
|
389
|
+
|
|
390
|
+
Venice-logo safety rules (AGENTS.md rule 17, anti-pattern #11) are enforced at manifest validation time — manifests that contain "VVV" / "triple-V" or pass mostly-transparent PNGs are rejected before rendering.
|
|
391
|
+
|
|
392
|
+
### Editing pipeline commands
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
# Transcribe a folder of sources into a pack + per-source words.json
|
|
396
|
+
npx tsx scripts/transcribe-sources.ts \
|
|
397
|
+
--dir output/<project>/shots \
|
|
398
|
+
--out output/<project>/edit/takes_packed.md \
|
|
399
|
+
--model base.en
|
|
400
|
+
|
|
401
|
+
# Align against a ground-truth TTS script (detects VO truncation)
|
|
402
|
+
npx tsx scripts/transcribe-sources.ts \
|
|
403
|
+
--dir output/<project>/audio \
|
|
404
|
+
--out output/<project>/edit/takes_packed.md \
|
|
405
|
+
--aligned-from scripts/<project>/config.ts
|
|
406
|
+
|
|
407
|
+
# Inspect a specific time range as a composite PNG
|
|
408
|
+
npx tsx scripts/timeline-view.ts \
|
|
409
|
+
--video output/<project>/final.mp4 \
|
|
410
|
+
--start 12.3 --end 16.1 \
|
|
411
|
+
--words output/<project>/edit/final.words.json \
|
|
412
|
+
--out /tmp/tl.png
|
|
413
|
+
|
|
414
|
+
# Composite overlays onto a delivered cut
|
|
415
|
+
npx tsx scripts/render-overlay.ts \
|
|
416
|
+
--manifest output/<project>/overlays/manifest.json
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
See [`.claude/skills/video-editing/SKILL.md`](.claude/skills/video-editing/SKILL.md) for the full philosophy, EDL format, and editing-specific anti-patterns.
|
|
420
|
+
|
|
421
|
+
## Timeline Export (NLE round-trip)
|
|
422
|
+
|
|
423
|
+
After an episode is rendered, the harness can export the assembled timeline as an XML file that imports into your editor of choice. Every video segment, dialogue clip, SFX clip, and music cue lands on its own track so you can fine-tune cuts, audio balance, and color in the NLE instead of editing the assembler's ffmpeg filter graph.
|
|
424
|
+
|
|
425
|
+
```bash
|
|
426
|
+
# Final Cut Pro X (FCPXML 1.10) — the original path
|
|
427
|
+
mini-drama export-timeline -p output/<project> -e 1 --format fcpxml
|
|
428
|
+
|
|
429
|
+
# Adobe Premiere Pro (Final Cut Pro 7 XML / xmeml v5)
|
|
430
|
+
mini-drama export-timeline -p output/<project> -e 1 --format premiere
|
|
431
|
+
|
|
432
|
+
# DaVinci Resolve (Resolve-tuned FCPXML 1.10)
|
|
433
|
+
mini-drama export-timeline -p output/<project> -e 1 --format davinci
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
Output filename mirrors the format:
|
|
437
|
+
|
|
438
|
+
| Format | File | Import path |
|
|
439
|
+
|--------|------|-------------|
|
|
440
|
+
| `fcpxml` | `episode-NNN.fcpxml` | FCP X → File → Import → XML… |
|
|
441
|
+
| `premiere` | `episode-NNN.premiere.xml` | Premiere → File → Import… |
|
|
442
|
+
| `davinci` | `episode-NNN.resolve.fcpxml` | Resolve → File → Import → Timeline… |
|
|
443
|
+
|
|
444
|
+
Lane layout (same across formats):
|
|
445
|
+
|
|
446
|
+
- Primary video track — every rendered shot in spine order, segment audio muted (-96 dB)
|
|
447
|
+
- Lane −1 (dialogue) — one clip per shot from `audio/dialogue-shot-NNN.mp3`
|
|
448
|
+
- Lane −2 (SFX) — one clip per `audio/sfx/*.mp3` matched to its shot
|
|
449
|
+
- Lane −3 (music) — `audio/music.mp3` spanning the full sequence
|
|
450
|
+
|
|
451
|
+
The `export-fcpxml` command from is kept as a thin alias of `export-timeline --format fcpxml` for back-compat.
|
|
452
|
+
|
|
453
|
+
**NLE XML implementations vary by editor version.** If your editor refuses the import, or any clip lands on the wrong track or wrong timecode, please [open a GitHub Issue](https://github.com/jordanurbs/venice-video-harness/issues/new) with:
|
|
454
|
+
|
|
455
|
+
- editor name + exact version
|
|
456
|
+
- the format you exported (`fcpxml` / `premiere` / `davinci`)
|
|
457
|
+
- the generated XML file attached (or relevant snippet)
|
|
458
|
+
- what FCP X / Premiere / Resolve reported
|
|
459
|
+
|
|
460
|
+
Bug reports are how we'll catch the gaps — the test fixture confirms structure, but it can't substitute for real NLE import paths.
|
|
461
|
+
|
|
462
|
+
## Commands, Agents, and Skills
|
|
463
|
+
|
|
464
|
+
### Workflow Commands (`.claude/commands/`)
|
|
465
|
+
|
|
466
|
+
| Command | Purpose |
|
|
467
|
+
|---------|---------|
|
|
468
|
+
| `new-series` | Create a new series with locked aesthetics |
|
|
469
|
+
| `add-character` | Add a character with reference images |
|
|
470
|
+
| `lock-character` | Lock a character's voice (add `--voice-reference <file>` to import a voice-donor clip) |
|
|
471
|
+
| `lock-characters` | Batch voice locking |
|
|
472
|
+
| `generate-voice-reference` | Generate/import a character voice-donor clip (`reference_audio_urls` / @AudioN, Seedance & HappyHorse R2V) |
|
|
473
|
+
| `add-location` | Add a location with generated reference images (wide / medium / detail) |
|
|
474
|
+
| `generate-location-references` | Regenerate a location's reference images |
|
|
475
|
+
| `set-aesthetic` | Set or derive series aesthetic |
|
|
476
|
+
| `explore-aesthetic` | Generate aesthetic comparison samples |
|
|
477
|
+
| `workshop-episode` | Collaborative episode scripting |
|
|
478
|
+
| `storyboard-episode` | Storyboard one episode |
|
|
479
|
+
| `storyboard-scene` | Storyboard a single scene |
|
|
480
|
+
| `storyboard-all` | Storyboard all scenes |
|
|
481
|
+
| `fix-panel` | Fix a panel with multi-edit |
|
|
482
|
+
| `qa-storyboard` | Visual QA on panels |
|
|
483
|
+
| `generate-episode-videos` | Generate episode videos from panels |
|
|
484
|
+
| `generate-videos` | General video generation |
|
|
485
|
+
| `assemble-episode` | Final assembly with audio and subtitles |
|
|
486
|
+
| `produce-episode` | Full pipeline in one command |
|
|
487
|
+
| `audition-voices` | TTS voice auditions |
|
|
488
|
+
| `generate-trailer` | Full trailer pipeline |
|
|
489
|
+
| `ingest-screenplay` | Ingest Fountain/PDF screenplay |
|
|
490
|
+
| `edit-footage` | Text-first editing pipeline for existing media (cuts, trims, re-orders) |
|
|
491
|
+
|
|
492
|
+
### Specialized Agents (`.claude/agents/`)
|
|
493
|
+
|
|
494
|
+
| Agent | Role |
|
|
495
|
+
|-------|------|
|
|
496
|
+
| `art-director` | Aesthetic decisions, palette, lighting, composition |
|
|
497
|
+
| `prompt-engineer` | Venice image prompts, character consistency |
|
|
498
|
+
| `screenplay-reader` | Fountain/PDF parsing and scene extraction |
|
|
499
|
+
| `storyboard-assembler` | HTML storyboard viewer assembly |
|
|
500
|
+
| `storyboard-qa` | Panel QA for continuity and character checks |
|
|
501
|
+
| `trailer-curator` | Trailer shot selection and anti-spoiler rules |
|
|
502
|
+
| `cut-qa` | Post-render quality gate — 6 checks at every cut boundary, max 3 fix iterations |
|
|
503
|
+
| `overlay-designer` | Plans branded motion graphics; spawns Remotion / ffmpeg overlay workers in parallel |
|
|
504
|
+
| `remotion-overlay` | Renders one animated overlay as transparent ProRes / WebM |
|
|
505
|
+
| `ffmpeg-overlay` | Emits drawtext specs for static overlays |
|
|
506
|
+
|
|
507
|
+
### Production Skills (`.claude/skills/`)
|
|
508
|
+
|
|
509
|
+
| Skill | Purpose |
|
|
510
|
+
|-------|---------|
|
|
511
|
+
| `venice-api` | Venice REST API usage and defaults |
|
|
512
|
+
| `venice-video-model-routing` | R2V-first model routing, decision trees, scripts |
|
|
513
|
+
| `character-consistency` | Multi-shot character consistency guidance |
|
|
514
|
+
| `shot-composition` | Shot composition and camera guidance |
|
|
515
|
+
| `screenplay-parsing` | Screenplay parsing workflows |
|
|
516
|
+
| `venice-ui-production` | Manual Venice web UI prompt guides |
|
|
517
|
+
| `video-editing` | Text-first editing philosophy, EDL format, cut-qa loop (inspired by browser-use/video-use) |
|
|
518
|
+
|
|
519
|
+
### Directing layer (optional): Seedance 2.0 Skill OS
|
|
520
|
+
|
|
521
|
+
The harness is the *production crew* — it locks identity, routes models, QA's panels, mixes audio, and assembles. It does not, by itself, make a shot feel **directed**. The [**Seedance 2.0 Skill OS**](https://github.com/emily2040/seedance-2.0) supplies that missing brain: pure directing/prompting knowledge (no execution code) built on one principle — **direct the scene, don't decorate it.** Read the beat's dramatic function, name one intention, and derive camera, light, blocking, performance, and sound from it instead of stacking "cinematic" adjectives; hold one directorial voice across the whole story. Venice ships **Seedance 2.0 (+ Fast)** as a video model family, so the directing knowledge applies almost verbatim.
|
|
522
|
+
|
|
523
|
+
This principle is already baked into the harness where it matters:
|
|
524
|
+
|
|
525
|
+
- The **workshop system prompt** (`src/mini-drama/cli.ts`) carries a "DIRECT THE SCENE, DON'T DECORATE IT" block, so both the CLI and the `venice-video-mcp` `episode.workshop` produce directed scripts.
|
|
526
|
+
- `.claude/agents/prompt-engineer.md`, `.claude/skills/shot-composition/SKILL.md`, and `.claude/commands/workshop-episode.md` open with the same directing preface for Claude-Code-in-repo sessions.
|
|
527
|
+
- The `buildVideoPrompt` builders document the principle so future prompt logic stays directed.
|
|
528
|
+
|
|
529
|
+
Install Seedance OS to unlock its full `directing-engine`, genre library, `retake-protocol`, `continuation-handoff`, `seedance-copyright`, `seedance-antislop`, and multilingual `vocab/*`:
|
|
530
|
+
|
|
531
|
+
```bash
|
|
532
|
+
# Clone the repo (its root is shaped as the seedance-20 skill) into the skills dir:
|
|
533
|
+
git clone https://github.com/emily2040/seedance-2.0 .claude/skills/seedance-20
|
|
534
|
+
```
|
|
535
|
+
|
|
536
|
+
**Division of labor to respect:** the harness owns identity (R2V refs + Seedance → Wan keyframe pass), durations (the pre-flight gate + 15s default), and model routing. So use Seedance OS for **intention/camera/light/blocking/performance/sound** only — do not hand-write identity locks, `[Image1]` reference tags, or surface-specific durations into prompts. Skip Seedance OS's `api-status.md` / `surface-prompt-profiles.md` / `api-workflow.md` / `model-name-map.md` (those describe non-Venice surfaces). The `venice-video-mcp` repo's `venice-mcp-directing` skill is the matching bridge for MCP-driven work.
|
|
537
|
+
|
|
538
|
+
## Production Anti-Patterns
|
|
539
|
+
|
|
540
|
+
The harness documents 13 production anti-patterns learned from real shoots in `AGENTS.md`. These cover:
|
|
541
|
+
|
|
542
|
+
- Multi-shot grouping bugs (wrong character overlap checks)
|
|
543
|
+
- Character reference style drift across angles
|
|
544
|
+
- Duration validation failures per model
|
|
545
|
+
- R2V aspect ratio defaults causing portrait-mode bugs
|
|
546
|
+
- Multi-edit cropping foreheads on close-up panels
|
|
547
|
+
- Lighting inconsistency between consecutive shots
|
|
548
|
+
- Logo/sigil prompt mismatches
|
|
549
|
+
- Seedance 2.0's former seedream-only face-image restriction (removed by Venice 2026-07; gate now neutralized)
|
|
550
|
+
- And more
|
|
551
|
+
|
|
552
|
+
See `AGENTS.md` > "Learned Anti-Patterns" for the full list with root causes and fixes.
|
|
553
|
+
|
|
554
|
+
## API Coverage
|
|
555
|
+
|
|
556
|
+
| Venice Endpoint | Status | Module |
|
|
557
|
+
|----------------|--------|--------|
|
|
558
|
+
| `POST /image/generate` | Full | `generate.ts` |
|
|
559
|
+
| `POST /image/multi-edit` | Full | `multi-edit.ts` |
|
|
560
|
+
| `POST /image/upscale` | Full | `edit.ts` |
|
|
561
|
+
| `POST /image/background-remove` | Full | `edit.ts` |
|
|
562
|
+
| `POST /video/queue` | Full | `video.ts` |
|
|
563
|
+
| `POST /video/retrieve` | Full | `video.ts` |
|
|
564
|
+
| `POST /video/quote` | Full | `video.ts` |
|
|
565
|
+
| `POST /video/complete` | Full | `video.ts` |
|
|
566
|
+
| `POST /audio/speech` | Full | `audio.ts` |
|
|
567
|
+
| `POST /audio/queue` | Full | `audio.ts` |
|
|
568
|
+
| `POST /audio/retrieve` | Full | `audio.ts` |
|
|
569
|
+
| `POST /audio/complete` | Full | `audio.ts` |
|
|
570
|
+
| `POST /chat/completions` | Partial | `client.ts` (vision) |
|
|
571
|
+
| `POST /images/edit` | Deprecated | `edit.ts` |
|
|
572
|
+
|
|
573
|
+
## Credits and Acknowledgments
|
|
574
|
+
|
|
575
|
+
The editing pipeline (text-first transcripts, on-demand timeline composites, EDL + self-eval loop, parallel overlay sub-agents) is directly inspired by [**browser-use/video-use**](https://github.com/browser-use/video-use) — a 100% open source agentic video editor for Claude Code. Their core insight — *"the LLM never watches the video, it reads it"* via word-level transcripts plus on-demand filmstrip+waveform composites — is what makes agent-driven editing actually work instead of drowning in frame-dump tokens.
|
|
576
|
+
|
|
577
|
+
Key patterns borrowed and adapted for this harness:
|
|
578
|
+
|
|
579
|
+
- The `takes_packed.md` format and compact per-take phrase blocks
|
|
580
|
+
- The timeline-view composite (filmstrip + waveform + word labels + silence-gap markers)
|
|
581
|
+
- 30ms audio fades at every cut boundary to prevent pops
|
|
582
|
+
- Self-evaluating QA loop at cut boundaries, max 3 fix iterations
|
|
583
|
+
- Session persistence (`project.md` → our `session.json`) for cross-session memory
|
|
584
|
+
- Parallel sub-agent spawning for overlay / animation rendering
|
|
585
|
+
- The "ask → confirm strategy → execute → self-eval → persist" design principle
|
|
586
|
+
|
|
587
|
+
Differences in this port:
|
|
588
|
+
|
|
589
|
+
- Uses local **whisper.cpp** instead of ElevenLabs Scribe (no new API keys required; loses diarization out of the box — we inject speaker labels from the shot script for generated content instead)
|
|
590
|
+
- Ground-truth script alignment mode via LCS matching, with automatic VO-truncation detection (rule 26 rescue)
|
|
591
|
+
- Integrated with Venice's generation pipeline: shared provenance sidecars, shared ffmpeg primitives, shared burn-in-subtitles skill
|
|
592
|
+
- TypeScript (Node) rather than Python, to stay consistent with the rest of the harness
|
|
593
|
+
|
|
594
|
+
Go give [browser-use/video-use](https://github.com/browser-use/video-use) a star. It's a clean, opinionated reference for text-first video editing and it's the right shape for this kind of tool.
|
|
595
|
+
|
|
596
|
+
## License
|
|
597
|
+
|
|
598
|
+
MIT
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a shot manifest by scanning scene directories for MP4s,
|
|
3
|
+
* running ffprobe for timing data, and reading video.json for metadata.
|
|
4
|
+
*/
|
|
5
|
+
import type { ShotManifest } from './types.js';
|
|
6
|
+
import type { ProjectState } from '../config.js';
|
|
7
|
+
export declare function buildManifest(project: ProjectState): Promise<ShotManifest>;
|
|
8
|
+
//# sourceMappingURL=manifest-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-builder.d.ts","sourceRoot":"","sources":["../../src/assembly/manifest-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAkHjD,wBAAsB,aAAa,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA6GhF"}
|