49 lines
1.7 KiB
TypeScript
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: 'Qwen VL is not configured. Set COMFY_HOST or IMAGE_COMFY_HOST to Beast.'
|
|
})
|
|
}
|
|
|
|
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)
|
|
})
|