fix(baoyu-imagine): tighten Replicate schema validation and model handling

This commit is contained in:
justnodejs 2026-04-11 16:31:23 +08:00
parent 0ec35bf930
commit 8c0b0d3a3b
2 changed files with 36 additions and 11 deletions

View File

@ -111,7 +111,7 @@ test("Replicate input builder maps Seedream models to size-based schema", () =>
"A robot painter", "A robot painter",
"bytedance/seedream-4.5", "bytedance/seedream-4.5",
makeArgs({ makeArgs({
quality: "2k", size: "1536x1024",
aspectRatio: "16:9", aspectRatio: "16:9",
n: 4, n: 4,
}), }),
@ -119,8 +119,9 @@ test("Replicate input builder maps Seedream models to size-based schema", () =>
), ),
{ {
prompt: "A robot painter", prompt: "A robot painter",
size: "2K", size: "custom",
aspect_ratio: "16:9", width: 1536,
height: 1024,
sequential_image_generation: "auto", sequential_image_generation: "auto",
max_images: 4, max_images: 4,
image_input: ["data:image/png;base64,AAAA"], 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", () => { test("Replicate validation catches unsupported Seedream and Wan argument combinations", () => {
assert.throws( assert.throws(
() => validateArgs("bytedance/seedream-4.5", makeArgs({ size: "large" })), () => validateArgs("bytedance/seedream-4.5", makeArgs({ size: "large" })),
/Seedream on Replicate requires --size/, /Seedream 4.5 on Replicate requires --size/,
); );
assert.throws( 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/, /Seedream on Replicate requires --size to be one of 2K, 3K/,
); );
assert.doesNotThrow(
() => validateArgs("bytedance/seedream-4.5", makeArgs({ size: "1536x1024" })),
);
assert.throws( assert.throws(
() => validateArgs("bytedance/seedream-4.5", makeArgs({ referenceImages: Array.from({ length: 15 }, () => "ref.png") })), () => validateArgs("bytedance/seedream-4.5", makeArgs({ referenceImages: Array.from({ length: 15 }, () => "ref.png") })),
/supports at most 14 reference images/, /supports at most 14 reference images/,

View File

@ -156,10 +156,21 @@ function buildSeedreamInput(prompt: string, model: string, args: CliArgs, refere
const requestedSize = args.size || getSeedreamDefaultSize(model, args.quality); const requestedSize = args.size || getSeedreamDefaultSize(model, args.quality);
if (requestedSize) { 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; input.aspect_ratio = args.aspectRatio;
} }
@ -217,11 +228,20 @@ export function validateArgs(model: string, args: CliArgs): void {
const referenceCount = args.referenceImages.length; const referenceCount = args.referenceImages.length;
if (args.size) { if (args.size) {
const normalizedSize = normalizePresetSize(args.size); if (isSeedream45Model(model)) {
if (!getAllowedSeedreamSizes(model).has(normalizedSize)) { const normalizedSize = normalizePresetSize(args.size);
throw new Error( if (!getAllowedSeedreamSizes(model).has(normalizedSize) && !parsePixelSize(args.size)) {
`Seedream on Replicate requires --size to be one of ${Array.from(getAllowedSeedreamSizes(model)).join(", ")}. Received: ${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}`
);
}
} }
} }