@nodetool-ai/websocket 0.8.4-a24.3 → 0.8.4

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 (251) hide show
  1. package/dist/.nodetool-build-stamp +1 -1
  2. package/dist/example-workflows.d.ts +2 -0
  3. package/dist/example-workflows.d.ts.map +1 -1
  4. package/dist/example-workflows.js +16 -4
  5. package/dist/example-workflows.js.map +1 -1
  6. package/dist/examples/nodetool-base/A Campaign Concept from a Brief.json +135 -0
  7. package/dist/examples/nodetool-base/A Gradient Card as PNG.json +128 -0
  8. package/dist/examples/nodetool-base/A Poster in Portrait.json +129 -0
  9. package/dist/examples/nodetool-base/A Repeating Texture Tile.json +129 -0
  10. package/dist/examples/nodetool-base/A Run Button for Any Job.json +152 -0
  11. package/dist/examples/nodetool-base/A Webhook That Answers.json +170 -0
  12. package/dist/examples/nodetool-base/AI Spokesperson.json +328 -0
  13. package/dist/examples/nodetool-base/Action Items from a Meeting Recording.json +198 -0
  14. package/dist/examples/nodetool-base/Ad Copy in Three Registers.json +135 -0
  15. package/dist/examples/nodetool-base/Ad Loop from a Product Photo.json +277 -0
  16. package/dist/examples/nodetool-base/Add Reverb to a Voice.json +125 -0
  17. package/dist/examples/nodetool-base/Album Art from a Mood.json +129 -0
  18. package/dist/examples/nodetool-base/Assemble a UGC Product Video.json +158 -0
  19. package/dist/examples/nodetool-base/Audio To Image.json +184 -0
  20. package/dist/examples/nodetool-base/B-Roll Reel from a Brief.json +339 -0
  21. package/dist/examples/nodetool-base/Batch a List.json +171 -0
  22. package/dist/examples/nodetool-base/Black and White, Hard.json +147 -0
  23. package/dist/examples/nodetool-base/Blog Post to Social Thread.json +135 -0
  24. package/dist/examples/nodetool-base/Blur a Channel.json +205 -0
  25. package/dist/examples/nodetool-base/Blur an Image.json +179 -0
  26. package/dist/examples/nodetool-base/Boost Saturation.json +178 -0
  27. package/dist/examples/nodetool-base/Brand Asset Generator.json +585 -0
  28. package/dist/examples/nodetool-base/Brand a UGC Product Video.json +402 -0
  29. package/dist/examples/nodetool-base/Bring a Still to Life.json +250 -0
  30. package/dist/examples/nodetool-base/Bullet Points to Press Release.json +135 -0
  31. package/dist/examples/nodetool-base/Chapter Markers for a Long Recording.json +198 -0
  32. package/dist/examples/nodetool-base/Chat With Your Documents.json +569 -0
  33. package/dist/examples/nodetool-base/Chunk a Transcript for Indexing.json +202 -0
  34. package/dist/examples/nodetool-base/Circles and Lines.json +126 -0
  35. package/dist/examples/nodetool-base/Clean Up a Rough Voice Recording.json +208 -0
  36. package/dist/examples/nodetool-base/Clip on Kie.json +173 -0
  37. package/dist/examples/nodetool-base/Cold Outreach Co-Pilot.json +423 -0
  38. package/dist/examples/nodetool-base/Color Boost Video.json +250 -0
  39. package/dist/examples/nodetool-base/Compose Directed Campaign Formats.json +764 -0
  40. package/dist/examples/nodetool-base/Concept Art Iteration Board.json +439 -0
  41. package/dist/examples/nodetool-base/Concept Art, Then a Moving Version.json +173 -0
  42. package/dist/examples/nodetool-base/Conditional Logic Engine.json +535 -0
  43. package/dist/examples/nodetool-base/Count a List.json +168 -0
  44. package/dist/examples/nodetool-base/Count to Three with a Loop.json +157 -0
  45. package/dist/examples/nodetool-base/Crop an Image.json +181 -0
  46. package/dist/examples/nodetool-base/Crop then Fit.json +208 -0
  47. package/dist/examples/nodetool-base/Crush It to 8 Bits.json +123 -0
  48. package/dist/examples/nodetool-base/Cut Out the Subject.json +184 -0
  49. package/dist/examples/nodetool-base/Cut a Landscape Clip for Vertical.json +123 -0
  50. package/dist/examples/nodetool-base/Cut a Product Out of Its Background.json +238 -0
  51. package/dist/examples/nodetool-base/Data Generator.json +216 -0
  52. package/dist/examples/nodetool-base/Denoise Footage.json +178 -0
  53. package/dist/examples/nodetool-base/Direct a Short Film.json +305 -0
  54. package/dist/examples/nodetool-base/Directed Film to Timeline.json +385 -0
  55. package/dist/examples/nodetool-base/Does This Text Mention the Deadline.json +130 -0
  56. package/dist/examples/nodetool-base/Draft Answers for an FAQ.json +135 -0
  57. package/dist/examples/nodetool-base/Draw a Badge in SVG.json +126 -0
  58. package/dist/examples/nodetool-base/Drop Duplicates.json +170 -0
  59. package/dist/examples/nodetool-base/Drop the First Few.json +148 -0
  60. package/dist/examples/nodetool-base/Dungeon and Ruins Starter Pack.json +786 -0
  61. package/dist/examples/nodetool-base/Edit a Still with Words.json +284 -0
  62. package/dist/examples/nodetool-base/Editorial Still from a Line.json +197 -0
  63. package/dist/examples/nodetool-base/Emboss a Still.json +120 -0
  64. package/dist/examples/nodetool-base/Every Combination.json +225 -0
  65. package/dist/examples/nodetool-base/Every Hour, On the Hour.json +162 -0
  66. package/dist/examples/nodetool-base/Executive Summary of a Long Document.json +135 -0
  67. package/dist/examples/nodetool-base/Explainer Clip from a Paragraph.json +244 -0
  68. package/dist/examples/nodetool-base/Extract the Claims Worth Checking.json +135 -0
  69. package/dist/examples/nodetool-base/Fade Audio In and Out.json +203 -0
  70. package/dist/examples/nodetool-base/Fade Audio Out.json +202 -0
  71. package/dist/examples/nodetool-base/Fill a Template.json +149 -0
  72. package/dist/examples/nodetool-base/Find Every Number in a Sentence.json +127 -0
  73. package/dist/examples/nodetool-base/Find and Replace.json +224 -0
  74. package/dist/examples/nodetool-base/Find the Edges.json +123 -0
  75. package/dist/examples/nodetool-base/Fit an Image.json +179 -0
  76. package/dist/examples/nodetool-base/Five Headlines for a Landing Page.json +135 -0
  77. package/dist/examples/nodetool-base/Flashcard Generator.json +297 -0
  78. package/dist/examples/nodetool-base/Gate Out the Room Noise.json +124 -0
  79. package/dist/examples/nodetool-base/Generate a Native-Audio UGC Testimonial.json +276 -0
  80. package/dist/examples/nodetool-base/Generate a Silent Bed.json +126 -0
  81. package/dist/examples/nodetool-base/Generate then Upscale a Poster.json +164 -0
  82. package/dist/examples/nodetool-base/Hacker News Agent.json +183 -0
  83. package/dist/examples/nodetool-base/Hook & Thumbnail Factory.json +498 -0
  84. package/dist/examples/nodetool-base/How Long Is This Transcript.json +185 -0
  85. package/dist/examples/nodetool-base/Image Enhance.json +272 -0
  86. package/dist/examples/nodetool-base/Image To Audio Story.json +180 -0
  87. package/dist/examples/nodetool-base/Image to Video Animation.json +346 -0
  88. package/dist/examples/nodetool-base/Inspect a Clip's Audio.json +187 -0
  89. package/dist/examples/nodetool-base/Inspect a Clip.json +163 -0
  90. package/dist/examples/nodetool-base/Invert a Still.json +120 -0
  91. package/dist/examples/nodetool-base/Keep Only the Long Lines.json +220 -0
  92. package/dist/examples/nodetool-base/Keep Only the Matches.json +148 -0
  93. package/dist/examples/nodetool-base/Key Out a Green Screen.json +124 -0
  94. package/dist/examples/nodetool-base/Last One Wins.json +144 -0
  95. package/dist/examples/nodetool-base/Lip-sync a Clip to a Voice Track.json +313 -0
  96. package/dist/examples/nodetool-base/Localise a Product Listing.json +135 -0
  97. package/dist/examples/nodetool-base/Localise a Script and Revoice It.json +242 -0
  98. package/dist/examples/nodetool-base/Localized Explainer.json +430 -0
  99. package/dist/examples/nodetool-base/Low-poly Adventure Starter Pack.json +786 -0
  100. package/dist/examples/nodetool-base/Low-poly Seaside Starter Pack.json +786 -0
  101. package/dist/examples/nodetool-base/Master a Voice Track.json +180 -0
  102. package/dist/examples/nodetool-base/Meeting Transcript Summarizer.json +524 -0
  103. package/dist/examples/nodetool-base/Model Arena.json +550 -0
  104. package/dist/examples/nodetool-base/Moodboard Frame from a Theme.json +129 -0
  105. package/dist/examples/nodetool-base/Movie Posters.json +660 -0
  106. package/dist/examples/nodetool-base/Movie Trailer Generator.json +418 -0
  107. package/dist/examples/nodetool-base/Music Video Visualizer.json +720 -0
  108. package/dist/examples/nodetool-base/Name a File from Its Narration.json +231 -0
  109. package/dist/examples/nodetool-base/Narrate a Script.json +169 -0
  110. package/dist/examples/nodetool-base/Narration with a Music Bed.json +360 -0
  111. package/dist/examples/nodetool-base/Normalize a Clip's Audio.json +201 -0
  112. package/dist/examples/nodetool-base/One Tagline, Six Markets.json +135 -0
  113. package/dist/examples/nodetool-base/Pad a Canvas.json +188 -0
  114. package/dist/examples/nodetool-base/Per-SKU Ad Factory.json +511 -0
  115. package/dist/examples/nodetool-base/Photo Enhancement Suite.json +417 -0
  116. package/dist/examples/nodetool-base/Picture in Picture.json +231 -0
  117. package/dist/examples/nodetool-base/Pitch a Voice Up.json +122 -0
  118. package/dist/examples/nodetool-base/Pixelate a Still.json +122 -0
  119. package/dist/examples/nodetool-base/Platformer Playground Starter Pack.json +786 -0
  120. package/dist/examples/nodetool-base/Podcast Episode to Show Notes.json +198 -0
  121. package/dist/examples/nodetool-base/Podcast Repurposing Studio.json +745 -0
  122. package/dist/examples/nodetool-base/Pokemon Maker.json +282 -0
  123. package/dist/examples/nodetool-base/Poster on Kie.json +172 -0
  124. package/dist/examples/nodetool-base/Posterize to Four Bits.json +122 -0
  125. package/dist/examples/nodetool-base/Private Assistant.json +236 -0
  126. package/dist/examples/nodetool-base/Product Mockup Generator.json +608 -0
  127. package/dist/examples/nodetool-base/Product Spot from Text.json +330 -0
  128. package/dist/examples/nodetool-base/Product Video Generator.json +344 -0
  129. package/dist/examples/nodetool-base/Prompt Template.json +221 -0
  130. package/dist/examples/nodetool-base/Propose Three Campaign Directions.json +614 -0
  131. package/dist/examples/nodetool-base/Pull a Field out of JSON Text.json +128 -0
  132. package/dist/examples/nodetool-base/Pull a Still from a Clip.json +179 -0
  133. package/dist/examples/nodetool-base/Pull the Quotable Lines Out of an Interview.json +198 -0
  134. package/dist/examples/nodetool-base/Put a Product on a Studio Backdrop.json +252 -0
  135. package/dist/examples/nodetool-base/Put a Voice Over a Music Bed.json +358 -0
  136. package/dist/examples/nodetool-base/README_EXAMPLES.md +59 -0
  137. package/dist/examples/nodetool-base/Re-delimit a List.json +199 -0
  138. package/dist/examples/nodetool-base/Read a Clip's Frame Rate.json +120 -0
  139. package/dist/examples/nodetool-base/Redact Email Addresses.json +129 -0
  140. package/dist/examples/nodetool-base/Redact and Tidy a Log Line.json +266 -0
  141. package/dist/examples/nodetool-base/Relight a Product for a Seasonal Campaign.json +131 -0
  142. package/dist/examples/nodetool-base/Render a Directed Campaign Hero.json +338 -0
  143. package/dist/examples/nodetool-base/Reopen a Directed Campaign.json +1748 -0
  144. package/dist/examples/nodetool-base/Research Agent.json +231 -0
  145. package/dist/examples/nodetool-base/Research a Brand from Its Website.json +445 -0
  146. package/dist/examples/nodetool-base/Restyle a Photo as an Illustration.json +136 -0
  147. package/dist/examples/nodetool-base/Reverse Audio.json +201 -0
  148. package/dist/examples/nodetool-base/Reverse a Clip.json +176 -0
  149. package/dist/examples/nodetool-base/Revise an Accepted Campaign Hero.json +486 -0
  150. package/dist/examples/nodetool-base/Rewrite This So a Customer Understands It.json +135 -0
  151. package/dist/examples/nodetool-base/Rotate Footage.json +178 -0
  152. package/dist/examples/nodetool-base/SEO Content Engine.json +708 -0
  153. package/dist/examples/nodetool-base/SEO Title and Meta Description.json +135 -0
  154. package/dist/examples/nodetool-base/Sci-fi Game Model Starter Pack.json +693 -0
  155. package/dist/examples/nodetool-base/Sci-fi Outpost Expansion.json +601 -0
  156. package/dist/examples/nodetool-base/Score a Clip from Its Own Mood.json +229 -0
  157. package/dist/examples/nodetool-base/Score a Silent Clip.json +382 -0
  158. package/dist/examples/nodetool-base/Script to Narrated Clip.json +224 -0
  159. package/dist/examples/nodetool-base/Script to Screen.json +940 -0
  160. package/dist/examples/nodetool-base/Sharpen Footage.json +179 -0
  161. package/dist/examples/nodetool-base/Shot List from a Synopsis.json +136 -0
  162. package/dist/examples/nodetool-base/Single Shot from a Line.json +199 -0
  163. package/dist/examples/nodetool-base/Slice Text.json +159 -0
  164. package/dist/examples/nodetool-base/Slow a Clip Without Dropping Pitch.json +122 -0
  165. package/dist/examples/nodetool-base/Soften a Plate.json +178 -0
  166. package/dist/examples/nodetool-base/Solarize a Still.json +122 -0
  167. package/dist/examples/nodetool-base/Speak a Line, Then Trim the Silence.json +157 -0
  168. package/dist/examples/nodetool-base/Spin a Packshot into a Turntable Clip.json +137 -0
  169. package/dist/examples/nodetool-base/Split a Channel.json +178 -0
  170. package/dist/examples/nodetool-base/Split a Log into Records.json +128 -0
  171. package/dist/examples/nodetool-base/Stabilize Handheld.json +179 -0
  172. package/dist/examples/nodetool-base/Still on Replicate.json +172 -0
  173. package/dist/examples/nodetool-base/Subject Lines Worth Testing.json +135 -0
  174. package/dist/examples/nodetool-base/Subtitle Lines from a Script.json +170 -0
  175. package/dist/examples/nodetool-base/Subtitle Text from a Recording.json +198 -0
  176. package/dist/examples/nodetool-base/Summarise a Recorded Call.json +198 -0
  177. package/dist/examples/nodetool-base/Swirl and Echo.json +154 -0
  178. package/dist/examples/nodetool-base/Take While the Numbers Are Small.json +148 -0
  179. package/dist/examples/nodetool-base/Take a Product Shot to Print Resolution.json +209 -0
  180. package/dist/examples/nodetool-base/Take the First Few Seconds of a Bed.json +127 -0
  181. package/dist/examples/nodetool-base/Take the First Few.json +170 -0
  182. package/dist/examples/nodetool-base/Telephone Voice.json +174 -0
  183. package/dist/examples/nodetool-base/Themes Across Customer Feedback.json +135 -0
  184. package/dist/examples/nodetool-base/Three Ratios.json +315 -0
  185. package/dist/examples/nodetool-base/Tidy Up Messy Text.json +199 -0
  186. package/dist/examples/nodetool-base/Top-down Native Asset Pack.json +955 -0
  187. package/dist/examples/nodetool-base/Trailer Beats from a Premise.json +136 -0
  188. package/dist/examples/nodetool-base/Transcribe Audio.json +138 -0
  189. package/dist/examples/nodetool-base/Transcribe a Clip.json +198 -0
  190. package/dist/examples/nodetool-base/Translate Marketing Copy to German.json +135 -0
  191. package/dist/examples/nodetool-base/Translate a Script for Dubbing.json +224 -0
  192. package/dist/examples/nodetool-base/Trim Audio to a Range.json +203 -0
  193. package/dist/examples/nodetool-base/Trim a Blurb to Length.json +128 -0
  194. package/dist/examples/nodetool-base/Trim a Clip.json +180 -0
  195. package/dist/examples/nodetool-base/Turn Research Notes into a Comparison Table.json +136 -0
  196. package/dist/examples/nodetool-base/Turn Specs into Product Copy.json +135 -0
  197. package/dist/examples/nodetool-base/Turn a Changelog into Release Notes.json +135 -0
  198. package/dist/examples/nodetool-base/Turn a Logo into Print-Ready Vector.json +126 -0
  199. package/dist/examples/nodetool-base/Turn a Support Thread into a Bug Report.json +135 -0
  200. package/dist/examples/nodetool-base/Turn a Talk into a Blog Post.json +198 -0
  201. package/dist/examples/nodetool-base/Upscale a Still.json +186 -0
  202. package/dist/examples/nodetool-base/Vectorize a Generated Logo.json +162 -0
  203. package/dist/examples/nodetool-base/Video Restyle Studio.json +281 -0
  204. package/dist/examples/nodetool-base/Vignette a Portrait.json +124 -0
  205. package/dist/examples/nodetool-base/Voice a Script in Two Voices.json +217 -0
  206. package/dist/examples/nodetool-base/Warm Up a Cold Clip.json +124 -0
  207. package/dist/examples/nodetool-base/Watch a Folder, Act on What Lands.json +177 -0
  208. package/dist/examples/nodetool-base/Widen a Mono Voice.json +151 -0
  209. package/dist/examples/nodetool-base/Workflow As A Tool.json +257 -0
  210. package/dist/examples/nodetool-base/Write a Listing from the Product Photo.json +139 -0
  211. package/dist/examples/nodetool-base/Write the Prompt, Then Make the Image.json +200 -0
  212. package/dist/examples/nodetool-base/gallery_thumbnail_generator.ts +384 -0
  213. package/dist/fake-runtime.d.ts.map +1 -1
  214. package/dist/fake-runtime.js +5 -1
  215. package/dist/fake-runtime.js.map +1 -1
  216. package/dist/http-api.d.ts.map +1 -1
  217. package/dist/http-api.js +20 -3
  218. package/dist/http-api.js.map +1 -1
  219. package/dist/lib/openverse.d.ts +47 -0
  220. package/dist/lib/openverse.d.ts.map +1 -0
  221. package/dist/lib/openverse.js +255 -0
  222. package/dist/lib/openverse.js.map +1 -0
  223. package/dist/model-execution-availability.d.ts.map +1 -1
  224. package/dist/model-execution-availability.js +7 -2
  225. package/dist/model-execution-availability.js.map +1 -1
  226. package/dist/screenshot-server.js +87 -49
  227. package/dist/screenshot-server.js.map +1 -1
  228. package/dist/trpc/router.d.ts +2 -0
  229. package/dist/trpc/router.d.ts.map +1 -1
  230. package/dist/trpc/router.js +2 -0
  231. package/dist/trpc/router.js.map +1 -1
  232. package/dist/trpc/routers/games.d.ts +179 -0
  233. package/dist/trpc/routers/games.d.ts.map +1 -1
  234. package/dist/trpc/routers/games.js +1 -1
  235. package/dist/trpc/routers/games.js.map +1 -1
  236. package/dist/trpc/routers/models.d.ts +270 -0
  237. package/dist/trpc/routers/models.d.ts.map +1 -1
  238. package/dist/trpc/routers/models.js +37 -19
  239. package/dist/trpc/routers/models.js.map +1 -1
  240. package/dist/trpc/routers/openverse.d.ts +91 -0
  241. package/dist/trpc/routers/openverse.d.ts.map +1 -0
  242. package/dist/trpc/routers/openverse.js +98 -0
  243. package/dist/trpc/routers/openverse.js.map +1 -0
  244. package/dist/trpc/sandbox-coverage.d.ts.map +1 -1
  245. package/dist/trpc/sandbox-coverage.js +11 -0
  246. package/dist/trpc/sandbox-coverage.js.map +1 -1
  247. package/dist/websocket-client-session.d.ts +8 -0
  248. package/dist/websocket-client-session.d.ts.map +1 -1
  249. package/dist/websocket-client-session.js +31 -1
  250. package/dist/websocket-client-session.js.map +1 -1
  251. package/package.json +27 -28
@@ -0,0 +1,940 @@
1
+ {
2
+ "id": "script_to_screen",
3
+ "access": "public",
4
+ "created_at": "2026-07-18T00:00:00.000000",
5
+ "updated_at": "2026-07-18T00:00:00.000000",
6
+ "name": "Script to Screen",
7
+ "tool_name": null,
8
+ "description": "Full production spine: a Director agent turns your brief into a direction document (characters, style bible, shot list, narration, music). A style frame anchors every keyframe for consistency, keyframes form a cheap storyboard you can approve before video spend, then each shot is animated, cut together, and mixed with voiceover and music.",
9
+ "tags": [
10
+ "video",
11
+ "generation",
12
+ "ai",
13
+ "storytelling",
14
+ "creative",
15
+ "director",
16
+ "storyboard",
17
+ "example"
18
+ ],
19
+ "thumbnail": "Script to Screen.jpg",
20
+ "thumbnail_url": null,
21
+ "graph": {
22
+ "edges": [
23
+ {
24
+ "id": "e_brief_dirprompt",
25
+ "source": "brief",
26
+ "sourceHandle": "output",
27
+ "target": "director_prompt",
28
+ "targetHandle": "BRIEF",
29
+ "ui_properties": {
30
+ "className": "str"
31
+ },
32
+ "edge_type": "data"
33
+ },
34
+ {
35
+ "id": "e_style_dirprompt",
36
+ "source": "style",
37
+ "sourceHandle": "output",
38
+ "target": "director_prompt",
39
+ "targetHandle": "STYLE",
40
+ "ui_properties": {
41
+ "className": "str"
42
+ },
43
+ "edge_type": "data"
44
+ },
45
+ {
46
+ "id": "e_count_dirprompt",
47
+ "source": "shot_count",
48
+ "sourceHandle": "output",
49
+ "target": "director_prompt",
50
+ "targetHandle": "COUNT",
51
+ "ui_properties": {
52
+ "className": "str"
53
+ },
54
+ "edge_type": "data"
55
+ },
56
+ {
57
+ "id": "e_dirprompt_director",
58
+ "source": "director_prompt",
59
+ "sourceHandle": "output",
60
+ "target": "director",
61
+ "targetHandle": "prompt",
62
+ "ui_properties": {
63
+ "className": "str"
64
+ },
65
+ "edge_type": "data"
66
+ },
67
+ {
68
+ "id": "e_director_directionout",
69
+ "source": "director",
70
+ "sourceHandle": "text",
71
+ "target": "direction_out",
72
+ "targetHandle": "value",
73
+ "ui_properties": {
74
+ "className": "str"
75
+ },
76
+ "edge_type": "data"
77
+ },
78
+ {
79
+ "id": "e_director_proddata",
80
+ "source": "director",
81
+ "sourceHandle": "text",
82
+ "target": "production_data",
83
+ "targetHandle": "context",
84
+ "ui_properties": {
85
+ "className": "str"
86
+ },
87
+ "edge_type": "data"
88
+ },
89
+ {
90
+ "id": "e_director_shotlistprompt",
91
+ "source": "director",
92
+ "sourceHandle": "text",
93
+ "target": "shotlist_prompt",
94
+ "targetHandle": "DIRECTION",
95
+ "ui_properties": {
96
+ "className": "str"
97
+ },
98
+ "edge_type": "data"
99
+ },
100
+ {
101
+ "id": "e_count_shotlistprompt",
102
+ "source": "shot_count",
103
+ "sourceHandle": "output",
104
+ "target": "shotlist_prompt",
105
+ "targetHandle": "COUNT",
106
+ "ui_properties": {
107
+ "className": "str"
108
+ },
109
+ "edge_type": "data"
110
+ },
111
+ {
112
+ "id": "e_shotlistprompt_shotlist",
113
+ "source": "shotlist_prompt",
114
+ "sourceHandle": "output",
115
+ "target": "shot_list",
116
+ "targetHandle": "prompt",
117
+ "ui_properties": {
118
+ "className": "str"
119
+ },
120
+ "edge_type": "data"
121
+ },
122
+ {
123
+ "id": "e_proddata_styleframe",
124
+ "source": "production_data",
125
+ "sourceHandle": "style_frame_prompt",
126
+ "target": "style_frame",
127
+ "targetHandle": "prompt",
128
+ "ui_properties": {
129
+ "className": "str"
130
+ },
131
+ "edge_type": "data"
132
+ },
133
+ {
134
+ "id": "e_shotitem_keyframeprompt",
135
+ "source": "shot_list",
136
+ "sourceHandle": "item",
137
+ "target": "keyframe_prompt",
138
+ "targetHandle": "SHOT",
139
+ "ui_properties": {
140
+ "className": "str"
141
+ },
142
+ "edge_type": "data"
143
+ },
144
+ {
145
+ "id": "e_style_keyframeprompt",
146
+ "source": "style",
147
+ "sourceHandle": "output",
148
+ "target": "keyframe_prompt",
149
+ "targetHandle": "STYLE",
150
+ "ui_properties": {
151
+ "className": "str"
152
+ },
153
+ "edge_type": "data"
154
+ },
155
+ {
156
+ "id": "e_styleframe_keyframe",
157
+ "source": "style_frame",
158
+ "sourceHandle": "output",
159
+ "target": "keyframe",
160
+ "targetHandle": "image",
161
+ "ui_properties": {
162
+ "className": "image"
163
+ },
164
+ "edge_type": "data"
165
+ },
166
+ {
167
+ "id": "e_keyframeprompt_keyframe",
168
+ "source": "keyframe_prompt",
169
+ "sourceHandle": "output",
170
+ "target": "keyframe",
171
+ "targetHandle": "prompt",
172
+ "ui_properties": {
173
+ "className": "str"
174
+ },
175
+ "edge_type": "data"
176
+ },
177
+ {
178
+ "id": "e_keyframe_storyboardcollect",
179
+ "source": "keyframe",
180
+ "sourceHandle": "output",
181
+ "target": "storyboard_collect",
182
+ "targetHandle": "input_item",
183
+ "ui_properties": {
184
+ "className": "image"
185
+ },
186
+ "edge_type": "data"
187
+ },
188
+ {
189
+ "id": "e_storyboardcollect_storyboardout",
190
+ "source": "storyboard_collect",
191
+ "sourceHandle": "output",
192
+ "target": "storyboard_out",
193
+ "targetHandle": "value",
194
+ "ui_properties": {
195
+ "className": "list"
196
+ },
197
+ "edge_type": "data"
198
+ },
199
+ {
200
+ "id": "e_shotitem_motionprompt",
201
+ "source": "shot_list",
202
+ "sourceHandle": "item",
203
+ "target": "motion_prompt",
204
+ "targetHandle": "SHOT",
205
+ "ui_properties": {
206
+ "className": "str"
207
+ },
208
+ "edge_type": "data"
209
+ },
210
+ {
211
+ "id": "e_keyframe_animate",
212
+ "source": "keyframe",
213
+ "sourceHandle": "output",
214
+ "target": "animate",
215
+ "targetHandle": "image",
216
+ "ui_properties": {
217
+ "className": "image"
218
+ },
219
+ "edge_type": "data"
220
+ },
221
+ {
222
+ "id": "e_motionprompt_animate",
223
+ "source": "motion_prompt",
224
+ "sourceHandle": "output",
225
+ "target": "animate",
226
+ "targetHandle": "prompt",
227
+ "ui_properties": {
228
+ "className": "str"
229
+ },
230
+ "edge_type": "data"
231
+ },
232
+ {
233
+ "id": "e_animate_clipscollect",
234
+ "source": "animate",
235
+ "sourceHandle": "output",
236
+ "target": "clips_collect",
237
+ "targetHandle": "input_item",
238
+ "ui_properties": {
239
+ "className": "video"
240
+ },
241
+ "edge_type": "data"
242
+ },
243
+ {
244
+ "id": "e_clipscollect_cut",
245
+ "source": "clips_collect",
246
+ "sourceHandle": "output",
247
+ "target": "cut",
248
+ "targetHandle": "clips",
249
+ "ui_properties": {
250
+ "className": "list"
251
+ },
252
+ "edge_type": "data"
253
+ },
254
+ {
255
+ "id": "e_proddata_tts",
256
+ "source": "production_data",
257
+ "sourceHandle": "narration",
258
+ "target": "narration_tts",
259
+ "targetHandle": "text",
260
+ "ui_properties": {
261
+ "className": "str"
262
+ },
263
+ "edge_type": "data"
264
+ },
265
+ {
266
+ "id": "e_proddata_music",
267
+ "source": "production_data",
268
+ "sourceHandle": "music_prompt",
269
+ "target": "music",
270
+ "targetHandle": "prompt",
271
+ "ui_properties": {
272
+ "className": "str"
273
+ },
274
+ "edge_type": "data"
275
+ },
276
+ {
277
+ "id": "e_cut_mixvo",
278
+ "source": "cut",
279
+ "sourceHandle": "output",
280
+ "target": "mix_vo",
281
+ "targetHandle": "video",
282
+ "ui_properties": {
283
+ "className": "video"
284
+ },
285
+ "edge_type": "data"
286
+ },
287
+ {
288
+ "id": "e_tts_mixvo",
289
+ "source": "narration_tts",
290
+ "sourceHandle": "audio",
291
+ "target": "mix_vo",
292
+ "targetHandle": "audio",
293
+ "ui_properties": {
294
+ "className": "audio"
295
+ },
296
+ "edge_type": "data"
297
+ },
298
+ {
299
+ "id": "e_mixvo_mixmusic",
300
+ "source": "mix_vo",
301
+ "sourceHandle": "output",
302
+ "target": "mix_music",
303
+ "targetHandle": "video",
304
+ "ui_properties": {
305
+ "className": "video"
306
+ },
307
+ "edge_type": "data"
308
+ },
309
+ {
310
+ "id": "e_music_mixmusic",
311
+ "source": "music",
312
+ "sourceHandle": "audio",
313
+ "target": "mix_music",
314
+ "targetHandle": "audio",
315
+ "ui_properties": {
316
+ "className": "audio"
317
+ },
318
+ "edge_type": "data"
319
+ },
320
+ {
321
+ "id": "e_mixmusic_filmout",
322
+ "source": "mix_music",
323
+ "sourceHandle": "output",
324
+ "target": "film_out",
325
+ "targetHandle": "value",
326
+ "ui_properties": {
327
+ "className": "video"
328
+ },
329
+ "edge_type": "data"
330
+ }
331
+ ],
332
+ "nodes": [
333
+ {
334
+ "id": "comment_main",
335
+ "type": "nodetool.workflows.base_node.Comment",
336
+ "data": {
337
+ "comment": "# 🎬 Script to Screen\n\nTurns a short brief into a narrated, scored short film, with a storyboard you can check before spending on video.\n\n**How it works:** \"Brief\", \"Visual style\" and \"Shot count\" (5) fill \"Build director brief\", and the Director agent writes the direction document. \"Extract production data\" pulls out narration, a music prompt and a style frame prompt for \"Master style frame\". \"Build shot-list prompt\" drives \"Stream the shots\", which emits one line per shot. Each shot becomes a keyframe in \"Storyboard keyframes (anchored to style frame)\", an image edit of the style frame at strength 0.82, collected into the storyboard output. \"Animate each shot (the expensive step)\" makes 4 s clips at 720p, joined by \"Cut the shots together\". \"Narration\" and \"Score\" (30 s) are mixed in at volumes 1 and 0.3. Pick language models on the Director agent, \"Extract production data\" and \"Stream the shots\". Media steps use your default model for each type, or the one you pick on the node.\n\n**Try this:** Bypass \"Animate each shot (the expensive step)\" (right-click, Bypass), set \"Shot count\" to 3, and run to review a cheap three-frame storyboard before any video spend."
338
+ },
339
+ "ui_properties": {
340
+ "position": {
341
+ "x": 0,
342
+ "y": 0
343
+ },
344
+ "zIndex": 0,
345
+ "width": 560,
346
+ "height": 464,
347
+ "selectable": true,
348
+ "bypassed": false
349
+ },
350
+ "dynamic_properties": {},
351
+ "dynamic_outputs": {}
352
+ },
353
+ {
354
+ "id": "brief",
355
+ "type": "nodetool.input.StringInput",
356
+ "data": {
357
+ "name": "Brief",
358
+ "value": "A lighthouse keeper discovers the beam of her lamp has started bending toward something beneath the waves — and tonight it refuses to point anywhere else."
359
+ },
360
+ "ui_properties": {
361
+ "position": {
362
+ "x": 0,
363
+ "y": 1365
364
+ },
365
+ "zIndex": 0,
366
+ "width": 280,
367
+ "title": "1️⃣ Brief",
368
+ "selectable": true,
369
+ "bypassed": false
370
+ },
371
+ "dynamic_properties": {},
372
+ "dynamic_outputs": {}
373
+ },
374
+ {
375
+ "id": "style",
376
+ "type": "nodetool.input.StringInput",
377
+ "data": {
378
+ "name": "Visual Style",
379
+ "value": "moody coastal nocturne, sodium-lamp amber against deep blue-black sea, drifting fog, anamorphic lens flares, fine film grain, painterly realism"
380
+ },
381
+ "ui_properties": {
382
+ "position": {
383
+ "x": 0,
384
+ "y": 1140
385
+ },
386
+ "zIndex": 0,
387
+ "width": 280,
388
+ "title": "2️⃣ Visual style",
389
+ "selectable": true,
390
+ "bypassed": false
391
+ },
392
+ "dynamic_properties": {},
393
+ "dynamic_outputs": {}
394
+ },
395
+ {
396
+ "id": "shot_count",
397
+ "type": "nodetool.input.StringInput",
398
+ "data": {
399
+ "name": "Shot Count",
400
+ "value": "5"
401
+ },
402
+ "ui_properties": {
403
+ "position": {
404
+ "x": 0,
405
+ "y": 1590
406
+ },
407
+ "zIndex": 0,
408
+ "width": 280,
409
+ "title": "3️⃣ Shot count",
410
+ "selectable": true,
411
+ "bypassed": false
412
+ },
413
+ "dynamic_properties": {},
414
+ "dynamic_outputs": {}
415
+ },
416
+ {
417
+ "id": "director_prompt",
418
+ "type": "nodetool.text.Prompt",
419
+ "data": {
420
+ "prompt": "You are directing a short film. Write a complete DIRECTION DOCUMENT for this brief.\n\nBrief: {{ BRIEF }}\nVisual style: {{ STYLE }}\nShot count: {{ COUNT }}\n\nReturn Markdown with exactly these sections:\n\n## TITLE\nOne evocative title.\n\n## LOGLINE\nOne sentence.\n\n## CHARACTERS\nEach recurring character or subject on its own line as `Name: <one fixed visual descriptor sentence>`. These exact descriptor sentences will be pasted into every shot prompt, so make them concrete: age, build, hair, wardrobe, distinguishing detail.\n\n## STYLE BIBLE\n3-4 lines: palette, light, lens, texture. Consistent with the visual style above.\n\n## SHOT LIST\nExactly {{ COUNT }} numbered shots. Each shot is one line: `N. VISUAL: <subject + setting, reusing the exact character descriptors> | CAMERA: <framing, lens, angle> | MOTION: <what moves in the shot, including camera movement>`.\n\n## NARRATION\nA voiceover script read over the whole film — about 2 seconds of speech per shot, written to land against the shot order. Plain sentences, no headings.\n\n## MUSIC\nOne line describing the score: genre, mood, instrumentation, tempo."
421
+ },
422
+ "ui_properties": {
423
+ "position": {
424
+ "x": 380,
425
+ "y": 1173
426
+ },
427
+ "zIndex": 0,
428
+ "width": 320,
429
+ "height": 480,
430
+ "title": "Build director brief",
431
+ "selectable": true,
432
+ "bypassed": false
433
+ },
434
+ "dynamic_properties": {
435
+ "BRIEF": "",
436
+ "STYLE": "",
437
+ "COUNT": "5"
438
+ },
439
+ "dynamic_outputs": {}
440
+ },
441
+ {
442
+ "id": "director",
443
+ "type": "nodetool.agents.Agent",
444
+ "data": {
445
+ "model": {
446
+ "type": "language_model",
447
+ "provider": "",
448
+ "id": "",
449
+ "name": "",
450
+ "path": null,
451
+ "supported_tasks": []
452
+ },
453
+ "system": "You are a film director and screenwriter. You write tight, concrete direction documents. Every line is visual and specific — no vague adjectives, no meta commentary. You keep character descriptors identical wherever they recur.",
454
+ "max_tokens": 100000
455
+ },
456
+ "ui_properties": {
457
+ "position": {
458
+ "x": 800,
459
+ "y": 1197
460
+ },
461
+ "zIndex": 0,
462
+ "width": 330,
463
+ "height": 360,
464
+ "title": "4️⃣ Director — write the direction",
465
+ "selectable": true,
466
+ "bypassed": false
467
+ },
468
+ "dynamic_properties": {},
469
+ "dynamic_outputs": {}
470
+ },
471
+ {
472
+ "id": "direction_out",
473
+ "type": "nodetool.output.Output",
474
+ "data": {
475
+ "name": "direction"
476
+ },
477
+ "ui_properties": {
478
+ "position": {
479
+ "x": 1230,
480
+ "y": 1310
481
+ },
482
+ "title": "📋 Direction document",
483
+ "selectable": true
484
+ },
485
+ "dynamic_properties": {},
486
+ "dynamic_outputs": {}
487
+ },
488
+ {
489
+ "id": "production_data",
490
+ "type": "nodetool.generators.StructuredOutputGenerator",
491
+ "data": {
492
+ "model": {
493
+ "type": "language_model",
494
+ "provider": "",
495
+ "id": "",
496
+ "name": "",
497
+ "path": null,
498
+ "supported_tasks": []
499
+ },
500
+ "instructions": "The context is a film direction document. Extract three fields:\n- narration: the full NARRATION section verbatim, as one block of plain text with no headings.\n- music_prompt: the MUSIC line as a single music-generation prompt (genre, mood, instrumentation, tempo). Instrumental only — state 'instrumental, no vocals'.\n- style_frame_prompt: one text-to-image prompt for a single 16:9 master style frame that establishes the film's world: the main character (exact descriptor from CHARACTERS), the key location, and the STYLE BIBLE's palette and light. No text, no titles, no watermark.",
501
+ "context": "",
502
+ "max_tokens": 4096,
503
+ "system_prompt": "Return only a valid JSON object with the requested fields. Do not wrap it in Markdown or add commentary."
504
+ },
505
+ "ui_properties": {
506
+ "position": {
507
+ "x": 1230,
508
+ "y": 914
509
+ },
510
+ "zIndex": 0,
511
+ "width": 300,
512
+ "height": 300,
513
+ "title": "5️⃣ Extract production data",
514
+ "selectable": true,
515
+ "bypassed": false
516
+ },
517
+ "dynamic_properties": {},
518
+ "dynamic_outputs": {
519
+ "narration": {
520
+ "type": "str",
521
+ "optional": false,
522
+ "type_args": []
523
+ },
524
+ "music_prompt": {
525
+ "type": "str",
526
+ "optional": false,
527
+ "type_args": []
528
+ },
529
+ "style_frame_prompt": {
530
+ "type": "str",
531
+ "optional": false,
532
+ "type_args": []
533
+ }
534
+ }
535
+ },
536
+ {
537
+ "id": "style_frame",
538
+ "type": "nodetool.image.TextToImage",
539
+ "data": {
540
+ "model": {
541
+ "type": "image_model",
542
+ "provider": "",
543
+ "id": "",
544
+ "name": "",
545
+ "path": null,
546
+ "supported_tasks": []
547
+ },
548
+ "negative_prompt": "",
549
+ "aspect_ratio": "16:9",
550
+ "resolution": "2K"
551
+ },
552
+ "ui_properties": {
553
+ "position": {
554
+ "x": 1650,
555
+ "y": 544
556
+ },
557
+ "zIndex": 0,
558
+ "width": 300,
559
+ "height": 320,
560
+ "title": "6️⃣ Master style frame",
561
+ "selectable": true,
562
+ "bypassed": false
563
+ },
564
+ "dynamic_properties": {},
565
+ "dynamic_outputs": {}
566
+ },
567
+ {
568
+ "id": "shotlist_prompt",
569
+ "type": "nodetool.text.Prompt",
570
+ "data": {
571
+ "prompt": "From the direction document below, output exactly {{ COUNT }} lines, one per shot from the SHOT LIST, in order. No numbering, no labels, no extra lines.\n\nEach line must be self-contained for an image model that sees nothing else: merge the shot's VISUAL, CAMERA and MOTION with the exact character descriptor sentences from CHARACTERS and the palette and light from STYLE BIBLE. Keep the `| MOTION: ...` part at the end of each line, verbatim.\n\nDirection document:\n{{ DIRECTION }}"
572
+ },
573
+ "ui_properties": {
574
+ "position": {
575
+ "x": 1230,
576
+ "y": 1510
577
+ },
578
+ "zIndex": 0,
579
+ "width": 320,
580
+ "height": 330,
581
+ "title": "Build shot-list prompt",
582
+ "selectable": true,
583
+ "bypassed": false
584
+ },
585
+ "dynamic_properties": {
586
+ "COUNT": "5",
587
+ "DIRECTION": ""
588
+ },
589
+ "dynamic_outputs": {}
590
+ },
591
+ {
592
+ "id": "shot_list",
593
+ "type": "nodetool.generators.ListGenerator",
594
+ "data": {
595
+ "model": {
596
+ "type": "language_model",
597
+ "provider": "",
598
+ "id": "",
599
+ "name": "",
600
+ "path": null,
601
+ "supported_tasks": []
602
+ },
603
+ "max_tokens": 100000
604
+ },
605
+ "ui_properties": {
606
+ "position": {
607
+ "x": 1650,
608
+ "y": 1612
609
+ },
610
+ "zIndex": 0,
611
+ "width": 300,
612
+ "height": 240,
613
+ "title": "7️⃣ Stream the shots",
614
+ "selectable": true,
615
+ "bypassed": false
616
+ },
617
+ "dynamic_properties": {},
618
+ "dynamic_outputs": {}
619
+ },
620
+ {
621
+ "id": "keyframe_prompt",
622
+ "type": "nodetool.text.Prompt",
623
+ "data": {
624
+ "prompt": "Cinematic film still, 16:9.\n\nShot: {{ SHOT }}\n\nVisual style: {{ STYLE }}. Dramatic volumetric lighting, rich cinematic color grading, fine film grain, atmospheric depth, photoreal detail. No on-screen text, no titles, no logos, no watermark, no distorted anatomy."
625
+ },
626
+ "ui_properties": {
627
+ "position": {
628
+ "x": 2050,
629
+ "y": 1085
630
+ },
631
+ "zIndex": 0,
632
+ "width": 320,
633
+ "height": 330,
634
+ "title": "Build keyframe prompt",
635
+ "selectable": true,
636
+ "bypassed": false
637
+ },
638
+ "dynamic_properties": {
639
+ "SHOT": "",
640
+ "STYLE": ""
641
+ },
642
+ "dynamic_outputs": {}
643
+ },
644
+ {
645
+ "id": "keyframe",
646
+ "type": "nodetool.image.ImageToImage",
647
+ "data": {
648
+ "model": {
649
+ "type": "image_model",
650
+ "provider": "",
651
+ "id": "",
652
+ "name": "",
653
+ "path": null,
654
+ "supported_tasks": []
655
+ },
656
+ "negative_prompt": "",
657
+ "strength": 0.82,
658
+ "aspect_ratio": "16:9",
659
+ "resolution": "2K"
660
+ },
661
+ "ui_properties": {
662
+ "position": {
663
+ "x": 2470,
664
+ "y": 919
665
+ },
666
+ "zIndex": 0,
667
+ "width": 320,
668
+ "height": 340,
669
+ "title": "8️⃣ Storyboard keyframes (anchored to style frame)",
670
+ "selectable": true,
671
+ "bypassed": false
672
+ },
673
+ "dynamic_properties": {},
674
+ "dynamic_outputs": {},
675
+ "sync_mode": "on_all"
676
+ },
677
+ {
678
+ "id": "storyboard_collect",
679
+ "type": "nodetool.control.Collect",
680
+ "data": {},
681
+ "ui_properties": {
682
+ "position": {
683
+ "x": 2890,
684
+ "y": 1034
685
+ },
686
+ "zIndex": 0,
687
+ "width": 160,
688
+ "height": 140,
689
+ "selectable": true,
690
+ "bypassed": false
691
+ },
692
+ "dynamic_properties": {},
693
+ "dynamic_outputs": {}
694
+ },
695
+ {
696
+ "id": "storyboard_out",
697
+ "type": "nodetool.output.Output",
698
+ "data": {
699
+ "name": "storyboard"
700
+ },
701
+ "ui_properties": {
702
+ "position": {
703
+ "x": 3320,
704
+ "y": 1012
705
+ },
706
+ "title": "🖼️ Storyboard — approve before video spend",
707
+ "selectable": true
708
+ },
709
+ "dynamic_properties": {},
710
+ "dynamic_outputs": {}
711
+ },
712
+ {
713
+ "id": "motion_prompt",
714
+ "type": "nodetool.text.Prompt",
715
+ "data": {
716
+ "prompt": "Animate this exact scene. {{ SHOT }}\n\nFollow the MOTION direction precisely: move only what it names, keep everything else stable. Preserve the framing, subjects and grade of the reference image. Cinematic, subtle, no jump cuts, no morphing, no added text."
717
+ },
718
+ "ui_properties": {
719
+ "position": {
720
+ "x": 2050,
721
+ "y": 1511
722
+ },
723
+ "zIndex": 0,
724
+ "width": 320,
725
+ "height": 260,
726
+ "title": "Build motion prompt",
727
+ "selectable": true,
728
+ "bypassed": false
729
+ },
730
+ "dynamic_properties": {
731
+ "SHOT": ""
732
+ },
733
+ "dynamic_outputs": {}
734
+ },
735
+ {
736
+ "id": "animate",
737
+ "type": "nodetool.video.ImageToVideo",
738
+ "data": {
739
+ "model": {
740
+ "type": "video_model",
741
+ "provider": "",
742
+ "id": "",
743
+ "name": "",
744
+ "path": null,
745
+ "supported_tasks": []
746
+ },
747
+ "negative_prompt": "",
748
+ "aspect_ratio": "16:9",
749
+ "resolution": "720p",
750
+ "duration": 4,
751
+ "timeout_seconds": 0
752
+ },
753
+ "ui_properties": {
754
+ "position": {
755
+ "x": 2890,
756
+ "y": 1236
757
+ },
758
+ "zIndex": 0,
759
+ "width": 330,
760
+ "height": 240,
761
+ "title": "9️⃣ Animate each shot (the expensive step)",
762
+ "selectable": true,
763
+ "bypassed": false
764
+ },
765
+ "dynamic_properties": {},
766
+ "dynamic_outputs": {}
767
+ },
768
+ {
769
+ "id": "clips_collect",
770
+ "type": "nodetool.control.Collect",
771
+ "data": {},
772
+ "ui_properties": {
773
+ "position": {
774
+ "x": 3320,
775
+ "y": 1314
776
+ },
777
+ "zIndex": 0,
778
+ "width": 160,
779
+ "height": 140,
780
+ "selectable": true,
781
+ "bypassed": false
782
+ },
783
+ "dynamic_properties": {},
784
+ "dynamic_outputs": {}
785
+ },
786
+ {
787
+ "id": "cut",
788
+ "type": "nodetool.video.Concat",
789
+ "data": {},
790
+ "ui_properties": {
791
+ "position": {
792
+ "x": 3700,
793
+ "y": 1223
794
+ },
795
+ "zIndex": 0,
796
+ "width": 300,
797
+ "height": 240,
798
+ "title": "🎞️ Cut the shots together",
799
+ "selectable": true,
800
+ "bypassed": false
801
+ },
802
+ "dynamic_properties": {
803
+ "clips": ""
804
+ },
805
+ "dynamic_outputs": {}
806
+ },
807
+ {
808
+ "id": "narration_tts",
809
+ "type": "nodetool.audio.TextToSpeech",
810
+ "data": {
811
+ "model": {
812
+ "type": "tts_model",
813
+ "provider": "",
814
+ "id": "",
815
+ "name": "",
816
+ "path": null,
817
+ "voices": [],
818
+ "selected_voice": ""
819
+ },
820
+ "speed": 1
821
+ },
822
+ "ui_properties": {
823
+ "position": {
824
+ "x": 1650,
825
+ "y": 1296
826
+ },
827
+ "zIndex": 0,
828
+ "width": 300,
829
+ "height": 220,
830
+ "title": "🎙️ Narration",
831
+ "selectable": true,
832
+ "bypassed": false
833
+ },
834
+ "dynamic_properties": {},
835
+ "dynamic_outputs": {}
836
+ },
837
+ {
838
+ "id": "music",
839
+ "type": "nodetool.audio.TextToMusic",
840
+ "data": {
841
+ "model": {
842
+ "type": "music_model",
843
+ "provider": "",
844
+ "id": "",
845
+ "name": "",
846
+ "path": null
847
+ },
848
+ "lyrics": "",
849
+ "duration": 30
850
+ },
851
+ "ui_properties": {
852
+ "position": {
853
+ "x": 1650,
854
+ "y": 960
855
+ },
856
+ "zIndex": 0,
857
+ "width": 300,
858
+ "height": 240,
859
+ "title": "🎵 Score",
860
+ "selectable": true,
861
+ "bypassed": false
862
+ },
863
+ "dynamic_properties": {},
864
+ "dynamic_outputs": {}
865
+ },
866
+ {
867
+ "id": "mix_vo",
868
+ "type": "nodetool.video.AddAudio",
869
+ "data": {
870
+ "volume": 1,
871
+ "mix": true
872
+ },
873
+ "ui_properties": {
874
+ "position": {
875
+ "x": 4100,
876
+ "y": 1204
877
+ },
878
+ "zIndex": 0,
879
+ "width": 280,
880
+ "height": 220,
881
+ "title": "Mix in narration",
882
+ "selectable": true,
883
+ "bypassed": false
884
+ },
885
+ "dynamic_properties": {},
886
+ "dynamic_outputs": {}
887
+ },
888
+ {
889
+ "id": "mix_music",
890
+ "type": "nodetool.video.AddAudio",
891
+ "data": {
892
+ "volume": 0.3,
893
+ "mix": true
894
+ },
895
+ "ui_properties": {
896
+ "position": {
897
+ "x": 4480,
898
+ "y": 1082
899
+ },
900
+ "zIndex": 0,
901
+ "width": 280,
902
+ "height": 220,
903
+ "title": "Mix in score",
904
+ "selectable": true,
905
+ "bypassed": false
906
+ },
907
+ "dynamic_properties": {},
908
+ "dynamic_outputs": {}
909
+ },
910
+ {
911
+ "id": "film_out",
912
+ "type": "nodetool.output.Output",
913
+ "data": {
914
+ "name": "film"
915
+ },
916
+ "ui_properties": {
917
+ "position": {
918
+ "x": 4860,
919
+ "y": 1135
920
+ },
921
+ "title": "🎬 Final film",
922
+ "selectable": true
923
+ },
924
+ "dynamic_properties": {},
925
+ "dynamic_outputs": {}
926
+ }
927
+ ]
928
+ },
929
+ "input_schema": null,
930
+ "output_schema": null,
931
+ "settings": null,
932
+ "package_name": "nodetool-base",
933
+ "path": null,
934
+ "run_mode": "workflow",
935
+ "workspace_id": null,
936
+ "required_providers": null,
937
+ "required_models": null,
938
+ "html_app": null,
939
+ "etag": null
940
+ }