Files
Sybil-2/server/prisma/schema.prisma
2026-02-14 00:14:21 -08:00

153 lines
2.7 KiB
Plaintext

// Prisma schema for the personal chat DB + LLM call log
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
enum Provider {
openai
anthropic
xai
}
enum MessageRole {
system
user
assistant
tool
}
enum SearchSource {
exa
}
model User {
id String @id @default(cuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
// minimal for now (single-user is fine). Keep extensible.
handle String? @unique
chats Chat[]
searches Search[]
}
model Chat {
id String @id @default(cuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String?
user User? @relation(fields: [userId], references: [id])
userId String?
messages Message[]
calls LlmCall[]
@@index([userId])
}
model Message {
id String @id @default(cuid())
createdAt DateTime @default(now())
chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade)
chatId String
role MessageRole
content String
// for tool messages or attachments later
name String?
metadata Json?
@@index([chatId, createdAt])
}
model LlmCall {
id String @id @default(cuid())
createdAt DateTime @default(now())
chat Chat @relation(fields: [chatId], references: [id], onDelete: Cascade)
chatId String
provider Provider
model String
// request/response snapshots for debugging + replay
request Json
response Json?
// usage/cost basics
inputTokens Int?
outputTokens Int?
totalTokens Int?
latencyMs Int?
error String?
@@index([chatId, createdAt])
@@index([provider, model, createdAt])
}
model Search {
id String @id @default(cuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String?
query String?
source SearchSource @default(exa)
requestId String?
rawResponse Json?
latencyMs Int?
error String?
answerText String?
answerRequestId String?
answerCitations Json?
answerRawResponse Json?
answerError String?
user User? @relation(fields: [userId], references: [id])
userId String?
results SearchResult[]
@@index([updatedAt])
@@index([userId])
}
model SearchResult {
id String @id @default(cuid())
createdAt DateTime @default(now())
search Search @relation(fields: [searchId], references: [id], onDelete: Cascade)
searchId String
rank Int
title String?
url String
publishedDate String?
author String?
text String?
highlights Json?
highlightScores Json?
score Float?
favicon String?
image String?
@@index([searchId, rank])
}