diff --git a/src/app/api/generate/providers/fal.ts b/src/app/api/generate/providers/fal.ts index 95f43852..30a10a2b 100644 --- a/src/app/api/generate/providers/fal.ts +++ b/src/app/api/generate/providers/fal.ts @@ -288,6 +288,13 @@ export async function generateWithFalQueue( } } Object.assign(requestBody, filteredInputs); + + // Ensure prompt is included even when dynamicInputs are present + // (executor sends prompt as top-level field, not in dynamicInputs) + const promptParam = paramMap.prompt || "prompt"; + if (input.prompt && !requestBody[promptParam]) { + requestBody[promptParam] = input.prompt; + } } else { // Fallback: use schema to map generic input names to model-specific parameter names if (input.prompt) { diff --git a/src/app/api/generate/providers/replicate.ts b/src/app/api/generate/providers/replicate.ts index d292c5bd..7daeaae5 100644 --- a/src/app/api/generate/providers/replicate.ts +++ b/src/app/api/generate/providers/replicate.ts @@ -76,7 +76,7 @@ export async function generateWithReplicate( if (hasDynamicInputs) { // Apply coerced parameters first, then dynamic inputs override Object.assign(predictionInput, coerceParameterTypes(input.parameters, parameterTypes)); - const { schemaArrayParams } = getInputMappingFromSchema(schema); + const { paramMap, schemaArrayParams } = getInputMappingFromSchema(schema); // Apply array wrapping based on schema type for (const [key, value] of Object.entries(input.dynamicInputs!)) { @@ -90,6 +90,13 @@ export async function generateWithReplicate( } } } + + // Ensure prompt is included even when dynamicInputs are present + // (executor sends prompt as top-level field, not in dynamicInputs) + const promptParam = paramMap.prompt || "prompt"; + if (input.prompt && !predictionInput[promptParam]) { + predictionInput[promptParam] = input.prompt; + } } else { // Fallback: use schema to map generic input names to model-specific parameter names const { paramMap, arrayParams } = getInputMappingFromSchema(schema);