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
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Storyboard Assembler -- orchestrates image generation for each shot and
|
|
3
|
+
// compiles the results into a structured Storyboard object.
|
|
4
|
+
//
|
|
5
|
+
// Handles Venice API calls, image persistence, and final JSON export.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { writeImageProvenance } from "../venice/provenance.js";
|
|
10
|
+
// ---- Constants ------------------------------------------------------------
|
|
11
|
+
/** Default image resolution and aspect ratio for Venice API. */
|
|
12
|
+
const DEFAULT_RESOLUTION = "1K";
|
|
13
|
+
const DEFAULT_ASPECT_RATIO = "16:9";
|
|
14
|
+
/**
|
|
15
|
+
* Image-generation model for panels.
|
|
16
|
+
*
|
|
17
|
+
* Seedance 2.0 used to reject face-bearing images from non-seedream families,
|
|
18
|
+
* so face-bearing panels were forced onto seedream-v5-lite. Venice removed that
|
|
19
|
+
* restriction (2026-07), so all panels — character and faceless alike — use a
|
|
20
|
+
* single high-quality default (`nano-banana-2`). FACE_MODEL / NO_FACE_MODEL are
|
|
21
|
+
* kept as aliases so the per-shot selection call sites don't need to change.
|
|
22
|
+
*/
|
|
23
|
+
const FACE_MODEL = "nano-banana-2";
|
|
24
|
+
const NO_FACE_MODEL = "nano-banana-2";
|
|
25
|
+
/** Diffusion steps -- higher = better quality, slower. */
|
|
26
|
+
const DEFAULT_STEPS = 30;
|
|
27
|
+
/** Classifier-free guidance scale. */
|
|
28
|
+
const DEFAULT_CFG_SCALE = 7.5;
|
|
29
|
+
// ---- Assembler class ------------------------------------------------------
|
|
30
|
+
export class StoryboardAssembler {
|
|
31
|
+
outputDir;
|
|
32
|
+
constructor(outputDir) {
|
|
33
|
+
this.outputDir = outputDir;
|
|
34
|
+
}
|
|
35
|
+
// ---- Scene generation ---------------------------------------------------
|
|
36
|
+
/**
|
|
37
|
+
* Generate images for every shot in a scene and return an array of
|
|
38
|
+
* StoryboardPanel objects.
|
|
39
|
+
*
|
|
40
|
+
* For each shot the method:
|
|
41
|
+
* 1. Calls the Venice API (with reference images when available).
|
|
42
|
+
* 2. Saves the generated image to disk.
|
|
43
|
+
* 3. Saves a video prompt JSON file alongside the image.
|
|
44
|
+
* 4. Records metadata in a StoryboardPanel.
|
|
45
|
+
*
|
|
46
|
+
* @param sceneNumber - 1-based scene index.
|
|
47
|
+
* @param scene - The parent Scene data.
|
|
48
|
+
* @param shots - Ordered array of shots planned for this scene.
|
|
49
|
+
* @param promptResults - Parallel array of PromptResult objects (one per shot).
|
|
50
|
+
* @param client - An authenticated VeniceClient instance.
|
|
51
|
+
* @param videoPrompts - Parallel array of VideoPromptResult objects (one per shot).
|
|
52
|
+
* @returns Array of StoryboardPanel objects in shot order.
|
|
53
|
+
*/
|
|
54
|
+
async generateScene(sceneNumber, scene, shots, promptResults, client, videoPrompts) {
|
|
55
|
+
// Ensure the scene output directory exists.
|
|
56
|
+
const sceneDir = join(this.outputDir, `scene-${String(sceneNumber).padStart(3, "0")}`);
|
|
57
|
+
await mkdir(sceneDir, { recursive: true });
|
|
58
|
+
const panels = [];
|
|
59
|
+
for (let i = 0; i < shots.length; i++) {
|
|
60
|
+
const shot = shots[i];
|
|
61
|
+
const pr = promptResults[i];
|
|
62
|
+
let imageBase64;
|
|
63
|
+
let usedSeed;
|
|
64
|
+
// Choose the generation model based on face presence. Face-bearing
|
|
65
|
+
// panels need seedream-v5-lite so they can be passed to Seedance
|
|
66
|
+
// video; faceless panels use the higher-quality no-face model.
|
|
67
|
+
const hasFace = (shot.characters?.length ?? 0) > 0;
|
|
68
|
+
const imageModel = hasFace ? FACE_MODEL : NO_FACE_MODEL;
|
|
69
|
+
if (pr.referenceImages.length > 0) {
|
|
70
|
+
// Use reference-augmented generation
|
|
71
|
+
const result = await this.generateWithReferences(client, pr, imageModel);
|
|
72
|
+
imageBase64 = result.base64;
|
|
73
|
+
usedSeed = result.seed ?? 0;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Standard generation (no character references)
|
|
77
|
+
const result = await this.generateStandard(client, pr, imageModel);
|
|
78
|
+
imageBase64 = result.base64;
|
|
79
|
+
usedSeed = result.seed ?? 0;
|
|
80
|
+
}
|
|
81
|
+
// Save image to disk
|
|
82
|
+
const shotId = String(shot.shotNumber).padStart(3, "0");
|
|
83
|
+
const fileName = `shot-${shotId}.png`;
|
|
84
|
+
const imagePath = join(sceneDir, fileName);
|
|
85
|
+
const imageBuffer = Buffer.from(imageBase64, "base64");
|
|
86
|
+
await writeFile(imagePath, imageBuffer);
|
|
87
|
+
// Track which image model produced this panel so the Seedance
|
|
88
|
+
// pre-flight gate can validate it later.
|
|
89
|
+
await writeImageProvenance(imagePath, imageModel, [], { hasFace });
|
|
90
|
+
// Save video prompt JSON alongside the image
|
|
91
|
+
const vp = videoPrompts?.[i];
|
|
92
|
+
if (vp) {
|
|
93
|
+
const panelId = `S${sceneNumber}-P${shot.shotNumber}`;
|
|
94
|
+
// Use new `video` block; fall back to legacy `veo` for old data
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
96
|
+
const videoBlock = (vp.video ?? vp.veo);
|
|
97
|
+
const videoJson = {
|
|
98
|
+
panelId,
|
|
99
|
+
sceneNumber,
|
|
100
|
+
shotNumber: shot.shotNumber,
|
|
101
|
+
video: {
|
|
102
|
+
model: videoBlock.model,
|
|
103
|
+
prompt: videoBlock.prompt,
|
|
104
|
+
duration: videoBlock.duration ?? `${videoBlock.durationSeconds ?? "8"}s`,
|
|
105
|
+
audio: videoBlock.audio ?? videoBlock.generateAudio ?? true,
|
|
106
|
+
},
|
|
107
|
+
metadata: {
|
|
108
|
+
imagePrompt: pr.prompt,
|
|
109
|
+
characters: shot.characters,
|
|
110
|
+
dialogue: shot.dialogue
|
|
111
|
+
? { character: shot.focusCharacter || shot.characters[0] || "UNKNOWN", line: shot.dialogue }
|
|
112
|
+
: undefined,
|
|
113
|
+
sfx: vp.audioNotes.sfx || undefined,
|
|
114
|
+
ambient: vp.audioNotes.ambient || undefined,
|
|
115
|
+
transition: vp.transition,
|
|
116
|
+
cameraMovement: vp.cameraMovement,
|
|
117
|
+
aesthetic: `${pr.prompt.match(/\[AESTHETIC\] (.+)/)?.[1] || ""}`.trim() || undefined,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
const videoJsonPath = join(sceneDir, `shot-${shotId}.video.json`);
|
|
121
|
+
await writeFile(videoJsonPath, JSON.stringify(videoJson, null, 2), "utf-8");
|
|
122
|
+
}
|
|
123
|
+
// Determine transition (if not last shot in scene)
|
|
124
|
+
const transition = i < shots.length - 1 ? (shot.transitionOut || "CUT") : undefined;
|
|
125
|
+
panels.push({
|
|
126
|
+
id: `S${sceneNumber}-P${shot.shotNumber}`,
|
|
127
|
+
sceneNumber,
|
|
128
|
+
panelNumber: shot.shotNumber,
|
|
129
|
+
totalPanelsInScene: shots.length,
|
|
130
|
+
prompt: pr.prompt,
|
|
131
|
+
imageBase64,
|
|
132
|
+
imageMimeType: "image/png",
|
|
133
|
+
shotType: shot.type,
|
|
134
|
+
cameraAngle: shot.angle,
|
|
135
|
+
cameraMovement: shot.movement,
|
|
136
|
+
transition,
|
|
137
|
+
characters: shot.characters,
|
|
138
|
+
dialogue: shot.dialogue ? {
|
|
139
|
+
character: shot.focusCharacter || shot.characters[0] || "UNKNOWN",
|
|
140
|
+
line: shot.dialogue,
|
|
141
|
+
} : undefined,
|
|
142
|
+
notes: shot.notes,
|
|
143
|
+
seed: usedSeed,
|
|
144
|
+
imagePath,
|
|
145
|
+
shot,
|
|
146
|
+
scene,
|
|
147
|
+
videoPrompt: vp?.videoPrompt,
|
|
148
|
+
videoDuration: vp?.duration,
|
|
149
|
+
videoCameraMovement: vp?.cameraMovement,
|
|
150
|
+
videoAudioNotes: vp?.audioNotes,
|
|
151
|
+
videoTransition: vp?.transition,
|
|
152
|
+
videoStartFrame: vp?.startFrame,
|
|
153
|
+
veoConfig: vp?.video ?? vp?.veo,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return panels;
|
|
157
|
+
}
|
|
158
|
+
// ---- Storyboard compilation ---------------------------------------------
|
|
159
|
+
/**
|
|
160
|
+
* Assemble all generated panels into a final Storyboard structure.
|
|
161
|
+
*
|
|
162
|
+
* @param title - Screenplay title.
|
|
163
|
+
* @param scenePanels - Map of scene number to its generated panels.
|
|
164
|
+
* @param scenes - All Scene objects in order.
|
|
165
|
+
* @param characters - All locked character references.
|
|
166
|
+
* @param aesthetic - The aesthetic profile used for generation.
|
|
167
|
+
* @returns A complete Storyboard object.
|
|
168
|
+
*/
|
|
169
|
+
async compileStoryboard(title, scenePanels, scenes, characters, aesthetic) {
|
|
170
|
+
const storyboardScenes = [];
|
|
171
|
+
for (const scene of scenes) {
|
|
172
|
+
const panels = scenePanels.get(scene.number) ?? [];
|
|
173
|
+
storyboardScenes.push({ scene, panels });
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
title,
|
|
177
|
+
scenes: storyboardScenes,
|
|
178
|
+
characters,
|
|
179
|
+
aesthetic,
|
|
180
|
+
generatedAt: new Date().toISOString(),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
// ---- Persistence --------------------------------------------------------
|
|
184
|
+
/**
|
|
185
|
+
* Save the complete storyboard as a JSON file and ensure all images are
|
|
186
|
+
* written to the output directory.
|
|
187
|
+
*
|
|
188
|
+
* The JSON manifest omits the raw base64 image data from panels to keep
|
|
189
|
+
* the file manageable. Full base64 data is available on the in-memory
|
|
190
|
+
* Storyboard object for downstream consumers that need it.
|
|
191
|
+
*
|
|
192
|
+
* @param storyboard - The complete Storyboard to persist.
|
|
193
|
+
* @returns The absolute path to the saved JSON file.
|
|
194
|
+
*/
|
|
195
|
+
async saveStoryboard(storyboard) {
|
|
196
|
+
await mkdir(this.outputDir, { recursive: true });
|
|
197
|
+
// Build a JSON-safe manifest that strips large base64 blobs.
|
|
198
|
+
const manifest = {
|
|
199
|
+
title: storyboard.title,
|
|
200
|
+
generatedAt: storyboard.generatedAt,
|
|
201
|
+
aesthetic: storyboard.aesthetic,
|
|
202
|
+
characters: storyboard.characters.map((c) => ({
|
|
203
|
+
name: c.name,
|
|
204
|
+
locked: c.locked,
|
|
205
|
+
seed: c.seed,
|
|
206
|
+
shortDescription: c.description.shortDescription,
|
|
207
|
+
})),
|
|
208
|
+
scenes: storyboard.scenes.map((s) => ({
|
|
209
|
+
scene: {
|
|
210
|
+
number: s.scene.number,
|
|
211
|
+
heading: s.scene.heading,
|
|
212
|
+
location: s.scene.location,
|
|
213
|
+
timeOfDay: s.scene.timeOfDay,
|
|
214
|
+
characters: s.scene.characters,
|
|
215
|
+
mood: s.scene.mood,
|
|
216
|
+
},
|
|
217
|
+
panels: s.panels.map((p) => ({
|
|
218
|
+
id: p.id,
|
|
219
|
+
sceneNumber: p.sceneNumber,
|
|
220
|
+
panelNumber: p.panelNumber,
|
|
221
|
+
totalPanelsInScene: p.totalPanelsInScene,
|
|
222
|
+
imagePath: p.imagePath,
|
|
223
|
+
prompt: p.prompt,
|
|
224
|
+
seed: p.seed,
|
|
225
|
+
shotType: p.shotType,
|
|
226
|
+
cameraAngle: p.cameraAngle,
|
|
227
|
+
cameraMovement: p.cameraMovement,
|
|
228
|
+
characters: p.characters,
|
|
229
|
+
dialogue: p.dialogue,
|
|
230
|
+
notes: p.notes,
|
|
231
|
+
transition: p.transition,
|
|
232
|
+
videoPrompt: p.videoPrompt,
|
|
233
|
+
videoDuration: p.videoDuration,
|
|
234
|
+
videoCameraMovement: p.videoCameraMovement,
|
|
235
|
+
videoAudioNotes: p.videoAudioNotes,
|
|
236
|
+
videoTransition: p.videoTransition,
|
|
237
|
+
shot: p.shot ? {
|
|
238
|
+
shotNumber: p.shot.shotNumber,
|
|
239
|
+
type: p.shot.type,
|
|
240
|
+
angle: p.shot.angle,
|
|
241
|
+
movement: p.shot.movement,
|
|
242
|
+
lens: p.shot.lens,
|
|
243
|
+
characters: p.shot.characters,
|
|
244
|
+
focusCharacter: p.shot.focusCharacter,
|
|
245
|
+
action: p.shot.action,
|
|
246
|
+
dialogue: p.shot.dialogue,
|
|
247
|
+
transitionIn: p.shot.transitionIn,
|
|
248
|
+
transitionOut: p.shot.transitionOut,
|
|
249
|
+
notes: p.shot.notes,
|
|
250
|
+
} : undefined,
|
|
251
|
+
})),
|
|
252
|
+
})),
|
|
253
|
+
};
|
|
254
|
+
const jsonPath = join(this.outputDir, "storyboard.json");
|
|
255
|
+
await writeFile(jsonPath, JSON.stringify(manifest, null, 2), "utf-8");
|
|
256
|
+
return jsonPath;
|
|
257
|
+
}
|
|
258
|
+
// ---- Private: Venice API wrappers ---------------------------------------
|
|
259
|
+
/**
|
|
260
|
+
* Generate an image using the standard (no-reference) endpoint.
|
|
261
|
+
*/
|
|
262
|
+
async generateStandard(client, pr, model = NO_FACE_MODEL) {
|
|
263
|
+
const raw = await client.post("/api/v1/image/generate", {
|
|
264
|
+
model,
|
|
265
|
+
prompt: pr.prompt,
|
|
266
|
+
negative_prompt: pr.negativePrompt,
|
|
267
|
+
resolution: DEFAULT_RESOLUTION,
|
|
268
|
+
aspect_ratio: DEFAULT_ASPECT_RATIO,
|
|
269
|
+
steps: DEFAULT_STEPS,
|
|
270
|
+
cfg_scale: DEFAULT_CFG_SCALE,
|
|
271
|
+
seed: pr.seed,
|
|
272
|
+
hide_watermark: true,
|
|
273
|
+
safe_mode: false,
|
|
274
|
+
});
|
|
275
|
+
// Venice returns { images: ["base64string"] } or { images: [{ b64_json }] }.
|
|
276
|
+
const rawImages = raw.images ?? [];
|
|
277
|
+
if (rawImages.length === 0) {
|
|
278
|
+
throw new Error("Venice API returned no images.");
|
|
279
|
+
}
|
|
280
|
+
const first = rawImages[0];
|
|
281
|
+
const b64 = typeof first === "string" ? first : first.b64_json;
|
|
282
|
+
return { base64: b64, seed: undefined };
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Generate an image using the reference-augmented endpoint.
|
|
286
|
+
*
|
|
287
|
+
* Constructs a multi-reference prompt following the Venice protocol:
|
|
288
|
+
* the main prompt text is augmented with `Image N:` annotations, and
|
|
289
|
+
* reference images are sent as separate base64 payloads keyed by slot.
|
|
290
|
+
*/
|
|
291
|
+
async generateWithReferences(client, pr, model = FACE_MODEL) {
|
|
292
|
+
// nano-banana-pro does not accept reference image payloads (image_1, image_2, etc.).
|
|
293
|
+
// Character consistency relies on exhaustive text descriptions + seed anchoring.
|
|
294
|
+
const raw = await client.post("/api/v1/image/generate", {
|
|
295
|
+
model,
|
|
296
|
+
prompt: pr.prompt,
|
|
297
|
+
negative_prompt: pr.negativePrompt,
|
|
298
|
+
resolution: DEFAULT_RESOLUTION,
|
|
299
|
+
aspect_ratio: DEFAULT_ASPECT_RATIO,
|
|
300
|
+
steps: DEFAULT_STEPS,
|
|
301
|
+
cfg_scale: DEFAULT_CFG_SCALE,
|
|
302
|
+
seed: pr.seed,
|
|
303
|
+
hide_watermark: true,
|
|
304
|
+
safe_mode: false,
|
|
305
|
+
});
|
|
306
|
+
// Venice returns { images: ["base64string"] } or { images: [{ b64_json }] }.
|
|
307
|
+
const rawImages = raw.images ?? [];
|
|
308
|
+
if (rawImages.length === 0) {
|
|
309
|
+
throw new Error("Venice API returned no images for reference-augmented generation.");
|
|
310
|
+
}
|
|
311
|
+
const first = rawImages[0];
|
|
312
|
+
const b64 = typeof first === "string" ? first : first.b64_json;
|
|
313
|
+
return {
|
|
314
|
+
base64: b64,
|
|
315
|
+
seed: undefined,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=assembler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assembler.js","sourceRoot":"","sources":["../../src/storyboard/assembler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { Shot } from "./shot-planner.js";
|
|
2
|
+
import type { Scene } from "../parsers/scene-extractor.js";
|
|
3
|
+
import type { CharacterDescription } from "../characters/describer.js";
|
|
4
|
+
import type { CharacterLock } from "../characters/reference-manager.js";
|
|
5
|
+
export interface AestheticProfile {
|
|
6
|
+
/** Overall visual style, e.g. "Cinematic photography". */
|
|
7
|
+
style: string;
|
|
8
|
+
/** Color palette, e.g. "warm amber palette". */
|
|
9
|
+
palette: string;
|
|
10
|
+
/** Lighting approach, e.g. "natural lighting with film grain". */
|
|
11
|
+
lighting: string;
|
|
12
|
+
/** Lens rendering traits, e.g. "anamorphic lens characteristics". */
|
|
13
|
+
lensCharacteristics: string;
|
|
14
|
+
/** Emulated film stock, e.g. "35mm Kodak Vision3 500T". */
|
|
15
|
+
filmStock: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PromptResult {
|
|
18
|
+
/** The assembled text prompt ready for the generation API. */
|
|
19
|
+
prompt: string;
|
|
20
|
+
/** Reference images to attach to the generation request. */
|
|
21
|
+
referenceImages: {
|
|
22
|
+
base64: string;
|
|
23
|
+
role: string;
|
|
24
|
+
}[];
|
|
25
|
+
/** Negative prompt describing what to exclude. */
|
|
26
|
+
negativePrompt: string;
|
|
27
|
+
/** Reproducibility seed (from the first character lock that has one). */
|
|
28
|
+
seed?: number;
|
|
29
|
+
/** Paired video generation prompt (populated by buildVideoPrompt). */
|
|
30
|
+
videoPrompt?: VideoPromptResult;
|
|
31
|
+
}
|
|
32
|
+
/** Audio cue metadata for a video clip. */
|
|
33
|
+
export interface AudioNotes {
|
|
34
|
+
dialogue?: string;
|
|
35
|
+
sfx?: string;
|
|
36
|
+
ambient?: string;
|
|
37
|
+
}
|
|
38
|
+
/** Video API-ready configuration block. */
|
|
39
|
+
export interface VideoConfig {
|
|
40
|
+
model: string;
|
|
41
|
+
prompt: string;
|
|
42
|
+
duration: string;
|
|
43
|
+
audio: boolean;
|
|
44
|
+
}
|
|
45
|
+
/** @deprecated Use VideoConfig instead. Kept for backward compatibility. */
|
|
46
|
+
export type VeoConfig = VideoConfig & {
|
|
47
|
+
negativePrompt?: string;
|
|
48
|
+
aspectRatio?: string;
|
|
49
|
+
resolution?: string;
|
|
50
|
+
durationSeconds?: string;
|
|
51
|
+
generateAudio?: boolean;
|
|
52
|
+
seed?: number;
|
|
53
|
+
};
|
|
54
|
+
/** Result of buildVideoPrompt() -- describes motion over time for a shot. */
|
|
55
|
+
export interface VideoPromptResult {
|
|
56
|
+
/** The text prompt for a video generation model. */
|
|
57
|
+
videoPrompt: string;
|
|
58
|
+
/** Suggested clip duration in seconds. */
|
|
59
|
+
duration: number;
|
|
60
|
+
/** Specific camera motion instruction (e.g. "dolly-in, slow"). */
|
|
61
|
+
cameraMovement: string;
|
|
62
|
+
/** Description tying this clip to the image panel (first-frame reference). */
|
|
63
|
+
startFrame: string;
|
|
64
|
+
/** Audio cue metadata. */
|
|
65
|
+
audioNotes: AudioNotes;
|
|
66
|
+
/** Transition to the next clip. */
|
|
67
|
+
transition: string;
|
|
68
|
+
/** Video API-ready configuration block. */
|
|
69
|
+
video: VideoConfig;
|
|
70
|
+
/** @deprecated Use `video` instead. */
|
|
71
|
+
veo?: VeoConfig;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Build a structured image-generation prompt from a shot, its parent scene,
|
|
75
|
+
* an aesthetic profile, and character data.
|
|
76
|
+
*
|
|
77
|
+
* The prompt follows a structured template with tagged sections so the
|
|
78
|
+
* image model can attend to each aspect independently:
|
|
79
|
+
*
|
|
80
|
+
* ```
|
|
81
|
+
* [AESTHETIC] ...
|
|
82
|
+
* [SHOT] ...
|
|
83
|
+
* [SETTING] ...
|
|
84
|
+
* [CHARACTERS] ...
|
|
85
|
+
* [ACTION] ...
|
|
86
|
+
* [MOOD] ...
|
|
87
|
+
* [LIGHTING] ...
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* Reference images are collected from character locks (front-facing angles)
|
|
91
|
+
* and returned alongside the prompt for multi-reference generation.
|
|
92
|
+
*/
|
|
93
|
+
export declare function buildPrompt(shot: Shot, scene: Scene, aesthetic: AestheticProfile, characterDescriptions: Map<string, CharacterDescription>, characterLocks: Map<string, CharacterLock>): PromptResult;
|
|
94
|
+
/**
|
|
95
|
+
* Build a video-generation prompt from a shot, its parent scene, and
|
|
96
|
+
* aesthetic data.
|
|
97
|
+
*
|
|
98
|
+
* The prompt is plain descriptive prose kept under ~150 words: camera
|
|
99
|
+
* movement, subject + action, setting, style, and audio cues. Only the
|
|
100
|
+
* aesthetic register relevant to the current scene is included.
|
|
101
|
+
*
|
|
102
|
+
* Directing principle (see .claude/agents/prompt-engineer.md and the README
|
|
103
|
+
* "Directing layer"): the prose should DIRECT the shot -- one intention
|
|
104
|
+
* expressed through camera/light/blocking/performance/sound -- rather than
|
|
105
|
+
* stack "cinematic" adjectives. Camera, angle, and movement come from the
|
|
106
|
+
* shot's authored intention, not from a generic "make it cinematic" default.
|
|
107
|
+
*
|
|
108
|
+
* The returned `video` block is API-ready for any supported video model.
|
|
109
|
+
* The model field is a default -- the generation script chooses the actual
|
|
110
|
+
* model at runtime.
|
|
111
|
+
*/
|
|
112
|
+
export declare function buildVideoPrompt(shot: Shot, scene: Scene, aesthetic: AestheticProfile): VideoPromptResult;
|
|
113
|
+
//# sourceMappingURL=prompt-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/storyboard/prompt-builder.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAIxE,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IAEd,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAEhB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;IAEjB,qEAAqE;IACrE,mBAAmB,EAAE,MAAM,CAAC;IAE5B,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IAEf,4DAA4D;IAC5D,eAAe,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAEpD,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IAEvB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,sEAAsE;IACtE,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,2CAA2C;AAC3C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IAEpB,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IAEjB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IAEvB,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IAEnB,0BAA0B;IAC1B,UAAU,EAAE,UAAU,CAAC;IAEvB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IAEnB,2CAA2C;IAC3C,KAAK,EAAE,WAAW,CAAC;IAEnB,uCAAuC;IACvC,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB;AA8MD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,gBAAgB,EAC3B,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,EACxD,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACzC,YAAY,CAmGd;AAwOD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,gBAAgB,GAC1B,iBAAiB,CAqFnB"}
|