Files
aigen/server/api/prompt/recommend.post.ts
T

49 lines
1.7 KiB
TypeScript

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<string, string> = {}
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)
})