UNPKG

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

113 lines (95 loc) 3.14 kB
/* eslint-disable sort-keys-fix/sort-keys-fix */ import { boolean, jsonb, pgTable, primaryKey, text, uniqueIndex, varchar, } from 'drizzle-orm/pg-core'; import { createInsertSchema } from 'drizzle-zod'; import { idGenerator, randomSlug } from '@/database/utils/idGenerator'; import { LobeAgentChatConfig, LobeAgentTTSConfig } from '@/types/agent'; import { timestamps } from './_helpers'; import { files, knowledgeBases } from './file'; import { users } from './user'; // Agent table is the main table for storing agents // agent is a model that represents the assistant that is created by the user // agent can have its own knowledge base and files export const agents = pgTable( 'agents', { id: text('id') .primaryKey() .$defaultFn(() => idGenerator('agents')) .notNull(), slug: varchar('slug', { length: 100 }) .$defaultFn(() => randomSlug(4)) .unique(), title: text('title'), description: text('description'), tags: jsonb('tags').$type<string[]>().default([]), avatar: text('avatar'), backgroundColor: text('background_color'), plugins: jsonb('plugins').$type<string[]>().default([]), clientId: text('client_id'), userId: text('user_id') .references(() => users.id, { onDelete: 'cascade' }) .notNull(), chatConfig: jsonb('chat_config').$type<LobeAgentChatConfig>(), fewShots: jsonb('few_shots'), model: text('model'), params: jsonb('params').default({}), provider: text('provider'), systemRole: text('system_role'), tts: jsonb('tts').$type<LobeAgentTTSConfig>(), openingMessage: text('opening_message'), openingQuestions: text('opening_questions').array().default([]), ...timestamps, }, (t) => ({ clientIdUnique: uniqueIndex('client_id_user_id_unique').on(t.clientId, t.userId), }), ); export const insertAgentSchema = createInsertSchema(agents); export type NewAgent = typeof agents.$inferInsert; export type AgentItem = typeof agents.$inferSelect; export const agentsKnowledgeBases = pgTable( 'agents_knowledge_bases', { agentId: text('agent_id') .references(() => agents.id, { onDelete: 'cascade' }) .notNull(), knowledgeBaseId: text('knowledge_base_id') .references(() => knowledgeBases.id, { onDelete: 'cascade' }) .notNull(), userId: text('user_id') .references(() => users.id, { onDelete: 'cascade' }) .notNull(), enabled: boolean('enabled').default(true), ...timestamps, }, (t) => ({ pk: primaryKey({ columns: [t.agentId, t.knowledgeBaseId] }), }), ); export const agentsFiles = pgTable( 'agents_files', { fileId: text('file_id') .notNull() .references(() => files.id, { onDelete: 'cascade' }), agentId: text('agent_id') .notNull() .references(() => agents.id, { onDelete: 'cascade' }), enabled: boolean('enabled').default(true), userId: text('user_id') .references(() => users.id, { onDelete: 'cascade' }) .notNull(), ...timestamps, }, (t) => ({ pk: primaryKey({ columns: [t.fileId, t.agentId, t.userId] }), }), );