前言¶
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 给出两条理由,都来自实际调用的故障现象:
- 字段不对。旧插件发
seed、steps、negative_prompt、guidance_scale,OpenAI 官方 Images API 不认这些扩散模型参数,直接 400。本插件只发model/prompt/n/size/quality/output_format/background。 - 输出 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 的步骤:
- OpenAI API 密钥:粘贴
sk-...点「保存」,只写进 DSH 凭据库,不进配置文件。 - Roblox Open Cloud 密钥:在 Roblox Creator Dashboard 建 key,勾
assets的 Read + Write;群组密钥要求你是群组拥有者。 - 创作者类型 / 创作者 ID:发个人账号填 user id,发群组填 group id(纯数字,例如
726492544)。 - 启用 Roblox 上传:默认关闭,打开后工具才可用,而且每次上传仍会在对话里确认。
- 点「保存配置」即时生效,不需要重启;卡片里的「测试 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¶
上传本身分三步走:
- 在 Creator Dashboard → Open Cloud → API Keys 建 key,权限勾 assets(读 + 写),并允许你的 IP。
- 把 key 存成 DSH 凭据
ROBLOX_API_KEY。 - 插件设置里打开「启用 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之类参数报错或 schemanull报错打断过的人。 - 想把出图结果直接落到 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