diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8bf16fe..208a8f2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -242,6 +242,7 @@ model Model { model SimulatorRun { id String @id @default(cuid()) userId String + name String @default("Simulation Run") // 运行名称 promptId String promptVersionId String? // 可选,如果选择了特定版本 modelId String diff --git a/src/app/api/simulator/[id]/route.ts b/src/app/api/simulator/[id]/route.ts index 0c971a7..b5f119b 100644 --- a/src/app/api/simulator/[id]/route.ts +++ b/src/app/api/simulator/[id]/route.ts @@ -20,7 +20,25 @@ export async function GET( id, userId: user.id, }, - include: { + select: { + id: true, + name: true, + status: true, + userInput: true, + promptContent: true, + output: true, + error: true, + createdAt: true, + completedAt: true, + temperature: true, + maxTokens: true, + topP: true, + frequencyPenalty: true, + presencePenalty: true, + inputTokens: true, + outputTokens: true, + totalCost: true, + duration: true, prompt: { select: { id: true, name: true, content: true } }, @@ -90,7 +108,17 @@ export async function PATCH( ...(duration !== undefined && { duration }), ...(status === "completed" && { completedAt: new Date() }), }, - include: { + select: { + id: true, + name: true, + status: true, + output: true, + error: true, + inputTokens: true, + outputTokens: true, + totalCost: true, + duration: true, + completedAt: true, prompt: { select: { id: true, name: true } }, diff --git a/src/app/api/simulator/route.ts b/src/app/api/simulator/route.ts index abadfc5..ab632b9 100644 --- a/src/app/api/simulator/route.ts +++ b/src/app/api/simulator/route.ts @@ -26,7 +26,19 @@ export async function GET(request: NextRequest) { const [runs, total] = await Promise.all([ prisma.simulatorRun.findMany({ where, - include: { + select: { + id: true, + name: true, + status: true, + userInput: true, + output: true, + error: true, + createdAt: true, + completedAt: true, + inputTokens: true, + outputTokens: true, + totalCost: true, + duration: true, prompt: { select: { id: true, name: true } }, @@ -70,6 +82,7 @@ export async function POST(request: NextRequest) { const body = await request.json(); const { + name, promptId, promptVersionId, modelId, @@ -80,18 +93,40 @@ export async function POST(request: NextRequest) { topP, frequencyPenalty, presencePenalty, + // 用于创建新prompt的字段 + createNewPrompt, + newPromptName, + newPromptContent, } = body; - // 验证用户是否拥有该prompt - const prompt = await prisma.prompt.findFirst({ - where: { - id: promptId, - userId: user.id, - }, - }); + let finalPromptId = promptId; - if (!prompt) { - return NextResponse.json({ error: "Prompt not found" }, { status: 404 }); + // 如果是创建新prompt模式 + if (createNewPrompt && newPromptContent) { + // 创建新的prompt + const newPrompt = await prisma.prompt.create({ + data: { + userId: user.id, + name: newPromptName || name || "New Prompt", + content: newPromptContent, + visibility: "private", + }, + }); + finalPromptId = newPrompt.id; + } else if (promptId) { + // 验证用户是否拥有该prompt + const prompt = await prisma.prompt.findFirst({ + where: { + id: promptId, + userId: user.id, + }, + }); + + if (!prompt) { + return NextResponse.json({ error: "Prompt not found" }, { status: 404 }); + } + } else { + return NextResponse.json({ error: "Either promptId or newPromptContent is required" }, { status: 400 }); } // 验证模型是否可用 @@ -108,7 +143,8 @@ export async function POST(request: NextRequest) { const run = await prisma.simulatorRun.create({ data: { userId: user.id, - promptId, + name: name || "Simulation Run", + promptId: finalPromptId, promptVersionId, modelId, userInput, diff --git a/src/app/simulator/[id]/page.tsx b/src/app/simulator/[id]/page.tsx index e8dac4c..7d6f5bf 100644 --- a/src/app/simulator/[id]/page.tsx +++ b/src/app/simulator/[id]/page.tsx @@ -33,6 +33,7 @@ import { getPromptContent } from '@/lib/simulator-utils' interface SimulatorRun { id: string + name: string status: string userInput: string promptContent?: string | null @@ -252,7 +253,7 @@ export default function SimulatorRunPage({ params }: { params: Promise<{ id: str