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.
Files changed (264) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -0
  3. package/README.md +598 -0
  4. package/dist/assembly/manifest-builder.d.ts +8 -0
  5. package/dist/assembly/manifest-builder.d.ts.map +1 -0
  6. package/dist/assembly/manifest-builder.js +196 -0
  7. package/dist/assembly/manifest-builder.js.map +1 -0
  8. package/dist/assembly/remotion-scaffold.d.ts +14 -0
  9. package/dist/assembly/remotion-scaffold.d.ts.map +1 -0
  10. package/dist/assembly/remotion-scaffold.js +292 -0
  11. package/dist/assembly/remotion-scaffold.js.map +1 -0
  12. package/dist/assembly/types.d.ts +67 -0
  13. package/dist/assembly/types.d.ts.map +1 -0
  14. package/dist/assembly/types.js +5 -0
  15. package/dist/assembly/types.js.map +1 -0
  16. package/dist/characters/describer.d.ts +32 -0
  17. package/dist/characters/describer.d.ts.map +1 -0
  18. package/dist/characters/describer.js +309 -0
  19. package/dist/characters/describer.js.map +1 -0
  20. package/dist/characters/extractor.d.ts +27 -0
  21. package/dist/characters/extractor.d.ts.map +1 -0
  22. package/dist/characters/extractor.js +274 -0
  23. package/dist/characters/extractor.js.map +1 -0
  24. package/dist/characters/reference-manager.d.ts +95 -0
  25. package/dist/characters/reference-manager.d.ts.map +1 -0
  26. package/dist/characters/reference-manager.js +346 -0
  27. package/dist/characters/reference-manager.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +310 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/config.d.ts +22 -0
  33. package/dist/config.d.ts.map +1 -0
  34. package/dist/config.js +66 -0
  35. package/dist/config.js.map +1 -0
  36. package/dist/editing/aligner.d.ts +44 -0
  37. package/dist/editing/aligner.d.ts.map +1 -0
  38. package/dist/editing/aligner.js +201 -0
  39. package/dist/editing/aligner.js.map +1 -0
  40. package/dist/editing/edl.d.ts +45 -0
  41. package/dist/editing/edl.d.ts.map +1 -0
  42. package/dist/editing/edl.js +133 -0
  43. package/dist/editing/edl.js.map +1 -0
  44. package/dist/editing/overlays.d.ts +97 -0
  45. package/dist/editing/overlays.d.ts.map +1 -0
  46. package/dist/editing/overlays.js +41 -0
  47. package/dist/editing/overlays.js.map +1 -0
  48. package/dist/editing/packer.d.ts +52 -0
  49. package/dist/editing/packer.d.ts.map +1 -0
  50. package/dist/editing/packer.js +170 -0
  51. package/dist/editing/packer.js.map +1 -0
  52. package/dist/editing/providers/whisper-cpp.d.ts +32 -0
  53. package/dist/editing/providers/whisper-cpp.d.ts.map +1 -0
  54. package/dist/editing/providers/whisper-cpp.js +239 -0
  55. package/dist/editing/providers/whisper-cpp.js.map +1 -0
  56. package/dist/editing/render.d.ts +36 -0
  57. package/dist/editing/render.d.ts.map +1 -0
  58. package/dist/editing/render.js +227 -0
  59. package/dist/editing/render.js.map +1 -0
  60. package/dist/editing/self-eval.d.ts +48 -0
  61. package/dist/editing/self-eval.d.ts.map +1 -0
  62. package/dist/editing/self-eval.js +293 -0
  63. package/dist/editing/self-eval.js.map +1 -0
  64. package/dist/editing/silence.d.ts +76 -0
  65. package/dist/editing/silence.d.ts.map +1 -0
  66. package/dist/editing/silence.js +189 -0
  67. package/dist/editing/silence.js.map +1 -0
  68. package/dist/editing/types.d.ts +178 -0
  69. package/dist/editing/types.d.ts.map +1 -0
  70. package/dist/editing/types.js +13 -0
  71. package/dist/editing/types.js.map +1 -0
  72. package/dist/index.d.ts +6 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +5 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/interactive.d.ts +12 -0
  77. package/dist/interactive.d.ts.map +1 -0
  78. package/dist/interactive.js +78 -0
  79. package/dist/interactive.js.map +1 -0
  80. package/dist/mini-drama/assembler.d.ts +61 -0
  81. package/dist/mini-drama/assembler.d.ts.map +1 -0
  82. package/dist/mini-drama/assembler.js +466 -0
  83. package/dist/mini-drama/assembler.js.map +1 -0
  84. package/dist/mini-drama/audio-mix.d.ts +65 -0
  85. package/dist/mini-drama/audio-mix.d.ts.map +1 -0
  86. package/dist/mini-drama/audio-mix.js +118 -0
  87. package/dist/mini-drama/audio-mix.js.map +1 -0
  88. package/dist/mini-drama/cli.d.ts +3 -0
  89. package/dist/mini-drama/cli.d.ts.map +1 -0
  90. package/dist/mini-drama/cli.js +2869 -0
  91. package/dist/mini-drama/cli.js.map +1 -0
  92. package/dist/mini-drama/fcpxml-export.d.ts +2 -0
  93. package/dist/mini-drama/fcpxml-export.d.ts.map +1 -0
  94. package/dist/mini-drama/fcpxml-export.js +5 -0
  95. package/dist/mini-drama/fcpxml-export.js.map +1 -0
  96. package/dist/mini-drama/generation-planner.d.ts +24 -0
  97. package/dist/mini-drama/generation-planner.d.ts.map +1 -0
  98. package/dist/mini-drama/generation-planner.js +304 -0
  99. package/dist/mini-drama/generation-planner.js.map +1 -0
  100. package/dist/mini-drama/location-generator.d.ts +23 -0
  101. package/dist/mini-drama/location-generator.d.ts.map +1 -0
  102. package/dist/mini-drama/location-generator.js +144 -0
  103. package/dist/mini-drama/location-generator.js.map +1 -0
  104. package/dist/mini-drama/music-cues.d.ts +96 -0
  105. package/dist/mini-drama/music-cues.d.ts.map +1 -0
  106. package/dist/mini-drama/music-cues.js +332 -0
  107. package/dist/mini-drama/music-cues.js.map +1 -0
  108. package/dist/mini-drama/panel-fixer.d.ts +12 -0
  109. package/dist/mini-drama/panel-fixer.d.ts.map +1 -0
  110. package/dist/mini-drama/panel-fixer.js +319 -0
  111. package/dist/mini-drama/panel-fixer.js.map +1 -0
  112. package/dist/mini-drama/prompt-builder.d.ts +149 -0
  113. package/dist/mini-drama/prompt-builder.d.ts.map +1 -0
  114. package/dist/mini-drama/prompt-builder.js +722 -0
  115. package/dist/mini-drama/prompt-builder.js.map +1 -0
  116. package/dist/mini-drama/reference-slots.d.ts +31 -0
  117. package/dist/mini-drama/reference-slots.d.ts.map +1 -0
  118. package/dist/mini-drama/reference-slots.js +161 -0
  119. package/dist/mini-drama/reference-slots.js.map +1 -0
  120. package/dist/mini-drama/shot-paths.d.ts +77 -0
  121. package/dist/mini-drama/shot-paths.d.ts.map +1 -0
  122. package/dist/mini-drama/shot-paths.js +101 -0
  123. package/dist/mini-drama/shot-paths.js.map +1 -0
  124. package/dist/mini-drama/storyboard-reference-generator.d.ts +47 -0
  125. package/dist/mini-drama/storyboard-reference-generator.d.ts.map +1 -0
  126. package/dist/mini-drama/storyboard-reference-generator.js +293 -0
  127. package/dist/mini-drama/storyboard-reference-generator.js.map +1 -0
  128. package/dist/mini-drama/subtitle-generator.d.ts +12 -0
  129. package/dist/mini-drama/subtitle-generator.d.ts.map +1 -0
  130. package/dist/mini-drama/subtitle-generator.js +139 -0
  131. package/dist/mini-drama/subtitle-generator.js.map +1 -0
  132. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts +3 -0
  133. package/dist/mini-drama/timeline-export/davinci-fcpxml.d.ts.map +1 -0
  134. package/dist/mini-drama/timeline-export/davinci-fcpxml.js +150 -0
  135. package/dist/mini-drama/timeline-export/davinci-fcpxml.js.map +1 -0
  136. package/dist/mini-drama/timeline-export/fcpxml.d.ts +11 -0
  137. package/dist/mini-drama/timeline-export/fcpxml.d.ts.map +1 -0
  138. package/dist/mini-drama/timeline-export/fcpxml.js +140 -0
  139. package/dist/mini-drama/timeline-export/fcpxml.js.map +1 -0
  140. package/dist/mini-drama/timeline-export/index.d.ts +13 -0
  141. package/dist/mini-drama/timeline-export/index.d.ts.map +1 -0
  142. package/dist/mini-drama/timeline-export/index.js +26 -0
  143. package/dist/mini-drama/timeline-export/index.js.map +1 -0
  144. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts +3 -0
  145. package/dist/mini-drama/timeline-export/premiere-xmeml.d.ts.map +1 -0
  146. package/dist/mini-drama/timeline-export/premiere-xmeml.js +211 -0
  147. package/dist/mini-drama/timeline-export/premiere-xmeml.js.map +1 -0
  148. package/dist/mini-drama/timeline-export/probe.d.ts +53 -0
  149. package/dist/mini-drama/timeline-export/probe.d.ts.map +1 -0
  150. package/dist/mini-drama/timeline-export/probe.js +89 -0
  151. package/dist/mini-drama/timeline-export/probe.js.map +1 -0
  152. package/dist/mini-drama/timeline-export/types.d.ts +57 -0
  153. package/dist/mini-drama/timeline-export/types.d.ts.map +1 -0
  154. package/dist/mini-drama/timeline-export/types.js +14 -0
  155. package/dist/mini-drama/timeline-export/types.js.map +1 -0
  156. package/dist/mini-drama/video-generator.d.ts +22 -0
  157. package/dist/mini-drama/video-generator.d.ts.map +1 -0
  158. package/dist/mini-drama/video-generator.js +1305 -0
  159. package/dist/mini-drama/video-generator.js.map +1 -0
  160. package/dist/mini-drama/voice-reference.d.ts +42 -0
  161. package/dist/mini-drama/voice-reference.d.ts.map +1 -0
  162. package/dist/mini-drama/voice-reference.js +170 -0
  163. package/dist/mini-drama/voice-reference.js.map +1 -0
  164. package/dist/output/html-renderer.d.ts +2 -0
  165. package/dist/output/html-renderer.d.ts.map +1 -0
  166. package/dist/output/html-renderer.js +37 -0
  167. package/dist/output/html-renderer.js.map +1 -0
  168. package/dist/parsers/fountain-parser.d.ts +34 -0
  169. package/dist/parsers/fountain-parser.d.ts.map +1 -0
  170. package/dist/parsers/fountain-parser.js +71 -0
  171. package/dist/parsers/fountain-parser.js.map +1 -0
  172. package/dist/parsers/pdf-parser.d.ts +24 -0
  173. package/dist/parsers/pdf-parser.d.ts.map +1 -0
  174. package/dist/parsers/pdf-parser.js +237 -0
  175. package/dist/parsers/pdf-parser.js.map +1 -0
  176. package/dist/parsers/scene-extractor.d.ts +41 -0
  177. package/dist/parsers/scene-extractor.d.ts.map +1 -0
  178. package/dist/parsers/scene-extractor.js +400 -0
  179. package/dist/parsers/scene-extractor.js.map +1 -0
  180. package/dist/series/manager.d.ts +64 -0
  181. package/dist/series/manager.d.ts.map +1 -0
  182. package/dist/series/manager.js +282 -0
  183. package/dist/series/manager.js.map +1 -0
  184. package/dist/series/types.d.ts +641 -0
  185. package/dist/series/types.d.ts.map +1 -0
  186. package/dist/series/types.js +304 -0
  187. package/dist/series/types.js.map +1 -0
  188. package/dist/storyboard/assembler.d.ts +134 -0
  189. package/dist/storyboard/assembler.d.ts.map +1 -0
  190. package/dist/storyboard/assembler.js +319 -0
  191. package/dist/storyboard/assembler.js.map +1 -0
  192. package/dist/storyboard/prompt-builder.d.ts +113 -0
  193. package/dist/storyboard/prompt-builder.d.ts.map +1 -0
  194. package/dist/storyboard/prompt-builder.js +578 -0
  195. package/dist/storyboard/prompt-builder.js.map +1 -0
  196. package/dist/storyboard/shot-planner.d.ts +34 -0
  197. package/dist/storyboard/shot-planner.d.ts.map +1 -0
  198. package/dist/storyboard/shot-planner.js +446 -0
  199. package/dist/storyboard/shot-planner.js.map +1 -0
  200. package/dist/user-config.d.ts +15 -0
  201. package/dist/user-config.d.ts.map +1 -0
  202. package/dist/user-config.js +103 -0
  203. package/dist/user-config.js.map +1 -0
  204. package/dist/venice/audio-preflight.d.ts +80 -0
  205. package/dist/venice/audio-preflight.d.ts.map +1 -0
  206. package/dist/venice/audio-preflight.js +142 -0
  207. package/dist/venice/audio-preflight.js.map +1 -0
  208. package/dist/venice/audio.d.ts +88 -0
  209. package/dist/venice/audio.d.ts.map +1 -0
  210. package/dist/venice/audio.js +234 -0
  211. package/dist/venice/audio.js.map +1 -0
  212. package/dist/venice/client.d.ts +86 -0
  213. package/dist/venice/client.d.ts.map +1 -0
  214. package/dist/venice/client.js +375 -0
  215. package/dist/venice/client.js.map +1 -0
  216. package/dist/venice/edit.d.ts +57 -0
  217. package/dist/venice/edit.d.ts.map +1 -0
  218. package/dist/venice/edit.js +100 -0
  219. package/dist/venice/edit.js.map +1 -0
  220. package/dist/venice/generate.d.ts +47 -0
  221. package/dist/venice/generate.d.ts.map +1 -0
  222. package/dist/venice/generate.js +150 -0
  223. package/dist/venice/generate.js.map +1 -0
  224. package/dist/venice/image-bytes.d.ts +26 -0
  225. package/dist/venice/image-bytes.d.ts.map +1 -0
  226. package/dist/venice/image-bytes.js +101 -0
  227. package/dist/venice/image-bytes.js.map +1 -0
  228. package/dist/venice/models.d.ts +143 -0
  229. package/dist/venice/models.d.ts.map +1 -0
  230. package/dist/venice/models.js +984 -0
  231. package/dist/venice/models.js.map +1 -0
  232. package/dist/venice/multi-edit.d.ts +40 -0
  233. package/dist/venice/multi-edit.d.ts.map +1 -0
  234. package/dist/venice/multi-edit.js +97 -0
  235. package/dist/venice/multi-edit.js.map +1 -0
  236. package/dist/venice/provenance.d.ts +66 -0
  237. package/dist/venice/provenance.d.ts.map +1 -0
  238. package/dist/venice/provenance.js +151 -0
  239. package/dist/venice/provenance.js.map +1 -0
  240. package/dist/venice/recipe.d.ts +69 -0
  241. package/dist/venice/recipe.d.ts.map +1 -0
  242. package/dist/venice/recipe.js +103 -0
  243. package/dist/venice/recipe.js.map +1 -0
  244. package/dist/venice/rejection.d.ts +63 -0
  245. package/dist/venice/rejection.d.ts.map +1 -0
  246. package/dist/venice/rejection.js +111 -0
  247. package/dist/venice/rejection.js.map +1 -0
  248. package/dist/venice/seedance-preflight.d.ts +38 -0
  249. package/dist/venice/seedance-preflight.d.ts.map +1 -0
  250. package/dist/venice/seedance-preflight.js +29 -0
  251. package/dist/venice/seedance-preflight.js.map +1 -0
  252. package/dist/venice/types.d.ts +212 -0
  253. package/dist/venice/types.d.ts.map +1 -0
  254. package/dist/venice/types.js +9 -0
  255. package/dist/venice/types.js.map +1 -0
  256. package/dist/venice/video.d.ts +77 -0
  257. package/dist/venice/video.d.ts.map +1 -0
  258. package/dist/venice/video.js +163 -0
  259. package/dist/venice/video.js.map +1 -0
  260. package/dist/venice/voices.d.ts +40 -0
  261. package/dist/venice/voices.d.ts.map +1 -0
  262. package/dist/venice/voices.js +194 -0
  263. package/dist/venice/voices.js.map +1 -0
  264. package/package.json +79 -0
@@ -0,0 +1,150 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Image generation functions for the Venice AI API.
3
+ //
4
+ // - generateImage -- thin wrapper around POST /api/v1/image/generate
5
+ // - generateWithReferences -- builds a reference-augmented prompt for
6
+ // character-consistent storyboard frames
7
+ // ---------------------------------------------------------------------------
8
+ import { assertNotSilentRejectImage, thresholdForResolution } from "./rejection.js";
9
+ // ---- Constants ------------------------------------------------------------
10
+ const GENERATE_PATH = "/api/v1/image/generate";
11
+ // Safe low-level fallback when no caller supplies a model. `seedream-v5-lite`
12
+ // is accepted by Seedance 2.0 regardless of whether the output contains a
13
+ // face. High-level callers (mini-drama CLI, storyboard assembler) should
14
+ // pick a model based on face presence — nano-banana-pro for faceless work,
15
+ // seedream-v5-lite for face-bearing work.
16
+ const DEFAULT_MODEL = "seedream-v5-lite";
17
+ const DEFAULT_RESOLUTION = "1K";
18
+ const DEFAULT_ASPECT_RATIO = "1:1";
19
+ /** Venice supports up to 14 reference images per request. */
20
+ const MAX_REFERENCE_IMAGES = 14;
21
+ /** Maximum number of the 14 slots that may be used for face references. */
22
+ const MAX_FACE_SLOTS = 5;
23
+ // ---- generateImage --------------------------------------------------------
24
+ /**
25
+ * Generate a single image from a text prompt.
26
+ *
27
+ * This is a straightforward 1:1 mapping to the Venice `/api/v1/image/generate`
28
+ * endpoint. All request fields are forwarded as-is; only `model`, `resolution`,
29
+ * and `aspect_ratio` receive defaults when omitted.
30
+ *
31
+ * @param client An authenticated {@link VeniceClient} instance.
32
+ * @param options Request parameters. At minimum `prompt` is required.
33
+ * @returns The full API response including the `images` array.
34
+ */
35
+ export async function generateImage(client, options) {
36
+ const body = {
37
+ model: options.model ?? DEFAULT_MODEL,
38
+ resolution: options.resolution ?? DEFAULT_RESOLUTION,
39
+ aspect_ratio: options.aspect_ratio ?? DEFAULT_ASPECT_RATIO,
40
+ ...options,
41
+ };
42
+ const raw = await client.post(GENERATE_PATH, body);
43
+ // Venice may return images as raw base64 strings or as { b64_json } objects.
44
+ // Normalize to the { b64_json, seed } shape our codebase expects.
45
+ const rawImages = raw.images ?? [];
46
+ const normalized = {
47
+ images: rawImages.map((img) => {
48
+ if (typeof img === "string") {
49
+ return { b64_json: img };
50
+ }
51
+ return img;
52
+ }),
53
+ };
54
+ const threshold = thresholdForResolution(body.resolution);
55
+ for (const img of normalized.images) {
56
+ const decoded = Buffer.from(img.b64_json, "base64");
57
+ assertNotSilentRejectImage(decoded, {
58
+ model: body.model,
59
+ prompt: body.prompt,
60
+ threshold,
61
+ });
62
+ }
63
+ return normalized;
64
+ }
65
+ // ---- generateWithReferences -----------------------------------------------
66
+ /**
67
+ * Generate a scene image while injecting character face references for
68
+ * identity consistency across storyboard frames.
69
+ *
70
+ * **How it works**
71
+ *
72
+ * 1. The caller supplies up to 14 {@link CharacterReference} entries via
73
+ * `options.referenceImages`.
74
+ * 2. The first N entries (where N = `options.faceSlots`, default 5, max 5)
75
+ * are treated as **face references**. For each one a role-assignment line
76
+ * is prepended to the prompt so the model knows which reference image
77
+ * corresponds to which character:
78
+ *
79
+ * ```
80
+ * Image 1: face reference for MARCUS (the detective)
81
+ * Image 2: face reference for LENA (the journalist)
82
+ * ```
83
+ *
84
+ * 3. All reference images (face + non-face) are concatenated as a
85
+ * comma-separated base-64 string in the `image` field, which Venice
86
+ * interprets as a multi-reference input.
87
+ *
88
+ * 4. The fidelity is set to a moderate default (0.35) to allow creative
89
+ * freedom while anchoring character likeness.
90
+ *
91
+ * @param client An authenticated {@link VeniceClient} instance.
92
+ * @param options Generation parameters plus reference images.
93
+ * @returns The generated image as base-64 and the seed used.
94
+ */
95
+ export async function generateWithReferences(client, options) {
96
+ const { referenceImages, faceSlots: rawFaceSlots, prompt, negative_prompt, resolution = DEFAULT_RESOLUTION, aspect_ratio = DEFAULT_ASPECT_RATIO, model = DEFAULT_MODEL, steps, cfg_scale, seed, safe_mode, hide_watermark, } = options;
97
+ // ---- Validate reference counts ------------------------------------------
98
+ if (referenceImages.length > MAX_REFERENCE_IMAGES) {
99
+ throw new Error(`Venice supports at most ${MAX_REFERENCE_IMAGES} reference images per request, ` +
100
+ `but ${referenceImages.length} were provided.`);
101
+ }
102
+ const faceSlots = Math.min(Math.max(rawFaceSlots ?? MAX_FACE_SLOTS, 0), MAX_FACE_SLOTS);
103
+ // ---- Build augmented prompt ---------------------------------------------
104
+ const faceRefs = referenceImages.slice(0, faceSlots);
105
+ const roleLines = faceRefs.map((ref, i) => `Image ${i + 1}: face reference for ${ref.name} (${ref.role})`);
106
+ const augmentedPrompt = roleLines.length > 0
107
+ ? `${roleLines.join("\n")}\n\n${prompt}`
108
+ : prompt;
109
+ // ---- Assemble request body ----------------------------------------------
110
+ const body = {
111
+ model,
112
+ prompt: augmentedPrompt,
113
+ resolution,
114
+ aspect_ratio,
115
+ };
116
+ if (negative_prompt !== undefined)
117
+ body.negative_prompt = negative_prompt;
118
+ if (steps !== undefined)
119
+ body.steps = steps;
120
+ if (cfg_scale !== undefined)
121
+ body.cfg_scale = cfg_scale;
122
+ if (seed !== undefined)
123
+ body.seed = seed;
124
+ if (safe_mode !== undefined)
125
+ body.safe_mode = safe_mode;
126
+ if (hide_watermark !== undefined)
127
+ body.hide_watermark = hide_watermark;
128
+ // ---- Call API -----------------------------------------------------------
129
+ const raw = await client.post(GENERATE_PATH, body);
130
+ // Venice may return images as raw base64 strings or as { b64_json } objects.
131
+ const rawImages = raw.images ?? [];
132
+ const firstImage = rawImages[0];
133
+ if (!firstImage) {
134
+ throw new Error("Venice API returned an empty images array.");
135
+ }
136
+ const b64 = typeof firstImage === "string"
137
+ ? firstImage
138
+ : firstImage.b64_json;
139
+ const resultSeed = typeof firstImage === "object"
140
+ ? firstImage.seed
141
+ : undefined;
142
+ const decoded = Buffer.from(b64, "base64");
143
+ assertNotSilentRejectImage(decoded, {
144
+ model,
145
+ prompt: augmentedPrompt,
146
+ threshold: thresholdForResolution(resolution),
147
+ });
148
+ return { base64: b64, seed: resultSeed };
149
+ }
150
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/venice/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export type ImageFormat = 'png' | 'jpeg' | 'webp' | 'gif' | 'avif' | 'unknown';
2
+ export interface SniffResult {
3
+ format: ImageFormat;
4
+ mime: string;
5
+ ext: string;
6
+ }
7
+ /**
8
+ * Inspect the leading bytes of `buf` and return the image format. Returns
9
+ * `{ format: 'unknown', mime: 'application/octet-stream', ext: '.bin' }` when
10
+ * no known magic matches.
11
+ */
12
+ export declare function sniffImageFormat(buf: Uint8Array | Buffer): SniffResult;
13
+ /**
14
+ * Write image bytes to disk, using the sniffed extension instead of the
15
+ * caller-supplied extension when they disagree.
16
+ *
17
+ * Returns the final on-disk path. When `requestedPath` says `.png` but the
18
+ * buffer is actually WebP, the file is written as `<base>.webp` and a
19
+ * `console.warn` records the mismatch. Pass `forceExt: true` to keep the
20
+ * caller's extension (useful when downstream tooling really does need a
21
+ * fixed name, even if the format is a lie — but transcode first when you can).
22
+ */
23
+ export declare function writeImageBytesSmart(buf: Buffer, requestedPath: string, opts?: {
24
+ forceExt?: boolean;
25
+ }): Promise<string>;
26
+ //# sourceMappingURL=image-bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-bytes.d.ts","sourceRoot":"","sources":["../../src/venice/image-bytes.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AA+CD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,GAAG,WAAW,CAKtE;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5B,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
@@ -0,0 +1,101 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Image-format byte sniffing.
3
+ //
4
+ // Seedream sometimes returns WebP bytes when callers asked for PNG. The
5
+ // harness used to write them with a `.png` extension anyway, which confuses
6
+ // downstream consumers (older ffmpeg, macOS Preview, image-tag thumbnailers,
7
+ // and the silent-reject heuristic that uses byte-size thresholds calibrated
8
+ // for PNG at 1K).
9
+ //
10
+ // `sniffImageFormat` inspects the leading magic bytes and returns the real
11
+ // MIME type plus a canonical file extension. `writeImageBytesSmart` writes
12
+ // the buffer to disk using the sniffed extension; if a `forceExt` is
13
+ // provided, the buffer is written under the requested name AND a sibling
14
+ // file with the sniffed extension is written too — so callers that hardcode
15
+ // `front.png` get the file at `front.png` AND know the real format via
16
+ // `front.webp` if a transcode is needed.
17
+ // ---------------------------------------------------------------------------
18
+ import { writeFile } from 'node:fs/promises';
19
+ import { extname, join, dirname, basename } from 'node:path';
20
+ const SNIFFERS = [
21
+ {
22
+ format: 'png',
23
+ mime: 'image/png',
24
+ ext: '.png',
25
+ // 89 50 4E 47 0D 0A 1A 0A
26
+ match: b => b.length >= 8 &&
27
+ b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4E && b[3] === 0x47 &&
28
+ b[4] === 0x0D && b[5] === 0x0A && b[6] === 0x1A && b[7] === 0x0A,
29
+ },
30
+ {
31
+ format: 'jpeg',
32
+ mime: 'image/jpeg',
33
+ ext: '.jpg',
34
+ // FF D8 FF
35
+ match: b => b.length >= 3 && b[0] === 0xFF && b[1] === 0xD8 && b[2] === 0xFF,
36
+ },
37
+ {
38
+ format: 'webp',
39
+ mime: 'image/webp',
40
+ ext: '.webp',
41
+ // 52 49 46 46 XX XX XX XX 57 45 42 50 -> "RIFF....WEBP"
42
+ match: b => b.length >= 12 &&
43
+ b[0] === 0x52 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x46 &&
44
+ b[8] === 0x57 && b[9] === 0x45 && b[10] === 0x42 && b[11] === 0x50,
45
+ },
46
+ {
47
+ format: 'gif',
48
+ mime: 'image/gif',
49
+ ext: '.gif',
50
+ // 47 49 46 38 (37|39) 61 "GIF87a" or "GIF89a"
51
+ match: b => b.length >= 6 && b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x38 &&
52
+ (b[4] === 0x37 || b[4] === 0x39) && b[5] === 0x61,
53
+ },
54
+ {
55
+ format: 'avif',
56
+ mime: 'image/avif',
57
+ ext: '.avif',
58
+ // ftyp box at offset 4: 'ftyp' then major brand 'avif'/'avis'
59
+ match: b => b.length >= 12 &&
60
+ b[4] === 0x66 && b[5] === 0x74 && b[6] === 0x79 && b[7] === 0x70 &&
61
+ b[8] === 0x61 && b[9] === 0x76 && b[10] === 0x69 && (b[11] === 0x66 || b[11] === 0x73),
62
+ },
63
+ ];
64
+ /**
65
+ * Inspect the leading bytes of `buf` and return the image format. Returns
66
+ * `{ format: 'unknown', mime: 'application/octet-stream', ext: '.bin' }` when
67
+ * no known magic matches.
68
+ */
69
+ export function sniffImageFormat(buf) {
70
+ for (const s of SNIFFERS) {
71
+ if (s.match(buf))
72
+ return { format: s.format, mime: s.mime, ext: s.ext };
73
+ }
74
+ return { format: 'unknown', mime: 'application/octet-stream', ext: '.bin' };
75
+ }
76
+ /**
77
+ * Write image bytes to disk, using the sniffed extension instead of the
78
+ * caller-supplied extension when they disagree.
79
+ *
80
+ * Returns the final on-disk path. When `requestedPath` says `.png` but the
81
+ * buffer is actually WebP, the file is written as `<base>.webp` and a
82
+ * `console.warn` records the mismatch. Pass `forceExt: true` to keep the
83
+ * caller's extension (useful when downstream tooling really does need a
84
+ * fixed name, even if the format is a lie — but transcode first when you can).
85
+ */
86
+ export async function writeImageBytesSmart(buf, requestedPath, opts) {
87
+ const sniff = sniffImageFormat(buf);
88
+ const requestedExt = extname(requestedPath).toLowerCase();
89
+ const expected = sniff.ext.toLowerCase();
90
+ if (sniff.format === 'unknown' || opts?.forceExt || requestedExt === expected) {
91
+ await writeFile(requestedPath, buf);
92
+ return requestedPath;
93
+ }
94
+ const dir = dirname(requestedPath);
95
+ const base = basename(requestedPath, requestedExt);
96
+ const correctedPath = join(dir, `${base}${sniff.ext}`);
97
+ await writeFile(correctedPath, buf);
98
+ console.warn(` image-bytes: requested ${requestedPath} (${requestedExt || '<no ext>'}) but bytes are ${sniff.format}; wrote ${correctedPath} instead.`);
99
+ return correctedPath;
100
+ }
101
+ //# sourceMappingURL=image-bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-bytes.js","sourceRoot":"","sources":["../../src/venice/image-bytes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ export type VideoModelType = 'image-to-video' | 'text-to-video';
2
+ export interface VideoModelSpec {
3
+ id: string;
4
+ name: string;
5
+ type: VideoModelType;
6
+ durations: string[];
7
+ resolutions: string[];
8
+ aspectRatios: string[];
9
+ audio: boolean;
10
+ audioConfigurable: boolean;
11
+ audioInput: boolean;
12
+ videoInput: boolean;
13
+ /** Supports structured `elements` with @Element1/@Element2 prompt refs */
14
+ supportsElements: boolean;
15
+ /** Supports flat `reference_image_urls` array */
16
+ supportsReferenceImages: boolean;
17
+ /** Supports `scene_image_urls` for environment/style anchoring */
18
+ supportsSceneImages: boolean;
19
+ /** Supports `end_image_url` for targeted ending composition */
20
+ supportsEndImage: boolean;
21
+ /** Max duration in seconds */
22
+ maxDurationSec: number;
23
+ /**
24
+ * Supports per-reference audio (Wan 2.7 R2V): each `elements[].audio_url`
25
+ * can drive a different speaker's lip-sync inside a single render.
26
+ */
27
+ perReferenceAudio?: boolean;
28
+ /**
29
+ * Supports `reference_audio_urls` — voice-donor clips (up to 3, 2-15s each,
30
+ * ≤15s aggregate, wav/mp3, ≤15MB per file) bound in-prompt as @Audio1,
31
+ * @Audio2, … so a character's voice (timbre / accent / pacing) stays
32
+ * consistent across shots. Must be paired with ≥1 reference image (Venice
33
+ * rejects audio-only requests at validation). Distinct from `audioInput`
34
+ * (lip-sync `audio_url`): these four R2V models accept reference audio but
35
+ * do NOT set `audio_input: true` in GET /models. Confirmed live via
36
+ * /video/quote (HTTP 200) 2026-07-23.
37
+ */
38
+ supportsReferenceAudio?: boolean;
39
+ /**
40
+ * Minimum allowed duration (seconds) for `audio_url` input.
41
+ * Wan 2.7 rejects audio shorter than 3 seconds. Use the pre-flight
42
+ * helper in `src/venice/audio-preflight.ts` to pad shorter clips.
43
+ */
44
+ minAudioInputSec?: number;
45
+ privacy: 'private' | 'anonymized';
46
+ offline: boolean;
47
+ }
48
+ /**
49
+ * Per-image-model positive-prompt length caps.
50
+ *
51
+ * Venice silently rejects requests with overly long positive prompts on
52
+ * certain models (observed at ~1800-2200 chars on seedream-v5-lite; the
53
+ * mini-drama character-reference builder used to emit 2400+ char prompts).
54
+ *
55
+ * Default cap is intentionally conservative (300 chars). Callers should
56
+ * keep the most-important style cue + character anchor inline and move
57
+ * everything else to negative_prompt.
58
+ */
59
+ export declare const DEFAULT_MAX_POSITIVE_PROMPT_CHARS = 300;
60
+ export declare const MAX_POSITIVE_PROMPT_CHARS: Record<string, number>;
61
+ /**
62
+ * Look up the positive-prompt cap for an image-generation model.
63
+ * Falls back to DEFAULT_MAX_POSITIVE_PROMPT_CHARS when unspecified.
64
+ */
65
+ export declare function getMaxPositivePromptChars(modelId: string): number;
66
+ export declare const VIDEO_MODELS: VideoModelSpec[];
67
+ export interface ImageModelSpec {
68
+ id: string;
69
+ name: string;
70
+ type: 'generation' | 'edit' | 'upscale' | 'background-remove';
71
+ offline: boolean;
72
+ }
73
+ export declare const IMAGE_GENERATION_MODELS: ImageModelSpec[];
74
+ export declare const MULTI_EDIT_MODELS: readonly ["qwen-edit", "qwen-image-2-edit", "qwen-image-2-pro-edit", "flux-2-max-edit", "gpt-image-1-5-edit", "gpt-image-2-edit", "grok-imagine-edit", "nano-banana-2-edit", "nano-banana-pro-edit", "seedream-v4-edit", "seedream-v5-lite-edit"];
75
+ export type MultiEditModelId = typeof MULTI_EDIT_MODELS[number];
76
+ export interface MusicModelSpec {
77
+ id: string;
78
+ name: string;
79
+ type: 'music' | 'sound-effects' | 'tts';
80
+ offline: boolean;
81
+ /** Selectable voices (voice-enabled models). `default_voice` first if known. */
82
+ voices?: string[];
83
+ /** Default voice id. For seed-audio this is the sentinel "Describe in prompt". */
84
+ defaultVoice?: string;
85
+ /** `speed` param support + bounds. */
86
+ supportsSpeed?: boolean;
87
+ minSpeed?: number;
88
+ maxSpeed?: number;
89
+ defaultSpeed?: number;
90
+ /** Lyrics / instrumental behaviour. */
91
+ supportsLyrics?: boolean;
92
+ lyricsRequired?: boolean;
93
+ supportsForceInstrumental?: boolean;
94
+ supportsLanguageCode?: boolean;
95
+ /** Output containers the model can emit (`response_format` on retrieve). */
96
+ supportedFormats?: string[];
97
+ defaultFormat?: string;
98
+ /** Prompt length bounds, in characters. */
99
+ promptCharacterLimit?: number;
100
+ minPromptLength?: number;
101
+ /** Default generation length in seconds. */
102
+ defaultDurationSec?: number;
103
+ /** Per-second price in USD (for budgeting without a `/audio/quote` round-trip). */
104
+ pricingPerSecondUsd?: number;
105
+ /** One-line human summary. */
106
+ description?: string;
107
+ }
108
+ export declare const MUSIC_MODELS: MusicModelSpec[];
109
+ export declare const TTS_MODELS: readonly ["tts-kokoro", "tts-qwen3-0-6b", "tts-qwen3-1-7b"];
110
+ export type TTSModelId = typeof TTS_MODELS[number];
111
+ export declare function getVideoModel(id: string): VideoModelSpec | undefined;
112
+ export declare function getMusicModel(id: string): MusicModelSpec | undefined;
113
+ export declare function listMusicModels(filter?: {
114
+ type?: MusicModelSpec['type'];
115
+ }): MusicModelSpec[];
116
+ export declare function listVideoModels(filter?: {
117
+ type?: VideoModelType;
118
+ audio?: boolean;
119
+ minDurationSec?: number;
120
+ supportsElements?: boolean;
121
+ supportsReferenceImages?: boolean;
122
+ supportsEndImage?: boolean;
123
+ imageToVideo?: boolean;
124
+ }): VideoModelSpec[];
125
+ /**
126
+ * Check if a model supports a given duration string (e.g. "8s").
127
+ * Falls back to checking max duration if the duration is within range.
128
+ */
129
+ export declare function modelSupportsDuration(modelId: string, duration: string): boolean;
130
+ /**
131
+ * For a given model, return the closest valid duration to the requested one.
132
+ */
133
+ export declare function closestValidDuration(modelId: string, requestedSec: number): string | undefined;
134
+ /**
135
+ * Build the model-specific parameters for a video queue request.
136
+ * Handles resolution, aspect_ratio, and end_image_url based on model capabilities.
137
+ */
138
+ export declare function buildModelParams(modelId: string, opts: {
139
+ aspectRatio?: string;
140
+ resolution?: string;
141
+ endImageUrl?: string;
142
+ }): Record<string, unknown>;
143
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/venice/models.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,cAAc,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iDAAiD;IACjD,uBAAuB,EAAE,OAAO,CAAC;IACjC,kEAAkE;IAClE,mBAAmB,EAAE,OAAO,CAAC;IAC7B,+DAA+D;IAC/D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;;OASG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,SAAS,GAAG,YAAY,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;CAClB;AAID;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iCAAiC,MAAM,CAAC;AAErD,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAO5D,CAAC;AAEF;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,eAAO,MAAM,YAAY,EAAE,cAAc,EAgwBxC,CAAC;AAIF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,mBAAmB,CAAC;IAC9D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,uBAAuB,EAAE,cAAc,EAoCnD,CAAC;AAEF,eAAO,MAAM,iBAAiB,mPAYpB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAIhE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,KAAK,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;IAMjB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2CAA2C;IAC3C,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4CAA4C;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mFAAmF;IACnF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,YAAY,EAAE,cAAc,EA4CxC,CAAC;AAEF,eAAO,MAAM,UAAU,6DAA8D,CAAC;AACtF,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAMnD,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEpE;AAID,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEpE;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;CAAE,GAAG,cAAc,EAAE,CAI5F;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE;IACvC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,cAAc,EAAE,CAYnB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAOhF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO9F;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAwB1B"}