yyfabab1/dsh-gpt-image ↗★ 1

@dsh-external/dsh-gpt-image

AI 生图/生视频全流水线插件(DeepSeek Harness):文生图 · 图生图/局部重绘 · 异步视频(含导入本地图片)· 像素画净化与真像素判定 · 素材规格即代码 · 自检/装机/登记 · 批量与去重 · 花钱闸门与免费档独立记账 · 27 个工具 + 侧栏 4 页。零依赖。 适合需要进行文生图、图生图、视频生成及批量素材管理的多媒体任务。

패키지
@dsh-external/dsh-gpt-image
호환성
미검증
버전
1.2.1
라이선스
MIT
최근 업데이트
2026. 10. 18.

설치

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:yyfabab1/dsh-gpt-image

配置 · Configuration

三种方式等价:

  1. 面板:/gpt-image → 配置 → 填 baseUrl / Key / 模型 / apiMode → 保存
  2. 工具:_dsh_external_dsh_gpt_image_config(set_profile / set_active / import / export / test / set_output)
  3. 文件:~/.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 与显示名
provideropenai / sb2api-async / fal,或 customProviders[].id
baseUrl接口根地址;不带 /v1 会自动补(404 时自动重试另一种)
apiKey / model / apiMode密钥 / 模型 id / images(默认)或 responses
pricePerImage该档单价(元/张)。免费档写 0 → 不触发确认锁、不吃日预算。不写则用全局单价
responseFormatB64Jsontrue 时给请求体加 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 与显示名
provideropenai / sb2api-async / fal,或 customProviders[].id
baseUrl接口根地址;不带 /v1 会自动补(404 时自动重试另一种)
apiKey / model / apiMode密钥 / 模型 id / images(默认)或 responses
pricePerImage该档单价(元/张)。免费档写 0 → 不触发确认锁、不吃日预算。不写则用全局单价
responseFormatB64Jsontrue 时给请求体加 response_format: "b64_json"(部分中转站需要)
retries同步接口瞬时故障重试次数(也在工具入参上,默认 2)

自定义字段(如 pricePerImage)会被完整保留,不会在 import/保存时被丢掉。

配置档不用你操心(这一条修的就是那个报错)

以前把它当成错误抛出来:

失败:配置档 agnes-2.5-flash(provider=agnes)不是视频服务商。
      在 profiles.json 里加一个 provider 为 "agnes-video" 的配置档…

这对用户毫无帮助 —— 他只想用同一个 Agnes Key 生成一段视频。现在自动解析(resolveVideoProfile):

  1. 指名的档就是视频档 → 用它
  2. 配置里已有视频档 → 自动换过去,并说明「已自动改用 xxx」
  3. 一个视频档都没有,但手上有同域名的图片档(同一个 baseUrl / Key)→ 就地派生一个视频档并落盘
  4. 中转站域名跟 apihub 不同、光靠域名永远匹配不上 → 在图片档上声明 videoProvider 即可:
    { "id": "agnes-relay", "baseUrl": "https://my-relay.example.com/v1",
      "apiKey": "sk-…", "model": "agnes-image-2.5-flash",
      "videoProvider": "agnes-video" }   // ← 声明视频对应关系
    
  5. 域名对不上且没声明 → 不硬派生(免得把别家的 Key 拿去调 Agnes),给出可执行的提示

派生的档是普通配置档,config 工具 action=remove_profile 就能删,完全可逆。