speechmap-judges / api /reclassification.ts
pappitti's picture
upgrade for v3 of dataset, adding family and provider filters, improving responsiveness. Still needs polishing
f263c36
import type { IncomingMessage, ServerResponse } from 'http';
import db from '../src/lib/db.js';
import { jsonResponse, ALLOWED_CLASSIFICATIONS } from './utils.js';
export default async function handler(req: IncomingMessage, res: ServerResponse) {
const url = new URL(req.url!, `http://${req.headers.host}`);
const judge1 = url.searchParams.get('judge1');
const judge1Classification = url.searchParams.get('judge1Classification');
const judge2 = url.searchParams.get('judge2');
const judge2Classification = url.searchParams.get('judge2Classification');
const theme = url.searchParams.get('theme') || null;
const model = url.searchParams.get('model') || null;
const modelFamily = url.searchParams.get('modelFamily') || null;
const apiProvider = url.searchParams.get('provider') || null;
if (!judge1 || !judge1Classification || !judge2 || !judge2Classification) {
return jsonResponse(res, 400, { error: 'Query parameters judge1, judge1Classification, judge2, and judge2Classification are required.' });
}
if (!ALLOWED_CLASSIFICATIONS.has(judge1Classification) || !ALLOWED_CLASSIFICATIONS.has(judge2Classification)) {
return jsonResponse(res, 400, { error: 'Invalid classification provided.' });
}
try {
const sql = `
SELECT
a1.${judge1Classification} AS judge1_compliance,
a2.${judge2Classification} AS judge2_compliance,
COUNT(*) as count
FROM assessments a1
JOIN assessments a2 ON a1.r_uuid = a2.r_uuid
JOIN responses r ON a1.r_uuid = r.uuid
JOIN questions q ON r.q_uuid = q.uuid
JOIN models m ON r.model = m.name
WHERE
a1.judge = ? AND a2.judge = ? AND (? IS NULL OR q.theme = ?)
AND (? IS NULL OR r.model = ?) AND (? IS NULL OR m.family = ?) AND (? IS NULL OR r.provider = ?)
GROUP BY
judge1_compliance,
judge2_compliance;
`;
const params = [judge1, judge2, theme, theme, model, model, modelFamily, modelFamily, apiProvider, apiProvider];
const rows = await db.query<{ judge1_compliance: string, judge2_compliance: string, count: number }>(sql, ...params);
const transitionMatrix: Record<string,Record<string, number>> = {};
for (const row of rows) {
if (!transitionMatrix[row.judge1_compliance]) {
transitionMatrix[row.judge1_compliance] = {};
}
transitionMatrix[row.judge1_compliance][row.judge2_compliance] = Number(row.count);
}
jsonResponse(res, 200, transitionMatrix);
} catch (error) {
console.error('Failed to fetch reclassification data:', error);
jsonResponse(res, 500, { error: 'Failed to fetch reclassification data' });
}
}