From 8c0b0d3a3b2a840c6386a318996e551ea12a0e63 Mon Sep 17 00:00:00 2001 From: justnodejs Date: Sat, 11 Apr 2026 16:31:23 +0800 Subject: [PATCH] fix(baoyu-imagine): tighten Replicate schema validation and model handling --- .../scripts/providers/replicate.test.ts | 13 ++++--- .../scripts/providers/replicate.ts | 34 +++++++++++++++---- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/skills/baoyu-imagine/scripts/providers/replicate.test.ts b/skills/baoyu-imagine/scripts/providers/replicate.test.ts index c255f6a..c98486e 100644 --- a/skills/baoyu-imagine/scripts/providers/replicate.test.ts +++ b/skills/baoyu-imagine/scripts/providers/replicate.test.ts @@ -111,7 +111,7 @@ test("Replicate input builder maps Seedream models to size-based schema", () => "A robot painter", "bytedance/seedream-4.5", makeArgs({ - quality: "2k", + size: "1536x1024", aspectRatio: "16:9", n: 4, }), @@ -119,8 +119,9 @@ test("Replicate input builder maps Seedream models to size-based schema", () => ), { prompt: "A robot painter", - size: "2K", - aspect_ratio: "16:9", + size: "custom", + width: 1536, + height: 1024, sequential_image_generation: "auto", max_images: 4, image_input: ["data:image/png;base64,AAAA"], @@ -207,7 +208,7 @@ test("Replicate input builder falls back to nano-banana schema for unknown model test("Replicate validation catches unsupported Seedream and Wan argument combinations", () => { assert.throws( () => validateArgs("bytedance/seedream-4.5", makeArgs({ size: "large" })), - /Seedream on Replicate requires --size/, + /Seedream 4.5 on Replicate requires --size/, ); assert.throws( @@ -215,6 +216,10 @@ test("Replicate validation catches unsupported Seedream and Wan argument combina /Seedream on Replicate requires --size to be one of 2K, 3K/, ); + assert.doesNotThrow( + () => validateArgs("bytedance/seedream-4.5", makeArgs({ size: "1536x1024" })), + ); + assert.throws( () => validateArgs("bytedance/seedream-4.5", makeArgs({ referenceImages: Array.from({ length: 15 }, () => "ref.png") })), /supports at most 14 reference images/, diff --git a/skills/baoyu-imagine/scripts/providers/replicate.ts b/skills/baoyu-imagine/scripts/providers/replicate.ts index dd8e4ef..b07becc 100644 --- a/skills/baoyu-imagine/scripts/providers/replicate.ts +++ b/skills/baoyu-imagine/scripts/providers/replicate.ts @@ -156,10 +156,21 @@ function buildSeedreamInput(prompt: string, model: string, args: CliArgs, refere const requestedSize = args.size || getSeedreamDefaultSize(model, args.quality); if (requestedSize) { - input.size = normalizePresetSize(requestedSize); + if (isSeedream45Model(model)) { + const parsed = parsePixelSize(requestedSize); + if (parsed) { + input.size = "custom"; + input.width = parsed.width; + input.height = parsed.height; + } else { + input.size = normalizePresetSize(requestedSize); + } + } else { + input.size = normalizePresetSize(requestedSize); + } } - if (args.aspectRatio) { + if (args.aspectRatio && input.size !== "custom") { input.aspect_ratio = args.aspectRatio; } @@ -217,11 +228,20 @@ export function validateArgs(model: string, args: CliArgs): void { const referenceCount = args.referenceImages.length; if (args.size) { - const normalizedSize = normalizePresetSize(args.size); - if (!getAllowedSeedreamSizes(model).has(normalizedSize)) { - throw new Error( - `Seedream on Replicate requires --size to be one of ${Array.from(getAllowedSeedreamSizes(model)).join(", ")}. Received: ${args.size}` - ); + if (isSeedream45Model(model)) { + const normalizedSize = normalizePresetSize(args.size); + if (!getAllowedSeedreamSizes(model).has(normalizedSize) && !parsePixelSize(args.size)) { + throw new Error( + `Seedream 4.5 on Replicate requires --size to be one of ${Array.from(getAllowedSeedreamSizes(model)).join(", ")} or custom dimensions like 1536x1024. Received: ${args.size}` + ); + } + } else { + const normalizedSize = normalizePresetSize(args.size); + if (!getAllowedSeedreamSizes(model).has(normalizedSize)) { + throw new Error( + `Seedream on Replicate requires --size to be one of ${Array.from(getAllowedSeedreamSizes(model)).join(", ")}. Received: ${args.size}` + ); + } } }