dsh-media-studio
Verifieddsh-media-studio · v0.3.1 · Apache-2.0 · Web UI
DSH 插件:面向 AI 漫剧 / AI 微电影 / AI 视频创作的多项目无限画布编辑器 —— 画布节点编排、分门别类的素材库、全局素材搜索与跨项目软引用,配合 dsh-llm-multimodal 的生成工具与 media-preview 的聊天内预览。
Install
dsh plugin add dsh-media-studio Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Readme
dsh-media-studio
一个 DeepSeek Harness(DSH)插件,为 agent 提供多项目无限画布编辑器:项目画布、每项目分门别类的素材库、全局实时素材搜索、跨项目软引用。媒体生成能力(generate_image / generate_video / generate_vision / generate_music / TTS)位于姊妹插件 dsh-llm-multimodal,本插件通过画布「重新生成」流程调用。
效果预览

一条 59 节点、76 条连线的 AI 微电影工作台:五个分区——编排计划、剧本与制作计划、资产锚点、分镜与关键帧、视频片段——在 22% 缩放下总览。点击可放大。
面向 AI 视频创作
画布是为多镜头、长链路的 AI 视频生产准备的工作台——这类工作需要一致的角色、可复用的资产与逐镜头的拓扑,而不是一条提示词:
| 使用场景 | 画布提供什么 |
|---|---|
| AI 漫剧 / 动态漫 | 一集一个分区:角色与场景资产块跨镜头复用,一个共享的美术风格节点向下游所有提示词供词,让画风在几十格里保持一致 |
| AI 微电影 | 剧本 → 分镜 → 镜头 → 剪辑分区让整片状态一眼可查;首尾帧关键帧串联让相邻镜头真正衔接,而不是 PPT 切片 |
| AI 视频创作 | 任何多镜头作品——商品广告、MV、讲解片。节点级 canvas_refresh_node 只重生成没做好的那一个镜头,不必重做整块画布 |
下面这些能力让以上场景可行:每项目一套素材库(人物 / 场景 / 音频 / 视频片段)保证主角形象稳定;软引用让一个角色资产服务多张画布而无需复制文件;**全局搜索(⌘K)**能从旧项目里找到场景资产直接复用到当前画布。
配套插件(互推)
本插件与同作者的另外两个 DSH 插件组成「生成 → 编排 → 预览」完整闭环,建议一起安装:
| 插件 | 角色 | npm |
|---|---|---|
| dsh-llm-multimodal | 生成后端:generate_image / generate_video / generate_vision / generate_tts / generate_music / generate_text,模型从 llm-pi-ai 自动发现 |
npm: dsh-llm-multimodal |
| media-preview | 把聊天中的本地/在线媒体路径渲染为可播放预览(Range / 缓存 / 27 种格式) | npm: media-preview |
- 生成 → 编排:本插件发布跨插件服务
mediaStudio(ctx.reflect.provide,软引用,双方均无硬依赖)。dsh-llm-multimodal用ctx.get('mediaStudio')读取它,把生成产物直接写进活跃项目的<sourcePath>/assets/<类别>/而非/tmp;结果附带projectId+canvasUrl,batchAddMedia可一步挂到画布节点。本插件缺失时生成器自动回退自身的outputDir策略——安装顺序无关。 - 编排 → 预览:项目下的媒体文件经
/api/media-studio/media-file提供,media-preview负责把file://路径在聊天里内联渲染。
Compatibility
| 项目 | 状态 |
|---|---|
| Harness | DeepSeek Harness 0.1.1-rc.2 |
| Node | `^22.19.0 |
| 平台 | 全部(纯 ESM;无原生代码、无网络) |
What it does
- 无限画布(Media Studio 侧栏标签页,经
betterSidebar)。服务端权威 + SSE 实时回灌;键鼠编辑、撤销/重做、小地图、自动整理、媒体灯箱预览。 - Agent 工具(25 个):13 个
canvas_*(图快照/批量写、自动整理、节点重生成、单节点 CRUD、分区 CRUD/贴合)+ 12 个media_studio_*(项目管理、素材库、全局搜索)。缺省canvasId解析为当前激活项目的画布。 - 分区(Region):命名容器盒,把画布按业务区块划分(流程总览 / 剧本文案 / 人物资产 / 场景资产 / 分镜区 / 成片与音频)。节点归属 =
data.region;盒随节点新增自动扩容,支持整体拖动、锁定、贴合内容。canvas_auto_arrange({ regionId })只重排该分区。 - 项目(M0/M1):
projects.json注册表 + 每项目assets/;旧画布首次启动自动升级为项目。顶部「项目」菜单:新建 / 打开 / 最近打开(≤10)/ 重命名 / 删除(带依赖分析);默认进<ws>/trash/回收站。带sourcePath创建的项目,画布与素材都留在用户自有目录。 - 素材库(M2):四类资产(人物 / 场景 / 音频 / 视频片段)。画布媒体卡可「存入素材库」;素材库面板支持浏览、改名、跨项目复制、删除预检。资产文件名=资产 id——改名永不断引用。
- 全局搜索 + 软引用(M3):顶栏实时搜索(⌘K)对全部项目的库资产与完成画布素材做模糊匹配,按「当前项目 / 其他项目」分组。「+ 添加」把库资产软引用进当前画布(
data.assetRef,不复制文件);画布素材结果提供「复制入库」。引用关系支撑删除预检;源被删时可把被引用资产迁入共享库(__shared)或在引用处断链标记。 - 中英双语 UI:极简 i18n,跟随 DSH 的 Language 设置(
ctx.locale)。
全部 REST/SSE 挂在 /api/media-studio/* 下:projects*(列出/新建/打开/改名/删除/依赖/打开目录/选目录/在访达显示)、assets*(列出/登记/更新/删除/复制/依赖/同步文件)、refs、search、search/import-canvas、canvas/*(state/patch/auto-arrange/refresh/backfill-video-posters)、media-file 代理、service-worker.js,以及统一 sse 端点。
只允许一条 SSE 连接。 画布 patch 与注册表变更(
registry-changed/project-open/project-deleted/asset-changed/project-focused)全部复用/api/media-studio/sse单条流。这是刻意的:HTTP/1.1 每主机上限 6 连接,而 DSH 核心已占用数条。标签页后台化时连接暂停,重连后主动拉取最新快照补齐。新增第二个 EventSource 属于回归——请合并进该端点。
Install
# 方式一(推荐):dsh 官方命令,从 npm registry 安装
dsh plugin --profile web add dsh-media-studio
# 方式二:从打包产物安装
pnpm pack
dsh plugin --profile <name> add ./dsh-media-studio-0.3.1.tgz
# 确认插件行已挂载
dsh --profile <name> --dump-config | grep 'dsh-media-studio'
可选:media-studio agent preset
包内还附带一份 agent preset(src/presets/media-studio/agent.cordis.yml),让会话带上媒体制作人格与配套的 prompt 段落。preset 里不声明任何工具——本插件自己的 fiber 已注册全部工具,每个会话都能通过 ctx.tools 继承;preset 只补充身份与提示词框架。
源码检出场景下,pnpm run prepare(或 bash scripts/setup-preset.sh [profile])会把它软链到 $DSH_HOME/profiles/<profile>/agent-presets/media-studio/。npm 安装场景请自行从 node_modules/dsh-media-studio/src/presets/media-studio/agent.cordis.yml 软链。之后在 agent preset 选择器里选 media-studio,或在对话中输入 /preset media-studio。完全跳过这一步也没问题——画布标签页与全部 25 个工具都不依赖它。
Configuration
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
workspaceRoot |
string | ~/.media-studio |
注册表、旧版画布、回收站所在 |
mediaRoots |
string[] | ['~/Movies'] |
media-file 代理可额外提供的目录。默认 ~/Movies,让 sourcePath 落在其下的影视类项目开箱即可渲染;~ 会自动展开 |
defaultCanvasId |
string | main |
兜底画布 id(激活项目优先) |
logToolCalls |
boolean | true |
工具结果写入会话日志 |
recentLimit |
number | 10 |
最近打开项目上限(1–50) |
trashEnabled |
boolean | true |
删除移入 <ws>/trash(除非显式彻底删除) |
配置由 src/config.ts 的 Schemastery Config 模式校验;无可调参数被硬编码。运行中的 profile 可通过 cordis.patch.yml 覆盖任意一项。
Development
pnpm install
pnpm run typecheck # 服务端源
pnpm run typecheck:client # 浏览器源(tsc)
pnpm test # vitest(store/project/asset/search/perf 套件)
pnpm run build # tsdown → lib/
pnpm pack
性能契约
以下热点路径由回归测试钉住——review 看不出 100ms 与 1s 的差别,CI 跑过的数字才看得见:
| 契约 | 测试 |
|---|---|
持久化合并:100 次同步 apply → ≤2 次写入 |
tests/persistence-debounce.test.ts |
postProcessCanvasPatch 把 N 个视频节点合并成单次 apply |
tests/post-process-batching.test.ts |
1000 次同步 apply 在 500ms 内完成且 ≤2 次写入 |
tests/perf-budget.test.ts |
| 媒体文件名稳定(sha1 派生,16 位 hex) | tests/stable-filename.test.ts |
gcOrphanMedia 只删不可达的 v- / a- / i- 文件 |
tests/orphan-gc.test.ts |
SSE 广播按 canvasId 分桶隔离 |
tests/sse-bucketing.test.ts |
| merge token 在节点 data 未变时短路 | tests/canvas-rerender-discipline.test.ts |
loadAssetIndex 命中 mtime 缓存(Object.is 稳定) |
tests/search-cache.test.ts |
openProject 只 restore 目标画布 |
tests/restore-target.test.ts |
dependentsOf / scanAssetRefs 不深拷贝画布 |
tests/dependents-no-clone.test.ts |
任何改动热点路径(写入、SSE、媒体处理、依赖扫描、画布渲染)都必须随附对应的回归测试。
打赏支持
若这个插件帮到了你,欢迎用下面的二维码请我喝杯咖啡。
![]() 微信支付 |
![]() 支付宝 |
License
Apache License 2.0 © 2026 dsh-media-studio contributors.

