* Rename tables, add graphile workers, update types * Add dev:worker command * Update pnpm-lock.yaml * Remove sentry config import from worker.ts * Stop generating new cells in cell router get query * Generate new cells for new scenarios, variants, and experiments * Remove most error throwing from queryLLM.task.ts * Remove promptVariantId and testScenarioId from ModelOutput * Remove duplicate index from ModelOutput * Move inputHash from cell to output * Add TODO * Add todo * Show cost and time for each cell * Always show output stats if there is output * Trigger LLM outputs when scenario variables are updated * Add newlines to ends of files * Add another newline * Cascade ModelOutput deletion * Fix linting and prettier * Return instead of throwing for non-pending cell * Remove pnpm dev:worker from pnpm:dev * Update pnpm-lock.yaml
77 lines
1.9 KiB
TypeScript
77 lines
1.9 KiB
TypeScript
import crypto from "crypto";
|
|
import { type Prisma } from "@prisma/client";
|
|
import { prisma } from "../db";
|
|
import { queueLLMRetrievalTask } from "./queueLLMRetrievalTask";
|
|
import { constructPrompt } from "./constructPrompt";
|
|
|
|
export const generateNewCell = async (variantId: string, scenarioId: string) => {
|
|
const variant = await prisma.promptVariant.findUnique({
|
|
where: {
|
|
id: variantId,
|
|
},
|
|
});
|
|
|
|
const scenario = await prisma.testScenario.findUnique({
|
|
where: {
|
|
id: scenarioId,
|
|
},
|
|
});
|
|
|
|
if (!variant || !scenario) return null;
|
|
|
|
const prompt = await constructPrompt(variant, scenario.variableValues);
|
|
|
|
const inputHash = crypto.createHash("sha256").update(JSON.stringify(prompt)).digest("hex");
|
|
|
|
let cell = await prisma.scenarioVariantCell.findUnique({
|
|
where: {
|
|
promptVariantId_testScenarioId: {
|
|
promptVariantId: variantId,
|
|
testScenarioId: scenarioId,
|
|
},
|
|
},
|
|
include: {
|
|
modelOutput: true,
|
|
},
|
|
});
|
|
|
|
if (cell) return cell;
|
|
|
|
cell = await prisma.scenarioVariantCell.create({
|
|
data: {
|
|
promptVariantId: variantId,
|
|
testScenarioId: scenarioId,
|
|
},
|
|
include: {
|
|
modelOutput: true,
|
|
},
|
|
});
|
|
|
|
const matchingModelOutput = await prisma.modelOutput.findFirst({
|
|
where: {
|
|
inputHash,
|
|
},
|
|
});
|
|
|
|
let newModelOutput;
|
|
|
|
if (matchingModelOutput) {
|
|
newModelOutput = await prisma.modelOutput.create({
|
|
data: {
|
|
scenarioVariantCellId: cell.id,
|
|
inputHash,
|
|
output: matchingModelOutput.output as Prisma.InputJsonValue,
|
|
timeToComplete: matchingModelOutput.timeToComplete,
|
|
promptTokens: matchingModelOutput.promptTokens,
|
|
completionTokens: matchingModelOutput.completionTokens,
|
|
createdAt: matchingModelOutput.createdAt,
|
|
updatedAt: matchingModelOutput.updatedAt,
|
|
},
|
|
});
|
|
} else {
|
|
cell = await queueLLMRetrievalTask(cell.id);
|
|
}
|
|
|
|
return { ...cell, modelOutput: newModelOutput };
|
|
};
|