dsh-openai-image:給 DSH 接上 OpenAI Images 2.6 的出圖與 Roblox 資產上傳

前言

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

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

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

小夜