@lobehub/chat
Version:
Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.
196 lines (173 loc) • 5.56 kB
text/typescript
/* eslint-disable sort-keys-fix/sort-keys-fix */
import { relations } from 'drizzle-orm';
import { pgTable, primaryKey, text, uuid, varchar } from 'drizzle-orm/pg-core';
import { createdAt } from '@/database/schemas/_helpers';
import { agents, agentsFiles, agentsKnowledgeBases } from './agent';
import { asyncTasks } from './asyncTask';
import { documentChunks, documents } from './document';
import { files, knowledgeBases } from './file';
import { messages, messagesFiles } from './message';
import { chunks, unstructuredChunks } from './rag';
import { sessionGroups, sessions } from './session';
import { threads, topicDocuments, topics } from './topic';
import { users } from './user';
export const agentsToSessions = pgTable(
'agents_to_sessions',
{
agentId: text('agent_id')
.notNull()
.references(() => agents.id, { onDelete: 'cascade' }),
sessionId: text('session_id')
.notNull()
.references(() => sessions.id, { onDelete: 'cascade' }),
userId: text('user_id')
.references(() => users.id, { onDelete: 'cascade' })
.notNull(),
},
(t) => ({
pk: primaryKey({ columns: [t.agentId, t.sessionId] }),
}),
);
export const filesToSessions = pgTable(
'files_to_sessions',
{
fileId: text('file_id')
.notNull()
.references(() => files.id, { onDelete: 'cascade' }),
sessionId: text('session_id')
.notNull()
.references(() => sessions.id, { onDelete: 'cascade' }),
userId: text('user_id')
.references(() => users.id, { onDelete: 'cascade' })
.notNull(),
},
(t) => ({
pk: primaryKey({ columns: [t.fileId, t.sessionId] }),
}),
);
export const fileChunks = pgTable(
'file_chunks',
{
fileId: varchar('file_id').references(() => files.id, { onDelete: 'cascade' }),
chunkId: uuid('chunk_id').references(() => chunks.id, { onDelete: 'cascade' }),
createdAt: createdAt(),
userId: text('user_id')
.references(() => users.id, { onDelete: 'cascade' })
.notNull(),
},
(t) => ({
pk: primaryKey({ columns: [t.fileId, t.chunkId] }),
}),
);
export type NewFileChunkItem = typeof fileChunks.$inferInsert;
export const topicRelations = relations(topics, ({ one, many }) => ({
session: one(sessions, {
fields: [topics.sessionId],
references: [sessions.id],
}),
documents: many(topicDocuments),
}));
export const threadsRelations = relations(threads, ({ one }) => ({
sourceMessage: one(messages, {
fields: [threads.sourceMessageId],
references: [messages.id],
}),
}));
export const messagesRelations = relations(messages, ({ many, one }) => ({
filesToMessages: many(messagesFiles),
session: one(sessions, {
fields: [messages.sessionId],
references: [sessions.id],
}),
parent: one(messages, {
fields: [messages.parentId],
references: [messages.id],
}),
topic: one(topics, {
fields: [messages.topicId],
references: [topics.id],
}),
thread: one(threads, {
fields: [messages.threadId],
references: [threads.id],
}),
}));
export const agentsRelations = relations(agents, ({ many }) => ({
agentsToSessions: many(agentsToSessions),
knowledgeBases: many(agentsKnowledgeBases),
files: many(agentsFiles),
}));
export const agentsToSessionsRelations = relations(agentsToSessions, ({ one }) => ({
session: one(sessions, {
fields: [agentsToSessions.sessionId],
references: [sessions.id],
}),
agent: one(agents, {
fields: [agentsToSessions.agentId],
references: [agents.id],
}),
}));
export const agentsKnowledgeBasesRelations = relations(agentsKnowledgeBases, ({ one }) => ({
knowledgeBase: one(knowledgeBases, {
fields: [agentsKnowledgeBases.knowledgeBaseId],
references: [knowledgeBases.id],
}),
agent: one(agents, {
fields: [agentsKnowledgeBases.agentId],
references: [agents.id],
}),
}));
export const sessionsRelations = relations(sessions, ({ many, one }) => ({
filesToSessions: many(filesToSessions),
agentsToSessions: many(agentsToSessions),
group: one(sessionGroups, {
fields: [sessions.groupId],
references: [sessionGroups.id],
}),
}));
export const chunksRelations = relations(unstructuredChunks, ({ one }) => ({
file: one(files, {
fields: [unstructuredChunks.fileId],
references: [files.id],
}),
}));
export const filesRelations = relations(files, ({ many, one }) => ({
messages: many(messagesFiles),
sessions: many(filesToSessions),
agents: many(agentsFiles),
documents: many(documents, { relationName: 'fileDocuments' }),
chunkingTask: one(asyncTasks, {
fields: [files.chunkTaskId],
references: [asyncTasks.id],
}),
embeddingTask: one(asyncTasks, {
fields: [files.embeddingTaskId],
references: [asyncTasks.id],
}),
}));
// Document 相关关系定义
export const documentsRelations = relations(documents, ({ one, many }) => ({
file: one(files, {
fields: [documents.fileId],
references: [files.id],
relationName: 'fileDocuments',
}),
topics: many(topicDocuments),
chunks: many(documentChunks),
}));
export const topicDocumentsRelations = relations(topicDocuments, ({ one }) => ({
document: one(documents, {
fields: [topicDocuments.documentId],
references: [documents.id],
}),
topic: one(topics, {
fields: [topicDocuments.topicId],
references: [topics.id],
}),
}));
export const documentChunksRelations = relations(documentChunks, ({ one }) => ({
document: one(documents, {
fields: [documentChunks.documentId],
references: [documents.id],
}),
}));