@nodetool-ai/agents 0.8.4-a24.3 → 0.8.5
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/dist/.nodetool-build-stamp +1 -1
- package/dist/_skills/LICENSE-iart-motion-design-skills +21 -0
- package/dist/_skills/README.md +211 -0
- package/dist/_skills/api-agents/SKILL.md +58 -0
- package/dist/_skills/api-apps/SKILL.md +54 -0
- package/dist/_skills/api-assets/SKILL.md +66 -0
- package/dist/_skills/api-collections/SKILL.md +33 -0
- package/dist/_skills/api-games/SKILL.md +81 -0
- package/dist/_skills/api-media/SKILL.md +131 -0
- package/dist/_skills/api-memory/SKILL.md +72 -0
- package/dist/_skills/api-models/SKILL.md +78 -0
- package/dist/_skills/api-scripts/SKILL.md +79 -0
- package/dist/_skills/api-settings/SKILL.md +49 -0
- package/dist/_skills/api-sketches/SKILL.md +61 -0
- package/dist/_skills/api-storyboards/SKILL.md +94 -0
- package/dist/_skills/api-timelines/SKILL.md +151 -0
- package/dist/_skills/api-web/SKILL.md +57 -0
- package/dist/_skills/api-workflows/SKILL.md +123 -0
- package/dist/_skills/beat-sync-editing/SKILL.md +208 -0
- package/dist/_skills/caption-titles/SKILL.md +94 -0
- package/dist/_skills/color-motion/SKILL.md +185 -0
- package/dist/_skills/commercial-beat-sheet/SKILL.md +338 -0
- package/dist/_skills/elevenlabs-audio-prompting/SKILL.md +163 -0
- package/dist/_skills/explainer-storyboard/SKILL.md +63 -0
- package/dist/_skills/flux-2-klein-prompting/SKILL.md +107 -0
- package/dist/_skills/frame-composition/SKILL.md +291 -0
- package/dist/_skills/game-direction/SKILL.md +99 -0
- package/dist/_skills/gpt-image-2-prompting/SKILL.md +161 -0
- package/dist/_skills/hailuo-prompting/SKILL.md +107 -0
- package/dist/_skills/kling-video-prompting/SKILL.md +188 -0
- package/dist/_skills/launch-commercial/SKILL.md +267 -0
- package/dist/_skills/launch-kit/SKILL.md +120 -0
- package/dist/_skills/logo-reveal/SKILL.md +225 -0
- package/dist/_skills/manimgx/SKILL.md +123 -0
- package/dist/_skills/minimax-h3-prompting/SKILL.md +134 -0
- package/dist/_skills/motion-ad/SKILL.md +281 -0
- package/dist/_skills/motion-background/SKILL.md +145 -0
- package/dist/_skills/motion-curves/SKILL.md +302 -0
- package/dist/_skills/motion-direction/SKILL.md +259 -0
- package/dist/_skills/motion-graphics/SKILL.md +217 -0
- package/dist/_skills/motion-principles/SKILL.md +255 -0
- package/dist/_skills/music-video-treatment/SKILL.md +40 -0
- package/dist/_skills/nano-banana-pro-prompting/SKILL.md +133 -0
- package/dist/_skills/native-game/SKILL.md +310 -0
- package/dist/_skills/native-game-reference/SKILL.md +879 -0
- package/dist/_skills/nodetool-3d-scene/SKILL.md +110 -0
- package/dist/_skills/nodetool-api-reference/SKILL.md +338 -0
- package/dist/_skills/nodetool-app-builder/SKILL.md +291 -0
- package/dist/_skills/nodetool-browser-agent/SKILL.md +119 -0
- package/dist/_skills/nodetool-chat-cli/SKILL.md +184 -0
- package/dist/_skills/nodetool-custom-node-developer/SKILL.md +294 -0
- package/dist/_skills/nodetool-deployment/SKILL.md +195 -0
- package/dist/_skills/nodetool-js-scripting/SKILL.md +223 -0
- package/dist/_skills/nodetool-model-provider-config/SKILL.md +348 -0
- package/dist/_skills/nodetool-rag-indexing/SKILL.md +153 -0
- package/dist/_skills/nodetool-sketch/SKILL.md +138 -0
- package/dist/_skills/nodetool-skill-author/SKILL.md +125 -0
- package/dist/_skills/nodetool-troubleshooter/SKILL.md +370 -0
- package/dist/_skills/nodetool-video-post/SKILL.md +149 -0
- package/dist/_skills/nodetool-workflow-builder/SKILL.md +295 -0
- package/dist/_skills/product-commercial/SKILL.md +132 -0
- package/dist/_skills/qwen-image-prompting/SKILL.md +122 -0
- package/dist/_skills/script-video/SKILL.md +106 -0
- package/dist/_skills/seedance-2-prompting/SKILL.md +194 -0
- package/dist/_skills/seedream-prompting/SKILL.md +117 -0
- package/dist/_skills/short-film/SKILL.md +123 -0
- package/dist/_skills/stable-audio-prompting/SKILL.md +130 -0
- package/dist/_skills/storyboard-core/SKILL.md +716 -0
- package/dist/_skills/timeline-edit-ops/SKILL.md +736 -0
- package/dist/_skills/trailer-template/SKILL.md +291 -0
- package/dist/_skills/ugc-video/SKILL.md +186 -0
- package/dist/_skills/veo-3-prompting/SKILL.md +140 -0
- package/dist/_skills/video-audio-continuity/SKILL.md +90 -0
- package/dist/_skills/video-clone/SKILL.md +96 -0
- package/dist/_skills/video-workflow/SKILL.md +119 -0
- package/dist/_skills/wan-2-6-prompting/SKILL.md +107 -0
- package/dist/analysis/audio-dsp.d.ts +1 -60
- package/dist/analysis/audio-dsp.d.ts.map +1 -1
- package/dist/analysis/audio-dsp.js +3 -190
- package/dist/analysis/audio-dsp.js.map +1 -1
- package/dist/app-build/bridge.d.ts.map +1 -1
- package/dist/app-build/bridge.js +44 -17
- package/dist/app-build/bridge.js.map +1 -1
- package/dist/capabilities/analysis.d.ts.map +1 -1
- package/dist/capabilities/analysis.js +9 -35
- package/dist/capabilities/analysis.js.map +1 -1
- package/dist/capabilities/apps.d.ts.map +1 -1
- package/dist/capabilities/apps.js +55 -13
- package/dist/capabilities/apps.js.map +1 -1
- package/dist/capabilities/apps.specs.d.ts.map +1 -1
- package/dist/capabilities/apps.specs.js +5 -3
- package/dist/capabilities/apps.specs.js.map +1 -1
- package/dist/capabilities/assets.d.ts.map +1 -1
- package/dist/capabilities/assets.js +10 -6
- package/dist/capabilities/assets.js.map +1 -1
- package/dist/capabilities/game-asset-browser.d.ts.map +1 -1
- package/dist/capabilities/game-asset-browser.js +6 -1
- package/dist/capabilities/game-asset-browser.js.map +1 -1
- package/dist/capabilities/game.d.ts +1 -1
- package/dist/capabilities/game.d.ts.map +1 -1
- package/dist/capabilities/game.js +71 -56
- package/dist/capabilities/game.js.map +1 -1
- package/dist/capabilities/game.specs.js +1 -1
- package/dist/capabilities/game.specs.js.map +1 -1
- package/dist/capabilities/game3d.d.ts.map +1 -1
- package/dist/capabilities/game3d.js +14 -19
- package/dist/capabilities/game3d.js.map +1 -1
- package/dist/capabilities/gameAssertions.d.ts +52 -0
- package/dist/capabilities/gameAssertions.d.ts.map +1 -0
- package/dist/capabilities/gameAssertions.js +32 -0
- package/dist/capabilities/gameAssertions.js.map +1 -0
- package/dist/capabilities/models.d.ts.map +1 -1
- package/dist/capabilities/models.js +9 -0
- package/dist/capabilities/models.js.map +1 -1
- package/dist/capabilities/project-scope.d.ts +8 -0
- package/dist/capabilities/project-scope.d.ts.map +1 -1
- package/dist/capabilities/project-scope.js +16 -0
- package/dist/capabilities/project-scope.js.map +1 -1
- package/dist/capabilities/storyboards.d.ts.map +1 -1
- package/dist/capabilities/storyboards.js +36 -11
- package/dist/capabilities/storyboards.js.map +1 -1
- package/dist/capabilities/storyboards.specs.d.ts.map +1 -1
- package/dist/capabilities/storyboards.specs.js +11 -1
- package/dist/capabilities/storyboards.specs.js.map +1 -1
- package/dist/capabilities/workflows.d.ts.map +1 -1
- package/dist/capabilities/workflows.js +1 -0
- package/dist/capabilities/workflows.js.map +1 -1
- package/dist/capabilities/workflows.specs.d.ts.map +1 -1
- package/dist/capabilities/workflows.specs.js +4 -3
- package/dist/capabilities/workflows.specs.js.map +1 -1
- package/dist/codeact/nodetool-api.d.ts.map +1 -1
- package/dist/codeact/nodetool-api.js +8 -2
- package/dist/codeact/nodetool-api.js.map +1 -1
- package/dist/evals/surfaces/game.d.ts.map +1 -1
- package/dist/evals/surfaces/game.js +29 -1
- package/dist/evals/surfaces/game.js.map +1 -1
- package/dist/game-authoring.d.ts +120 -0
- package/dist/game-authoring.d.ts.map +1 -1
- package/dist/game-build-integrity.d.ts +12 -0
- package/dist/game-build-integrity.d.ts.map +1 -0
- package/dist/game-build-integrity.js +78 -0
- package/dist/game-build-integrity.js.map +1 -0
- package/dist/game-examples.d.ts +44 -3
- package/dist/game-examples.d.ts.map +1 -1
- package/dist/game-examples.js +60 -10
- package/dist/game-examples.js.map +1 -1
- package/dist/system-skills.d.ts +1 -1
- package/dist/system-skills.js +1 -1
- package/dist/tools/builtin-tools.d.ts.map +1 -1
- package/dist/tools/builtin-tools.js +2 -0
- package/dist/tools/builtin-tools.js.map +1 -1
- package/dist/tools/external-mcp-tools.d.ts +6 -0
- package/dist/tools/external-mcp-tools.d.ts.map +1 -1
- package/dist/tools/external-mcp-tools.js +15 -4
- package/dist/tools/external-mcp-tools.js.map +1 -1
- package/package.json +19 -19
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video-audio-continuity
|
|
3
|
+
description: Keep sound continuous across a multi-scene piece cut from generated video — why one clip per scene hard-cuts the audio at every boundary, when to write all the scenes into a single generation instead, the sound-design vocabulary that survives a provider's copyright filter, and how to check the length, the aspect ratio and the mix of what came back. Use when a piece has more than one scene and the video model writes its own audio (Seedance 2, Veo 3, MiniMax H3, Kling 2.6 and later), or when a cut's sound drops out at the shot changes.
|
|
4
|
+
featured: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# One clip, one bed
|
|
8
|
+
|
|
9
|
+
A generated clip carries its own audio, and that audio starts and stops at the
|
|
10
|
+
clip's own edges. So the obvious build — one generated clip per shot, laid end
|
|
11
|
+
to end — hard-cuts or drops to silence at every boundary. Stills and contact
|
|
12
|
+
sheets never show it; it only exists on playback, and it is the most common
|
|
13
|
+
audio defect in a multi-scene piece.
|
|
14
|
+
|
|
15
|
+
## The rule
|
|
16
|
+
|
|
17
|
+
When sound has to carry across the scene changes, generate **one** clip holding
|
|
18
|
+
**all** the scenes.
|
|
19
|
+
|
|
20
|
+
- One `generate_video` call, the scenes written as "cut to" beats inside the
|
|
21
|
+
prompt, and one continuous audio brief across the whole thing.
|
|
22
|
+
- Lay that clip under the sequence as the base bed and time the type and
|
|
23
|
+
graphics to it.
|
|
24
|
+
- Use a model line that writes native audio, and load its prompting skill first:
|
|
25
|
+
`seedance-2-prompting` (its JSON beat sheet is built for exactly this — global
|
|
26
|
+
`audio_note`, one `audio` line per beat), `veo-3-prompting`,
|
|
27
|
+
`minimax-h3-prompting`, `kling-video-prompting`.
|
|
28
|
+
|
|
29
|
+
Separate per-shot clips are right in two cases:
|
|
30
|
+
|
|
31
|
+
- the piece is silent, or
|
|
32
|
+
- the continuity comes from a track you add yourself — narration from
|
|
33
|
+
`generate_speech` (or `voice_script_lines`, which voices every line of a
|
|
34
|
+
board's script in one call), a bed from `generate_music` — on its own
|
|
35
|
+
timeline track. Then the visual beds can be separate and the shots are muted
|
|
36
|
+
under it. `elevenlabs-audio-prompting` directs the voice and the music plan,
|
|
37
|
+
`stable-audio-prompting` the bed and any effects; a bed generated with a
|
|
38
|
+
stated BPM is a bed whose grid `beat-sync-editing` already knows.
|
|
39
|
+
|
|
40
|
+
Two video lines force the second build: Wan 2.6 takes an audio file as input
|
|
41
|
+
but writes none, and Hailuo has no native audio at all, so a piece on either
|
|
42
|
+
gets its sound from a track of your own.
|
|
43
|
+
|
|
44
|
+
On a storyboard this means one shot, not seven. A board whose shots each render
|
|
45
|
+
their own native-audio clip cannot be assembled into a continuous mix; decide
|
|
46
|
+
which of the two builds you are doing before the first render, because the fix
|
|
47
|
+
afterwards is a re-render. The board skills (`commercial-beat-sheet`,
|
|
48
|
+
`trailer-template`, `explainer-storyboard`, `music-video-treatment`) each say
|
|
49
|
+
which build they default to; the sound brief itself goes into the shot's
|
|
50
|
+
`motion` and `action`, the only fields the clip prompt is built from.
|
|
51
|
+
|
|
52
|
+
## A sound brief that is not refused
|
|
53
|
+
|
|
54
|
+
Providers copyright-filter the generated audio track, and a brief asking for a
|
|
55
|
+
"swell", a "chord", a "score", a "soundtrack" or a named musical genre can come
|
|
56
|
+
back blocked — failing the whole render, not just the audio. For an underscore,
|
|
57
|
+
describe sound design instead:
|
|
58
|
+
|
|
59
|
+
- Hum, digital pulses, ticking, airy whooshes, risers, sparkle textures, one low
|
|
60
|
+
sub-bass boom.
|
|
61
|
+
- Close with "no music, no melody, no song, no voice".
|
|
62
|
+
- Put each transition in the sound design — a whoosh on every "cut to" — not in a
|
|
63
|
+
musical cue. A cue tends to restart at the cut, which is the discontinuity you
|
|
64
|
+
are avoiding.
|
|
65
|
+
|
|
66
|
+
Dialogue is not affected by this: quoted lines are the model's own voice track,
|
|
67
|
+
and the model-line skill says how to write them.
|
|
68
|
+
|
|
69
|
+
## Check what came back
|
|
70
|
+
|
|
71
|
+
- **Length.** `duration_seconds` is honoured loosely and clamped to the lengths a
|
|
72
|
+
model supports. Measure with `analyze_video` before cutting to it.
|
|
73
|
+
- **Frame.** Aspect ratio is not guaranteed — an image-to-video route often
|
|
74
|
+
ignores a 9:16 source and emits 16:9. `analyze_video` reports it; fix it with
|
|
75
|
+
an ffmpeg crop to the target frame (`nodetool.media.ffmpeg` in a code action;
|
|
76
|
+
`api-media` has its contract) before compositing, not after.
|
|
77
|
+
- **The mix.** Judge it with `understand_video` (Gemini gets the audio; every
|
|
78
|
+
other vision model is sent silent stills), `analyze_audio` for the levels, and
|
|
79
|
+
`detect_video_scenes` to confirm the cuts landed where the beats said. Never
|
|
80
|
+
from a contact sheet.
|
|
81
|
+
- **The file.** Build on a stored asset. `generate_video` saves its result;
|
|
82
|
+
probing a generation node with `invoke_node` hands back whatever the node
|
|
83
|
+
returned, which can be a run-local path that is gone by the time you assemble.
|
|
84
|
+
|
|
85
|
+
## Where the rest picks up
|
|
86
|
+
|
|
87
|
+
`timeline-edit-ops` carries the timeline op contract for laying the bed and muting
|
|
88
|
+
shot audio under a narration track. `beat-sync-editing` sits the cuts on that
|
|
89
|
+
bed once it exists, and `caption-titles` times the type to it — a title card is
|
|
90
|
+
never rendered into the clip, whichever build you chose.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video-clone
|
|
3
|
+
description: "Analyze a reference video and recreate its shot structure with a new product or cast in NodeTool."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
**Load `/storyboard-core` first.** It carries the loop, the tool contract and
|
|
7
|
+
the gating this skill assumes. Everything below is the breakdown pass that comes
|
|
8
|
+
before that loop, and the rules for what may and may not be carried over.
|
|
9
|
+
|
|
10
|
+
## What makes this job type its own
|
|
11
|
+
|
|
12
|
+
The structure is given, so the work is reading it accurately and then rebuilding it
|
|
13
|
+
with different content. Two failure modes: describing the reference vaguely enough
|
|
14
|
+
that the rebuild is unrelated, and copying it closely enough that you reproduce
|
|
15
|
+
somebody's trademarks.
|
|
16
|
+
|
|
17
|
+
## Read the reference first
|
|
18
|
+
|
|
19
|
+
`find_model` with `capability: "generate_message"` for a model that reads video —
|
|
20
|
+
Gemini does it natively — then:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
understand_video {provider, model, video, prompt, max_tokens}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`video` takes an asset id, an `asset://` URI, a URL or a data URI. It reads the whole
|
|
27
|
+
video, not sampled frames. Ask for one thing at a time rather than everything at once;
|
|
28
|
+
two or three calls read better than one overloaded prompt.
|
|
29
|
+
|
|
30
|
+
Extract, in this order:
|
|
31
|
+
|
|
32
|
+
1. **Frame:** aspect, total length, shot count.
|
|
33
|
+
2. **The first three seconds** — what the hook actually does, described as an action.
|
|
34
|
+
3. **Per shot:** in and out timecode, framing, camera height, camera move, who speaks,
|
|
35
|
+
whether the product is visible and how.
|
|
36
|
+
4. **Audio recipe:** dialogue, voiceover, room tone, music, and whether the sound is
|
|
37
|
+
diegetic.
|
|
38
|
+
5. **One paragraph on why it works** — the mechanism, not praise.
|
|
39
|
+
|
|
40
|
+
Report the breakdown. Stop for an analysis-only request or a requested review.
|
|
41
|
+
For an authorized remake, continue using the reference structure and the new brief.
|
|
42
|
+
|
|
43
|
+
## What carries over, and what must not
|
|
44
|
+
|
|
45
|
+
| Carry over | Replace |
|
|
46
|
+
|---|---|
|
|
47
|
+
| Cut rhythm — each shot's duration | The room, the set, the location |
|
|
48
|
+
| Camera heights and framings | Wardrobe and casting |
|
|
49
|
+
| The order of beats: hook, demonstration, verdict | Every spoken line |
|
|
50
|
+
| Whether the sound is diegetic | The product |
|
|
51
|
+
| Aspect ratio and total length | The palette, unless the user asks to match it |
|
|
52
|
+
|
|
53
|
+
**Never carry a trademark across.** Logos, wordmarks, brand colours as identity,
|
|
54
|
+
slogans, packaging layout and any readable sign in the reference stay out of the
|
|
55
|
+
rebuild. Put `no brand marks other than [PRODUCT]` in the board `style`. If the user
|
|
56
|
+
asks for the reference's actual logo, say plainly that the rebuild uses their product
|
|
57
|
+
and nothing else, and carry on with the rest.
|
|
58
|
+
|
|
59
|
+
## Rebuild
|
|
60
|
+
|
|
61
|
+
Map each extracted shot to one `add_shot`, keeping its duration as
|
|
62
|
+
`duration_seconds`, its framing in `camera.framing`, its camera height in
|
|
63
|
+
`camera.angle` and its move in `camera.movement`. The still prompt reads framing,
|
|
64
|
+
angle and lens, and the clip prompt reads the movement, so none of them needs
|
|
65
|
+
repeating in `action`.
|
|
66
|
+
|
|
67
|
+
Cast before rendering: a character entity from a generated reference you show the user
|
|
68
|
+
first, and a prop entity from their pack shot. Slug the shots `1a`, `2a`, … so the
|
|
69
|
+
user can name one against the reference's own numbering.
|
|
70
|
+
|
|
71
|
+
Then run the core loop: stills, take selection (`select_version` when the user names a take), clips.
|
|
72
|
+
|
|
73
|
+
## Brief
|
|
74
|
+
|
|
75
|
+
Adapt these examples to the user's brief. Example deliverables, style choices,
|
|
76
|
+
and approval checkpoints apply only when the user adopts them.
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
Read the attached reference video with understand_video (find a model that reads
|
|
80
|
+
video via find_model, capability=generate_message — Gemini reads it natively).
|
|
81
|
+
|
|
82
|
+
Extract: aspect, length, shot count; what the first three seconds do; then per
|
|
83
|
+
shot the in/out timecode, framing, camera height, move, who speaks and whether
|
|
84
|
+
the product is visible. Then the audio recipe, then one paragraph on the
|
|
85
|
+
mechanism that makes it work.
|
|
86
|
+
|
|
87
|
+
Report that and stop.
|
|
88
|
+
|
|
89
|
+
Then rebuild it for [PRODUCT] with a new character. Keep the cut rhythm, the
|
|
90
|
+
durations and the camera heights. Change the room, the wardrobe and every line.
|
|
91
|
+
Carry no trademark from the reference — board style gets "no brand marks other
|
|
92
|
+
than [PRODUCT]".
|
|
93
|
+
|
|
94
|
+
Cast from stills first: generate the character reference, show me, then tag it.
|
|
95
|
+
Slug every shot so I can say "fix 2a".
|
|
96
|
+
```
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: video-workflow
|
|
3
|
+
description: "Build a reusable NodeTool video workflow for batches or repeated inputs. For a single finished piece, use a storyboard skill."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
**Load `/storyboard-core` for what a shot is and how entities season a prompt,
|
|
7
|
+
and `/nodetool-workflow-builder` for how to author a graph at all** — node search,
|
|
8
|
+
handles, validation, the tools. This skill is the seam between them: the nodes that
|
|
9
|
+
turn a brief into shots, and when a graph is the wrong answer.
|
|
10
|
+
|
|
11
|
+
## First, check a graph is actually wanted
|
|
12
|
+
|
|
13
|
+
A graph earns its cost only when the pipeline gets **re-run on new inputs**. One video,
|
|
14
|
+
even a complicated one, is faster and cheaper to direct on a storyboard — no node
|
|
15
|
+
search, no handle wiring, no validation pass, and the user can see and fix each shot.
|
|
16
|
+
|
|
17
|
+
Build a graph when the user says template, pipeline, batch, factory, "for every SKU",
|
|
18
|
+
"run it again next month", or wants it callable from Chat by name. If they asked for a
|
|
19
|
+
video and you are reaching for a graph, go back to the storyboard skills.
|
|
20
|
+
|
|
21
|
+
## The creative nodes
|
|
22
|
+
|
|
23
|
+
Search the registry before adding any of these — `search_nodes` or `ui_search_nodes`
|
|
24
|
+
with `include_properties` and `include_outputs` — and never invent a type, a property
|
|
25
|
+
or a handle name. Verified types:
|
|
26
|
+
|
|
27
|
+
| Node | Does |
|
|
28
|
+
|---|---|
|
|
29
|
+
| `nodetool.creative.Director` | brief → `Screenplay`. Props: `model` (language_model), `brief`, `style`, `shot_count` (1–20), `aspect_ratio`, `max_tokens`. Outputs: `screenplay`, `narration`, `music_prompt`, `title`. |
|
|
30
|
+
| `nodetool.creative.ScreenplayShots` | fans a screenplay out one shot at a time. Outputs `shot`, `shot_prompt`, `index` per iteration plus `output` as the whole list. |
|
|
31
|
+
| `nodetool.creative.ShotBatch` | flattens a screenplay into generation-ready specs in one go. Output: `shots` (list[dict]) with prompt, timing and keyframe. |
|
|
32
|
+
| `nodetool.creative.ShotChain` | animates a spec list sequentially, seeding each shot's first frame from the previous clip's last frame. Output: `videos`. Needs the `ffmpeg` runtime. |
|
|
33
|
+
| `nodetool.creative.ApplyEntities` | seasons a prompt with entity descriptors, the same rule the storyboard render path uses. |
|
|
34
|
+
| `nodetool.image.TextToImage` | prompt → image. |
|
|
35
|
+
| `nodetool.video.ImageToVideo` / `nodetool.video.TextToVideo` | still → clip, or prompt → clip. |
|
|
36
|
+
|
|
37
|
+
## Re-run an approved document instead of re-directing
|
|
38
|
+
|
|
39
|
+
When the user already has a board, a script or a cut they signed off, do not put
|
|
40
|
+
`Director` in the graph. Start from the approved row and derive:
|
|
41
|
+
|
|
42
|
+
| Node | Does |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `nodetool.constant.Storyboard` / `.Entity` | a picked board or library entity as a graph value. Outputs `output`. |
|
|
45
|
+
| `nodetool.entity.CreateEntity` | `image`, `kind`, `name`, `descriptor`, `key` → `entity`, `created`. Upserts on `key` (a SKU), so a second run reuses the row instead of growing the library. |
|
|
46
|
+
| `nodetool.entity.LoadEntity` / `ListEntities` | read one entity, or stream a filtered set. |
|
|
47
|
+
| `nodetool.storyboard.CreateStoryboard` | `screenplay` from `Director`, `name`, `cast`, both models → a new writable `storyboard`. The brief-first path: Director → CreateStoryboard → RenderStills. A re-run returns the board it made. |
|
|
48
|
+
| `nodetool.storyboard.RecastStoryboard` | `storyboard`, `cast`, `replaces`, `reuse_existing` → the copy, `invalidated`, `kept`. Keeps every frame whose prompt did not move. |
|
|
49
|
+
| `nodetool.storyboard.RenderStills` / `RenderClips` | render the stale shots of a derived board. `only_stale`, `max_shots`, `require_keyframe` are the spend gates. |
|
|
50
|
+
| `nodetool.storyboard.AssembleTimeline` | the derived board → `timeline`. A copy inherits the template's cut, titles and music. |
|
|
51
|
+
| `nodetool.storyboard.LoadStoryboard` / `StoryboardShots` | read a board's shots, entities and settings, or stream one message per shot with its still and clip. |
|
|
52
|
+
| `nodetool.script.WriteScript` / `FillScript` | write a script from a brief and a cast, or fill `{{key}}` placeholders in an approved one. Both make a new row. |
|
|
53
|
+
| `nodetool.timeline.FillTimelineText` | `timeline`, `values` → a new sequence with the overlay filled. |
|
|
54
|
+
| `nodetool.timeline.RetargetTimeline` | `timeline`, `aspect_ratio`, `fit` → a new sequence, plus `cropped` naming the clips the crop cuts into. |
|
|
55
|
+
|
|
56
|
+
**The write contract.** A `storyboard` ref is read-only unless the run derived it.
|
|
57
|
+
`RenderStills`, `RenderClips` and `AssembleTimeline` refuse a picked board and name
|
|
58
|
+
`allow_writes`, which is the override for a graph whose whole purpose is to render the
|
|
59
|
+
board a person chose. Wire `CreateStoryboard` or `RecastStoryboard` first and pass its
|
|
60
|
+
output along; that ref carries the permission.
|
|
61
|
+
|
|
62
|
+
Shipped examples to read before wiring one yourself: **Per-SKU Ad Factory**,
|
|
63
|
+
**Localized Explainer**, **Three Ratios** (`get_example_workflow`).
|
|
64
|
+
|
|
65
|
+
## Two shapes, and they are not interchangeable
|
|
66
|
+
|
|
67
|
+
**Per-shot fan-out** — `Director` → `ScreenplayShots` → `TextToImage` → `ImageToVideo`.
|
|
68
|
+
Each shot renders independently. Use it when shots are separate takes: an ad, a set of
|
|
69
|
+
social cuts, anything where a shot failing should not spoil the rest.
|
|
70
|
+
|
|
71
|
+
**Continuous chain** — `Director` → `ShotBatch` → `ShotChain`. Each clip's first frame
|
|
72
|
+
is the previous clip's last frame, so motion and framing carry across the cut. Use it
|
|
73
|
+
for a sequence that has to feel continuous. It is sequential, so it is slower and one
|
|
74
|
+
bad clip propagates.
|
|
75
|
+
|
|
76
|
+
`ApplyEntities` goes between the prompt source and the image node whenever the pipeline
|
|
77
|
+
has a recurring character or product to hold steady.
|
|
78
|
+
|
|
79
|
+
## Wire the gate in
|
|
80
|
+
|
|
81
|
+
The storyboard loop's value is that a human sees the stills before the clips are paid
|
|
82
|
+
for. A graph loses that unless you build it in: keep the still half and the clip half
|
|
83
|
+
separable, so the user can run to the stills, look, and then run the clip half. Say
|
|
84
|
+
which inputs do that when you hand the workflow over.
|
|
85
|
+
|
|
86
|
+
## Validate and deliver the requested result
|
|
87
|
+
|
|
88
|
+
`validate_workflow` with the inline graph before saving — it catches unknown node
|
|
89
|
+
types, missing required properties, unselected models, dangling edges and a model id
|
|
90
|
+
the provider does not offer, in well under a second and with no spend.
|
|
91
|
+
|
|
92
|
+
`create_workflow` refuses to save a graph whose model properties are unselected, so
|
|
93
|
+
pick real ones with `find_model` and stamp them in. Nothing fills them in at run time.
|
|
94
|
+
|
|
95
|
+
Save and read back the graph. A request to build a template ends with a validated
|
|
96
|
+
workflow and its input instructions. If the user also requested execution, run
|
|
97
|
+
the authorized stages within their scope and budget. Do not request the same
|
|
98
|
+
authorization again.
|
|
99
|
+
|
|
100
|
+
## Brief
|
|
101
|
+
|
|
102
|
+
Adapt these examples to the user's brief. Example deliverables, style choices,
|
|
103
|
+
and approval checkpoints apply only when the user adopts them.
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
Build a workflow named "UGC factory" that I can re-run from Chat.
|
|
107
|
+
|
|
108
|
+
Inputs: a product image, a brief, an aspect ratio.
|
|
109
|
+
Shape: nodetool.creative.Director (brief + style + shot_count) ->
|
|
110
|
+
nodetool.creative.ScreenplayShots -> nodetool.creative.ApplyEntities ->
|
|
111
|
+
nodetool.image.TextToImage -> a point I can stop at and look ->
|
|
112
|
+
nodetool.video.ImageToVideo -> timeline assembly.
|
|
113
|
+
|
|
114
|
+
Search the registry for every node type and read its real properties and handles
|
|
115
|
+
before you add it. Pick concrete models with find_model and stamp them in.
|
|
116
|
+
validate_workflow before saving.
|
|
117
|
+
|
|
118
|
+
Save it and stop. Do not run the clip stage.
|
|
119
|
+
```
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wan-2-6-prompting
|
|
3
|
+
description: Prompt Alibaba's Wan 2.6 video — text-to-video with a global style line plus timing-bracketed shots, and image-to-video that describes only what changes over time. Covers the shot-mode switch per provider, the prompt budget, negative prompts, motion intensity wording, audio input and prompt expansion. Use whenever the model id names a Wan 2.6 video route (alibaba/wan-2.6/text-to-video, alibaba/wan-2.6/image-to-video, wan-video/wan-2.6-t2v, wan-video/wan-2.6-i2v, wan-video/wan2.6-i2v-flash) on generate_video, animate_image or a TextToVideo node. Not for Wan 2.5 or 2.7, or the Wan 2.6 image routes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Wan 2.6 → two modes, two prompt shapes
|
|
7
|
+
|
|
8
|
+
Wan 2.6 generates from text or animates a still. Each mode wants a differently
|
|
9
|
+
shaped prompt. Getting the shape wrong is the usual reason a clip comes back
|
|
10
|
+
generic.
|
|
11
|
+
|
|
12
|
+
Reach it with `find_model` for `text_to_video` or `image_to_video`, then
|
|
13
|
+
`generate_video` / `animate_image`. Those forward the prompt (and the image),
|
|
14
|
+
a negative prompt (not `animate_image`), the duration, the aspect ratio and
|
|
15
|
+
the resolution. The shot-mode switch, prompt expansion and an audio file exist
|
|
16
|
+
only on the route's own node: find it with `search_nodes`, read its fields
|
|
17
|
+
with `get_node_info`, and run it with `run_node`. Each run is a paid
|
|
18
|
+
generation, so confirm the scope with the user before rendering several.
|
|
19
|
+
|
|
20
|
+
fal's guide caps main prompts at 800 characters. No shipped route states the
|
|
21
|
+
limit, but write as if it holds.
|
|
22
|
+
|
|
23
|
+
## Text to video
|
|
24
|
+
|
|
25
|
+
Two components: a global style line, then shots with timing brackets.
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
A cinematic journey through ancient ruins at sunset. Photoreal, 4K, film grain.
|
|
29
|
+
|
|
30
|
+
Shot 1 [0-3s] Wide establishing shot of stone pillars with sunlight streaming through.
|
|
31
|
+
Shot 2 [3-7s] Camera tracks forward through an archway revealing a hidden chamber.
|
|
32
|
+
Shot 3 [7-10s] Close-up of ancient inscriptions as dust particles float in light beams.
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The shot mode is a switch, and its name and default differ by provider:
|
|
36
|
+
AtlasCloud's `shot_type` defaults to `multi`, and Replicate's `multi_shots`
|
|
37
|
+
defaults to false, so set it true there before sending bracketed shots. Give
|
|
38
|
+
each shot a timing indicator, a
|
|
39
|
+
camera action (push, pull, pan, orbit, track) and its scene elements — subject
|
|
40
|
+
position, lighting change, environmental detail. Keep continuity by referencing
|
|
41
|
+
the same characters, locations and objects across shots; unrelated shots
|
|
42
|
+
produce disjointed results.
|
|
43
|
+
|
|
44
|
+
AtlasCloud's durations are 5, 10 or 15 seconds, at 720p or 1080p, in 16:9, 9:16, 1:1, 4:3 or
|
|
45
|
+
3:4. Write to the ratio you picked: wide establishing shots and horizontal
|
|
46
|
+
movement for 16:9, tighter framing and vertical composition for 9:16, centred
|
|
47
|
+
subjects for 1:1.
|
|
48
|
+
|
|
49
|
+
## Image to video
|
|
50
|
+
|
|
51
|
+
Describe the temporal change, not the image. The model already has the frame;
|
|
52
|
+
words spent re-describing it are words not spent on motion.
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
Continue from first frame. Gentle camera push toward the mountain peak as
|
|
56
|
+
clouds drift overhead. Light changes from morning to golden hour. Cinematic and
|
|
57
|
+
serene movement.
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Spend the prompt on camera motion, lighting shifts, and environmental
|
|
61
|
+
animation — water, clouds, foliage, smoke. The same shot switch applies:
|
|
62
|
+
AtlasCloud defaults to `multi`, Replicate to `multi_shots` false. Set single
|
|
63
|
+
shot for a plain animated still.
|
|
64
|
+
|
|
65
|
+
Images animate better when they are high resolution, have clear depth of field,
|
|
66
|
+
carry atmospheric elements, and are uncluttered with a well-defined subject.
|
|
67
|
+
Busy compositions with competing elements produce inconsistent motion. fal's
|
|
68
|
+
guide gives input images 360 to 2000 px per side, up to 100 MB.
|
|
69
|
+
|
|
70
|
+
## Controls
|
|
71
|
+
|
|
72
|
+
**Negative prompt** — fal's guide caps it at 500 characters. Prioritise the artifacts you actually
|
|
73
|
+
see: "low quality, blurry, distorted faces, unnatural movement, text,
|
|
74
|
+
watermarks, shaky camera".
|
|
75
|
+
|
|
76
|
+
**Motion intensity** is a wording choice, not a parameter. Minimal: "subtle
|
|
77
|
+
camera drift", "gentle movement". Moderate: "smooth camera track", "flowing
|
|
78
|
+
motion". Dramatic: "dynamic sweeping motion", "rapid camera movement".
|
|
79
|
+
|
|
80
|
+
**Audio input** (`audio` on the route's node) takes WAV or MP3, 3 to 30
|
|
81
|
+
seconds, up to 15 MB, per fal's guide. Audio longer than the video is
|
|
82
|
+
truncated; audio shorter leaves the rest silent. For
|
|
83
|
+
dialogue, put speaker cues in the prompt.
|
|
84
|
+
|
|
85
|
+
**Prompt expansion** (`enable_prompt_expansion`) is on by default on every
|
|
86
|
+
Wan 2.6 video route and runs an LLM over the prompt before generation. It adds
|
|
87
|
+
detail without eating the 800-character budget, and it
|
|
88
|
+
works best when you have given it style references, visual descriptors and
|
|
89
|
+
precise terminology to expand from.
|
|
90
|
+
|
|
91
|
+
## Symptoms
|
|
92
|
+
|
|
93
|
+
| What went wrong | What to change |
|
|
94
|
+
| :--- | :--- |
|
|
95
|
+
| Incoherent narrative | Break the scene into specific shots with timing brackets |
|
|
96
|
+
| Inconsistent subjects | Repeat the character description across every shot |
|
|
97
|
+
| Unnatural motion | Name the camera movement explicitly: push, pan, orbit |
|
|
98
|
+
| Flat visual quality | Add quality descriptors to the global style line |
|
|
99
|
+
| An element ignored | Move it earlier in the shot description |
|
|
100
|
+
|
|
101
|
+
Iterate one variable at a time, and start in text-to-video — the shot and
|
|
102
|
+
timing format transfers to image-to-video without any asset dependency.
|
|
103
|
+
Check the render with `analyze_video`, `detect_video_scenes` and
|
|
104
|
+
`understand_video`.
|
|
105
|
+
|
|
106
|
+
Adapted from fal's Wan 2.6 prompt guide:
|
|
107
|
+
https://fal.ai/learn/devs/wan-2-6-prompt-guide-mastering-all-three-generation-modes
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* streaming target is specified in. dBFS peak/RMS is kept alongside it because
|
|
13
13
|
* clipping and headroom are peak questions, not loudness questions.
|
|
14
14
|
*/
|
|
15
|
+
export { detectOnsets, estimateTempo, fftInPlace, hannWindow, magnitudeSpectrum, spectralFlux, type TempoEstimate } from "@nodetool-ai/timeline";
|
|
15
16
|
/** Amplitude floor reported instead of -Infinity for digital silence. */
|
|
16
17
|
export declare const SILENT_DB = -120;
|
|
17
18
|
/** Interleaved PCM plus the format needed to interpret it. */
|
|
@@ -63,20 +64,6 @@ export interface PeakSummary {
|
|
|
63
64
|
export declare function peakSummary(mono: Float32Array, clipThreshold?: number): PeakSummary;
|
|
64
65
|
/** Largest power of two at or below `value`, at least 2. */
|
|
65
66
|
export declare function floorPowerOfTwo(value: number): number;
|
|
66
|
-
/** A periodic Hann window of length `size`. */
|
|
67
|
-
export declare function hannWindow(size: number): Float32Array;
|
|
68
|
-
/**
|
|
69
|
-
* In-place radix-2 Cooley-Tukey FFT. `re`/`im` must have the same
|
|
70
|
-
* power-of-two length; the transform overwrites both.
|
|
71
|
-
*/
|
|
72
|
-
export declare function fftInPlace(re: Float32Array, im: Float32Array): void;
|
|
73
|
-
/**
|
|
74
|
-
* The magnitude spectrum of one windowed frame — bins 0..size/2 inclusive.
|
|
75
|
-
*
|
|
76
|
-
* `signal` is read from `offset`; a frame that runs past the end is
|
|
77
|
-
* zero-padded, which is what makes the last window of a clip analysable.
|
|
78
|
-
*/
|
|
79
|
-
export declare function magnitudeSpectrum(signal: Float32Array, offset: number, window: Float32Array): Float32Array;
|
|
80
67
|
/** What one spectrum says about the sound's colour. */
|
|
81
68
|
export interface SpectralFeatures {
|
|
82
69
|
/** Energy-weighted mean frequency — "brightness". */
|
|
@@ -158,21 +145,6 @@ export interface LoudnessResult {
|
|
|
158
145
|
* number nobody measured.
|
|
159
146
|
*/
|
|
160
147
|
export declare function measureLoudness(planar: readonly Float32Array[], sampleRate: number): LoudnessResult;
|
|
161
|
-
/**
|
|
162
|
-
* Half-wave rectified spectral flux between two frames, normalized by the
|
|
163
|
-
* current frame's total magnitude.
|
|
164
|
-
*
|
|
165
|
-
* The normalization is what makes the number mean something. Raw flux scales
|
|
166
|
-
* with how loud the passage is, so one threshold cannot serve a quiet verse
|
|
167
|
-
* and a loud chorus. Worse, a *stationary* tone does not produce zero raw
|
|
168
|
-
* flux: at a hop that is not a whole number of cycles the sinusoid's leakage
|
|
169
|
-
* pattern shifts between frames, so its bin magnitudes wobble by a few percent
|
|
170
|
-
* forever. Measured against the frame's own magnitude that wobble is ~0.02 and
|
|
171
|
-
* a real onset is a large fraction of 1, which is a difference a threshold can
|
|
172
|
-
* act on. Against raw flux the two are indistinguishable, and a held note
|
|
173
|
-
* reads as a stream of onsets at a confident tempo.
|
|
174
|
-
*/
|
|
175
|
-
export declare function spectralFlux(magnitude: Float32Array, previous: Float32Array): number;
|
|
176
148
|
/** A stretch of the timeline classified as silent or as sound. */
|
|
177
149
|
export interface AudioSegment {
|
|
178
150
|
readonly start: number;
|
|
@@ -190,35 +162,4 @@ export interface AudioSegment {
|
|
|
190
162
|
export declare function silenceSegments(frames: readonly EnergyFrame[], thresholdDb: number, minDurationSeconds: number, frameDuration: number): AudioSegment[];
|
|
191
163
|
/** The gaps between silences: everything that is not silent. */
|
|
192
164
|
export declare function invertSegments(segments: readonly AudioSegment[], duration: number): AudioSegment[];
|
|
193
|
-
/**
|
|
194
|
-
* Onset times from a normalized spectral-flux novelty curve.
|
|
195
|
-
*
|
|
196
|
-
* A peak is an onset when it is a local maximum, clears an adaptive threshold
|
|
197
|
-
* (the local mean plus `sensitivity` local standard deviations), and clears
|
|
198
|
-
* `minStrength` outright. Both halves are needed. The adaptive half handles
|
|
199
|
-
* dynamics — a fixed threshold finds every hit in a loud passage and none in a
|
|
200
|
-
* quiet one. The absolute half handles the opposite failure: where the curve
|
|
201
|
-
* is essentially flat the local standard deviation collapses, every ripple
|
|
202
|
-
* clears mean + 1.5σ, and a held note reports dozens of onsets. `minStrength`
|
|
203
|
-
* is in the units {@link spectralFlux} returns — a fraction of the frame's own
|
|
204
|
-
* magnitude — so 0.04 means "at least 4% of this frame's energy is new".
|
|
205
|
-
*/
|
|
206
|
-
export declare function detectOnsets(flux: readonly number[], times: readonly number[], sensitivity?: number, windowFrames?: number, minGapSeconds?: number, minStrength?: number): number[];
|
|
207
|
-
/** A tempo estimate, and how strongly the novelty curve supports it. */
|
|
208
|
-
export interface TempoEstimate {
|
|
209
|
-
readonly bpm: number;
|
|
210
|
-
/** Normalized autocorrelation at the winning lag, 0..1. */
|
|
211
|
-
readonly confidence: number;
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Tempo from the autocorrelation of the novelty curve.
|
|
215
|
-
*
|
|
216
|
-
* Only lags inside `minBpm`..`maxBpm` are considered, so the classic
|
|
217
|
-
* half/double-time ambiguity is bounded rather than unbounded. Confidence is
|
|
218
|
-
* the autocorrelation at the winning lag over the curve's own energy; a
|
|
219
|
-
* non-rhythmic signal scores near zero, and the caller is expected to say so
|
|
220
|
-
* instead of printing a BPM for speech.
|
|
221
|
-
*/
|
|
222
|
-
export declare function estimateTempo(novelty: readonly number[], hopSeconds: number, minBpm?: number, maxBpm?: number): TempoEstimate;
|
|
223
|
-
export {};
|
|
224
165
|
//# sourceMappingURL=audio-dsp.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audio-dsp.d.ts","sourceRoot":"","sources":["../../src/analysis/audio-dsp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"audio-dsp.d.ts","sourceRoot":"","sources":["../../src/analysis/audio-dsp.ts"],"names":[],"mappings":"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"}
|