@dsh-external/dsh-gpt-image
AI 生图/生视频全流水线插件(DeepSeek Harness):文生图 · 图生图/局部重绘 · 异步视频(含导入本地图片)· 像素画净化与真像素判定 · 素材规格即代码 · 自检/装机/登记 · 批量与去重 · 花钱闸门与免费档独立记账 · 27 个工具 + 侧栏 4 页。零依赖。 适合需要进行文生图、图生图、视频生成及批量素材管理的多媒体任务。
Install
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:yyfabab1/dsh-gpt-imageREADME
Read the full README ↗配置 · Configuration
三种方式等价:
- 面板:
/gpt-image→ 配置 → 填 baseUrl / Key / 模型 / apiMode → 保存 - 工具:
_dsh_external_dsh_gpt_image_config(set_profile/set_active/import/export/test/set_output) - 文件:
~/.dsh/gpt-image/profiles.json
{
"activeProfileId": "sealin-relay",
"outputDir": "D:\\AHC\\aishengtu图片地址",
"customProviders": [],
"profiles": [
{
"id": "sealin-relay",
"name": "中转站",
"provider": "openai",
"baseUrl": "https://sub-proxy-us.65535.space/v1",
"apiKey": "sk-...",
"model": "gpt-image-2.5-sunburst",
"apiMode": "images"
}
]
}
从 Playground 迁移:把它的 gpt-image-config.json 内容直接丢给 config 的 import:
{ "customProviders": [], "profiles": [{ "id": "x", "provider": "openai", "baseUrl": "https://.../v1", "apiKey": "sk-...", "model": "gpt-image-2" }] }
配置档字段
| 字段 | 说明 |
|---|---|
id / name | 配置档 id 与显示名 |
provider | openai / sb2api-async / fal,或 customProviders[].id |
baseUrl | 接口根地址;不带 /v1 会自动补(404 时自动重试另一种) |
apiKey / model / apiMode | 密钥 / 模型 id / images(默认)或 responses |
pricePerImage | 该档单价(元/张)。免费档写 0 → 不触发确认锁、不吃日预算。不写则用全局单价 |
responseFormatB64Json | true 时给请求体加 response_format: "b64_json"(部分中转站需要) |
retries | 同步接口瞬时故障重试次数(也在工具入参上,默认 2) |
自定义字段(如
pricePerImage)会被完整保留,不会在import/保存时被丢掉。
内置示例:Agnes Image 2.5 Flash
官方目前免费(1K/2K/3K/4K 与参考图 $0),接口是标准 OpenAI Images API, 但有两处差异,所以用自定义 provider 模板接:
size用档位(1K/2K/3K/4K),要配合ratio才可预期;精确尺寸会被就近归一化response_format必须嵌在extra_body里(放顶层直接报错)- 没有 mask 参数 → 不支持局部重绘(传了会被显式拒绝,不会静默整图重画)
现成配置见 examples/agnes-config.json:
{
"customProviders": [{
"id": "agnes",
"submit": {
"path": "images/generations",
"body": {
"model": "$profile.model", "prompt": "$prompt",
"size": "$params.size", "ratio": "$params.ratio",
"extra_body": { "response_format": "url" }
}
},
"editSubmit": {
"path": "images/generations",
"body": {
"model": "$profile.model", "prompt": "$prompt",
"size": "$params.size", "ratio": "$params.ratio",
"extra_body": { "image": "$inputImages.dataUrls", "response_format": "url" }
}
},
"result": { "imageUrlPaths": ["data.*.url"], "b64JsonPaths": ["data.*.b64_json"] },
"supports": { "text2image": true, "image2image": true, "mask": false, "async": false }
}],
"profiles": [{
"id": "agnes-2.5-flash", "provider": "agnes", "model": "agnes-image-2.5-flash",
"baseUrl": "https://apihub.agnes-ai.com/v1", "apiKey": "",
"apiMode": "images", "pricePerImage": 0
}]
}
导入:config 工具 action=import + path 指向该文件,然后 set_active。
ratio 与档位 size 的实际输出(已实测):1K + 1:1→1024×1024,9:16→736×1312,
16:9→1312×736,3:4→864×1152;2K 为对应尺寸翻倍。
配置档字段
| 字段 | 说明 |
|---|---|
id / name | 配置档 id 与显示名 |
provider | openai / sb2api-async / fal,或 customProviders[].id |
baseUrl | 接口根地址;不带 /v1 会自动补(404 时自动重试另一种) |
apiKey / model / apiMode | 密钥 / 模型 id / images(默认)或 responses |
pricePerImage | 该档单价(元/张)。免费档写 0 → 不触发确认锁、不吃日预算。不写则用全局单价 |
responseFormatB64Json | true 时给请求体加 response_format: "b64_json"(部分中转站需要) |
retries | 同步接口瞬时故障重试次数(也在工具入参上,默认 2) |
自定义字段(如
pricePerImage)会被完整保留,不会在import/保存时被丢掉。
配置档不用你操心(这一条修的就是那个报错)
以前把它当成错误抛出来:
失败:配置档 agnes-2.5-flash(provider=agnes)不是视频服务商。
在 profiles.json 里加一个 provider 为 "agnes-video" 的配置档…
这对用户毫无帮助 —— 他只想用同一个 Agnes Key 生成一段视频。现在自动解析(resolveVideoProfile):
- 指名的档就是视频档 → 用它
- 配置里已有视频档 → 自动换过去,并说明「已自动改用 xxx」
- 一个视频档都没有,但手上有同域名的图片档(同一个
baseUrl/Key)→ 就地派生一个视频档并落盘 - 中转站域名跟
apihub不同、光靠域名永远匹配不上 → 在图片档上声明videoProvider即可:{ "id": "agnes-relay", "baseUrl": "https://my-relay.example.com/v1", "apiKey": "sk-…", "model": "agnes-image-2.5-flash", "videoProvider": "agnes-video" } // ← 声明视频对应关系 - 域名对不上且没声明 → 不硬派生(免得把别家的 Key 拿去调 Agnes),给出可执行的提示
派生的档是普通配置档,config 工具 action=remove_profile 就能删,完全可逆。