# dsh-aifisher-canvas 使用说明 > 面向**使用者**的快速上手手册。面向开发者的构建、补丁、架构与踩坑记录见 [`README.md`](README.md) 与 `docs/`。 > > ⚠️ 许可证:本插件基于 AIFISHER,采用 **AIFISHER Noncommercial Source License 1.0**(非商用源码可见许可),**禁止商用**(接私单、付费出图、卖插件、商业 SaaS、付费托管均不允许)。再分发须免费并保留 LICENSE / NOTICE / 修改说明。 --- ## 1. 这是什么 把 AIFISHER 无限画布移植成 **DeepSeek Harness(DSH)的 Web 插件**。一个面板里同时有: - 无限画布(节点、连线、编组、历史、框选、复制粘贴) - 本地 ComfyUI 生成(文/图/视频/音频工作流) - 云端生图 / 生视频(方舟直连、OpenAI 兼容通道、魔搭 ModelScope、FisherAI) - 画布右侧 **DSH 原生对话栏**(聊天框直接控制画布;模型走 DSH 配置,可接任意大模型 API;不只是操作已有节点,还能对话式写工作流、写脚本、扩展画布节点) - 任务队列面板 --- ## 2. 快速开始 > 还没装插件?安装(构建 → 设置 → 插件 →「添加插件」填插件目录绝对路径 → 重启 DSH)见 [`README.md`](README.md) 的「安装」一节。下面假设插件已装好、DSH 已启动。 1. 启动 ComfyUI(若要用本地生成;默认地址 `http://127.0.0.1:8188`)。 2. 启动 DSH。 3. 侧边栏点 **「无限画布」** → 新建或打开一个项目。 4. 画布上: - **双击空白处 / 右键 / `Shift+A`** 打开节点搜索,模糊搜节点与工作流;回车(或点候选)后节点先跟着鼠标,**左键点一下才放下**(Blender 的「新建并移动」)。 - 从左侧「工作流节点」面板点卡片,可把配置好的 ComfyUI 工作流直接放到画布正中。 5. 选中节点,在右侧参数面板填提示词、选模型,点 **生成**。 > 改了插件源码 / host 半后必须**重启 DSH**;只刷新页面只能更新画布产物。 --- ## 3. 三种生成方式 ### 3.1 本地 ComfyUI - 画布左上角有 **ComfyUI 状态胶囊**,绿了表示已连上。 - 节点上的 `lora_name` / `ckpt_name` / `sampler_name` 等枚举字段会自动变成下拉(候选来自本机已装模型);装了新 LoRA 后在面板底栏点 **「扫描 ComfyUI」** 即可。 - **提示词**:节点上有正向提示词框;负向提示词是左侧第二个输入槽,可直接接文本节点(接上后输入框自动换成只读引用)。 - **模型文件名自动对账**:提交前会拿 ComfyUI `/object_info` 校验,模板里写的模型名和本机文件名略有出入(量化后缀不同)时自动替换;缺节点或缺模型会回明确报错(`COMFY_NODE_MISSING` / `COMFY_MODEL_MISSING`)并列出本机相近候选。 ### 3.2 用自己的 ComfyUI 工作流 左栏 **「ComfyUI 工作流配置」**: 1. 左下角「工作流目录」填你的工作流目录(绝对路径,不存在会自动新建;点「默认」回默认目录)。 2. 把在 ComfyUI 里 **Export (API)** 导出的 JSON 丢进该目录,点「重新扫描」。 3. 左边选工作流 → 右边勾选要暴露到画布节点上的参数(可起中文标签)。 4. 改「画布节点名称」→「保存配置」;「直接添加到画布」= 保存并在画布正中落一个节点。 ### 3.3 云端通道(生图 / 生视频) 设置 → 闭源服务里配置通道。一个通道 = 名称 + Base URL + Key + 请求方言 + 勾选的模型: | 方言 | 适用 | 备注 | |---|---|---| | OpenAI 兼容 | 方舟 / 任意 OpenAI 形状端点 | 参考图走 `image` 字段 | | 魔搭 ModelScope | `*.modelscope.cn` | 参考图走 `image_url` 数组;叫多张会真的提交多次 | | FisherAI(work-fisher) | `api.work-fisher.com` | 异步任务轮询;参考图只收公网直链(插件自动上传并缓存 12h) | 面板头部有「+ 魔搭 API-Inference」一键预设。**新建节点默认沿用上一次生成的模型**(按图片/视频/音频/文本分桶记),不用每次重选。 视频节点上那几个参考档位能接多少张,按模式定(与 MiniMax H3 参考模式同口径): - **多图参考**:最多 **9 张参考图**(MiniMax H3 参考模式就是 9 个图片槽),第 10 张拖不上去; - **首帧** 1 张、**首尾帧** 2 张、**文生视频** 不接图; - 参考图以外还接一个文本节点(放提示词),所以一个「9 图 + 1 文本」的参考镜头是能连满的。 ### 3.4 火山方舟(豆包)直连 设置 → 闭源服务 → **「火山方舟(豆包直连)」** 填 API Key(或给 DSH 进程设环境变量 `ARK_API_KEY`)。填完一张卡同时管两种媒体,**不用配通道**: | 节点 | 画布上的模型名 | 方舟模型 | |---|---|---| | 图片 | 豆包图片5.0-pro(方舟直连) / 5.0-lite / 4.5(多参考) / 4.0(多参考) | `doubao-seedream-…` | | 视频 | **豆包视频2.0** / 豆包视频2.0 fast | `doubao-seedance-2-0-260128`(Seedance 2.0) | 视频那条的要点: - **模式**:文生视频 / 首尾帧(连两张图)/ 多模态(参考图 + 参考视频 + 参考音频)。首尾帧模式下比例由画面决定,节点上的比例不参与提交。 - **参考图可以用画布里的图**(插件会内联成 base64 发给方舟);**参考视频 / 参考音频只能给公网 http(s) 直链** —— 方舟不收内联,画布素材只在本机,这时会用一句明确报错说明,而不是发出去等一个看不懂的 400。 - 单次上限:参考图 ≤9、参考视频 ≤3、参考音频 ≤3;参考音频必须搭配至少一张图或一条视频。 - 视频是**异步任务**:提交后 host 一直轮询到出片,再把结果下载进素材库(回执里有任务号)。长时间不结束会报 `ARK_VIDEO_TIMEOUT` 并给任务号,去方舟控制台看结果即可,别重复点(会重复计费)。 - 账号没开通模型时方舟回 404 `ModelNotOpen` —— 到方舟控制台「开通管理」开通,或在设置页「自定义模型 ID」填你账号的推理接入点 ID(`ep-…`)。 --- ## 4. 画布常用操作 | 操作 | 说明 | |---|---| | 节点搜索 | `Shift+A`,模糊搜节点与工作流;回车后节点跟手,左键放下 | | 连线 | 从节点端口圆拖出,靠近目标端口会吸附放大 | | 多选折叠 | 框选多个图片后工具条点「折叠」,收进最上面那张(卡上有「N 张叠图 · 展开」) | | 叠图切换 | 折叠后宿主卡左下角有 `切换 2/3`,不展开也能翻看这一叠(`Shift+点击` 往回翻) | | 扩图 | 工具条扩图按钮:先在浏览器按目标比例 / 原图九宫格位置生成一张「扩图画面」(外延留空),再接一个空图像生成节点,提示词已填好,**生成由你自己点** | | 尺寸调整 | nova 版尺寸对话框:等比倍数 / 指定宽高 / 快捷倍率 | | 宫格裁剪 | 工具条「宫格裁剪」:预设 2×2…4×1、可拖切线微调每一行/列、间隙、导出顺序与序号(`1,3,5-8`),保存后每格成为画布上的一张图 | | 图片编辑 | 工作台 / 裁剪 / 标注·蒙版,「保存为新图片」 | | 点阵底纹 | 三层嵌套(24 / 120 / 600px):放大看小矩阵,缩小时小矩阵自动让位给大矩阵,不会密密麻麻;设置 → 画布外观 → 画布互动,可关闭鼠标周围辉光 | | 结果图排布 | 同节点连生多张时自动在右侧找不重叠的格子落位 | | 生成历史(图片 / 视频) | 同一个节点重复生成时旧结果不会丢:节点头部一枚「历史 N」,点开摊出前面几版,可下载或设为主图 / 主视频(见 4.4) | | 视频截帧 | 视频底栏「截取视频帧」三项菜单:首帧 / 尾帧 / 首尾帧各一张;截出来的图落到节点右侧并自动避开已占位置(见 4.6) | | 拖入文本 | 把 `.md` / `.txt` 从系统里拖到画布 → 指针处生成文本节点,标题 / 清单 / 表格 / 加粗都已排好版(见 4.7) | | 文本全屏预览 | 选中文本节点 → 头部「全屏预览」:整篇摊开只读,可调字号 / 复制全文,Esc 关闭(见 4.8) | --- ## 4.4 生成历史:图片与视频(v1.64) 同一个图片 / 视频节点**反复生成**时,上一条不会被覆盖: - **头部那枚 `历史 N`**:`N` = 这个节点一共生成过几条(含当前这条)。文案会按本批条数变: `本次 2`(这一批本来就出了 2 条)/ `本次 1 · 历史 3`(这 1 条 + 以前的 2 条)。 - **点它**:在节点周围扇形摊出前面几版。图片直接看;视频**鼠标移上去就会循环播放**,不用点。 - **每格右上角两个按钮**(鼠标移上去才出现): - 「下载历史图片 / 下载历史视频」—— 存到设置里的下载目录,文件名带序号(`标题-2.mp4`); - 「设为主图 / 设为主视频」—— 把这一版提到节点上显示,之后拿它当参考图 / 首尾帧、或导出都用它。 视频换主之后,首尾帧与比例会按新片重新算(不会沿用上一条片子的首尾帧)。 - **上限**:图片留 20 条、视频留 12 条(更早的自动淘汰,只保留最近的)。历史是节点数据, 存在项目文件里,导出 `.fisherai` 会一起带走。 --- ## 4.5 画布里的会话切换(v1.62) 右侧会话栏头部就是切换入口,**不需要离开画布**: | 想做的事 | 怎么做 | |---|---| | 换个会话接着聊 | 点会话栏**标题**(`▾`)→ 弹出最近会话列表(可搜、当前那条高亮)→ 点一条就切过去 | | 开一个新对话 | 点标题右边的 **「+」** → 在当前会话所在工作区新建一个空白会话并切过去(该工作区已有空白会话时会直接复用它,不会越堆越多) | | 收起 / 展开会话栏 | 最右边的「收起」;收起后点右侧窄条上的箭头展开 | 几个约定: - 切换只作用于**右侧栏**:画布、节点、视口都不动,正在生成的任务也不会被打断。 - 空白会话的标题显示为「新会话」(不会显示成工作区目录名)。 - 列表里只列「能接续聊」的会话:已归档、子代理会话不出现;非当前的空白会话也不出现(空白会话彼此等价,只显示当前那个)。 - 也能聊到一半直接换:切走再切回来,对话记录、节点引用都在。 - 对比:**左侧栏**点会话或「新建会话」仍然会切回对话区(这是 DSH 自己的导航语义),要留在画布就用上面这两个入口。 --- ## 4.6 视频截帧:首帧 / 尾帧(v1.66) 视频节点鼠标移上去,底栏右侧有两枚按钮: | 按钮 | 做什么 | |---|---| | **截取视频帧**(带小三角) | 弹三项:**截取首帧** / **截取尾帧** / **首尾帧各一张** | | **截图** | 取**播放器当前停住的那一帧**(先拖到想要的位置再点) | - 截出来的图落到视频节点右侧:**首帧在上、尾帧在下**,自动避开已占位置;截完会把 「视频 + 新图」一起收进视口,并提示「已截取尾帧」,不会出现点了像没反应。 - **只截一帧就只出一张图**(不会额外掉一个首帧节点要你去删)。 - 取帧用的是独立解码器,**不会动当前播放进度**;尾帧没取到画面时会自动往前退一点重试。 - 输出最长边 2048(够清,又不会把 4K 原图搬来搬去);截帧节点的提示词留空, 不会被当成生成提示词拼出去。 - 图已经落进素材库(`media/<项目>/images/`),可以直接拿去当下一段的首帧 / 尾帧 / 参考图。 > **进度条(v1.68)**:底栏那根进度条**整条都能按、都能拖** —— 在轨道任意位置按下就跳到那里 > (最右端 = 片尾),按住往两边拖时读数 1:1 跟手;松手后如果片子还在解码,时间旁边会显示 > 「定位中…」,落到位自己消失。缩到 70% 也拖得动(不用再瞄那个小圆点)。 --- ## 4.7 文本节点:拖入 Markdown 直接成节点(v1.87) 把 `.md` / `.markdown` / `.mdx`(以及 `.txt` `.log` `.csv` `.tsv` `.json` `.yaml` `.yml` `.srt` `.vtt`)从系统文件管理器**直接拖到画布上**,指针处就落一个文本节点, 正文已经是排好版的富文本: - `#` / `##` / `###` → 一到三级标题(更深的层级压到三级) - `- * +` 与 `1. 2.` → 无序 / 有序清单,缩进的第二级会变成子清单 - `>` 引用、围栏代码块、`---` 分隔线、`| 表格 |` - `**加粗**`、`*斜体*`、`~~删除线~~`、行内代码 - `[链接](url)` 只留可见文字(节点 schema 里没有链接节点);`![图](url)` 只留说明文字 - 开头的 YAML front matter(`---` 包起来那一段)会被丢掉,不进正文 节点里落两份东西:`textContent`(纯文本镜像)与 `textRichContent`(富文档),由同一个函数 一起算出来。**屏幕上看到的是排版,模型读到的是干净文字**(没有 `## `、`**` 这些记号)—— 所以拿文本节点当提示词也能直接用,不会把 Markdown 记号喂给模型。 同一套解析也用在了文本节点自己的**「导入文本」**按钮上:以前 `.md` 会被送到宿主解析成 纯文本,标题 / 清单全变成字面量。节点里已有正文时照旧弹「替换 / 追加」,格式照样保留。 边界: - 一次拖多份会斜着错开落,各成一个节点;单份上限 2 MB(文本节点是摆提示词 / 分镜稿的, 不是装整本书的)。 - 只接管**画布范围内**的拖入。拖到右侧会话栏、设置页、系统别处都不受影响;图片 / 视频 / 音频照旧走原来的上传节点。 - 不支持(按普通文字处理):HTML 块、脚注、数学公式、图片与链接地址、`===` 下划线标题。 - 一个拖拽手势只落**一个**节点(v1.89):同一个 drop 事件被处理两遍、`files` 里同一份文件 出现两次、同一个手势派发出两个 drop 事件,三种情况都被挡掉。 - 排查读数:控制台看 `window.__FISHERAI_CANVAS_TEXT_DROP__`(`drops` / `created` / `skipped` / `duplicateEvents` / `duplicateFiles` / `repeatGestures` / `lastFileCount` / `lastError` / `lastPoint`);每次拖入还会往 `/diagnostics` 记一条。 --- ## 4.8 文本节点:全屏预览(v1.89) 点一下文本节点把它**选中**,节点上方那排按钮(和「导入文本」并排)会多出一个 **最大化图标**按钮(悬停提示「全屏预览正文」): - 铺满窗口把正文摊开读,标题 / 清单 / 表格 / 加粗的排版与卡片里完全一致 —— 它是把节点里 已经渲染好的正文克隆一份,不新建编辑器、不改节点内容、也不进编辑态。 - 顶部一条工具:`A−` / `A+` 调字号(13–30px,默认 16)、**复制全文**、**关闭 · Esc**。 - 正文可以选中复制;浮层开着的时候滚轮 / 按键 / 拖动都不会漏给底下的画布。 - 退出:Esc、点浮层空白处、或右上「关闭」。 - 想改字就用原来的「双击 → 编辑」或编辑器里的「全屏编辑」;这里只读。 - 排查读数:`window.__FISHERAI_CANVAS_TEXT_PREVIEW__`(`opened` / `closed` / `buttons` / `lastChars` / `lastTitle` / `lastFont` / `open`)。 --- ## 5. 任务队列 - 右上角 **任务队列** 面板:运行中循环发光边框,可单个取消、可清空。 - 打开设置 / 图片编辑等全屏浮层时,任务队列自动隐藏(只在画布层显示)。 - 云端任务会进生成日记。 --- ## 5.5 画布助手:记忆 · 副驾 · 分镜板 · 长任务(v1.61) 四样新东西都在画布上,不需要额外设置: | 功能 | 怎么用 | |---|---| | **项目记忆** | 直接跟右侧助手说「记住:这个项目是黄昏海边、冷色调,女主短发深蓝外套」。它会写进项目记忆,**新开对话自动带上**,不用重新交代。面板「副驾」里能看到已记的条目,× 可删。 | | **视觉一致性** | 把角色定妆图 / 画风参考图拖到画布上(可以就摆一张图节点),对助手说「把这张定妆图设为参考锚点,锁到所有镜头上」。之后每个镜头生成都会把它当参考图(画布原生「上游即参考」),跨镜头锁脸锁服装。副驾会提示「还剩几个镜头没锁」。 | | **主动副驾** | 画布左下角,只在**有建议时**才出现一个小胶囊(比如「2 个节点生成失败」)。点开才看建议;每条有「问助手」把话递进对话面板。不想看就点「不再提示」,彻底关掉。 | | **分镜板** | 画布底部「分镜」按钮:按镜头号排好的缩略图带。点一张聚焦过去;「播放」每 1.5 秒翻一张,像翻画稿。只做看顺序,不做时间轴。 | | **长任务** | 对助手说「用这几个分镜做一组镜头,失败自动重试」——它会在后台建节点、锁参考、准备批次,然后等你在右下角确认卡上点「确认本批生成与费用」。某个镜头失败会自动**再准备一批重试**,仍然要你点确认(不会自动花钱)。进度可以让助手查 `job status`。 | > 审批红线没变:任何生成都必须你在画布右下角点确认;助手只能「准备」,不能替你提交。 --- ## 5.6 画布技能目录:三个技能怎么重建 画布右栏的「技能」目录不是插件内置的,是 **host 每次请求时现扫这几个根**(同名以先扫到的为准): `~/.agents/skills` → `~/.dsh/skills` → `/.agents/skills` → `/.dsh/skills`,再并上 DSH 自带的 bundled 技能。 所以技能属于**用户层安装**:重装插件、换机器都不会自动带回来。 三个「画布版」技能——原文一字不改,只在文末追加 `docs/skill-canvas-adapter-*.md` 适配层(`canvas-shots/v1` 机读块,规范见 `docs/skill-canvas-output-contract.md`): | 技能 | 上游原文 | 机读形态 | | --- | --- | --- | | `storyboard-director`(小墨分镜 6.0) | `原件\小墨skill\小墨个人分镜SKILL6.0(画面优化).md` | `locks` + `shots`,镜头标题 `镜头 NN` | | `character-analyzer`(小墨资产提取) | `原件\小墨skill\小墨个人资产提取SKILL.md` | 只给 `locks`(`shots: []`),产出锚点 | | `worldbuilding-moke`(MOKE 世界观 v17) | `原件\MOKE\worldbuilding-moke-v17.md` | 九张概览 → `shots` 1–9,默认不挂锚点 | **重建(换机器 / 重装 DSH 后)** 1. 备好上游原文(仓库里不带原文),默认就在 `E:\AllAssets\Skill\原件\` 下,即上表第二列;放在别处就用环境变量指过去:`XIAOMO_STORYBOARD_SRC` / `XIAOMO_ASSETS_SRC` / `MOKE_WORLDBUILDING_SRC`。 2. 在插件根目录先试跑到暂存目录,确认没问题再安装: ```powershell node scripts/build-canvas-skills.mjs # 试跑 → .dsh-tmp/skills node scripts/build-canvas-skills.mjs --out "$env:USERPROFILE\.dsh\skills" # 正式安装 ``` 3. **刷新画布页即可**(host 每次请求都重扫技能根,不用重启 DSH)。右栏技能目录应出现这三条,`/storyboard-director` 手势同样生效。 > MOKE 原件的 `name` 是 `MOKEAIGC-V017`(版本号式,不符合 kebab-case 校验),构建脚本用条目上的 `name` 覆盖归一成 `worldbuilding-moke`。 | 报错 | 原因 | |---|---| | 缺 frontmatter | 上游原文开头没有 `--- name: … ---` 块,脚本直接退出 | | `ENOENT` … `SKILL.md` | 上游原文路径不对,用上面三个环境变量改 | | 技能目录里没出现 | 确认 `--out` 指向真正的 `$DSH_HOME/skills`(`$DSH_HOME` 没设就是 `%USERPROFILE%\.dsh`),且目录结构是 `<技能名>/SKILL.md`。另一种更隐蔽的情况:磁盘上有文件、画布扫盘接口也列着它,但 frontmatter 解析失败(例如 description 里的直双引号没转义),DSH 会**静默不加载** | > 装进去的是副本,改它不会回写上游原文;要改技能正文请改原文再重跑脚本(直接改 `~/.dsh/skills` 下的文件,下次重建会被覆盖)。 --- ## 6. 项目归档与换机迁移 **只迁一个项目**(v1.42 起): 1. 画布头部 **「项目归档」** → 面板显示节点数 / 素材数 / 归档大小 → 导出到本机目录(回执绝对路径)或下载,得到 `.fisherai`。 2. 新机器项目库头部点 **「导入项目」** → 选 `.fisherai` → 自动新建项目并切过去。 **整盘迁移**: - 全部数据都在 `$DSH_HOME/storages/dsh-aifisher-canvas/`(`$DSH_HOME` 没设就是 `%USERPROFILE%\.dsh`)。 - 两边都关掉 DSH → `robocopy` 整目录到新机器 → 启动后核对项目、图片、通道、工作流配图、背景。 - 需手动补两类:**机器相关绝对路径**(工作流目录 / 下载目录,设置里重选)与浏览器 localStorage 偏好(缺失自动回落默认值)。 --- ## 7. 数据目录搬到别的盘(v1.43) 设置 → 存储 → **项目数据目录**: 1. 填新绝对路径,可选「把现有数据复制过去」(纯复制,不删旧目录)。 2. **重启 DSH 生效**。之后项目 / 素材 / 通道 / 密钥 / 工作流 / 下载全部落到新目录。 3. 「恢复默认」回 DSH 数据目录下。 --- ## 8. 常见问题 | 现象 | 处理 | |---|---| | 画布打不开 / 接口 404 | 改了 host 半没重启 DSH;重启 DSH 再刷新画布页 | | ComfyUI 胶囊不亮 | 确认 ComfyUI 已启动、`http://127.0.0.1:8188/system_stats` 能打开;地址不对时检查 `COMFYUI_URL` | | 报 `COMFY_NODE_MISSING` | 内置模板需要的自定义节点没装,按报错里的类名去 ComfyUI 装;或改用自己 Export(API) 的工作流 | | 报 `COMFY_MODEL_MISSING` | 模板模型名与本机文件名不一致时插件会自动对账;对不上时按提示候选装模型或改名 | | 叫了 3 张只出 1 张 | 魔搭方言下插件会真的提交多次再合并;全失败才报错,部分失败只回成功的那些 | | 参考图没生效(图生图像重画) | 检查通道方言:OpenAI 形状在魔搭上会被静默丢参考图;方言选「魔搭」或确认自动判定正确 | | 参考图上传被掐断(ECONNRESET) | 插件自动重试 3 次;一直断时回执会写明次数 / 大小 / 原因,多为代理或网络问题 | | 新建节点模型不是想要的 | 它记的是上一次生成用的模型;通道被删 / 取消勾选 / 改名后会回落目录第一个 | | 换了盘符后构建报「找不到模块」 | `node_modules` 里 junction 是绝对路径,跑 `node scripts/fix-node-modules-junctions.mjs --dry` 先看计数,去掉 `--dry` 真改 | --- ## 9. 目录与数据文件速查 | 路径(`$DSH_HOME/storages/dsh-aifisher-canvas/` 下) | 内容 | |---|---| | `canvas.json` | 项目、节点、分组、视口(自动保存) | | `media/<项目>/{images,videos,audios}/` | 生成与上传的素材 | | `workflows/` + `workflow-dir.json` | 目录式自定义工作流 | | `cloud-channels.json` | 自配云端通道表 | | `cloud-keys.json` | 界面填的密钥(值不回前端) | | `comfy-widget-options.json` | ComfyUI 枚举快照(5 分钟 TTL) | | `downloads/` | 媒体下载 / 项目归档导出目录 | | `data-dir.json` | 数据目录指针(v1.43) | --- 需要更深入的技术细节(HTTP 接口、补丁锚点、回归脚本),查 `README.md` 的「关键约束」「数据目录与本地后端」两节,以及 `docs/` 下对应文档。