dsh-openai-image: Connecting DSH to OpenAI Images 2.6 for image generation and Roblox asset uploads

前言

DSH 生态里「一切皆插件」,出图这类能力也由社区插件提供。但常见的 DSH 出图插件走的是「OpenAI 兼容」路线,会把 seed、steps、negative_prompt、guidance_scale 这些扩散模型参数一起发给官方接口,结果第一张图就报错:

HTTP 400: Unknown parameter: 'seed'.

本文介绍的插件只发 OpenAI Images API 文档里存在的字段,并在输出 schema 里避免了 null 对象字段。它由 yangshulin2333 维护,是在社区目录 SkillHub 上收录的一个模型推理类插件,定位很窄:把 GPT-Image-2.6 的出图、改图和 Roblox 资源上传三件事做准。

插件概况

插件名 yangshulin2333/dsh-openai-image,包名 @yangshulin2333/dsh-openai-image,托管在 GitHub,MIT 许可证,当前版本 0.4.6,要求 Node >= 20。对 DSH 的 peerDependencies 为:

"@deepseek-ai/cordis": "^4.0.1",
"@deepseek-ai/dsh-tools": "^0.1.7-rc.2 || ^0.2.0-rc.1 || ^0.2.0-rc.2",
"@deepseek-ai/schemastery": "^0.1.0 || ^0.2.0"

它注册三个工具,形成一条「出图 → 改图 → 上传」的链路:

image_generate  →  出图(flare / sunburst,Roblox 预设)
image_edit      →  改图(多图输入 + 可选 mask)
roblox_upload   →  传到 Roblox,拿 rbxassetid://(默认关闭,需用户确认)

底层直接打官方 /v1/images/generations 和 /v1/images/edits,没有自己造的兼容层。

为什么不用现成的图片插件

README 给出两条理由,都来自实际调用的故障现象:

  1. 字段不对。旧插件发 seed、steps、negative_prompt、guidance_scale,OpenAI 官方 Images API 不认这些扩散模型参数,直接 400。本插件只发 model / prompt / n / size / quality / output_format / background。
  2. 输出 schema 有 null 对象字段。另一种常见故障是图已经存好了,工具却报 "value.router" must be an object。本插件保证输出 schema 里没有 null 对象字段。

如果你原来装的插件出现过这两种报错,可以在一个不心疼的会话里换成这个插件验证。

安装

从 GitHub 安装,装完重启 DSH,因为 bundle 补丁在启动时加载:

# 从 GitHub(推荐)
dsh plugin add github:yangshulin2333/dsh-openai-image

# 或者装到某个 profile
dsh plugin --profile web add github:yangshulin2333/dsh-openai-image

也可以手动放进 profile 的依赖:

cd ~/.dsh/profiles/desktop
pnpm add @yangshulin2333/dsh-openai-image

配置

装好之后在左侧栏「插件」面板里点开 @yangshulin2333/dsh-openai-image,页面正文就是配置卡片。按 README 的步骤:

  1. OpenAI API 密钥:粘贴 sk-... 点「保存」,只写进 DSH 凭据库,不进配置文件。
  2. Roblox Open Cloud 密钥:在 Roblox Creator Dashboard 建 key,勾 assets 的 Read + Write;群组密钥要求你是群组拥有者。
  3. 创作者类型 / 创作者 ID:发个人账号填 user id,发群组填 group id(纯数字,例如 726492544)。
  4. 启用 Roblox 上传:默认关闭,打开后工具才可用,而且每次上传仍会在对话里确认。
  5. 点「保存配置」即时生效,不需要重启;卡片里的「测试 OpenAI 连接」「测试 Roblox 连接」直接验证 key 是否被接受。

适合团队预置时跳过界面,直接写进 profile 的 cordis.patch.yml:

- id: dsh-openai-image
  name: "@yangshulin2333/dsh-openai-image"
  config:
    model: gpt-image-2.6-flare
    robloxEnabled: true
    robloxCreatorType: group
    robloxCreatorId: "123456789"

字段与默认值:

字段 默认值 说明
启用 true 总开关
凭证名称 OPENAI_API_KEY DSH 凭据库或环境变量里的名字
API 地址 https://api.openai.com/v1 走代理时改这里
默认模型 gpt-image-2.6-flare 快;gpt-image-2.6-sunburst 画质更好
默认尺寸 1024x1024 另支持 1536x1024、1024x1536
默认画质 auto low / medium / high
输出目录 generated-images 相对当前会话工作目录
提示词后缀 空 追加到每个 prompt 末尾,适合项目统一风格
默认预设 空 见下方预设表
启用 Roblox 上传 false 打开后 roblox_upload 才可用
Roblox 凭证名称 ROBLOX_API_KEY 带 assets 权限的 Open Cloud API key
Roblox creator 类型 / id user / 空 个人资产填 userId,组资产填 groupId
Roblox 资产类型 Decal 或 Image

三个工具的用法

image_generate

参数与官方 API 对齐,另外加了几项本地落盘和 GIF/SVG 相关的扩展:

参数 说明
prompt(必填) 画面描述
preset Roblox 预设名,自动补尺寸/格式/约束
model / size / aspect_ratio / quality / count / output_format / background 与官方 API 一致(count 1-10,size 任意 宽x高,两边须被 16 整除、最长边 ≤ 3840)
frame_count GIF 帧数(2-16,默认 6),只在 output_format: gif 时生效
gif_fps 生成后把 GIF 改成这个帧率(1-50);接口原始是 5fps
svg_model 生成 SVG 的文本模型(默认 gpt-6.1-sol),只在 output_format: svg 时生效
moderation / output_compression / user 安全过滤 auto|low、jpeg/webp 压缩 0-100、调用方用户标识
output_name / output_dir 落盘位置

输出格式分三类,选错会走不通:

  • png / jpeg / webp 是普通静图。
  • gif 是循环动图。接口把动画做成一张雪碧图再切片,所以尺寸只能是 256x256 或 512x512,帧数 2-16。
  • svg 是矢量图,由文本模型写代码生成,size / quality 不生效。想改线条就在提示词里描述。

image_edit

参数 说明
prompt(必填) 要改什么;做动画时按「第 1 帧…第 2 帧…」描述分镜
image(必填) 源图路径,多张用逗号分隔(最多 16 张,内部用 image[] 数组语法提交)
mask 可选 PNG 蒙版(必须是带 alpha 通道的 RGBA PNG),透明区域即重绘区域
output_format png / jpeg / webp / gif;gif 可以用一张现成图生成动画,svg 不支持(编辑接口不出矢量)
frame_count / gif_fps 同上,只在 gif 时生效
其余 同 image_generate(preset 也可用)

一个能直接用的场景是:已经出好了主体图,用 image_edit 加 mask 只重绘指定区域,输出同尺寸的新图。

roblox_upload

参数 说明
image(必填) 本地 png/jpg/bmp/tga
confirm(可选) 不传时只返回计划摘要(confirm_required);用户明确同意后再传 true
display_name / description 资产名(≤50 字)/ 描述
asset_type / creator_type / creator_id 覆盖设置里的默认值

调 roblox_upload({ image }) 会先拿到一份上传计划;确认后传 confirm: true 才真正发。这个过程是插件刻意加的确认门槛,不是 bug。

Roblox 预设

七套预设都只是「提示词约束 + 尺寸 + 格式」,不做任何后处理,结果里会返回完整 prompt,方便复制出来手工复现:

预设 尺寸 用途
game_icon 1024×1024 游戏图标,150px 下仍可辨认
thumbnail 1536×1024 缩略图 / 宣传图,主体靠右留标题位
gamepass 1024×1024 通行证 / 商品图标
badge 1024×1024 成就徽章
decal 1024×1024(透明) 通用贴花
ui_9slice 1024×1024 九宫格面板,附 sliceHint
seamless_texture 1024×1024 无缝平铺材质

调用时 preset 填预设名即可,例如给游戏做一张宣传图用 thumbnail。

Roblox 上传与放进 place

上传本身分三步走:

  1. 在 Creator Dashboard → Open Cloud → API Keys 建 key,权限勾 assets(读 + 写),并允许你的 IP。
  2. 把 key 存成 DSH 凭据 ROBLOX_API_KEY。
  3. 插件设置里打开「启用 Roblox 上传」,填 robloxCreatorId(个人账号在 users 资料页里的数字)。

上传限制来自官方 Assets API:png/jpeg/bmp/tga、小于 8000×8000 px、≤ 20 MB、资产不可更新(改图等于新资产,所以文件名带时间戳)。上传是异步的,插件轮询 operation 直到 done,返回 assetId、rbxassetid://、moderationState,并把结果写进图片旁边的 .json sidecar。

拿到 rbxassetid:// 之后,插件不碰 Studio,交给 Roblox Studio MCP:

cmd.exe /c %LOCALAPPDATA%\Roblox\mcp.bat   # Windows 下的 stdio MCP server 命令

在 Studio 的 Assistant → ⋯ → Manage MCP Servers 里勾选 Enable Studio as MCP server,然后在 DSH 里挂一个 stdio MCP server。接着让 agent 用 rbxassetid://<id> 建 ImageLabel / Decal,或用 Luau 的 Datatype.Content.fromAssetId(id)。

速度与成本

README 给出的实测(1024×1024,单张,含下载,2026-11,api.openai.com):

模型 / 画质 耗时
gpt-image-2.6-flare / low ≈ 6.1 s
gpt-image-2.6-flare / medium ≈ 7.4 s
gpt-image-2.6-sunburst / low ≈ 16.7 s

计价与 Images 2.5 持平:出图 $30 / 1M image token,参考图输入 $8 / 1M,文本输入 $5 / 1M。做图标、贴花这类日常资产,flare + low 够用;需要细节时再上 sunburst。

排错

现象 原因 / 处理
HTTP 401: Missing bearer or basic authentication 凭证名对不上:确认设置里的凭证名称就是凭据库里的名字
HTTP 400: Unknown parameter: 'seed' 你装的是走 custom provider 的旧插件;本插件不会发这些字段
HTTP 403 / Invalid scope Roblox key 没有 assets 读+写权限,或 IP 白名单没放行
robloxCreatorId is empty 设置里填 userId / groupId
工具报 must be an object 但图已生成 输出 schema 里出现了 null 对象字段,属于 bug,开 issue
传了图但游戏里不显示 审核还没过(看 moderationState),或者资产是不可更新的旧 version

代码结构与测试

源码结构如下,改动前可以按文件定位:

index.js              # apply(ctx, config):注册三个工具
cordis.patch.yml      # bundle 补丁(默认配置)
lib/config.js         # 配置 schema + 归一化
lib/presets.js        # Roblox 预设
lib/openai.js         # Images API 客户端 + 落盘
lib/roblox.js         # Open Cloud 上传 + 校验
lib/tools/*.js        # 三个工具
test/*.test.js        # node:test 单元测试

本地跑测试和打包预演:

npm test        # 31 个纯函数单元测试,不联网
npm run pack:dry

适用场景与注意

适合这几类人:

  • 在 DSH 里用 Roblox 做游戏资产,需要图标、贴花、缩略图、徽章等预设尺寸的智能体开发者。
  • 已经用过其他出图插件、被 seed 之类参数报错或 schema null 报错打断过的人。
  • 想把出图结果直接落到 Roblox 资产库、拿到 rbxassetid:// 的人。

几点注意:

  • 插件以当前 DSH 进程的权限运行,安装前应读一遍源码并确认许可证(MIT)再接入。
  • Roblox 上传默认关闭,打开后每次上传仍要对话确认,不要把 confirm 自动化掉。
  • 群组的 Open Cloud key 要求调用者是群组拥有者;IP 白名单没有放行会导致 403。
  • 该仓库在 GitHub 上目前没有 star,属于个人维护项目,长期可用性取决于维护者节奏。仓库更新、issue 反馈建议走 GitHub。

小结

这个插件的价值不在于加了一个新能力,而在于把出图链路做窄做准:只发官方字段、schema 干净、预设只做尺寸与提示词约束、上传前有确认门槛。如果你需要 Roblox 资源和 GPT-Image-2.6 出图,值得试一次。

目录页:https://www.skillhub.cn/plugins/yangshulin2333/dsh-openai-image
GitHub:https://github.com/yangshulin2333/dsh-openai-image

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye