Add sidecar Qwen VL prompt recommend, fix queued shot bursts, and leave unused MiniMax identity slots empty.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
import { listPromptPresets } from '~/server/utils/promptPresets'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const owner = libraryOwnerKey(event)
|
||||
return {
|
||||
presets: listPromptPresets(owner).map(item => ({
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
description: item.description || '',
|
||||
builtin: Boolean(item.builtin),
|
||||
systemPrompt: item.systemPrompt
|
||||
}))
|
||||
}
|
||||
})
|
||||
@@ -0,0 +1,15 @@
|
||||
import { createPromptPreset, listPromptPresets } from '~/server/utils/promptPresets'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const body = await readBody<{ name?: string; systemPrompt?: string; description?: string }>(event).catch(() => ({}))
|
||||
const owner = libraryOwnerKey(event)
|
||||
const created = await createPromptPreset(owner, {
|
||||
name: body.name || '',
|
||||
systemPrompt: body.systemPrompt || '',
|
||||
description: body.description
|
||||
})
|
||||
return {
|
||||
preset: created,
|
||||
presets: listPromptPresets(owner)
|
||||
}
|
||||
})
|
||||
@@ -0,0 +1,12 @@
|
||||
import { deletePromptPreset, listPromptPresets } from '~/server/utils/promptPresets'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const id = getRouterParam(event, 'id')
|
||||
if (!id) throw createError({ statusCode: 400, statusMessage: 'Missing instruction set id' })
|
||||
const owner = libraryOwnerKey(event)
|
||||
await deletePromptPreset(owner, id)
|
||||
return {
|
||||
ok: true,
|
||||
presets: listPromptPresets(owner)
|
||||
}
|
||||
})
|
||||
@@ -0,0 +1,13 @@
|
||||
import { updatePromptPreset, listPromptPresets } from '~/server/utils/promptPresets'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const id = getRouterParam(event, 'id')
|
||||
if (!id) throw createError({ statusCode: 400, statusMessage: 'Missing instruction set id' })
|
||||
const body = await readBody<{ name?: string; systemPrompt?: string; description?: string }>(event).catch(() => ({}))
|
||||
const owner = libraryOwnerKey(event)
|
||||
const preset = await updatePromptPreset(owner, id, body)
|
||||
return {
|
||||
preset,
|
||||
presets: listPromptPresets(owner)
|
||||
}
|
||||
})
|
||||
@@ -0,0 +1,48 @@
|
||||
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)
|
||||
})
|
||||
@@ -0,0 +1,10 @@
|
||||
import { getPromptJob, promptJobSnapshot } from '~/server/utils/promptComfy'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const id = getRouterParam(event, 'id')
|
||||
const job = id ? getPromptJob(id) : undefined
|
||||
if (!job) {
|
||||
throw createError({ statusCode: 404, statusMessage: 'Recommend job not found' })
|
||||
}
|
||||
return promptJobSnapshot(job)
|
||||
})
|
||||
Reference in New Issue
Block a user