paper-burner/local-proxy/routes/prompt-pool.js

172 lines
4.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 提示词池路由
* 复用 server/src/routes/prompt-pool.js 的逻辑
*/
import express from 'express';
import { prisma } from '../db/client.js';
const router = express.Router();
// 限制数组大小
const MAX_PROMPTS_ARRAY_SIZE = 1000;
// 获取用户的 Prompt Pool
router.get('/', async (req, res, next) => {
try {
const promptPool = await prisma.promptPool.findUnique({
where: { userId: req.user.id }
});
if (!promptPool) {
// 返回默认空结构
return res.json({
prompts: [],
healthConfig: null
});
}
res.json({
prompts: promptPool.prompts,
healthConfig: promptPool.healthConfig
});
} catch (error) {
next(error);
}
});
// 更新 Prompt Pool全量
router.put('/', async (req, res, next) => {
try {
const { prompts, healthConfig } = req.body;
// 输入验证
if (!Array.isArray(prompts)) {
return res.status(400).json({ error: 'prompts must be an array' });
}
// 限制数组大小
if (prompts.length > MAX_PROMPTS_ARRAY_SIZE) {
return res.status(400).json({ error: `Too many prompts (max ${MAX_PROMPTS_ARRAY_SIZE})` });
}
// 验证每个 prompt 的基本格式
const validPrompts = prompts.filter(prompt => {
return prompt && typeof prompt === 'object';
});
if (validPrompts.length !== prompts.length) {
return res.status(400).json({ error: 'Some prompts have invalid format' });
}
const promptPool = await prisma.promptPool.upsert({
where: { userId: req.user.id },
update: {
prompts: validPrompts,
healthConfig
},
create: {
userId: req.user.id,
prompts: validPrompts,
healthConfig
}
});
res.json({
prompts: promptPool.prompts,
healthConfig: promptPool.healthConfig
});
} catch (error) {
next(error);
}
});
// 添加单个 Prompt
router.post('/prompts', async (req, res, next) => {
try {
const newPrompt = req.body;
// 输入验证
if (!newPrompt || typeof newPrompt !== 'object') {
return res.status(400).json({ error: 'Prompt must be an object' });
}
// 获取当前 Prompt Pool
let promptPool = await prisma.promptPool.findUnique({
where: { userId: req.user.id }
});
let prompts = promptPool ? (promptPool.prompts || []) : [];
// 限制数组大小
if (prompts.length >= MAX_PROMPTS_ARRAY_SIZE) {
return res.status(400).json({ error: `Maximum number of prompts reached (${MAX_PROMPTS_ARRAY_SIZE})` });
}
// 添加新 Prompt
prompts.push(newPrompt);
// 更新
promptPool = await prisma.promptPool.upsert({
where: { userId: req.user.id },
update: { prompts },
create: {
userId: req.user.id,
prompts
}
});
res.status(201).json({
prompts: promptPool.prompts,
healthConfig: promptPool.healthConfig
});
} catch (error) {
next(error);
}
});
// 删除指定 Prompt根据索引或 ID
router.delete('/prompts/:identifier', async (req, res, next) => {
try {
const { identifier } = req.params;
const promptPool = await prisma.promptPool.findUnique({
where: { userId: req.user.id }
});
if (!promptPool) {
return res.status(404).json({ error: 'Prompt pool not found' });
}
let prompts = promptPool.prompts || [];
// 尝试作为索引解析
const index = parseInt(identifier);
if (!isNaN(index) && index >= 0 && index < prompts.length) {
prompts.splice(index, 1);
} else {
// 尝试作为 ID 查找
const initialLength = prompts.length;
prompts = prompts.filter(p => p.id !== identifier);
if (prompts.length === initialLength) {
return res.status(404).json({ error: 'Prompt not found' });
}
}
// 更新
const updated = await prisma.promptPool.update({
where: { userId: req.user.id },
data: { prompts }
});
res.json({
prompts: updated.prompts,
healthConfig: updated.healthConfig
});
} catch (error) {
next(error);
}
});
export default router;