import { promptComfyConfigured, createPromptJob, runPromptRecommend, failPromptJob, promptJobSnapshot } from '~/server/utils/promptComfy' import { getPromptPreset } from '~/server/utils/promptPresets' export default defineEventHandler(async (event) => { if (!promptComfyConfigured()) { throw createError({ statusCode: 503, statusMessage: 'Sidecar Qwen VL is not configured. Set IMAGE_COMFY_HOST.' }) } const form = await readMultipartFormData(event).catch(() => null) if (!form?.length) { throw createError({ statusCode: 400, statusMessage: 'Expected an image and a draft prompt' }) } const fields: Record = {} let image: { filename: string; data: Buffer; type?: string } | null = null for (const part of form) { if (part.name === 'image' && part.filename && part.data?.length) { image = { filename: part.filename, data: part.data, type: part.type } } else if (part.name && part.data) { fields[part.name] = part.data.toString('utf8') } } if (!image) { throw createError({ statusCode: 400, statusMessage: 'Load a still before recommending a prompt' }) } const draftPrompt = (fields.prompt || '').trim() if (!draftPrompt) { throw createError({ statusCode: 400, statusMessage: 'Type a draft prompt to enhance' }) } const owner = libraryOwnerKey(event) const preset = getPromptPreset(owner, fields.presetId || 'enhance') const mode = ['edit', 'shot-script', 'video'].includes(fields.mode) ? fields.mode : 'video' const job = createPromptJob() void runPromptRecommend(job, { image, draftPrompt, systemPrompt: preset.systemPrompt, mode }).catch(error => failPromptJob(job, error)) return promptJobSnapshot(job) })