407 lines
14 KiB
Plaintext
407 lines
14 KiB
Plaintext
generator client {
|
||
provider = "prisma-client-js"
|
||
binaryTargets = ["native", "darwin-arm64", "darwin", "windows", "debian-openssl-3.0.x", "linux-arm64-openssl-3.0.x", "debian-openssl-1.1.x"]
|
||
}
|
||
|
||
datasource db {
|
||
provider = "sqlite"
|
||
url = env("DATABASE_URL")
|
||
}
|
||
|
||
model Projects {
|
||
id String @id @default(nanoid(12))
|
||
name String
|
||
description String
|
||
globalPrompt String @default("")
|
||
questionPrompt String @default("")
|
||
answerPrompt String @default("")
|
||
labelPrompt String @default("")
|
||
domainTreePrompt String @default("")
|
||
cleanPrompt String @default("")
|
||
defaultModelConfigId String?
|
||
test String @default("")
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
Questions Questions[]
|
||
Datasets Datasets[]
|
||
DatasetConversations DatasetConversations[]
|
||
Chunks Chunks[]
|
||
ModelConfig ModelConfig[]
|
||
UploadFiles UploadFiles[]
|
||
Tags Tags[]
|
||
Task Task[]
|
||
GaPairs GaPairs[]
|
||
CustomPrompts CustomPrompts[]
|
||
Images Images[]
|
||
ImageDatasets ImageDatasets[]
|
||
QuestionTemplates QuestionTemplates[]
|
||
EvalDatasets EvalDatasets[]
|
||
}
|
||
|
||
model UploadFiles {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
fileName String
|
||
fileExt String
|
||
path String
|
||
size Int
|
||
md5 String
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
GaPairs GaPairs[]
|
||
}
|
||
|
||
model Chunks {
|
||
id String @id @default(nanoid())
|
||
name String
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
fileId String
|
||
fileName String
|
||
content String
|
||
summary String
|
||
size Int
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
Questions Questions[]
|
||
EvalDatasets EvalDatasets[]
|
||
|
||
@@index([projectId])
|
||
}
|
||
|
||
model Tags {
|
||
id String @id @default(nanoid())
|
||
label String
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
parentId String?
|
||
parent Tags? @relation("Tags", fields: [parentId], references: [id])
|
||
children Tags[] @relation("Tags")
|
||
|
||
@@index([projectId, label])
|
||
@@index([projectId, parentId])
|
||
}
|
||
|
||
model Questions {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
chunk Chunks @relation(fields: [chunkId], references: [id])
|
||
chunkId String
|
||
gaPair GaPairs? @relation(fields: [gaPairId], references: [id])
|
||
gaPairId String? // Optional: links question to the GA pair that generated it
|
||
question String
|
||
label String
|
||
answered Boolean @default(false)
|
||
imageId String? // Optional: for image-based questions
|
||
imageName String? // Optional: for image-based questions
|
||
templateId String? // Optional: links to ImageQuestionTemplates
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
@@index([projectId])
|
||
@@index([imageId])
|
||
@@index([templateId])
|
||
@@index([projectId, label])
|
||
}
|
||
|
||
model Datasets {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
questionId String
|
||
question String
|
||
answer String
|
||
answerType String? @default("text") // 'text' | 'label' | 'custom_format'
|
||
chunkName String
|
||
chunkContent String
|
||
model String
|
||
questionLabel String
|
||
cot String
|
||
confirmed Boolean @default(false)
|
||
score Float @default(0)
|
||
aiEvaluation String @default("") // AI评估结论
|
||
tags String @default("")
|
||
note String @default("")
|
||
other String @default("") // 存储其他字段的JSON字符串
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
@@index([projectId])
|
||
@@index([projectId, confirmed, createAt, id], name: "idx_export_confirmed")
|
||
@@index([projectId, createAt], name: "idx_project_createAt")
|
||
}
|
||
|
||
model DatasetConversations {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
questionId String // 第一个问题 Id(初始问题)
|
||
question String // 第一个问题(初始问题)
|
||
chunkId String // 基于哪个文本块生成
|
||
model String
|
||
questionLabel String
|
||
score Float @default(0)
|
||
aiEvaluation String @default("") // AI评估结论
|
||
tags String @default("")
|
||
note String @default("")
|
||
scenario String // 对话场景(教学/咨询/讨论等)
|
||
roleA String // 角色A设定
|
||
roleB String // 角色B设定
|
||
turnCount Int // 实际轮数
|
||
maxTurns Int // 设置的最大轮数
|
||
rawMessages String // JSON存储完整对话(和 ShareGPT 格式保持完全一致)
|
||
confirmed Boolean @default(false)
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
@@index([projectId])
|
||
}
|
||
|
||
model LlmProviders {
|
||
id String @id
|
||
name String
|
||
apiUrl String
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
LlmModels LlmModels[]
|
||
}
|
||
|
||
model LlmModels {
|
||
id String @id @default(nanoid())
|
||
modelId String
|
||
modelName String
|
||
provider LlmProviders @relation(fields: [providerId], references: [id])
|
||
providerId String
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
}
|
||
|
||
model ModelConfig {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
providerId String
|
||
providerName String
|
||
endpoint String
|
||
apiKey String
|
||
modelId String
|
||
modelName String
|
||
type String
|
||
temperature Float
|
||
maxTokens Int
|
||
topP Float
|
||
topK Float
|
||
status Int
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
}
|
||
|
||
model Task {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
taskType String // 任务类型: text-processing, question-generation, answer-generation, data-distillation
|
||
status Int // 任务状态: 0-处理中, 1-已完成, 2-失败, 3-已中断
|
||
startTime DateTime @default(now())
|
||
endTime DateTime?
|
||
completedCount Int @default(0)
|
||
totalCount Int @default(0)
|
||
modelInfo String // JSON格式存储,包含使用的模型信息
|
||
language String @default("zh-CN")
|
||
detail String @default("") // 任务详情
|
||
note String @default("") // 任务备注
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
@@index([projectId])
|
||
}
|
||
|
||
model CustomPrompts {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
promptType String // 提示词类型,对应 lib/llm/prompts 下的文件名
|
||
promptKey String // 提示词在模块中的键名,如 QUESTION_PROMPT, QUESTION_PROMPT_EN
|
||
language String // 语言: zh-CN, en
|
||
content String // 自定义的提示词内容
|
||
isActive Boolean @default(true) // 是否启用
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
@@unique([projectId, promptType, promptKey, language])
|
||
@@index([projectId, promptType])
|
||
@@index([projectId, language])
|
||
}
|
||
|
||
model GaPairs {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
uploadFile UploadFiles @relation(fields: [fileId], references: [id], onDelete: Cascade)
|
||
fileId String
|
||
pairNumber Int // 1-5, representing the 5 generated pairs
|
||
genreTitle String // Genre name/title
|
||
genreDesc String // Genre description
|
||
audienceTitle String // Audience name/title
|
||
audienceDesc String // Audience description
|
||
isActive Boolean @default(true) // Whether this pair is active for use
|
||
questions Questions[] // Questions generated by this GA pair
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
@@unique([fileId, pairNumber])
|
||
@@index([projectId])
|
||
@@index([fileId])
|
||
}
|
||
|
||
model Images {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
imageName String
|
||
path String // 图片存储路径
|
||
size Int // 文件大小(字节)
|
||
width Int? // 图片宽度
|
||
height Int? // 图片高度
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
ImageDatasets ImageDatasets[]
|
||
|
||
@@unique([projectId, imageName])
|
||
@@index([projectId])
|
||
}
|
||
|
||
model ImageDatasets {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
image Images @relation(fields: [imageId], references: [id], onDelete: Cascade)
|
||
imageId String
|
||
imageName String
|
||
questionId String? // Optional: links to Questions table
|
||
question String
|
||
answer String // Stores all answer types: text, JSON array for labels, or custom format JSON
|
||
answerType String @default("text") // 'text' | 'label' | 'custom_format'
|
||
model String
|
||
confirmed Boolean @default(false)
|
||
score Float @default(0)
|
||
tags String @default("")
|
||
note String @default("")
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
@@index([projectId])
|
||
@@index([imageId])
|
||
@@index([questionId])
|
||
}
|
||
|
||
model QuestionTemplates {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
question String // Question content
|
||
sourceType String // 'image' | 'text' - data source type
|
||
answerType String // 'text' | 'label' | 'custom_format'
|
||
description String @default("") // Question description
|
||
labels String @default("") // JSON array of label options (for answerType='label')
|
||
customFormat String @default("") // Custom format definition (for answerType='custom_format')
|
||
order Int @default(0) // Display order
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
@@index([projectId])
|
||
@@index([projectId, sourceType])
|
||
}
|
||
|
||
model LlmUsageLogs {
|
||
id String @id @default(nanoid())
|
||
projectId String
|
||
provider String // 提供商: openai, anthropic, google 等
|
||
model String // 模型名称
|
||
|
||
// 核心指标
|
||
inputTokens Int @default(0)
|
||
outputTokens Int @default(0)
|
||
totalTokens Int @default(0)
|
||
latency Int @default(0) // 响应耗时(毫秒)
|
||
|
||
// 状态与追踪
|
||
status String @default("SUCCESS") // 状态: "SUCCESS", "FAILED"
|
||
errorMessage String? // 失败原因,status="FAILED" 时填写
|
||
|
||
// 时间维度
|
||
createAt DateTime @default(now())
|
||
dateString String // 格式 "YYYY-MM-DD",用于快速按天聚合
|
||
|
||
@@index([projectId, dateString])
|
||
@@index([dateString])
|
||
@@index([provider])
|
||
@@index([model])
|
||
}
|
||
|
||
model EvalDatasets {
|
||
id String @id @default(nanoid())
|
||
project Projects @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
||
projectId String
|
||
|
||
// 题目内容
|
||
question String // 题目内容
|
||
questionType String // 题型: true_false, single_choice, multiple_choice, short_answer, open_ended
|
||
|
||
// 上下文信息(关联到文本块)
|
||
chunkId String? // 关联到 Chunks 表
|
||
chunks Chunks? @relation(fields: [chunkId], references: [id])
|
||
|
||
// 选项(仅选择题使用)
|
||
options String @default("") // JSON数组: ["选项A", "选项B", "选项C", "选项D"]
|
||
|
||
// 标准答案
|
||
correctAnswer String // 标准答案
|
||
|
||
tags String @default("") // 标签,逗号分隔
|
||
note String @default("") // 备注
|
||
|
||
// 时间戳
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
// 关联评估结果
|
||
EvalResults EvalResults[]
|
||
|
||
@@index([projectId])
|
||
@@index([projectId, questionType])
|
||
@@index([chunkId])
|
||
}
|
||
|
||
model EvalResults {
|
||
id String @id @default(nanoid())
|
||
projectId String
|
||
taskId String // 关联到 Task 表
|
||
|
||
// 关联评估题目
|
||
evalDataset EvalDatasets @relation(fields: [evalDatasetId], references: [id], onDelete: Cascade)
|
||
evalDatasetId String
|
||
|
||
// 评估结果
|
||
modelAnswer String // 模型的回答
|
||
score Float @default(0) // 得分 (0-1 之间)
|
||
isCorrect Boolean @default(false) // 是否正确(用于客观题)
|
||
judgeResponse String @default("") // LLM 评分的响应(用于主观题)
|
||
|
||
// 答题详情
|
||
duration Int @default(0) // 答题耗时(毫秒)
|
||
status Int @default(0) // 答题状态:0-成功, 1-输出不符合规范, 2-LLM调用报错
|
||
errorMessage String @default("") // 答题报错信息
|
||
|
||
// 时间戳
|
||
createAt DateTime @default(now())
|
||
updateAt DateTime @updatedAt
|
||
|
||
@@unique([taskId, evalDatasetId]) // 每个任务对每道题只能有一个结果
|
||
@@index([projectId])
|
||
@@index([taskId])
|
||
@@index([evalDatasetId])
|
||
}
|