diff --git a/src/app/api/generate/providers/kie.ts b/src/app/api/generate/providers/kie.ts index f85e13c0..87fe2191 100644 --- a/src/app/api/generate/providers/kie.ts +++ b/src/app/api/generate/providers/kie.ts @@ -624,9 +624,12 @@ export async function submitKieTask( } } - // Handle image inputs (fallback - only if dynamicInputs didn't already set the image key) + // Handle image inputs (fallback - only if dynamicInputs didn't already handle any image key). + // If the schema-driven dynamic inputs already placed images into specific fields + // (e.g. reference_image_urls), don't also populate the default key — some models + // treat these fields as mutually exclusive and reject the request. const imageKey = getKieImageInputKey(modelId); - if (input.images && input.images.length > 0 && !handledImageKeys.has(imageKey)) { + if (input.images && input.images.length > 0 && handledImageKeys.size === 0) { const imageUrls: string[] = []; for (const image of input.images) { if (image.startsWith("http")) { diff --git a/src/app/api/models/[modelId]/route.ts b/src/app/api/models/[modelId]/route.ts index d8354bab..d4d7d83c 100644 --- a/src/app/api/models/[modelId]/route.ts +++ b/src/app/api/models/[modelId]/route.ts @@ -881,10 +881,10 @@ function getKieSchema(modelId: string): ExtractedSchema { ], inputs: [ { name: "prompt", type: "text", required: false, label: "Prompt" }, - { name: "first_frame_url", type: "image", required: true, label: "First Frame", description: "Starting frame of the generated video." }, - { name: "last_frame_url", type: "image", required: false, label: "Last Frame", description: "Optional end frame — the video interpolates between first and last." }, - { name: "reference_image_urls", type: "image", required: false, isArray: true, label: "Reference Images", description: "Up to 9 supplementary reference images for style/subject guidance." }, - { name: "reference_video_urls", type: "image", required: false, isArray: true, label: "Reference Videos", description: "Up to 3 reference videos (uses image handle; accepts video data URLs)." }, + { name: "first_frame_url", type: "image", required: false, label: "First Frame", description: "Starting frame. Mutually exclusive with Reference Images." }, + { name: "last_frame_url", type: "image", required: false, label: "Last Frame", description: "Optional end frame — interpolates from First to Last. Mutually exclusive with Reference Images." }, + { name: "reference_image_urls", type: "image", required: false, isArray: true, label: "Reference Images", description: "Up to 9 reference images for style/subject guidance. Mutually exclusive with First/Last Frame." }, + { name: "reference_video_urls", type: "image", required: false, isArray: true, label: "Reference Videos", description: "Up to 3 reference videos (accepts video data URLs over the image handle)." }, { name: "reference_audio_urls", type: "audio", required: false, isArray: true, label: "Reference Audio", description: "Up to 3 reference audio clips." }, ], }, @@ -910,10 +910,10 @@ function getKieSchema(modelId: string): ExtractedSchema { ], inputs: [ { name: "prompt", type: "text", required: false, label: "Prompt" }, - { name: "first_frame_url", type: "image", required: true, label: "First Frame", description: "Starting frame of the generated video." }, - { name: "last_frame_url", type: "image", required: false, label: "Last Frame", description: "Optional end frame — the video interpolates between first and last." }, - { name: "reference_image_urls", type: "image", required: false, isArray: true, label: "Reference Images", description: "Up to 9 supplementary reference images for style/subject guidance." }, - { name: "reference_video_urls", type: "image", required: false, isArray: true, label: "Reference Videos", description: "Up to 3 reference videos (uses image handle; accepts video data URLs)." }, + { name: "first_frame_url", type: "image", required: false, label: "First Frame", description: "Starting frame. Mutually exclusive with Reference Images." }, + { name: "last_frame_url", type: "image", required: false, label: "Last Frame", description: "Optional end frame — interpolates from First to Last. Mutually exclusive with Reference Images." }, + { name: "reference_image_urls", type: "image", required: false, isArray: true, label: "Reference Images", description: "Up to 9 reference images for style/subject guidance. Mutually exclusive with First/Last Frame." }, + { name: "reference_video_urls", type: "image", required: false, isArray: true, label: "Reference Videos", description: "Up to 3 reference videos (accepts video data URLs over the image handle)." }, { name: "reference_audio_urls", type: "audio", required: false, isArray: true, label: "Reference Audio", description: "Up to 3 reference audio clips." }, ], },