Files
drawing/server/api/drawing.ts
2023-03-03 09:45:59 +08:00

70 lines
3.8 KiB
TypeScript

import axios from 'axios'
export default defineEventHandler(async event => {
// 获取任务列表的状态进度(普通用户只能看到自己的)
if (event.node.req.method === 'GET') {
let {status, model, uid, bot} = getQuery(event)
let tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:')))
tasks = await Promise.all(tasks.map(async (key: any) => await useStorage().getItem(key))) // 读取所有任务的数据
tasks.sort((a: any, b: any) => a.createdAt - b.createdAt) // 按照创建时间排序
if (tasks.length === 0) return [] // 如果没有任务,直接返回空数组
if (status) tasks = tasks.filter((task: any) => task.status === status) // 筛选出指定状态的任务
if (model) tasks = tasks.filter((task: any) => task.model === model) // 筛选出指定model的任务
if (uid) tasks = tasks.filter((task: any) => task.uid === uid) // 筛选出指定用户的任务
if (bot) {
tasks = tasks.filter((task: any) => task.model === tasks[0].model) // 筛选出首位model的任务
tasks.forEach(async (task: any) => {
task.status = 'processing'
await useStorage().setItem(`task:${task.id}`, task)
})
}
return tasks
}
// 翻译中文到英文
const translate = async (text: string, callback:Function) => {
if (!/^[a-zA-Z]+$/.test(text)) return text
text = encodeURIComponent(text)
const {data} = await axios.get(`http://139.224.128.24:7861//api/text_to_text?zh=${text}`)
if (callback) callback(data.en)
return data.en
}
// 添加任务到队列(生成一个32位随机字符串作为任务ID)
if (event.node.req.method === 'POST') {
let {
model = 'SD2', // 模型
ckpt = '768-v-ema', // 风格
image = '', // 图片数据(img2img)
prompt = 'cat', // 提示词
remove = 'dog', // 排除词
number = 1, // 生成数量
width = 512, // 图片宽度
height = 512, // 图片高度
seed = 0, // 随机种子
sampler = 'pndm', // 扩散采样器
prompt_guidance = 0.5, // 提示词权重
quality_details = 25, // 质量和细节(步数)
} = await readBody(event)
const id = Math.random().toString(36).substring(2, 34) // 生成随机任务ID
const uid = 1234567890 // 用户ID
const createdAt = new Date().getTime() // 设定创建时间
const status = 'translate' // 任务状态(翻译)
const progress = 0.00 // 任务进度
const data:any[] = [] // 生成结果
const task = { model, ckpt, image, prompt, remove, number, width, height, seed, sampler, prompt_guidance, quality_details, id, uid, createdAt, status, progress, data }
console.log('task:', task)
await useStorage().setItem(`task:${task.id}`, task) // 保存任务到内存
translate(prompt, (en: string) => {
task.prompt = en
task.status = 'waiting' // 任务状态(排队)
useStorage().setItem(`task:${task.id}`, task) // 修改任务状态
console.log(task.id, task.prompt)
})
//const tasks = await useStorage().getKeys().then((keys: any[]) => keys.filter(key => key.startsWith('task:')))
//console.log('tasks:', tasks)
return task
}
})