226 lines
5.8 KiB
Plaintext
226 lines
5.8 KiB
Plaintext
generator client {
|
||
provider = "prisma-client-js"
|
||
}
|
||
|
||
datasource db {
|
||
provider = "sqlite"
|
||
url = "file:../data/upage.db"
|
||
}
|
||
|
||
// 聊天使用记录,每个 message 对应多条。
|
||
model ChatUsage {
|
||
id String @id @default(uuid())
|
||
// 用户 ID
|
||
userId String
|
||
// 聊天的 id
|
||
chatId String
|
||
// 消息的 id
|
||
messageId String
|
||
// 输入令牌数
|
||
inputTokens Int @default(0)
|
||
// 输出令牌数
|
||
outputTokens Int @default(0)
|
||
// 缓存令牌数
|
||
cachedTokens Int @default(0)
|
||
// 推理令牌数
|
||
reasoningTokens Int @default(0)
|
||
// 总令牌数
|
||
totalTokens Int @default(0)
|
||
// 调用时间
|
||
calledAt DateTime @default(now())
|
||
// 调用状态
|
||
status String
|
||
// 使用的模型名称
|
||
modelName String?
|
||
// 提示文本
|
||
prompt String?
|
||
// 包含额外调用信息的元数据
|
||
metadata Json? /// @type {Object}
|
||
// 创建时间
|
||
createdAt DateTime @default(now())
|
||
// 更新时间
|
||
updatedAt DateTime @updatedAt
|
||
|
||
@@index([userId])
|
||
@@index([messageId])
|
||
@@index([chatId])
|
||
@@index([calledAt])
|
||
@@index([status])
|
||
}
|
||
|
||
// 聊天,一个聊天会包含多个消息。
|
||
model Chat {
|
||
id String @id @default(uuid())
|
||
// URL 标识符
|
||
urlId String? @unique
|
||
// 用户 ID
|
||
userId String
|
||
// 聊天描述
|
||
description String?
|
||
// 时间戳
|
||
timestamp DateTime @default(now())
|
||
// 版本,每次更新时,版本号加 1
|
||
version Int @default(1)
|
||
// 包含额外信息的元数据
|
||
metadata Json? /// @type {{gitUrl?: string, gitBranch?: string, netlifySiteId?: string}}
|
||
// 创建时间
|
||
createdAt DateTime @default(now())
|
||
// 更新时间
|
||
updatedAt DateTime @updatedAt
|
||
|
||
// 关联的消息
|
||
messages Message[] @relation("ChatToMessages")
|
||
// 关联的部署记录
|
||
deployments Deployment[]
|
||
|
||
@@index([userId])
|
||
@@index([urlId])
|
||
}
|
||
|
||
// 聊天消息,消息是需要有序的。 @ai-sdk/ui-utils 的 Message 类型。
|
||
model Message {
|
||
id String @id @default(uuid())
|
||
// 消息所属聊天
|
||
chatId String
|
||
// 消息所属用户
|
||
userId String
|
||
// 'user' 或 'assistant'
|
||
role String
|
||
// 消息内容
|
||
content String
|
||
// 版本 ID
|
||
revisionId String?
|
||
// 注释
|
||
annotations Json? /// @type {Array<{id: string, text: string, start: number, end: number}>}
|
||
|
||
// 是否为遗弃消息
|
||
isDiscarded Boolean @default(false)
|
||
|
||
// 消息的元数据
|
||
metadata Json? /// @type {Record<string, any>}
|
||
|
||
// 消息的部分内容,用于存储 UIMessage 的 parts
|
||
parts Json? /// @type {Array<{type: string, text?: string, [key: string]: any}>}
|
||
|
||
version Int @default(1)
|
||
|
||
createdAt DateTime @default(now())
|
||
updatedAt DateTime @updatedAt
|
||
|
||
chat Chat @relation("ChatToMessages", fields: [chatId], references: [id], onDelete: Cascade)
|
||
// 关联的页面
|
||
page Page? @relation("MessageToPage")
|
||
// 关联的部分
|
||
sections Section[] @relation("MessageToSections")
|
||
|
||
@@index([chatId])
|
||
@@index([userId])
|
||
}
|
||
|
||
model Page {
|
||
id String @id @default(uuid())
|
||
// 关联的消息 ID
|
||
messageId String @unique
|
||
// 页面数据 (JSON 数组格式)
|
||
pages Json /// @type {Array<Object>} 自定义编辑器的页面数据结构数组,每个元素代表一个页面
|
||
// 创建时间
|
||
createdAt DateTime @default(now())
|
||
// 更新时间
|
||
updatedAt DateTime @updatedAt
|
||
|
||
// 关联的消息
|
||
message Message @relation("MessageToPage", fields: [messageId], references: [id], onDelete: Cascade)
|
||
|
||
@@index([messageId])
|
||
}
|
||
|
||
model Section {
|
||
id String @id @default(uuid())
|
||
// 所属消息 ID
|
||
messageId String
|
||
// 部分类型,通常为 "section"
|
||
type String @default("section")
|
||
// 操作类型:add, update, remove 等
|
||
action String @default("add")
|
||
// 操作的 ID
|
||
actionId String
|
||
// 页面名称
|
||
pageName String @default("")
|
||
// Section 内容 (HTML/CSS)
|
||
content String
|
||
// DOM ID
|
||
domId String
|
||
// 根 DOM ID,用于标识父级容器
|
||
rootDomId String?
|
||
// 排序顺序
|
||
sort Int @default(0)
|
||
// 创建时间
|
||
createdAt DateTime @default(now())
|
||
// 更新时间
|
||
updatedAt DateTime @updatedAt
|
||
|
||
// 关联的消息
|
||
message Message @relation("MessageToSections", fields: [messageId], references: [id], onDelete: Cascade)
|
||
|
||
@@index([messageId])
|
||
@@index([domId])
|
||
@@index([rootDomId])
|
||
}
|
||
|
||
// 部署记录表,记录用户将代码部署到各平台的信息
|
||
model Deployment {
|
||
id String @id @default(uuid())
|
||
// 用户 ID
|
||
userId String
|
||
// 聊天 ID
|
||
chatId String
|
||
// 部署平台(1Panel、Netlify、Vercel 等)
|
||
platform String
|
||
// 平台上的部署 ID
|
||
deploymentId String
|
||
// 部署后的访问链接
|
||
url String
|
||
// 部署状态
|
||
status String
|
||
// 包含平台特定信息的元数据
|
||
metadata Json? /// @type {Object}
|
||
// 创建时间
|
||
createdAt DateTime @default(now())
|
||
// 更新时间
|
||
updatedAt DateTime @updatedAt
|
||
|
||
// 关联的聊天
|
||
chat Chat? @relation(fields: [chatId], references: [id], onDelete: Cascade)
|
||
|
||
@@index([userId])
|
||
@@index([chatId])
|
||
@@index([platform])
|
||
@@index([status])
|
||
@@index([createdAt])
|
||
}
|
||
|
||
// 用户设置表,用于保存用户的各种设置
|
||
model UserSetting {
|
||
id String @id @default(uuid())
|
||
// 用户 ID
|
||
userId String
|
||
// 设置类别(profile、connectivity、services 等)
|
||
category String
|
||
// 设置键名
|
||
key String
|
||
// 设置值
|
||
value String
|
||
// 是否为敏感信息(如 API 密钥)
|
||
isSecret Boolean @default(false)
|
||
// 创建时间
|
||
createdAt DateTime @default(now())
|
||
// 更新时间
|
||
updatedAt DateTime @updatedAt
|
||
|
||
@@unique([userId, category, key])
|
||
@@index([userId])
|
||
@@index([category])
|
||
@@index([key])
|
||
@@index([isSecret])
|
||
}
|