🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

多媒体生成 EmberwingAviation/dsh-media-gen

DeepSeek Harnessv0.1.4
EmberwingAviation16 天前有提交已提供中文文档扫描:含敏感能力

让 DeepSeek Harness 会画图、会出片。 一个插件、一套设置页、三个工具、多条供应商通道。

33.6/100
综合分
5
GitHub 星标
1,310
npm 周下载
—/5
用户评分

数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-media-gen
npm 源 · dsh-media-gen 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · vision
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 16 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-media-gen @ 0.1.4
✓Node 引擎要求 >=22.19 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/23 06:15:33

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 53 处,展示前 48 条)
  • 发起网络请求
    lib/client.js:2568
    fetch(VIDEO_ROUTE, {
  • 写入剪贴板
    lib/client.js:2730
    try { await navigator.clipboard.writeText(item.prompt); onToast(t("copiedPrompt")); }
  • 写入剪贴板
    lib/client.js:2801
    try { await navigator.clipboard.writeText(item.prompt); onToast(t("copiedPrompt")); }
  • 发起网络请求
    lib/image-core.js:224
    const response = await fetch(url, { redirect: 'follow', signal })
  • 发起网络请求
    lib/image-core.js:342
    response = await fetch(url, {
  • 写入本地文件
    lib/image-core.js:711
    await mkdir(directory, { recursive: true })
  • 写入本地文件
    lib/image-core.js:717
    await writeFile(join(directory, name), image.data)
  • 发起网络请求
    lib/image-core.js:813
    const response = await fetch(target, {
  • 读取本地文件
    lib/image-core.js:840
    const data = await readFile(abs, signal !== undefined ? { signal } : {})
  • 发起网络请求
    lib/video-core.js:52
    const response = await fetch(`${input.endpoint}/services/aigc/video-generation/video-synthesis`, {
  • 发起网络请求
    lib/video-core.js:87
    const response = await fetch(`${input.endpoint}/services/aigc/video-generation/video-synthesis`, {
  • 发起网络请求
    lib/video-core.js:131
    const poll = await fetch(`${input.endpoint}/tasks/${encodeURIComponent(taskId)}`, {
  • 发起网络请求
    lib/video-core.js:176
    const submit = await fetch(`${input.baseURL}/contents/generations/tasks`, {
  • 发起网络请求
    lib/video-core.js:200
    const poll = await fetch(`${input.baseURL}/contents/generations/tasks/${encodeURIComponent(taskId)}`, {
  • 发起网络请求
    lib/video-core.js:236
    const poll = await fetch(url, {
  • 读取本地文件
    lib/video-core.js:373
    const parsed = JSON.parse(await readFile(join(dir, WORKSPACE_MARKER_NAME), "utf8"));
  • 读取本地文件
    lib/video-core.js:390
    const parsed = JSON.parse(await readFile(markerPath, "utf8"));
  • 写入本地文件
    lib/video-core.js:398
    await writeFile(staging, JSON.stringify({ version: 1, videos }, null, "\t"), { flag: "wx" });
  • 写入本地文件
    lib/video-core.js:399
    await rename(staging, markerPath);
  • 删除本地文件
    lib/video-core.js:401
    await unlink(staging).catch(() => {});
  • 读取本地文件
    lib/video-core.js:448
    const realFile = await realpath(savedTo);
  • 读取本地文件
    lib/video-core.js:451
    try { realRoot = await realpath(root); }
  • 读取本地文件
    lib/video-core.js:454
    const data = await readFile(realFile);
  • 读取本地文件
    lib/video-core.js:470
    const realFile = await realpath(join(dir, entry.file));
  • 写入本地文件
    lib/video-core.js:583
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/video-core.js:586
    await writeFile(staging, options.data, { flag: "wx", signal: options.signal });
  • 写入本地文件
    lib/video-core.js:588
    await rename(staging, target);
  • 删除本地文件
    lib/video-core.js:590
    await unlink(staging).catch(() => {});
  • 写入本地文件
    lib/cli-config.js:51
    mkdirSync(dirname(path), { recursive: true })
  • 写入本地文件
    lib/cli-config.js:53
    writeFileSync(staging, JSON.stringify(mirror, null, 2) + '\n', 'utf8')
  • 写入本地文件
    lib/cli-config.js:54
    renameSync(staging, path)
  • 写入本地文件
    lib/rpc-route.js:19
    void appendFile(logPath, `${new Date().toISOString()} ${message}\n`).catch(() => {})
  • 读取本地文件
    lib/credential-refs.js:57
    return parseCredentialRefs(readFileSync(path, 'utf8'))
  • 写入本地文件
    lib/video-task-store.js:74
    await fs.mkdir(this.directory, { recursive: true, mode: 0o700 })
  • 写入本地文件
    lib/video-task-store.js:76
    try { await fs.mkdir(lock) } catch (e) {
  • 删除本地文件
    lib/video-task-store.js:80
    try { return await action() } finally { await fs.rmdir(lock) }
  • 写入本地文件
    lib/video-task-store.js:95
    await fs.rename(temp, target)
  • 删除本地文件
    lib/video-task-store.js:98
    try { await fs.unlink(temp) } catch (cleanup) { if (cleanup.code !== 'ENOENT') throw new AggregateError([e, cleanup], 'Write and cleanup failed') }
  • 读取本地文件
    lib/video-task-store.js:126
    try { text = await fs.readFile(this._path(id), 'utf8') } catch (e) {
  • 读取本地文件
    lib/video-task-store.js:130
    const stat = await fs.stat(this.directory)
  • 读取本地文件
    lib/video-task-store.js:157
    try { names = await fs.readdir(this.directory) } catch (e) { if (e.code === 'ENOENT') return []; throw e }
  • 发起网络请求
    lib/video-google.js:51
    const response = await fetch(input.endpoint, {
  • 读取本地文件
    lib/video-reference-image.js:105
    [realRoot, realCandidate] = await Promise.all([realpath(root), realpath(candidate)]);
  • 读取本地文件
    lib/video-reference-image.js:116
    const file = await stat(realCandidate);
  • 读取本地文件
    lib/video-reference-image.js:122
    const data = await readFile(realCandidate, { signal: input.signal });
  • 发起网络请求
    lib/client-video.js:1293
    fetch(VIDEO_ROUTE, {
  • 写入剪贴板
    lib/client-video.js:1455
    try { await navigator.clipboard.writeText(item.prompt); onToast(t("copiedPrompt")); }
  • 写入剪贴板
    lib/client-video.js:1526
    try { await navigator.clipboard.writeText(item.prompt); onToast(t("copiedPrompt")); }
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/cordis@deepseek-ai/dsh-attachment@deepseek-ai/dsh-credentials@deepseek-ai/dsh-host-webserver@deepseek-ai/dsh-settings@deepseek-ai/dsh-system-prompt@deepseek-ai/dsh-tools
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 生图与生视频整合
  • 统一供应商目录
  • 设置页与画廊
展开完整介绍(125 字)↓

DeepSeek Harness 生图+生视频整合插件:统一服务商目录、三个工具、中转站实测的异步视频契约、限流退避纪律、设置页+画廊+快车道命令行。MIT,fork 合并自 dsh-image-generation 与 dsh-video-gen。

v0.1.42026-10-17
· 0.1.4 · 视频通道加固(含 PR #7) · fail_to_fetch_task 不再被当作限流:它是 New API 的"取上游任务失败"包装码,内层可能是配置错误,过去会被 60s+ 长退避反复重试,把配置问题伪装成"卡住" · 新增 lib/upstream-error.js:向下钻取中转的嵌套错误(如 model_not_found / No available channel for model …)并摘出 request id,报错文案可直接拿去开工单 · 新增 retryOnDispatchFailure:仅对"确认未建成任务"的 503 fail_to_fetch_task 做 15s→30s 短退避(最多 2 次),与限流长退避分离 · 三个适配器统一加固:id / task_id 兼容、拒绝空白字符任务号(此前会带着空号轮询到超时)、缺失任务号时报错带上上游原文 · 修正火山适配器在缺少任务号时引用未定义变量导致的崩溃 · 图像通道修复(0.1.3) · connection RPC 通道在 DSH 0.2.0-rc.2 上静默缺失(POST /image-gen/* 405):改为在插件自己的 webServer 上按同协议自注册路由,设置页「拉取上游模型」、图片工具视图加载、CLI 镜像同步全部恢复。详见 docs/DEVELOPMENT.md · 其他 · 测试 84 项全绿(新增 host-stubs 桩、视频适配器、任务号校验三套用例) · 安装:dsh plugin --profile desktop add dsh-media-gen
v0.12026-09-30
· v0.1 — first public release npm: dsh-media-gen@0.1.2 · 三个工具:image_generate / generate_video / animate_image · 多供应商目录:生图(OpenAI images / xAI / Gemini / chat 携图)、 生视频(通义万相 / 火山 Seedance / Google Veo / Sora 风格中转) · 中转图生视频(input_reference)、限流指数退避、任务登记簿(先查旧任务再重提) · 设置页(生图 / 视频生成)、视频画廊、对话内联卡片、快车道 CLI + 配置镜像 · CI:测试(Node 22/24 矩阵 + 构建确定性门)+ Release 自动发布(npm Trusted Publishing / provenance) 安装:dsh plugin --profile desktop add dsh-media-gen License: MIT(fork 合并自 dsh-image-generation 与 dsh-video-gen,声明见 NOTICE.md)
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-media-gen 让 DeepSeek Harness 会画图、会出片。 一个插件、一套设置页、三个工具、多条供应商通道。 为 DeepSeek Harness 统一生图与生视频 —— image_generate / generate_video / animate_image,多服务商(OpenAI 兼容中转站、DashScope 通义万相、火山引擎 Seedance、Google Veo、Sora 风格 /v1/videos),设置界面、视频画廊、MIT。 30 秒上手 1. 安装插件(三种渠道任选,推荐 npm) ① npm 注册表(推荐,自动跟随最新版) dsh plugin --profile desktop add dsh-media-gen ② GitHub 仓库直装 dsh plugin --profile desktop add github:EmberwingAviation/dsh-media-gen ③ 本地源码(开发用,改源码即生效) dsh plugin --profile desktop add link:/path/to/dsh-media-gen 或者用图形界面:设置 → 内置插件 → 添加插件 → 输入 dsh-media-gen(也接受 GitHub 地址或本地目录路径)。
展开完整文档(README 剩余 1 节)
dsh-media-gen

让 DeepSeek Harness 会画图、会出片。 一个插件、一套设置页、三个工具、多条供应商通道。

为 DeepSeek Harness 统一生图与生视频 —— image_generate / generate_video / animate_image,多服务商(OpenAI 兼容中转站、DashScope 通义万相、火山引擎 Seedance、Google Veo、Sora 风格 /v1/videos),设置界面、视频画廊、MIT。

30 秒上手

1. 安装插件(三种渠道任选,推荐 npm)

① npm 注册表(推荐,自动跟随最新版)
dsh plugin --profile desktop add dsh-media-gen

② GitHub 仓库直装
dsh plugin --profile desktop add github:EmberwingAviation/dsh-media-gen

③ 本地源码(开发用,改源码即生效)
dsh plugin --profile desktop add link:/path/to/dsh-media-gen

或者用图形界面:设置 → 内置插件 → 添加插件 → 输入 dsh-media-gen(也接受 GitHub 地址或本地目录路径)。

npm 包页:https://www.npmjs.com/package/dsh-media-gen | 装完可在「设置 → 内置插件」列表看到 dsh-media-gen 与版本号
升级:重复执行同一条安装命令即可取到最新版(升级后需重启 DSH)

2. 完全重启 DSH(插件在启动时装载)

3. 填一个生图供应商 → 设置 → 生图 → 供应商目录卡 → 新建:
- 名称、Base URL(如 https://你的中转站/v1)、API 格式(多数中转站选 openai-images)
- 密钥(写入 DSH 凭据服务,不会明文存配置文件)
- 模型列表:可以点 「拉取上游模型」 一键从上游 GET /models 拉取候选

4. 选默认模型 → 同一页的默认配置卡 → 当前模型选一个(image_generate 就跟着它走)

5.(可选)配视频 → 设置 → 视频生成 → 加供应商(类型 / Base URL / 模型 / 密钥 / 是否支持图生视频)

6. 开始用 —— 新建一个会话,直接对智能体说:

「画一只在深夜海面上跃起的座头鲸,电影海报风格」「把这张图做成 5 秒视频」(附图)「生成一段视频:赛博朋克城市雨夜,镜头缓慢推进」

⚠️ 工具只在新建的会话里出现:DSH 的会话工具集在会话创建时快照,装完插件后请开新会话。

你会得到什么

| 工具 | 做什么 |
| image_generate | 文生图、参考图改图(referenceImages 传 1–5 张对话里的图);结果存 generate/image/ 并直接显示在对话里 |
| generate_video | 文生视频(异步任务 + 自动轮询);结果存 generate/video/、对话内播放,并收录进视频画廊 |
| animate_image | 图生视频:源图可以是工作区文件、对话附件、或「对话里最新那张图」 |

产物都在工作区的 generate/ 下,随时可再引用;视频还能在会话顶栏的 视频画廊 里回看。

支持哪些服务商

生图(按供应商选择 API 格式):

| 格式 | 适用 |
| openai-images | OpenAI 官方、以及绝大多数 New API 系中转站的 /v1/images/generations(推荐) |
| openai-chat-image | 只提供 chat 路由携图的中转站(兼容兜底) |
| xai-images / gemini-image | xAI、Google Gemini 系原生格式 |

生视频(按供应商选择类型):

| 类型 | 说明 | 图生视频 |
| dashscope | 阿里云通义万相 | ✅ 默认支持 |
| volcengine | 火山引擎 Seedance | ✅ 默认支持 |
| google | Google Veo | ✅ 默认支持 |
| openai-compatible | OpenAI / Sora 风格 /v1/videos 异步任务,含各类中转站 | ⚠️ 需手动勾选「支持图生视频」(经 input_reference 传图) |

同一条通道可配多个模型,默认供应商在设置页单选;单次调用还可用工具参数 provider 临时换。

配置详解

设置 → 生图(一页两卡)

- 供应商目录卡:增删改供应商(名称 / Base URL / API 格式 / Key / 模型列表),每行有密钥状态徽章;「拉取上游模型」按钮会带着你填的密钥向 GET {BaseURL}/models 请求,把返回的模型 id 去重合并进列表
- 默认配置卡:
- 启用 image_generate:关掉后工具会拒答
- 当前模型:image_generate 实际使用的模型
- 默认尺寸 / 默认质量:不给参数时用这套
- 智能体出图通道:auto(默认,简单出图走命令行、需要参考图/内联/画廊时走原生工具)/cli/tool/subagent
- 命令行出图输出目录 / 请求超时:给下面的命令行工具用

设置 → 视频生成

供应商目录(类型 / Base URL / 模型 / Key / 图生视频开关)、默认供应商单选、轮询间隔、等待超时、落盘目录。

密钥放哪

所有 Key 都交给 DSH 凭据服务(配置里只存引用名),不会明文写进配置文件、不会传进浏览器、不会进命令行。

命令行直连出图(可选)

不想经过智能体回合、想最快拿到图:

node scripts/gen-image.mjs "提示词" [--model qwen-image-3.0-pro] [--size 1024x1024] [--dry-run]

- 默认值来自「设置 → 生图」保存的配置(host 会把它同步成配置文件镜像),命令行参数可临时覆盖
- --dry-run 只打印生效配置,不消耗额度
- 参数、优先级、镜像机制见 docs/DEVELOPMENT.md

常见问题

Q:为什么新会话里才有这三个工具? DSH 的会话工具集在会话创建时快照,装完插件或改了工具开关,新开一个会话即可。

Q:报 429 / 限流 / "负载已饱和"怎么办? 插件会自动指数退避重试(默认 ≥60 秒起步,最多 3 次),不要手动连发;上游拥堵时等一会儿或换个供应商。

Q:视频任务一直转圈? 异步视频任务偶尔会长时间停滞(上游排队)。插件会保留任务 id:超时后先查旧任务,而不是盲目重提;确实要开新任务时,明确说「重提」或让智能体传 resubmit。

Q:图/视频存哪了? 工作区 generate/image/、generate/video/;图片会内联在对话里,视频同时出现在视频画廊。

Q:改了设置要重启吗? 改配置(供应商、模型、开关)不用重启;安装/升级插件、改插件自身代码需要重启 DSH。

Q:图生视频为什么提示不支持? openai-compatible 类型默认关闭图生视频(不同中转站能力不一),到「视频生成」页把该供应商的「支持图生视频」勾上。

反馈与贡献

- 遇到问题或有需求:开 Issue
- 开发、架构、测试、发布流程:见 docs/DEVELOPMENT.md

English quick start

dsh plugin --profile desktop add dsh-media-gen # restart DSH afterwards

Then go to Settings → Image generation: add a provider (Base URL / key / models), pick a default model, and ask the
agent in a new session:

"Draw a humpback whale breaching at night, movie-poster style"

Three tools are exposed: image_generate (text-to-image and reference-image edits), generate_video (text-to-video,
async polling) and animate_image (image-to-video). Outputs land in generate/image/ and generate/video/, inline in the
conversation, with a video gallery tab. Keys are stored through the DSH credential service — never in config files.

Attribution & License

MIT © dsh-media-gen contributors. 本插件是以下两个 MIT 项目的 fork 合并与再创作:

| 上游 | 版权 | 使用范围 |
| dsh-image-generation @0.1.2 | whiteS18, MIT | lib/image-core.js、lib/client-image.js |
| dsh-video-gen @0.2.4(npm) | Yang-wudi / shanliuling, MIT | lib/video-core.js、lib/video-*.js、lib/client-video.js |

完整声明见 NOTICE.md;上游 LICENSE 与源码副本保留于 vendor/;各改编文件头部均有来源注释。
预览分享卡片长什么样 ↓EmberwingAviation/dsh-media-gen
分享 · DeepSeek Harness Hub
EmberwingAviation/dsh-media-gen

让 DeepSeek Harness 会画图、会出片。 一个插件、一套设置页、三个工具、多条供应商通道。

这是你的仓库?认领条目

回到顶部