Add admin vision lab and LLM vision verification

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

查看文件

@@ -0,0 +1,43 @@
CREATE TABLE `vision_reference_images` (
`id` int AUTO_INCREMENT NOT NULL,
`slug` varchar(128) NOT NULL,
`title` varchar(256) NOT NULL,
`exerciseType` varchar(64) NOT NULL,
`imageUrl` text NOT NULL,
`sourcePageUrl` text NOT NULL,
`sourceLabel` varchar(128) NOT NULL,
`author` varchar(128),
`license` varchar(128),
`expectedFocus` json,
`tags` json,
`notes` text,
`sortOrder` int NOT NULL DEFAULT 0,
`isPublished` int NOT NULL DEFAULT 1,
`createdAt` timestamp NOT NULL DEFAULT (now()),
`updatedAt` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT `vision_reference_images_id` PRIMARY KEY(`id`),
CONSTRAINT `vision_reference_images_slug_unique` UNIQUE(`slug`)
);
--> statement-breakpoint
CREATE TABLE `vision_test_runs` (
`id` int AUTO_INCREMENT NOT NULL,
`taskId` varchar(64) NOT NULL,
`userId` int NOT NULL,
`referenceImageId` int,
`title` varchar(256) NOT NULL,
`exerciseType` varchar(64) NOT NULL,
`imageUrl` text NOT NULL,
`status` enum('queued','succeeded','failed') NOT NULL DEFAULT 'queued',
`visionStatus` enum('pending','ok','fallback','failed') NOT NULL DEFAULT 'pending',
`configuredModel` varchar(128),
`expectedFocus` json,
`summary` text,
`corrections` text,
`report` json,
`warning` text,
`error` text,
`createdAt` timestamp NOT NULL DEFAULT (now()),
`updatedAt` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT `vision_test_runs_id` PRIMARY KEY(`id`),
CONSTRAINT `vision_test_runs_taskId_unique` UNIQUE(`taskId`)
);

查看文件

@@ -43,6 +43,13 @@
"when": 1773504000000,
"tag": "0005_lively_taskmaster",
"breakpoints": true
},
{
"idx": 6,
"version": "5",
"when": 1773510000000,
"tag": "0006_solid_vision_library",
"breakpoints": true
}
]
}

查看文件

@@ -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;