在侧栏生成与编辑图片,并让智能体调用绘图工具
30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Mr-Maidong/dsh-plugin-image2该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · vision
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 9 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 29 处,展示前 27 条)
- 读取本地文件index.js:204
text = await readFile(settingsFile(), 'utf8') - 写入本地文件index.js:228
await mkdir(dirname(file), { recursive: true }) - 写入本地文件index.js:229
await writeFile(file, `${JSON.stringify(settings, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }) - 读取本地文件index.js:257
text = await readFile(historyFile(), 'utf8') - 写入本地文件index.js:277
await mkdir(dirname(file), { recursive: true }) - 写入本地文件index.js:278
await writeFile(file, `${JSON.stringify(history, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 }) - 发起网络请求index.js:635
response = await fetch(`${baseUrl}/images/generations`, { - 发起网络请求index.js:691
download = await fetch(first.url, { - 写入本地文件index.js:732
await mkdir(outputDir, { recursive: true }) - 写入本地文件index.js:735
await writeFile(file, imageBytes) - 发起网络请求index.js:951
return await fetch(`${input.baseUrl}/images/edits`, { - 读取本地文件index.js:1076
return await readFile(path) - 发起网络请求index.js:1135
response = await fetch(`${baseUrl}/models`, { - 读取本地文件index.js:1303
bytes = await readFile(item.file) - 写入本地文件smoke.mjs:145
await mkdir(workspace, { recursive: true }) - 发起网络请求smoke.mjs:183
const response = await route.fetch(request) - 发起网络请求smoke.mjs:190
const response = await route.fetch(new Request(`http://127.0.0.1:63321${path}`)) - 发起网络请求smoke.mjs:205
const response = await route.fetch(new Request(`http://127.0.0.1:63321${path}`, { method: 'POST', body: form })) - 读取本地文件smoke.mjs:247
const stored = JSON.parse(await readFile(join(profile, 'image2', 'settings.json'), 'utf8')) - 读取本地文件smoke.mjs:260
check('saved file exists', typeof item.file === 'string' && (await stat(item.file)).size > 0) - 读取本地文件smoke.mjs:303
check('deleted file stays on disk', (await stat(item.file)).size > 0) - 读取本地文件smoke.mjs:321
check('tool returns path', typeof toolResult.file === 'string' && (await stat(toolResult.file)).size > 0, JSON.stringify(toolResult)) - 写入本地文件smoke.mjs:330
await writeFile(source, Buffer.from(PNG, 'base64')) - 读取本地文件smoke.mjs:333
check('edit returns a new file', edited.file !== source && (await stat(edited.file)).size > 0, JSON.stringify(edited)) - 读取本地文件smoke.mjs:335
check('edit leaves the source alone', (await stat(source)).size > 0) - 发起网络请求smoke.mjs:492
const detached = routes.get('/api/image2/generate').fetch(new Request( - 删除本地文件递归smoke.mjs:541
await rm(profile, { recursive: true, force: true })
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
DeepSeek Harness 的图像工作室插件:接入图像 API 端点和密钥,在 Web UI 里生成和编辑图片,并向智能体暴露 image2_generate / image2_edit 工具。
README
由 DeepSeek 最新模型翻译生成Image studio(图像生成)
一个 DSH Harness 插件:在 Web UI 左侧栏新增「图像生成」页面,填写接口地址与 API Key 后,输入提示词即可调用生图接口,图片会保存到本地并进入页面右侧的画廊。
同时注册两个智能体工具——image2_generate(生成)与 image2_edit(改图)——复用同一套配置。
仓库:<https://github.com/Mr-Maidong/dsh-plugin-image2>(topic:dsh、dsh-plugin、deepseek-harness)
安装
从 GitHub 安装
dsh plugin --profile desktop add git+https://github.com/Mr-Maidong/dsh-plugin-image2.git
或用本地克隆
git clone https://github.com/Mr-Maidong/dsh-plugin-image2.git
dsh plugin --profile desktop add ./dsh-plugin-image2
Host 半侧在启动时加载,装好需要重启 DSH;之后只改 client.js 的话刷新页面即可。
使用
1. 打开左侧栏的「图像生成」图标。
展开完整文档(README 剩余 1 节)
Image studio(图像生成)
一个 DSH Harness 插件:在 Web UI 左侧栏新增「图像生成」页面,填写接口地址与 API Key 后,输入提示词即可调用生图接口,图片会保存到本地并进入页面右侧的画廊。
同时注册两个智能体工具——image2_generate(生成)与 image2_edit(改图)——复用同一套配置。
仓库:<https://github.com/Mr-Maidong/dsh-plugin-image2>(topic:dsh、dsh-plugin、deepseek-harness)
安装
从 GitHub 安装
dsh plugin --profile desktop add git+https://github.com/Mr-Maidong/dsh-plugin-image2.git
或用本地克隆
git clone https://github.com/Mr-Maidong/dsh-plugin-image2.git
dsh plugin --profile desktop add ./dsh-plugin-image2
Host 半侧在启动时加载,装好需要重启 DSH;之后只改 client.js 的话刷新页面即可。
使用
1. 打开左侧栏的「图像生成」图标。第一次进入会自动弹出接口设置;已经配好密钥时,设置收在左下角的「设置」按钮里。
2. 设置里填写:
- 接口地址:生图接口的基础地址,例如 https://api.openai.com/v1。
也可以直接粘贴完整路由 https://api.openai.com/v1/images/generations,插件会自动截掉后缀。
- API Key:只需填写一次,保存后不再回显(页面只显示掩码提示)。
- 模型:默认 gpt-image-2.5。
- 输出目录:默认 ~/Pictures/image2,支持以 ~ 开头的路径。
3. 点「保存」(第一次保存后弹窗会自己关掉),可先点「测试连接」确认地址与密钥可用(探测 {接口地址}/models)。
4. 左列写提示词、选画幅、质量与背景,点「生成图片」。三者默认 16:9 / 自动 / 自动(存在配置档里,页面上切换后只影响本次,不改设置文件)。背景取 自动 / 透明 / 不透明:选「透明」时接口返回带 alpha 的 PNG,适合做空态插图、贴纸这类要抠底的素材(接口是否支持取决于你自己的服务实现)。
5. 右列是最新一张图,和左边「提示词 + 图像设置」两栏等高:图片按容器铺满显示(object-fit: cover),不附带路径、改写、文件信息。下面是通栏的历史画廊,缩略图按 4:3 一行 8 张:
- 选:鼠标移到缩略图上,底部滑出工具条——底衬是一条自下而上渐隐的暗色蒙层(底部最深、向上淡到全透明,没有硬边),左边勾选框、右边垃圾桶。点勾选框或直接点缩略图都能选中/取消;选中的图在指针移开后只留底部左侧的勾选标记(蒙层与垃圾桶隐去,不压图);卡片右上角的「全选」一次选中全部,满选后变成「取消选择」;
- 删一张:工具条右侧的垃圾桶按钮;
- 批量删:选中若干(或全选)后点右上角红色的「删除所选 / 全部删除」;
- 两种删除都会先弹二次确认(列出数量,说明只删记录、不动文件),确认后才真正移除。
历史只删除记录,磁盘上的图片文件不会被删。
实现
| 部分 | 位置 | 说明 |
| Host 半 | index.js | 读写设置与历史;在 /api/image2/ 上注册六个需要鉴权的路由;注册两个工具 |
| Client 半 | client.js | sidebar.panellist 图标 + 以 image2 为 key 的 main 页面 |
| 组合 | cordis.patch.yml | 插入一行 id: image2 的插件行 |
路由(都在 Connection 的 /api 鉴权通道上,浏览器同源 fetch 即可):
- GET|POST /api/image2/settings — 读取/更新设置;POST 只写入传入的字段。
- POST /api/image2/test — 探测 {接口地址}/models。
- POST /api/image2/generate — 调用 {接口地址}/images/generations(response_format: b64_json),写盘后返回 { item, items }:新记录与刷新后的整份历史。
- GET /api/image2/history — 历史列表,新的在前。
- POST /api/image2/history/delete — 按 { ids: [...] } 删除记录,返回剩余历史。
- GET /api/image2/asset?id= — 回传某条记录的图片字节( 直接用它,页面因此不必在 JSON 里搬运 base64)。
工具:
- image2_generate(prompt, size?, quality?, background?, outputDir?) — 生成一张并返回落盘路径。
- image2_edit(image, prompt, mask?, size?, quality?, background?, outputDir?) — 调 /images/edits 改图,结果写成新文件,原图不动。
background 取 auto(默认)/ transparent / opaque:transparent 出带 alpha 的 PNG(做空态插图、贴纸这类素材时用),opaque 强制不透明,auto 交给接口决定。不传时用设置里保存的值,设置里也没有就按 auto。页面本身没有这个开关,只对两个工具和 POST /api/image2/generate 生效。
工具在工作区里调用时默认写入 <工作区>/imgout(而不是设置里的图片目录),这样智能体生成的图就落在它的工作旁边;显式传 outputDir 时以参数为准。
界面
页面样式不是凭空写的:先用 gpt-image2 生成一张界面设计稿,再照着稿子在 client.js 里还原。
版面是两行:第一行左边是「提示词 + 图像设置」,右边是「最新」那张图——两栏底部对齐(网格 align-items: stretch,左列最后一张卡吃掉余量),图片 object-fit: cover 铺满卡片;第二行是通栏的「历史」画廊,缩略图固定 4:3、宽屏一行 8 张。页面不放大标题,也没有空态文案。
- 只用 Harness 自己的设计变量(--dsw-alias-)和 ui-primitives 的 Button,深浅两套主题都跟随应用。
- 唯一的固定色是这个插件的品牌蓝 #3b82f6,只在聚焦描边、选中描边、选中数量胶囊上出现;主按钮仍然用 Button variant="primary",因此和其它页面保持一致。
- 空态插图来自 design/empty.webp(600px 透明 WebP),缩到 400px 宽后以 data URL 内联进 client.js (页面因此不需要额外的静态资源路由)。
- 侧栏图标是给定的那枚「相框 + 山 + 星」形状,用 currentColor 单色填充,因此选中态跟随侧栏自己的配色。
- 画幅、质量与背景不是原生 :它们的弹层直接用宿主的 Menu 基元(ui-primitives),因此卡片、行高、悬停底色、右侧勾选和应用里其它下拉菜单完全一致;触发器仍是本页的输入框样式,通过 portal 渲染到 body,不会被面板的滚动容器裁掉。三项并排一行,该行的触发器收窄了内边距与图标尺寸,最长的「不透明」也不会被截断(英文用 Auto / Clear / Solid 这三个短词)。
- 设置弹窗是 position:fixed + createPortal 到 body 的自绘对话框,不依赖宿主的 Modal,这样它不会被页面容器的 overflow 或层叠顺序裁掉。
深色主题:画廊与最新图片
浅色主题
深色空态(只有插图)
勾选与批量删除入口
悬停时底部滑出的工具条(渐变蒙层)
删除前的二次确认
接口设置弹窗
图像设置:画幅、质量与新增的背景
画幅下拉(预览壳里的 Menu 替身,卡片外观以宿主基元为准)
侧栏图标 16/24/48/72px
design/ 里是这些素材与开发工具:
| 文件 | 用途 |
| comp.png | gpt-image2 生成的界面设计稿,还原时照着它写 |
| preview.html | 开发预览:用 React + 假的 slots/locale/Button/Menu/fetch 直接渲染 client.js,可截图比对设计稿(Menu 替身只模拟 props 与行结构,卡片外观来自宿主基元,预览里不作为视觉依据) |
| serve.mjs | 预览用的本地服务:静态文件 + /api/image2/asset( 不走 fetch,必须有真实路由) |
| vendor/ | 预览页用的 React 18.3.1 UMD 构建(原本从 unpkg 拉,离线会白屏,现改为本地文件) |
| check-client.mjs | 无浏览器自检:中英词条是否对齐、代码里用到的 key 是否都存在、slot 是否注册 |
| empty.webp | 空态插图原图(600×499 透明) |
| empty-inline.webp | 实际内联的那份:缩到 400px 宽、WebP q84 |
| empty-dataurl.txt | 上面那份的 data URL |
| inline-art.mjs | 把 empty-dataurl.txt 写回 client.js 的 ART_EMPTY |
| fox.webp | 更早一版的空态插图,现已不用,仅留档 |
| shots/ | 截图:深色画廊、浅色画廊、深色空态、勾选与批量删除入口、工具条渐变、二次确认弹窗、设置弹窗、图像设置、画幅下拉、图标各尺寸;另有三张旧图兼作预览页里的历史缩略图 |
改完 client.js 想看效果,不必反复装插件:
node design/serve.mjs 39181
打开 http://127.0.0.1:39181/design/preview.html
?theme=light|dark、?lang=en|zh、?nokey=1(模拟未配置密钥,弹窗自动打开)、 ?empty=1(模拟空历史)。换了插图就跑一次 node design/inline-art.mjs。
这个预览页只替代宿主环境,不是插件的运行方式。
设置与历史存储
都在 $DSH_PROFILE_DIR/image2/(未设置该环境变量时回落到 ~/.dsh/image2/):
- settings.json — 写入时使用 0600 权限。API Key 只存在于这个文件与插件进程内存中:
- 接口永远不把 Key 回传给浏览器,只返回 hasApiKey 与形如 ••••abcd 的掩码。
- Key 在每次调用时重新读取,因此保存后立刻对下一次生成、image2_generate 与 image2_edit 生效,无需重启。
- 删除密钥:页面上的「删除密钥」,或直接删除该 settings.json。
- 除地址/模型/输出目录外,还存 size、quality、background 三个偏好(默认 16:9 / auto / auto);工具调用时显式传参优先,其次是这里的值,最后才是代码默认值。
- history.json — 画廊记录(最多 200 条,新的在前),每条含 id、绝对路径、媒体类型、字节数、提示词、模型改写、生成方式(generate / edit)与时间。文件损坏时按空画廊处理。
删除记录只改这个文件,图片本体留在原处。
注意
- 「测试连接」依赖接口实现 /models;部分兼容实现没有该路由,此时测试会报错,但不影响生成。
- 接口地址由使用者自己填写,插件只按 {接口地址}/images/generations 与 /images/edits 约定拼接;这是本机发起的出站请求,请只填写你信任的地址。
- 生成是慢请求(默认 180 秒超时),期间按钮处于禁用状态。
开发自测
- node smoke.mjs——在本机临时目录里起一个假的生图接口,跑通「设置读写 → 探测 → 生成落盘 → 历史/素材/ 删除 → 两个工具(含工作区 imgout 默认目录、multipart 改图)→ 各类错误分支」。它把 DSH_PROFILE_DIR 指向临时目录,因此不会碰真实配置,也不访问外网。
- node design/check-client.mjs——加载 client.js 的工厂函数(stub 掉 React 与 slots),检查中英词条键一致、无缺失/无冗余、main 与 sidebar.panellist 都已注册。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Mr-Maidong/dsh-plugin-image2
在侧栏生成与编辑图片,并让智能体调用绘图工具
相关插件 · 视觉能力
智能体工作台Devin-AXIS/iPolloWork
企业级、本地优先的智能体工作台,面向个人和智能体团队——一个工作区,容纳多个智能体引擎;一套统一体系,管理插件和技能;支…
★ 7,364已汉化DSH
72
开源设计工作台nexu-io/open-design
OpenDesign:首个协作式 AI 设计智能体工作区
★ 105,709已汉化DSH
71.8
GPT 图像提示词库freestylefly/awesome-gpt-image-2
Prompt as Code | GPT Image 2 / 2.5 提示词与案例库,530+ 个案例、20+…
★ 34,534已汉化DSH
71.5
多智能体编码工作区spacering-net/codeg
多智能体协作的 AI 编程工作区:汇总 Claude Code、Codex、OpenCode、Pi、Grok Build 等来源的会话。支持桌面应用、自托管服务器或 Docker。
★ 4,319已汉化DSH
71.5
AI 用量桌面小部件Javis603/token-monitor
EN | 简 | 繁 | KO | JA | PT
★ 3,533已汉化DSH
71.1
架构图生成器tt-a1i/archify
把你想理解、规划或分享的事,变成可以互动的可视化作品。
★ 93,105已汉化DSH
71.1
这是你的仓库?认领条目