Files

220 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# DSH 生图插件
为 **DeepSeek Harness(DSH)** 添加「设置 → 生图」页面和可在对话中直接调用的生图工具。支持自定义 OpenAI Images API 兼容接口、API Key 和模型,生成结果可在对话内预览,并保存原图。
## 功能
- **接口配置**:设置 Base URL 和 API Key,支持第三方兼容服务。
- **显式选择模型**:手动维护模型 ID,或从接口读取模型列表;可设置对话默认模型,也可以每次在对话中指定。
- **对话生图**:助手通过 `imagegen_status` 查询配置,通过 `imagegen_generate` 生成图片。
- **图片编辑**:对话工具 `imagegen_edit` 与「编辑图片」页面支持上传单张 PNG/JPEG/WebP,调用 `/images/edits`,保留输入原图并另存结果。
- **直接生成**:在「设置 → 生图 → 生成图片」中输入提示词、选择模型并生成。
- **图片输出**:支持 base64 和图片 URL 响应,提供图片预览与原图下载。
- **技能复用**:附带 imagegen 提示词规范和示例,并注册 DSH 专用的 `dsh-imagegen` 技能。
- **密钥隔离**:API Key 存入 DSH 凭据存储,按 Base URL 分开保存,不在配置查询中回显。
## 环境要求
- 已验证的 DSH 版本:**0.2.0-rc.2**,桌面版的 Web 界面。
- 安装目标需要提供 DSH 的插件管理、设置插槽、工具、凭据和图片附件服务。
- 一个支持 `POST /images/generations` 的 OpenAI Images API 兼容服务及有效 API Key。
- 从源码克隆安装需要 Git;运行测试建议 Node.js 24 或更新版本。
仓库已经包含可直接加载的 Host / Client 文件,**不需要编译前端、不需要安装 Python,也没有运行时第三方 npm 依赖**。其他 DSH 版本尚未验证。
## 安装
### 方式一:克隆到本地后安装(推荐)
1. 在本仓库页面复制克隆地址,克隆到一个长期保留的目录:
```sh
git clone https://git.crash.work/cneicy/dsh-imagegen.git dsh-imagegen
```
2. 打开 DSH 左侧的「插件」页面,使用安装入口,填写克隆目录的**绝对路径**。例如 Windows:
```text
D:\Plugins\dsh-imagegen
```
如果通过 DSH 助手安装,可以直接说:
> 请把 D:\Plugins\dsh-imagegen 作为插件包安装并启用。
对应的插件管理工具调用:
```json
{
"action": "install_bundle",
"target": "D:\\Plugins\\dsh-imagegen",
"enabled": true
}
```
3. 确认插件包 `dsh-imagegen-local` 已启用,然后打开「设置 → 生图」。启用后若入口没有出现,先刷新界面;如果安装结果提示需要重启,请重启 DSH。
本地目录可能以链接方式安装,安装后请保留该目录,不要移动或删除。
### 方式二:从 Git 地址安装
也可以在 DSH 的插件安装入口填写本仓库的 Git 安装地址:
```text
git+https://git.crash.work/cneicy/dsh-imagegen.git
```
插件管理器会下载仓库并安装,默认启用。若希望固定版本,可以使用 `#<提交哈希>` 后缀。此方式需要 DSH 所在环境能访问 Gitea,并可调用 Git。
> 仓库包名为 `dsh-imagegen-local`。本项目尚未发布到 npm,不能直接用 `npm install dsh-imagegen-local` 从公共注册表安装。
## 配置
打开 **设置 → 生图 → 接口设置**:
| 配置项 | 说明 |
| --- | --- |
| Base URL | API 根地址,例如 `https://api.openai.com/v1`;不要填写完整的 `/images/generations` 路径。 |
| API Key | 对应这个接口地址的密钥。保存后不回显;留空会保持已有密钥。 |
| 可选模型 | 每行填写一个完整、精确的模型 ID。名称是否可用取决于服务商。 |
| 对话默认模型 | 用户显式选定的默认模型;留空时,助手应先询问或使用本次对话明确指定的模型。 |
点击「保存设置」。保存接口与密钥后,可使用「从接口读取模型」,检查列表并再次保存。部分服务不提供 `/models`,或会同时返回聊天模型,此时手动填写可生图的模型 ID 即可。
更换 Base URL 后,需要为新地址配置密钥。勾选「清除这个地址已保存的密钥」并保存,才会删除该地址的凭据。不要把 API Key 发到聊天里。
## 使用
### 在对话中生图
配置完成后,直接对 DSH 助手描述图片:
> 用 gpt-image-2 生成一张雨夜霓虹街道,电影摄影风格,横版。
或者,在设置中已经选定默认模型时:
> 画一只趴在窗台上晒太阳的橘猫,柔和水彩风格。
模型名称仅作示例,以你的服务实际支持的模型为准。助手会调用插件,返回图片预览和保存路径。插件**不会自动更换模型,也不会自动重试收费请求**。
### 在设置页面直接生图
1. 进入「设置 → 生图 → 生成图片」。
2. 选择或输入本次生成模型。
3. 输入画面描述。
4. 按需展开尺寸、质量与数量设置。
5. 点击「生成图片」,完成后预览并下载原图。
### 编辑已有图片(1.1.0)
先确认服务商和所选模型支持 `POST /v1/images/edits`(`edits` 为复数;Base URL 已有 `/v1` 时只追加 `/images/edits`)。支持生图不代表支持编辑。
- **对话中**:上传图片,或指定已有图片的本机路径,例如「把这张图的背景改成海边,保持人物、衣服和姿势不变,用我设置的默认模型」。助手使用附件的本机路径调用 `imagegen_edit`。
- **设置页**:进入「设置 → 生图 → 编辑图片」,选择图片并预览,选择模型,输入修改要求,然后点击「编辑图片」。
- 输入仅支持一张 PNG/JPEG/WebP,最大 20 MiB;DSH 附件服务还会检查图片能否解码及部署的像素限制。暂不支持 GIF、蒙版或多图输入。
- 原图字节会发送到所配置的服务商;请求可能收费,失败不自动重试。输出另存为新文件,输入不会被覆盖。
- 对话附件可能已经过 DSH 缩放;要使用原始分辨率,请选择本机原文件或在设置页上传原文件。
工具参数示例(路径替换为实际存在的绝对路径):
```json
{
"image_path": "D:/Pictures/input.png",
"model": "gpt-image-2.5-sunburst",
"prompt": "只将背景改成夕阳下的海边,保持人物、衣服和姿势不变"
}
```
编辑工具复用生图的 `n`、`size`、`quality`、`background`、`output_format` 可选参数;是否支持由服务商决定。设置页通过 `POST /api/imagegen/edit` 提交 multipart 表单:`image` 为文件,`input` 为上述生成参数的 JSON(不包含 `image_path`)。浏览器路由只接收上传文件,不读取请求提供的本机路径。
### 对话工具
| 工具 | 用途 |
| --- | --- |
| `imagegen_status` | 返回 Base URL、是否已配置、候选模型、默认模型与输出目录;不返回密钥。 |
| `imagegen_generate` | 以明确的模型和提示词生成图片,并返回 DSH 图片附件及原图路径。 |
| `imagegen_edit` | 上传 `image_path` 指定的图片,按提示词编辑并返回新图片附件和路径。 |
生成参数示例:
```json
{
"model": "gpt-image-2",
"prompt": "一只趴在窗台上晒太阳的橘猫,柔和水彩风格",
"n": 1,
"size": "1024x1024"
}
```
必填参数是 `model`、`prompt`;`n` 默认为 1,范围为 1–4。可选参数还有 `size`、`quality`、`background`、`output_format`。这些参数是否可用取决于选定模型与服务商;未指定的可选参数不会额外发送。网页生成表单目前提供尺寸、质量和数量,背景与格式可通过对话工具设置。
## 数据保存
- 普通配置:`$DSH_HOME/imagegen/settings.json`。
- 生成原图:`$DSH_HOME/imagegen/outputs/`。
- 未设置 `DSH_HOME` 时,默认根目录为用户主目录下的 `.dsh`。
- API Key:由 DSH 凭据服务保存,不写入插件目录或上述普通配置文件。
- 对话预览:使用 DSH 持久化附件。预览可能被缩小,输出目录里的原图保留服务返回的原始字节。
使用插件会将提示词和生成参数发送到配置的服务商,并按其规则计费。请求最多等待 15 分钟,适用于 `gpt-image-2` 等处理较慢的模型;等待期间仍可手动取消。点击「停止等待」不能保证服务商已经取消生成或计费。
## 更新与卸载
- 本地克隆方式安装:在插件目录执行 `git pull --ff-only`,然后重启 DSH,以加载新的 Host / Client 代码。
- Git 地址方式安装:通过 DSH 插件管理器安装所需的新提交或版本,然后按提示重启。
- 在 DSH「插件」页面停用或卸载 `dsh-imagegen-local`。
- 卸载不会自动删除已保存的图片和凭据。如需清理密钥,请先在生图设置里清除对应地址的密钥,再卸载。
### 1.0.1 凭据兼容修复(从 1.0.0 升级必读)
1.0.0 曾将凭据名称写成 `dsh-imagegen:<SHA-256>`,不符合 DSH 的 `scope/id` 校验规则,可能导致凭据服务在下次启动时失败。1.0.1 统一使用 `imagegen-local/endpoint-<SHA-256>`;`endpoint-` 保证 ID 始终以字母开头,scope 与注册的 Host 插件名称一致。读、写、删除都使用同一格式。
- **DSH 已能启动**:先更新插件并重启 DSH,再在「设置 → 生图」重新保存 API Key。旧版配置的 Base URL、模型列表和原图不受影响。
- **DSH 因旧记录无法启动**:先退出 DSH,安全备份 `$DSH_HOME/.credentials.yaml`,只移出 `records` 下本插件的旧条目(`dsh-imagegen:<哈希>`,或曾手动改成的 `dsh-imagegen/<哈希>`),保留其他凭据和 YAML 结构;启动后更新插件,再重新保存 API Key。备份含密钥,请勿上传。
- 不要仅替换冒号:十六进制哈希可能以数字开头,仍不符合 ID 规则。
- 插件不会自动读取备份、恢复被移出的旧密钥,或直接改写全局凭据文件。凭据服务先于插件加载,启动被旧记录阻断时,插件自身无法执行迁移。
回归测试现在在每次凭据读写、删除及持久化重载时校验名称,并覆盖哈希首字符的全部 16 种情况。
## 常见问题
**出现 HTTP 401 / 403**:检查 API Key、Base URL 以及账号是否有该模型的权限。
**出现 HTTP 404**:检查地址是否包含服务商要求的 `/v1`,以及是否支持 Images API。不要把完整生成端点填进 Base URL。
**出现 HTTP 502 / 503 或超时**:通常是服务或网关暂时不可用。确认服务状态后手动重试;插件不会自动重试。单次网络操作最多等待 180 秒。
**模型列表读取失败**:可以手动填写模型,不要求服务必须支持 `/models`。
**模型不支持尺寸、质量或透明背景**:去掉不受支持的可选参数,或显式选择支持这些能力的模型。第三方服务也可能忽略某些参数。
**能否用参考图或修改已有图片?** 1.1.0 起支持单张图片加文字指令编辑,调用 `/images/edits`。暂不支持蒙版和多图输入。若编辑返回 404,请检查服务商是否提供该端点;插件不会自动降级成文生图。
## 开发与验证
```sh
node --test test/*.test.mjs
```
测试使用本地模拟 HTTP 服务和隔离的临时目录,不会访问付费生图接口。覆盖参数校验、模型选择、base64 / URL 返回、下载时不携带密钥、错误处理、取消、响应大小限制、设置与凭据隔离、图片附件和路径校验。
项目结构:
```text
lib/index.mjs Host 插件、设置路由、聊天工具和附件
lib/client.js DSH ModuleLoader 格式的设置界面
lib/engine.mjs Images API 请求与校验
skills/SKILL.md DSH 生图技能适配层
vendor/imagegen/ 上游 imagegen 技能与许可证
bundle.yaml DSH 插件安装补丁
test/ 本地模拟接口测试
```
接口响应与解码图片总量有 64 MiB 限制。网络引擎校验图片格式签名,DSH 附件服务负责进一步验证与预览处理。
## 技能来源与许可证
`vendor/imagegen/` 复用 OpenAI Codex 的 imagegen 技能资源,包含原始脚本、提示词参考、示例和 Apache-2.0 许可证。上游资源完整保留,DSH 的执行适配放在 `skills/SKILL.md` 中;插件本身通过原生 JavaScript 调用 Images API,不运行附带的 Python CLI。
本项目采用 Apache-2.0 许可证,详见 [LICENSE](LICENSE);第三方资源归属说明见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md)。