@ninkch/dsh-infinite-canvas 0.17.10 → 0.17.12
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/README.md +56 -18
- package/README.zh-CN.md +83 -40
- package/assets/canvas-studio/SKILL.md +80 -14
- package/client.js +1584 -171
- package/docs/guide.en.md +225 -0
- package/docs/guide.zh-CN.md +229 -0
- package/index.js +83 -13
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**A node-based short-drama studio inside DeepSeek Harness.** Start from a one-line idea, walk out with a storyboarded, voiced, subtitled video cut — right on an infinite canvas.
|
|
4
4
|
|
|
5
|
-
English | [简体中文](./README.zh-CN.md)
|
|
5
|
+
English | [简体中文](./README.zh-CN.md) · **User guide: [English](./docs/guide.en.md)** · [操作手册(中文)](./docs/guide.zh-CN.md)
|
|
6
6
|
|
|
7
7
|
<!-- Badges: add CI / npm / license badges here after publishing -->
|
|
8
8
|
|
|
@@ -12,23 +12,57 @@ Infinite Canvas is a [DeepSeek Harness](https://github.com/deepseek-ai) plugin t
|
|
|
12
12
|
|
|
13
13
|
Everything runs locally in your Harness. Bring your own generation APIs, or use the built-in demo mode to learn the whole flow with zero configuration.
|
|
14
14
|
|
|
15
|
+
## Drive it from the chat
|
|
16
|
+
|
|
17
|
+
The canvas and the agent share one brain. Every node is an AI workbench, and the **chat side is the director**: ask in plain language and the agent operates the canvas tools for you — batch work especially.
|
|
18
|
+
|
|
19
|
+
> *"Create a project called Time-Postman, write the world view and series bible first."*
|
|
20
|
+
> *"Write episode 1 based on the bible."* → the script node generates one episode (60–120s), every scene marked with a `【场N】` header.
|
|
21
|
+
> *"Expand episode 1 into scenes."* → per-scene text nodes + storyboard nodes appear, wired automatically.
|
|
22
|
+
> *"Generate reference images for every character, scene and prop."* → ten image nodes created and generated in one go.
|
|
23
|
+
> *"Generate scene 1's video."* → storyboard shots + reference images compose one multi-shot video call.
|
|
24
|
+
> *"Send episode 1 to FilmCraft for an MP4 render."* → FCP7 XML + SRT land in your data root for the Craft suite.
|
|
25
|
+
|
|
26
|
+
The heavy lifting — bibles, episode scripts, storyboard breakdowns, batches of reference images — is exactly what the agent is fast at. You then fine-tune the 20% you care about directly on the nodes: tweak a prompt, reorder references, re-roll one shot, pull an older result from history.
|
|
27
|
+
|
|
28
|
+
## Case study: Time-Postman (时空邮递员)
|
|
29
|
+
|
|
30
|
+
A full episode produced end to end with the flow above. The canvas at 32% — the script node, the expanded per-scene text + storyboard groups, the scene-1 video node with its bound references and preview, and the Assets panel:
|
|
31
|
+
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
Scene 1 up close — text → storyboard → video wiring, with the storyboard's shot list and the video node's bound references:
|
|
35
|
+
|
|
36
|
+

|
|
37
|
+
|
|
38
|
+
A scene video node: model picked from the provider's model list, duration/ratio/resolution on the node, four reference images bound in order:
|
|
39
|
+
|
|
40
|
+

|
|
41
|
+
|
|
42
|
+
Providers are configured once (URL + key + vendor-specific extra params) and can hold many models — one is starred as the default route:
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
The Settings panel — data root, Craft status (12/12 ready), skills, text model, and the image/video/TTS provider lists (EN / 中文 versions of the same UI):
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
15
50
|
## How it works
|
|
16
51
|
|
|
17
52
|
```mermaid
|
|
18
53
|
flowchart LR
|
|
19
|
-
A[Script node<br>
|
|
20
|
-
B --> C[
|
|
21
|
-
C --> D[
|
|
22
|
-
|
|
23
|
-
E -->
|
|
24
|
-
|
|
25
|
-
G --> D
|
|
54
|
+
A[Script node<br>ONE episode · scene headers] --> B[Expand to scenes<br>text + storyboard per scene]
|
|
55
|
+
B --> C[Multi-shot video per scene<br>shots + refs in ONE call]
|
|
56
|
+
C --> D[Tail-frame chaining<br>scene N last frame → N+1 first frame]
|
|
57
|
+
A --> E[Reference image gen<br>characters · scenes · props]
|
|
58
|
+
E --> C
|
|
59
|
+
D --> F[Final cut / FilmCraft<br>transitions · subtitles · voices]
|
|
26
60
|
```
|
|
27
61
|
|
|
28
62
|
## Highlights
|
|
29
63
|
|
|
30
64
|
### Consistent characters, scene after scene
|
|
31
|
-
A per-project **series bible** (style baseline + character/scene/prop cards) is injected into every AI call, so wardrobes, locations and props stay coherent across shots and episodes. After each storyboard run, a
|
|
65
|
+
A per-project **series bible** (style baseline + character/scene/prop cards) is injected into every AI call, so wardrobes, locations and props stay coherent across shots and episodes. Entities referenced with `@name` in a prompt automatically carry their bible description and reference assets. After each storyboard run, a consistency check flags any name that isn't registered yet, and the agent fills the gaps.
|
|
32
66
|
|
|
33
67
|
### References that actually bind
|
|
34
68
|
Reference images connect as an ordered, visible list — `[图1] 角色:Lin Ning`, `[图2] 场景:The Old House` — and that exact order is what reaches the model. Multi-character frames stay unambiguous, and Volcano Engine **Seedance**'s native `[图N]` convention is supported end to end (first frame, up to 4 reference images, official task API).
|
|
@@ -40,28 +74,32 @@ Reference images connect as an ordered, visible list — `[图1] 角色:Lin Ni
|
|
|
40
74
|
Pan, zoom, marquee select, alignment guides, groups that fold, a minimap, 60-step undo/redo, per-node media history (last 8 results), mask-based inpainting, and middle-click everything — the canvas part should feel like an editor, not a chat sidebar.
|
|
41
75
|
|
|
42
76
|
### Bring your own models
|
|
43
|
-
Text models come from Harness itself (no extra keys, no per-plugin parameters). Image
|
|
77
|
+
Text models come from Harness itself (no extra keys, no per-plugin parameters). Image and video backends use a **provider + model** structure: configure a provider once (URL, key, optional vendor-specific **extra params** as JSON) and list as many model IDs under it as you like; star one as the **default route** for nodes that don't pick one. Video endpoints are auto-adapted — OpenAI-style task APIs, Seedance-native `content[]` gateways and Sora-style `/v1/videos` are covered by an automatic fallback chain, resolutions/ratios/first-frames/references are mapped to each vendor's conventions, and oversized references are downscaled before sending. Every gateway call is relayed through the local Harness host process, so **any vendor works** (no CORS headaches). No backend configured? Demo mode synthesizes placeholder images and animated videos locally so the entire pipeline is testable offline.
|
|
44
78
|
|
|
45
79
|
### A portable data root
|
|
46
|
-
Set a **data root folder** once and everything lands there, organized by **project name**: nodes and the series bible in `project.json`, the asset index in `assets.json`, media under `image/ video/ audio/ text/`, and Craft post-production under `craft/`.
|
|
80
|
+
Set a **data root folder** once and everything lands there, organized by **project name**: nodes and the series bible in `project.json`, the asset index in `assets.json`, media under `image/ video/ audio/ text/`, and Craft post-production under `craft/`. **Moving to a new machine = copying the folder**: point the new install's data root at it and every project (assets, bible, media) is recognized — plus a one-click **Import from data root** for anything not yet on disk. Put the folder inside a cloud-sync directory and multiple machines stay in sync automatically.
|
|
47
81
|
|
|
48
82
|
## Quick start
|
|
49
83
|
|
|
50
84
|
1. Install the plugin (bundle folder) and restart Harness once.
|
|
51
|
-
2. Click the **Infinite Canvas** button in the left sidebar.
|
|
52
|
-
3.
|
|
53
|
-
4.
|
|
54
|
-
5.
|
|
85
|
+
2. Click the **Infinite Canvas** button in the left sidebar, and set a **data root** in Settings.
|
|
86
|
+
3. In the chat: *"Create a project called <your idea>, write the world view and series bible first."*
|
|
87
|
+
4. *"Write episode 1."* → script node generates one episode with `【场N】` scene headers → click **Expand to scenes** (or ask the agent) to get text + storyboard nodes per scene.
|
|
88
|
+
5. *"Generate reference images for all characters, scenes and props."* → named, bible-consistent asset images in one batch.
|
|
89
|
+
6. *"Generate scene 1's video."* → storyboard shots + references compose one multi-shot video call; chain scenes via tail-frame → first-frame.
|
|
90
|
+
7. Open a **Final Cut** node for the preview cut, or export to FilmCraft for a true MP4.
|
|
55
91
|
|
|
56
92
|
> Without any generation API configured, every step runs in demo mode — the full pipeline works offline.
|
|
57
93
|
|
|
94
|
+
The full walkthrough (with screenshots, model configuration and data-root migration) lives in the [Chinese user guide](./docs/guide.zh-CN.md).
|
|
95
|
+
|
|
58
96
|
## Generation backends
|
|
59
97
|
|
|
60
98
|
| Kind | Protocol | Notes |
|
|
61
99
|
|---|---|---|
|
|
62
|
-
| Text | Harness LLM service |
|
|
63
|
-
| Image | OpenAI-compatible `/images/generations`, multi-reference via `/images/edits` |
|
|
64
|
-
| Video |
|
|
100
|
+
| Text | Harness LLM service | Episode scripts & storyboard writers; pick any configured model, or override per node |
|
|
101
|
+
| Image | OpenAI-compatible `/images/generations`, multi-reference via `/images/edits` | Provider + model list with starred default; size (1K/2K/4K) × ratio; extra params as JSON; mask inpainting via `edits` + PNG mask |
|
|
102
|
+
| Video | OpenAI-style task APIs, Seedance-native `content[]`, Sora-style `/v1/videos` — automatic fallback chain | Episodes per scene (≤15s), 480P/720P/1080P, ratio, first frame, multi-reference (auto-downscaled), voice references via `audios[]` |
|
|
65
103
|
| TTS | OpenAI-compatible `/audio/speech` | Per-shot voices mixed into the final cut |
|
|
66
104
|
|
|
67
105
|
All gateway calls are relayed by the local Harness host process (no browser CORS limits) — any vendor endpoint with an OpenAI-style shape works.
|
package/README.zh-CN.md
CHANGED
|
@@ -2,92 +2,135 @@
|
|
|
2
2
|
|
|
3
3
|
**DeepSeek Harness 内的节点式短剧工作室。** 从一句话创意出发,在无限画布上完成剧本、分镜、角色资产、画面生成、视频生成,直到带转场、字幕、配音的成片。
|
|
4
4
|
|
|
5
|
-
[English](./README.md) | 简体中文
|
|
5
|
+
[English](./README.md) | 简体中文 · **操作手册:[中文版](./docs/guide.zh-CN.md)** · [English guide](./docs/guide.en.md)
|
|
6
6
|
|
|
7
7
|
<!-- 徽标位:发布后在顶部添加 CI / npm / license 徽标 -->
|
|
8
8
|
|
|
9
9
|
## 这是什么?
|
|
10
10
|
|
|
11
|
-
无限画布是一个 [DeepSeek Harness](https://github.com/deepseek-ai) 插件:它在 Web
|
|
11
|
+
无限画布是一个 [DeepSeek Harness](https://github.com/deepseek-ai) 插件:它在 Web 界面侧边栏加入一个完整的创作工作室。你像导演一样工作——无限画布上的节点连成流水线:剧本、分镜、角色与场景资产、图片生成、视频生成,最终在成片节点完成转场、字幕与配音。
|
|
12
12
|
|
|
13
13
|
全部本地运行于你的 Harness。生成后端自带或自配均可;未配置任何 API 时有内置演示模式,整条流水线离线可学可测。
|
|
14
14
|
|
|
15
|
+
## 用对话驱动画布
|
|
16
|
+
|
|
17
|
+
画布与对话共享同一个"大脑"。每个节点都是一个 AI 工位,而**对话侧就是导演**:用自然语言下指令,Agent 替你操作画布工具——批量工作尤其如此。
|
|
18
|
+
|
|
19
|
+
> 「创建一个叫《时空邮递员》的项目,先写世界观和设定集。」
|
|
20
|
+
> 「根据设定集写第一集。」→ 剧本节点生成一整集(60–120 秒),每个场景带【场N】分场标记。
|
|
21
|
+
> 「把第一集铺开到场景。」→ 每场一个文本节点 + 分镜表节点自动出现并连线。
|
|
22
|
+
> 「把所有角色、场景、道具的参考图都生成了。」→ 十个图片节点一次建好、逐个生成。
|
|
23
|
+
> 「生成场1的视频。」→ 分镜镜头 + 参考图合成一次多镜头视频调用。
|
|
24
|
+
> 「把第一集交给 FilmCraft 渲染 MP4。」→ FCP7 XML + SRT 落盘,Craft 套件接手。
|
|
25
|
+
|
|
26
|
+
设定集、整集剧本、分镜拆解、成批参考图——这些批量工作正是 Agent 最快的部分。跑完后你只需要在画布上精修真正在意的那 20%:改提示词、调参考图顺序、重掷某一个镜头、从历史里回退旧结果。
|
|
27
|
+
|
|
28
|
+
## 案例:时空邮递员
|
|
29
|
+
|
|
30
|
+
用上面的流程完整制作的一集。整集铺开后的画布全览(32%)——左侧:剧本 → 各场文本 → 各场分镜表 → 场1视频(带预览与参考图);右侧:资产面板:
|
|
31
|
+
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
场1 连线细节——场1文本 → 场1分镜表 → 场1视频,分镜表带镜头清单与逐镜台词标注:
|
|
35
|
+
|
|
36
|
+

|
|
37
|
+
|
|
38
|
+
场景视频节点:模型来自供应商模型列表,时长/比例/分辨率在节点上可调,四张参考图按顺序绑定:
|
|
39
|
+
|
|
40
|
+

|
|
41
|
+
|
|
42
|
+
供应商配置一次(地址 + Key + 厂商专属扩展参数),下面可挂多个模型——点 ★ 星标作为默认路由:
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
设置页签——数据根目录、Craft 状态(12/12 就绪)、技能增强、文本模型与图片/视频/TTS 供应商列表:
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
15
50
|
## 工作方式
|
|
16
51
|
|
|
17
52
|
```mermaid
|
|
18
53
|
flowchart LR
|
|
19
|
-
A[剧本节点<br
|
|
20
|
-
B --> C[
|
|
21
|
-
C --> D[
|
|
22
|
-
|
|
23
|
-
E -->
|
|
24
|
-
|
|
54
|
+
A[剧本节点<br>一集 · 场景标记] --> B[铺开到场景<br>每场 文本+分镜表]
|
|
55
|
+
B --> C[每场多镜头视频<br>镜头+参考图一次生成]
|
|
56
|
+
C --> D[尾帧串联<br>场N尾帧 → 场N+1首帧]
|
|
57
|
+
A --> E[参考图生成<br>角色 · 场景 · 道具]
|
|
58
|
+
E --> C
|
|
59
|
+
D --> F[成片 / FilmCraft<br>转场 · 字幕 · 配音]
|
|
25
60
|
```
|
|
26
61
|
|
|
27
62
|
## 核心亮点
|
|
28
63
|
|
|
29
64
|
### 角色一致,跨镜跨集
|
|
30
|
-
项目级**设定集**(风格基调 +
|
|
65
|
+
项目级**设定集**(风格基调 + 角色/场景/道具卡)注入每一次 AI 调用,服装、场景、道具跨镜跨集保持一致。提示词里的 `@名称` 自动携带该实体的设定描述与参考资产。每次分镜生成后一致性检查会标出未登记实体,Agent 自动补全。
|
|
66
|
+
|
|
67
|
+
### 参考图真正绑定
|
|
68
|
+
参考图以有序、可见的列表连线(`[图1] 角色:陈拾`、`[图2] 场景:褶皱巷`),这个顺序就是到达模型的顺序。多角色画面不再含糊;Volcano **Seedance** 的原生 `[图N]` 约定端到端支持(首帧、最多 4 张参考图、官方任务 API)。
|
|
31
69
|
|
|
32
|
-
###
|
|
33
|
-
|
|
70
|
+
### 从分镜到可看成片
|
|
71
|
+
**一个分镜表 = 一次多镜头视频生成。** 全部镜头(顺序 + 每镜时长)合成一条提示词,视频模型一次调用渲染整段——硬切由模型完成,没有逐镜拼接的接缝。每场 ≤ 15 秒,多场之间用**尾帧 → 首帧**串联。**成片节点**按顺序拼接片段——交叉溶解或黑场转场、烧录字幕、原声与 TTS 配音混音——即时导出预览版;接 [ArtCraft](#artcraft-桥接)(FilmCraft)则写出 **FCP7 XML 时间线 + SRT** 渲染真正的 MP4。
|
|
34
72
|
|
|
35
|
-
###
|
|
36
|
-
|
|
73
|
+
### 编辑器级画布
|
|
74
|
+
平移缩放、框选、对齐参考线、可折叠分组、小地图、60 步撤销重做、节点媒体历史(最近 8 次)、蒙版局部重绘、全要素中键——画布应该像剪辑软件,不像聊天侧栏。
|
|
37
75
|
|
|
38
|
-
###
|
|
39
|
-
|
|
76
|
+
### 模型自带或自配
|
|
77
|
+
文本模型直接来自 Harness(无额外 Key)。图片/视频后端采用**供应商 + 模型**两级结构:供应商配一次(地址、Key、可选的厂商专属**扩展参数 JSON**),下面挂任意多个模型 ID,点 ★ 星标作为默认路由。视频端点自动适配——OpenAI 风格任务接口、Seedance 原生 `content[]`、Sora 风格 `/v1/videos` 由自动降级链覆盖,分辨率/比例/首帧/参考图按厂商惯例映射,超大参考图发送前自动压缩。所有网关调用经本地 Harness 宿主进程转发(无浏览器 CORS 限制)。什么都没配?演示模式本地合成占位图与动画视频,整条流水线离线可测。
|
|
40
78
|
|
|
41
|
-
###
|
|
42
|
-
|
|
79
|
+
### 便携数据根目录
|
|
80
|
+
设置一次**数据根目录**,所有数据按**项目名**落盘:节点与设定集在 `project.json`,资产索引在 `assets.json`,媒体在 `image/ video/ audio/ text/`,Craft 后期产物在 `craft/`。**换电脑 = 复制文件夹**:新机器把数据根目录指过去,所有项目(资产、设定集、媒体)自动识别——另有**「从数据根导入」**一键合并。把目录放进网盘同步文件夹,多台机器自动保持一致。
|
|
43
81
|
|
|
44
82
|
## 快速开始
|
|
45
83
|
|
|
46
|
-
1. 安装插件(bundle
|
|
47
|
-
2.
|
|
48
|
-
3.
|
|
49
|
-
4.
|
|
50
|
-
5.
|
|
84
|
+
1. 安装插件(bundle 目录)并重启一次 Harness。
|
|
85
|
+
2. 点侧边栏 **Infinite Canvas**,在设置里配好**数据根目录**。
|
|
86
|
+
3. 对话:*「创建一个项目叫〈你的创意〉,先写世界观和设定集。」*
|
|
87
|
+
4. *「写第一集。」* → 剧本节点生成带【场N】标记的一集 → 点**铺开到场景**(或让 Agent 做),得到每场的文本+分镜表组合。
|
|
88
|
+
5. *「把所有角色、场景、道具的参考图生成了。」* → 一批命名规范、与设定集一致的资产图。
|
|
89
|
+
6. *「生成场1的视频。」* → 分镜镜头 + 参考图合成一次多镜头调用;场与场之间尾帧串联。
|
|
90
|
+
7. 打开**成片节点**导出预览版,或交给 FilmCraft 渲染正式 MP4。
|
|
51
91
|
|
|
52
|
-
> 未配置任何生成 API
|
|
92
|
+
> 未配置任何生成 API 时,全部步骤以演示模式运行——整条流水线离线可用。
|
|
93
|
+
|
|
94
|
+
完整的图文教程(含截图、模型配置与数据目录迁移)见[中文操作手册](./docs/guide.zh-CN.md)。
|
|
53
95
|
|
|
54
96
|
## 生成后端
|
|
55
97
|
|
|
56
98
|
| 类型 | 协议 | 说明 |
|
|
57
99
|
|---|---|---|
|
|
58
|
-
| 文本 | Harness LLM 服务 |
|
|
59
|
-
| 图片 | OpenAI 兼容 `/images/generations`,多参考走 `/images/edits` |
|
|
60
|
-
| 视频 |
|
|
61
|
-
| TTS | OpenAI 兼容 `/audio/speech` |
|
|
100
|
+
| 文本 | Harness LLM 服务 | 整集剧本与分镜拆解;可选任意已配置模型,或按节点覆盖 |
|
|
101
|
+
| 图片 | OpenAI 兼容 `/images/generations`,多参考走 `/images/edits` | 供应商+模型列表(星标默认);尺寸(1K/2K/4K)× 比例;扩展参数 JSON;`edits`+PNG 蒙版局部重绘 |
|
|
102
|
+
| 视频 | OpenAI 风格任务接口、Seedance 原生 `content[]`、Sora 风格 `/v1/videos`——自动降级链 | 每场一集(≤15s)、480P/720P/1080P、比例、首帧、多参考图(自动压缩)、`audios[]` 声音参考 |
|
|
103
|
+
| TTS | OpenAI 兼容 `/audio/speech` | 每镜配音混入成片 |
|
|
104
|
+
|
|
105
|
+
所有网关调用由本地 Harness 宿主进程转发(无浏览器 CORS 限制)——任何 OpenAI 风格的厂商端点都可用。
|
|
62
106
|
|
|
63
107
|
## ArtCraft 桥接
|
|
64
108
|
|
|
65
|
-
|
|
109
|
+
安装姊妹插件 [`dsh-artcraft`](../dsh-artcraft/README.md) 后,画布可与本地 **Craft 家族**(PhotoCraft、FilmCraft、EffectCraft、LightCraft、VectorCraft、DesignCraft 等 12 个)经同源 HTTP 协作。把 ArtCraft 的数据根目录指向与画布相同的位置,全部后期产物落在 `projects/<项目>/craft/`:资产按项目同步、图片支持 PhotoCraft 无头调色(单个/批量)、成片导出 FCP7 XML + SRT 交 FilmCraft 渲染 MP4。设置面板的状态卡为每个 Craft 显示一盏状态灯与 n/n 就绪摘要。
|
|
66
110
|
|
|
67
111
|
## 发布(维护者)
|
|
68
112
|
|
|
69
|
-
|
|
113
|
+
维护者手册(红线、分支模型、版本规则)见 [`RELEASING.md`](RELEASING.md);操作细节见 [`docs/release.md`](docs/release.md);已发布变更见 [`CHANGELOG.md`](CHANGELOG.md)——**GitHub Release 正文一律英文**,从 changelog 复制。
|
|
70
114
|
|
|
71
|
-
发布走 **npm Trusted Publishing**(OIDC
|
|
115
|
+
发布走 **npm Trusted Publishing**(OIDC)——任何地方都不存在 npm 令牌:
|
|
72
116
|
|
|
73
|
-
-
|
|
74
|
-
-
|
|
75
|
-
- `publish.yml` 从 release tag(或手动输入)解析版本号,发布时带 `provenance` 徽标。
|
|
117
|
+
- **发布流程**:dev 测试通过并获批准 → 合并进 `main` → 创建 GitHub Release(tag `v0.17.11`,…)→ Actions 自动发布该版本。
|
|
118
|
+
- `publish.yml` 工作流内置守卫:release 提交必须在 `main` 上、tag 必须与 `package.json` 一致,然后带 `provenance` 徽章发布。
|
|
76
119
|
|
|
77
120
|
## 数据与隐私
|
|
78
121
|
|
|
79
|
-
-
|
|
80
|
-
- AI
|
|
81
|
-
- 图片/视频/TTS
|
|
122
|
+
- 画布文档、项目与设置存于浏览器 `localStorage`(`dsh-ic:*`);资产元数据存于 IndexedDB(`dsh-infinite-canvas`);设置数据根目录后媒体文件**落盘**(按项目名分目录,插件后端带 HTTP Range 支持视频拖动)。
|
|
123
|
+
- AI 文本生成经 Harness 宿主进程(用你已配置的模型,无额外 Key)。
|
|
124
|
+
- 图片/视频/TTS 网关调用由本地 Harness 宿主进程转发(规避浏览器 CORS);你的端点与 Key 都留在本地。
|
|
82
125
|
- 插件自身不向任何第三方上传数据。
|
|
83
126
|
|
|
84
127
|
## 环境与限制
|
|
85
128
|
|
|
86
|
-
- DeepSeek Harness 0.2.0-rc.2
|
|
87
|
-
-
|
|
129
|
+
- DeepSeek Harness 0.2.0-rc.2+;演示模式成片导出需要 MediaRecorder(Chromium)。
|
|
130
|
+
- 预览成片为实时录制 WebM;多轨剪辑的 MP4 母版请配合 ArtCraft FilmCraft 或任意 NLE。
|
|
88
131
|
- 图片 `edits`/蒙版重绘需要模型支持该端点(如 gpt-image-1)。
|
|
89
|
-
-
|
|
132
|
+
- 宿主侧插件更新需重启一次 Harness;Web 半区热加载。
|
|
90
133
|
|
|
91
|
-
##
|
|
134
|
+
## 许可证
|
|
92
135
|
|
|
93
136
|
Apache-2.0
|
|
@@ -40,32 +40,98 @@ description: 用无限画布(Infinite Canvas)做短剧/视频创作时使用
|
|
|
40
40
|
只要 `warnings` 非空:**逐条** `canvas_update_bible` 补全(名称与告警**逐字一致**、描述写实可生成),
|
|
41
41
|
再生成参考图;**绝不忽略、绝不跳过、绝不只补一部分**。设定集更新后告警会自动重算
|
|
42
42
|
(几秒内随文档同步刷新),以最新一次 `canvas_node_status` 为准。
|
|
43
|
-
9.
|
|
43
|
+
9. **分镜容量铁律:一个分镜节点 = 一个 10–15s 的完整场景视频,是剧本的一小部分。**
|
|
44
|
+
- 一个分镜节点只吃**一个场景**的剧本:各镜 2–5s、时长之和 **≤ 15s(上限)**;
|
|
45
|
+
- **长剧本必须按场景拆分**为多个场景剧本节点(命名「第X节-场Y剧本」…),
|
|
46
|
+
每个场景剧本作为**各自分镜表**的源端——**绝不把长剧本整根连线给一个分镜表**;
|
|
47
|
+
- 全集剧本(若有)只作总纲存档,**不作为分镜源端**;
|
|
48
|
+
- 体量感:一个 10–15s 场景 ≈ 剧本 60–150 字(含该场全部对白);分镜表 `shots` 上限 24 镜,
|
|
49
|
+
超长剧本会被截断且触发生成告警(warnings 会出现"剧本较长…请按场景拆分");
|
|
50
|
+
- **镜头数量不固定**:分镜表镜头数默认「自动(按内容节拍)」——一个连续动作段落 = 一镜,
|
|
51
|
+
3–10 镜都正常,绝不凑数、绝不用固定数量;全部镜头时长之和 ≤ 15s(超限客户端会自动压缩最长镜);
|
|
52
|
+
- 拆分操作:全集剧本已生成后,按场景把对应片段 `canvas_write_node(target:'output')`
|
|
53
|
+
写入各场景剧本节点(这是**分配已有内容**,不是代写)。
|
|
54
|
+
10. **汇报固定要素**:项目名 + 项目 id + 节点名/id + 成稿摘要(若已生成);有错误如实说明。
|
|
55
|
+
11. **生成节点前置检查单(创建任何 image-gen / video-gen 前逐条确认,任一不过 = 停止创建)**:
|
|
56
|
+
① **镜头清单来源**:这一段的镜头序列已经从分镜表节点的 `shots` 读到了吗?(`canvas_node_status`)
|
|
57
|
+
没读到 → 停止创建,先读分镜表节点;仍读不到 → **问用户要分镜内容**。绝不自己按剧本推导/编造镜头表。
|
|
58
|
+
② **视频节点数量 = 1**:一个分镜表对应一个完整视频(多镜头一次生成)。
|
|
59
|
+
准备为不同镜头建第 2 个视频节点 → 立即停止,走错路了。
|
|
60
|
+
③ **先建 1 个、验证、再继续**:批量预建生成节点会放大错误——先建第 1 个,
|
|
61
|
+
用 `canvas_node_status` 验证连线与产物正确,再继续下一个。
|
|
62
|
+
12. **读不到就问**:必需的项目状态(分镜内容/镜头清单/设定集条目)读不到时,那是**应当向用户确认的缺口**,
|
|
63
|
+
不是可以自行绕过的障碍——绝不把"编一份"当作替代方案。
|
|
64
|
+
13. **分镜连贯靠连线,绝不靠名字/序号推断。** 分镜表节点**顶部**有「衔接上一镜」输入口(`prev`)、
|
|
65
|
+
**底部**有「尾镜」输出口(`tail`)。需要与上一场连贯时:
|
|
66
|
+
`canvas_connect({ projectId, fromNode: 上一分镜表id, toNode: 本分镜表id, fromPort: 'tail', toPort: 'prev' })`。
|
|
67
|
+
连上后,本场分镜**生成时**会自动把上一场尾镜的「画面 / 最后一个动作 / 台词 / 音效」作为**硬性承接约束**
|
|
68
|
+
写进提示词:第 1 镜必须从上一镜的**最后一个动作**继续、画面重叠 **≤ 0.2 秒**、**背景声连续**、
|
|
69
|
+
不得重新建立场景或跳回远景交代。**禁止**用节点名("场1/场2")、节点位置或剧本序号去猜衔接关系——
|
|
70
|
+
名字会改,只有连线是可靠依据。修复已有项目时:先补连 `tail → prev`,再重新生成对应分镜表。
|
|
71
|
+
14. **音话同步(口型)是硬要求。** 分镜里带 `dialogue` 的镜头,必须让说话角色**在画面内开口说话**:
|
|
72
|
+
近景/中近景、脸部朝向可见(正面或 3/4 侧脸),**禁止**背对镜头、脸部被遮挡、人物出画;
|
|
73
|
+
`visual` 或 `motion` 里要写明「开口说话、口型清晰可见」。
|
|
74
|
+
台词**绝不能**处理成画外音/旁白——成片里人嘴闭着、声音飘在背景,就是这个错误。
|
|
75
|
+
视频提示词会自动带上该约束(画面内开口、口型与台词同步);发现分镜把有台词的镜头写成背影/空镜,
|
|
76
|
+
必须重新生成该分镜。
|
|
44
77
|
|
|
45
78
|
## 二、标准工作流(对话填提示词+连线+触发,生成由节点完成)
|
|
46
79
|
|
|
47
80
|
0. **读/补设定集**:`canvas_get_bible` → 缺什么用 `canvas_update_bible` 补。
|
|
48
81
|
创作意图、世界观、风格 → 写进设定集的 worldview/style 字段。
|
|
49
82
|
1. `canvas_list_projects` —— 查重 + 拿到 projectId 与节点 id
|
|
50
|
-
2.
|
|
51
|
-
- 新项目:`canvas_create_project({ name, scriptText:
|
|
83
|
+
2. **剧本节点(一集 = 成片 60–120 秒,按【场N】分场)**:只写提示词,让节点自己生成剧本——
|
|
84
|
+
- 新项目:`canvas_create_project({ name, scriptText: 本集创作提示词, nodeName: '第X节剧本' })`
|
|
52
85
|
- 已有项目:`canvas_write_node({ projectId, text: 提示词, target: 'idea', name: '第X节剧本' })`
|
|
53
86
|
- 触发生成:`canvas_run_node({ projectId, nodeId })` → `canvas_node_status` 轮询直到 done/error
|
|
87
|
+
- 生成契约(自动注入,无需复述):整集 **4–10 场、每场 10–15 秒成片**;**每场以「【场N】场景名(地点·时间)」单独一行开头**
|
|
88
|
+
——这是"铺开到场景"自动拆分的解析标记,格式不可变;对白逐行「角色:台词」;结尾附人物/场景/道具清单;
|
|
54
89
|
- **【铁律】不要把成稿直接填进 output**——生成是节点的工作(用户在画布上看得到过程与结果)。
|
|
55
90
|
仅当用户明确说"你直接把剧本写出来、不用节点生成"时,才允许 `target:'output'` 直接写成稿。
|
|
56
|
-
3.
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
91
|
+
3. **铺开到场景(每场 = 场景文本节点 + 分镜表节点,连线一次生成场景分镜)**:
|
|
92
|
+
- 画布:剧本节点的**「铺开到场景」按钮**一键完成(按【场N】自动分段);
|
|
93
|
+
- Agent 等价操作:`canvas_node_status` 读成稿 → 按【场N】分段 → **逐场**:
|
|
94
|
+
`canvas_create_node({ type: 'text', name: '第X节-场Y文本' })` +
|
|
95
|
+
`canvas_write_node({ projectId, nodeId: 文本节点id, target: 'output', text: 该场原文 })` +
|
|
96
|
+
`canvas_create_node({ projectId, type: 'storyboard', name: '第X节-场Y分镜表', connectFrom: 该场文本节点id })`;
|
|
97
|
+
- **【铁律】每个分镜表的源端 = 对应场景文本(连线取)**;整集剧本节点**绝不**直接连分镜表(体量超限,见硬约束 9)。
|
|
98
|
+
- **连贯连线(要连贯就必须连,见硬约束 13)**:把**上一场分镜表的 `tail` 输出口**连到**本场分镜表的 `prev` 输入口**:
|
|
99
|
+
`canvas_connect({ projectId, fromNode: 上一场分镜表id, toNode: 本场分镜表id, fromPort: 'tail', toPort: 'prev' })`。
|
|
100
|
+
逐场依次串联(场1→场2→场3…),**连好之后再生成该场分镜**——连上后生成的分镜第 1 镜会承接上一场尾镜
|
|
101
|
+
(从上一镜最后一个动作续、重叠 ≤0.2s、背景声连续)。已有分镜是"旧约束"产物时,补连后
|
|
102
|
+
**重新 `canvas_run_node` 该分镜表**即可修正(重生成分镜不花钱,只有视频花钱)。
|
|
103
|
+
4. **逐场生成视频(多镜头一次生成)**:
|
|
104
|
+
- `canvas_run_node({ 分镜表 })` → `canvas_node_status` 读 `shots`(镜头清单以此为准,绝不编造镜头表);
|
|
105
|
+
- `canvas_create_node({ projectId, type: 'video-gen', name: '第X节-场Y视频', connectFrom: 分镜表节点id, duration: 各镜时长之和 })`
|
|
106
|
+
(不传 connectFrom 且项目里有已拆解镜头的分镜表时会自动连线;prompt 留空);
|
|
107
|
+
- **【禁止逐镜建节点】**一段 10–15 秒的视频**不需要逐镜的图片节点或"镜头图→镜头视频"链路**:
|
|
108
|
+
多镜头一致性靠角色/场景/道具**参考图资产**(@引用自动挂载)保证,视频模型在一次调用里完成全部镜头。
|
|
109
|
+
最多为**开场首帧或 1–2 个关键镜头**补定帧图(接同一视频节点的 frame/ref 端口)。
|
|
110
|
+
一旦发现自己在批量创建"第X节-场Y-镜Z"这类镜头图片/视频节点 = 走错路,**立即停止**并回到本条。
|
|
67
111
|
- 参考图:把角色/场景/道具参考图资产连到视频生成节点的 `ref` 端口(`canvas_connect`);
|
|
68
112
|
提示词里的 `@引用` 命中的资产也会自动挂上
|
|
113
|
+
- **【跨段连贯:分镜承接 + 尾帧 → 首帧】**连贯分两层,先文本后画面:
|
|
114
|
+
**①分镜承接(文本层,先做)**:上一分镜表 `tail` → 本分镜表 `prev`(见硬约束 13 / 工作流第 3 步),
|
|
115
|
+
让分镜第 1 镜从上一场尾镜的最后一个动作继续、重叠 ≤0.2s、背景声连续;
|
|
116
|
+
**②画面承接(视频层,后做)**:每个视频节点生成完成后会**自动提取尾帧**并挂到 `last` 输出端口。
|
|
117
|
+
多场视频按顺序串联:上一视频节点的 `last` 端口 → 下一视频节点的 `frame` 端口
|
|
118
|
+
(`canvas_connect({ projectId, fromNode: 上一段, toNode: 下一段, fromPort: 'last', toPort: 'frame' })`)。
|
|
119
|
+
第一段的 `frame` 用开场定帧图(若生成了首帧关键图)或留空。
|
|
120
|
+
**【衔接模式】**下一段视频节点若有 frame 连线,节点上有「衔接」下拉三选一:
|
|
121
|
+
**参考图融合**(默认:尾帧降级为第 1 张参考图,保留实体参考图,衔接为软约束)、
|
|
122
|
+
**硬首帧(弃参考图)**(用真首帧参数,画面绝对承接——网关禁止首帧与参考图混用)、
|
|
123
|
+
**忽略首帧**。需要画面严格承接选「硬首帧」,新实体参考图占主导选「参考图融合」。
|
|
124
|
+
**按顺序触发**:上一段 `canvas_node_status` 为 done 后再连线、再触发下一段
|
|
125
|
+
(连线可以提前建好——frame 在下一段真正运行时才解析)。
|
|
126
|
+
- **【声音一致(可选)】**视频接口配置里的「生成同步音频」勾选后才发送 `generate_audio:true`——
|
|
127
|
+
模型生成**自带音轨**的视频(对白/环境声与画面同步);不勾 = 无声视频(声音另行 TTS 配音)。
|
|
128
|
+
要让同一角色**跨视频保持音色**:用视频/成片节点的「提取声音参考」按钮——
|
|
129
|
+
**输入角色名即可**:系统自动按分镜 `dialogue` 台词标注定位该角色的全部时间窗,
|
|
130
|
+
逐窗取音轨**拼接为一个声音参考文件**(`角色-<名> 声音`,自动绑定实体),
|
|
131
|
+
之后该角色的视频提示词里 `@<名称>` 会自动把这条声音参考放进 `audios[]`,
|
|
132
|
+
模型生成的对白将向参考音色对齐(携带声音参考时会自动强制开启同步音频)。
|
|
133
|
+
时间窗归属靠分镜的 `dialogue` 标注(对白逐字来自剧本、按镜头分配,一镜尽量单说话人);
|
|
134
|
+
分镜缺少台词标注时按钮会降级为手动模式并提示重新生成分镜。
|
|
69
135
|
- 触发:`canvas_run_node` → 轮询;整段视频一次生成完成
|
|
70
136
|
5. **生成角色/场景/道具参考图**:为设定集里的每个条目
|
|
71
137
|
`canvas_create_node({ projectId, type: 'image-gen', name: '角色-张山 多视图', prompt: '按设定集写外观关键词' })`
|