Bladeren bron

Add a script to copy eval run results to Turso (#2452)

Chris Estreich 10 maanden geleden
bovenliggende
commit
4e716263d0
3 gewijzigde bestanden met toevoegingen van 102 en 2 verwijderingen
  1. 2 1
      evals/packages/db/package.json
  2. 97 0
      evals/packages/db/scripts/copy-run.mts
  3. 3 1
      evals/turbo.json

+ 2 - 1
evals/packages/db/package.json

@@ -15,7 +15,8 @@
 		"db:check": "pnpm drizzle-kit check",
 		"db:up": "pnpm drizzle-kit up",
 		"db:studio": "pnpm drizzle-kit studio",
-		"db:enable-wal": "dotenvx run -f ../../.env -- tsx scripts/enable-wal.mts"
+		"db:enable-wal": "dotenvx run -f ../../.env -- tsx scripts/enable-wal.mts",
+		"db:copy-run": "dotenvx run -f ../../.env -- tsx scripts/copy-run.mts"
 	},
 	"dependencies": {
 		"@evals/types": "workspace:^",

+ 97 - 0
evals/packages/db/scripts/copy-run.mts

@@ -0,0 +1,97 @@
+import { drizzle } from "drizzle-orm/libsql"
+import { eq } from "drizzle-orm"
+
+import { db as sourceDb } from "../src/db.js"
+import { schema } from "../src/schema.js"
+
+const copyRun = async (runId: number) => {
+	const destDb = drizzle({
+		schema,
+		connection: { url: process.env.TURSO_CONNECTION_URL!, authToken: process.env.TURSO_AUTH_TOKEN! },
+	})
+
+	const run = await sourceDb.query.runs.findFirst({
+		where: eq(schema.runs.id, runId),
+		with: { taskMetrics: true },
+	})
+
+	if (!run) {
+		throw new Error(`Run with ID ${runId} not found in source database`)
+	}
+
+	if (!run.taskMetrics) {
+		throw new Error("Run is not completed")
+	}
+
+	console.log(`Copying run ${run.id}`)
+
+	// eslint-disable-next-line @typescript-eslint/no-unused-vars
+	const { id: _, ...runTaskMetricsValues } = run.taskMetrics
+	const [newRunTaskMetrics] = await destDb.insert(schema.taskMetrics).values(runTaskMetricsValues).returning()
+
+	if (!newRunTaskMetrics) {
+		throw new Error("Failed to insert run taskMetrics")
+	}
+
+	// eslint-disable-next-line @typescript-eslint/no-unused-vars
+	const { id: __, ...runValues } = run
+
+	const [newRun] = await destDb
+		.insert(schema.runs)
+		.values({ ...runValues, taskMetricsId: newRunTaskMetrics.id })
+		.returning()
+
+	if (!newRun) {
+		throw new Error("Failed to insert run")
+	}
+
+	const tasks = await sourceDb.query.tasks.findMany({
+		where: eq(schema.tasks.runId, run.id),
+		with: { taskMetrics: true },
+	})
+
+	console.log(`Copying ${tasks.length} tasks`)
+
+	for (const task of tasks) {
+		// eslint-disable-next-line @typescript-eslint/no-unused-vars
+		const { id: _, ...newTaskMetricsValues } = task.taskMetrics!
+		const [newTaskMetrics] = await destDb.insert(schema.taskMetrics).values(newTaskMetricsValues).returning()
+
+		if (!newTaskMetrics) {
+			throw new Error(`Failed to insert taskMetrics for task ${task.id}`)
+		}
+
+		// eslint-disable-next-line @typescript-eslint/no-unused-vars
+		const { id: __, ...newTaskValues } = task
+
+		const [newTask] = await destDb
+			.insert(schema.tasks)
+			.values({ ...newTaskValues, runId: newRun.id, taskMetricsId: newTaskMetrics.id })
+			.returning()
+
+		if (!newTask) {
+			throw new Error(`Failed to insert task ${task.id}`)
+		}
+	}
+
+	console.log(`Successfully copied run ${runId} with ${tasks.length} tasks`)
+}
+
+const main = async () => {
+	const runId = parseInt(process.argv[2], 10)
+
+	if (isNaN(runId)) {
+		console.error("Run ID must be a number")
+		process.exit(1)
+	}
+
+	try {
+		await copyRun(runId)
+		process.exit(0)
+	} catch (error) {
+		console.error(error)
+		process.exit(1)
+	}
+}
+
+main()

+ 3 - 1
evals/turbo.json

@@ -9,7 +9,9 @@
 		"OPENROUTER_MODEL_ID",
 		"PROMPT_PATH",
 		"WORKSPACE_PATH",
-		"BENCHMARKS_DB_PATH"
+		"BENCHMARKS_DB_PATH",
+		"TURSO_CONNECTION_URL",
+		"TURSO_AUTH_TOKEN"
 	],
 	"tasks": {
 		"lint": {},