Add admin vision lab and LLM vision verification

这个提交包含在:
cryptocommuniums-afk
2026-03-15 00:41:09 +08:00
父节点 20e183d2da
当前提交 ad83ce9c68
修改 18 个文件,包含 915 行新增16 行删除

查看文件

@@ -334,3 +334,55 @@ export const backgroundTasks = mysqlTable("background_tasks", {
export type BackgroundTask = typeof backgroundTasks.$inferSelect;
export type InsertBackgroundTask = typeof backgroundTasks.$inferInsert;
/**
* Vision reference library - canonical public tennis images used for multimodal evaluation
*/
export const visionReferenceImages = mysqlTable("vision_reference_images", {
id: int("id").autoincrement().primaryKey(),
slug: varchar("slug", { length: 128 }).notNull().unique(),
title: varchar("title", { length: 256 }).notNull(),
exerciseType: varchar("exerciseType", { length: 64 }).notNull(),
imageUrl: text("imageUrl").notNull(),
sourcePageUrl: text("sourcePageUrl").notNull(),
sourceLabel: varchar("sourceLabel", { length: 128 }).notNull(),
author: varchar("author", { length: 128 }),
license: varchar("license", { length: 128 }),
expectedFocus: json("expectedFocus"),
tags: json("tags"),
notes: text("notes"),
sortOrder: int("sortOrder").default(0).notNull(),
isPublished: int("isPublished").default(1).notNull(),
createdAt: timestamp("createdAt").defaultNow().notNull(),
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
});
export type VisionReferenceImage = typeof visionReferenceImages.$inferSelect;
export type InsertVisionReferenceImage = typeof visionReferenceImages.$inferInsert;
/**
* Vision test run history - records each multimodal evaluation against the standard library
*/
export const visionTestRuns = mysqlTable("vision_test_runs", {
id: int("id").autoincrement().primaryKey(),
taskId: varchar("taskId", { length: 64 }).notNull().unique(),
userId: int("userId").notNull(),
referenceImageId: int("referenceImageId"),
title: varchar("title", { length: 256 }).notNull(),
exerciseType: varchar("exerciseType", { length: 64 }).notNull(),
imageUrl: text("imageUrl").notNull(),
status: mysqlEnum("status", ["queued", "succeeded", "failed"]).default("queued").notNull(),
visionStatus: mysqlEnum("visionStatus", ["pending", "ok", "fallback", "failed"]).default("pending").notNull(),
configuredModel: varchar("configuredModel", { length: 128 }),
expectedFocus: json("expectedFocus"),
summary: text("summary"),
corrections: text("corrections"),
report: json("report"),
warning: text("warning"),
error: text("error"),
createdAt: timestamp("createdAt").defaultNow().notNull(),
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
});
export type VisionTestRun = typeof visionTestRuns.$inferSelect;
export type InsertVisionTestRun = typeof visionTestRuns.$inferInsert;