|
| 1 | +import { NextResponse } from 'next/server' |
| 2 | +import { z } from 'zod' |
| 3 | +import { evaluateEvalGate, listEvalBaselinesForAgent, setEvalBaseline } from '@/lib/server/eval/baseline' |
| 4 | +import { errorMessage } from '@/lib/shared-utils' |
| 5 | + |
| 6 | +const BaselineSchema = z.object({ |
| 7 | + agentId: z.string().min(1), |
| 8 | + scenarioId: z.string().min(1).nullable().optional(), |
| 9 | + suite: z.string().min(1).nullable().optional(), |
| 10 | + minPercent: z.number().min(0).max(100).nullable().optional(), |
| 11 | + maxRegressionPoints: z.number().min(0).max(100).nullable().optional(), |
| 12 | + label: z.string().max(160).nullable().optional(), |
| 13 | + notes: z.string().max(1_000).nullable().optional(), |
| 14 | +}) |
| 15 | + |
| 16 | +export async function GET(req: Request) { |
| 17 | + try { |
| 18 | + const { searchParams } = new URL(req.url) |
| 19 | + const agentId = searchParams.get('agentId') |
| 20 | + return NextResponse.json(listEvalBaselinesForAgent(agentId)) |
| 21 | + } catch (err: unknown) { |
| 22 | + return NextResponse.json( |
| 23 | + { error: errorMessage(err) }, |
| 24 | + { status: 500 }, |
| 25 | + ) |
| 26 | + } |
| 27 | +} |
| 28 | + |
| 29 | +export async function POST(req: Request) { |
| 30 | + try { |
| 31 | + const body: unknown = await req.json() |
| 32 | + const parsed = BaselineSchema.safeParse(body) |
| 33 | + if (!parsed.success) { |
| 34 | + return NextResponse.json( |
| 35 | + { error: parsed.error.issues.map((issue) => issue.message).join(', ') }, |
| 36 | + { status: 400 }, |
| 37 | + ) |
| 38 | + } |
| 39 | + |
| 40 | + const baseline = setEvalBaseline(parsed.data) |
| 41 | + const gate = evaluateEvalGate({ |
| 42 | + agentId: parsed.data.agentId, |
| 43 | + scenarioId: parsed.data.scenarioId, |
| 44 | + suite: parsed.data.suite, |
| 45 | + minPercent: parsed.data.minPercent, |
| 46 | + maxRegressionPoints: parsed.data.maxRegressionPoints, |
| 47 | + }) |
| 48 | + return NextResponse.json({ baseline, gate }) |
| 49 | + } catch (err: unknown) { |
| 50 | + return NextResponse.json( |
| 51 | + { error: errorMessage(err) }, |
| 52 | + { status: 500 }, |
| 53 | + ) |
| 54 | + } |
| 55 | +} |
0 commit comments