diff --git a/packages/data-schemas/src/index.ts b/packages/data-schemas/src/index.ts index c135bacfb6..4a2d68b505 100644 --- a/packages/data-schemas/src/index.ts +++ b/packages/data-schemas/src/index.ts @@ -25,7 +25,6 @@ export { default as assistantSchema } from './schema/assistant'; export type { IAssistant } from './schema/assistant'; export { default as balanceSchema } from './schema/balance'; -export type { IBalance } from './schema/balance'; export { default as bannerSchema } from './schema/banner'; export type { IBanner } from './schema/banner'; @@ -37,7 +36,6 @@ export { default as conversationTagSchema } from './schema/conversationTag'; export type { IConversationTag } from './schema/conversationTag'; export { default as convoSchema } from './schema/convo'; -export type { IConversation } from './schema/convo'; export { default as fileSchema } from './schema/file'; export type { IMongoFile } from './schema/file'; diff --git a/packages/data-schemas/src/models/balance.ts b/packages/data-schemas/src/models/balance.ts new file mode 100644 index 0000000000..2cc174fef0 --- /dev/null +++ b/packages/data-schemas/src/models/balance.ts @@ -0,0 +1,6 @@ +import mongoose from 'mongoose'; +import balanceSchema from '~/schema/balance'; +import type * as t from '~/types'; + +export const Balance = + mongoose.models.Balance || mongoose.model('Balance', balanceSchema); diff --git a/packages/data-schemas/src/models/convo.ts b/packages/data-schemas/src/models/convo.ts new file mode 100644 index 0000000000..38d7e554ee --- /dev/null +++ b/packages/data-schemas/src/models/convo.ts @@ -0,0 +1,17 @@ +import mongoose from 'mongoose'; +import type * as t from '~/types'; +import mongoMeili from '~/models/plugins/mongoMeili'; +import convoSchema from '~/schema/convo'; + +if (process.env.MEILI_HOST && process.env.MEILI_MASTER_KEY) { + convoSchema.plugin(mongoMeili, { + host: process.env.MEILI_HOST, + apiKey: process.env.MEILI_MASTER_KEY, + /** Note: Will get created automatically if it doesn't exist already */ + indexName: 'convos', + primaryKey: 'conversationId', + }); +} + +export const Conversation = + mongoose.models.Conversation || mongoose.model('Conversation', convoSchema); diff --git a/packages/data-schemas/src/models/index.ts b/packages/data-schemas/src/models/index.ts index a53380286e..fb094fd28e 100644 --- a/packages/data-schemas/src/models/index.ts +++ b/packages/data-schemas/src/models/index.ts @@ -1,25 +1,7 @@ -import mongoose from 'mongoose'; - -// Import schemas -import userSchema from '~/schema/user'; -import sessionSchema from '~/schema/session'; -import tokenSchema from '~/schema/token'; -import balanceSchema from '~/schema/balance'; - -// Import types -import { IUser, ISession, IToken } from '~/types'; -import { IBalance } from '~/schema/balance'; - -// Create and export model instances -export const User = mongoose.model('User', userSchema); -export const Session = mongoose.model('Session', sessionSchema); -export const Token = mongoose.model('Token', tokenSchema); -export const Balance = mongoose.model('Balance', balanceSchema); - -// Default export with all models -export default { - User, - Session, - Token, - Balance, -}; +// Export models from their individual files +export { User } from './user'; +export { Token } from './token'; +export { Session } from './session'; +export { Balance } from './balance'; +export { Conversation } from './convo'; +export { Message } from './message'; diff --git a/packages/data-schemas/src/models/message.ts b/packages/data-schemas/src/models/message.ts new file mode 100644 index 0000000000..46af4a4a28 --- /dev/null +++ b/packages/data-schemas/src/models/message.ts @@ -0,0 +1,16 @@ +import mongoose from 'mongoose'; +import mongoMeili from '~/models/plugins/mongoMeili'; +import messageSchema from '~/schema/message'; +import type * as t from '~/types'; + +if (process.env.MEILI_HOST && process.env.MEILI_MASTER_KEY) { + messageSchema.plugin(mongoMeili, { + host: process.env.MEILI_HOST, + apiKey: process.env.MEILI_MASTER_KEY, + indexName: 'messages', + primaryKey: 'messageId', + }); +} + +export const Message = + mongoose.models.Message || mongoose.model('Message', messageSchema); diff --git a/packages/data-schemas/src/models/session.ts b/packages/data-schemas/src/models/session.ts new file mode 100644 index 0000000000..142ab94c09 --- /dev/null +++ b/packages/data-schemas/src/models/session.ts @@ -0,0 +1,6 @@ +import mongoose from 'mongoose'; +import sessionSchema from '~/schema/session'; +import type * as t from '~/types'; + +export const Session = + mongoose.models.Session || mongoose.model('Session', sessionSchema); diff --git a/packages/data-schemas/src/models/token.ts b/packages/data-schemas/src/models/token.ts new file mode 100644 index 0000000000..2f8b1a7aa2 --- /dev/null +++ b/packages/data-schemas/src/models/token.ts @@ -0,0 +1,5 @@ +import mongoose from 'mongoose'; +import tokenSchema from '~/schema/token'; +import type * as t from '~/types'; + +export const Token = mongoose.models.Token || mongoose.model('Token', tokenSchema); diff --git a/packages/data-schemas/src/models/user.ts b/packages/data-schemas/src/models/user.ts new file mode 100644 index 0000000000..df59a05999 --- /dev/null +++ b/packages/data-schemas/src/models/user.ts @@ -0,0 +1,5 @@ +import mongoose from 'mongoose'; +import userSchema from '~/schema/user'; +import type * as t from '~/types'; + +export const User = mongoose.models.User || mongoose.model('User', userSchema); diff --git a/packages/data-schemas/src/schema/balance.ts b/packages/data-schemas/src/schema/balance.ts index c02871dffe..8e786ae388 100644 --- a/packages/data-schemas/src/schema/balance.ts +++ b/packages/data-schemas/src/schema/balance.ts @@ -1,17 +1,7 @@ -import { Schema, Document, Types } from 'mongoose'; +import { Schema } from 'mongoose'; +import type * as t from '~/types'; -export interface IBalance extends Document { - user: Types.ObjectId; - tokenCredits: number; - // Automatic refill settings - autoRefillEnabled: boolean; - refillIntervalValue: number; - refillIntervalUnit: 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months'; - lastRefill: Date; - refillAmount: number; -} - -const balanceSchema = new Schema({ +const balanceSchema = new Schema({ user: { type: Schema.Types.ObjectId, ref: 'User', diff --git a/packages/data-schemas/src/schema/convo.ts b/packages/data-schemas/src/schema/convo.ts index 44a7a6affd..7a18eeb66b 100644 --- a/packages/data-schemas/src/schema/convo.ts +++ b/packages/data-schemas/src/schema/convo.ts @@ -1,57 +1,6 @@ -import mongoose, { Schema, Document, Types } from 'mongoose'; +import mongoose, { Schema } from 'mongoose'; import { conversationPreset } from './defaults'; - -// @ts-ignore -export interface IConversation extends Document { - conversationId: string; - title?: string; - user?: string; - messages?: Types.ObjectId[]; - agentOptions?: unknown; - // Fields provided by conversationPreset (adjust types as needed) - endpoint?: string; - endpointType?: string; - model?: string; - region?: string; - chatGptLabel?: string; - examples?: unknown[]; - modelLabel?: string; - promptPrefix?: string; - temperature?: number; - top_p?: number; - topP?: number; - topK?: number; - maxOutputTokens?: number; - maxTokens?: number; - presence_penalty?: number; - frequency_penalty?: number; - file_ids?: string[]; - resendImages?: boolean; - promptCache?: boolean; - thinking?: boolean; - thinkingBudget?: number; - system?: string; - resendFiles?: boolean; - imageDetail?: string; - agent_id?: string; - assistant_id?: string; - instructions?: string; - stop?: string[]; - isArchived?: boolean; - iconURL?: string; - greeting?: string; - spec?: string; - tags?: string[]; - tools?: string[]; - maxContextTokens?: number; - max_tokens?: number; - reasoning_effort?: string; - // Additional fields - files?: string[]; - expiredAt?: Date; - createdAt?: Date; - updatedAt?: Date; -} +import { IConversation } from '~/types'; const convoSchema: Schema = new Schema( { diff --git a/packages/data-schemas/src/types/balance.ts b/packages/data-schemas/src/types/balance.ts new file mode 100644 index 0000000000..d9497ff514 --- /dev/null +++ b/packages/data-schemas/src/types/balance.ts @@ -0,0 +1,12 @@ +import { Document, Types } from 'mongoose'; + +export interface IBalance extends Document { + user: Types.ObjectId; + tokenCredits: number; + // Automatic refill settings + autoRefillEnabled: boolean; + refillIntervalValue: number; + refillIntervalUnit: 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months'; + lastRefill: Date; + refillAmount: number; +} diff --git a/packages/data-schemas/src/types/convo.ts b/packages/data-schemas/src/types/convo.ts new file mode 100644 index 0000000000..f088db8c92 --- /dev/null +++ b/packages/data-schemas/src/types/convo.ts @@ -0,0 +1,53 @@ +import type { Document, Types } from 'mongoose'; + +// @ts-ignore +export interface IConversation extends Document { + conversationId: string; + title?: string; + user?: string; + messages?: Types.ObjectId[]; + agentOptions?: unknown; + // Fields provided by conversationPreset (adjust types as needed) + endpoint?: string; + endpointType?: string; + model?: string; + region?: string; + chatGptLabel?: string; + examples?: unknown[]; + modelLabel?: string; + promptPrefix?: string; + temperature?: number; + top_p?: number; + topP?: number; + topK?: number; + maxOutputTokens?: number; + maxTokens?: number; + presence_penalty?: number; + frequency_penalty?: number; + file_ids?: string[]; + resendImages?: boolean; + promptCache?: boolean; + thinking?: boolean; + thinkingBudget?: number; + system?: string; + resendFiles?: boolean; + imageDetail?: string; + agent_id?: string; + assistant_id?: string; + instructions?: string; + stop?: string[]; + isArchived?: boolean; + iconURL?: string; + greeting?: string; + spec?: string; + tags?: string[]; + tools?: string[]; + maxContextTokens?: number; + max_tokens?: number; + reasoning_effort?: string; + // Additional fields + files?: string[]; + expiredAt?: Date; + createdAt?: Date; + updatedAt?: Date; +} diff --git a/packages/data-schemas/src/types/index.ts b/packages/data-schemas/src/types/index.ts index 1077dfd676..b8538c2f73 100644 --- a/packages/data-schemas/src/types/index.ts +++ b/packages/data-schemas/src/types/index.ts @@ -1,8 +1,6 @@ -// User types export * from './user'; - -// Session types -export * from './session'; - -// Token types export * from './token'; +export * from './convo'; +export * from './session'; +export * from './balance'; +export * from './message'; diff --git a/packages/data-schemas/src/types/message.ts b/packages/data-schemas/src/types/message.ts new file mode 100644 index 0000000000..cfa302f1d0 --- /dev/null +++ b/packages/data-schemas/src/types/message.ts @@ -0,0 +1,38 @@ +import type { Document } from 'mongoose'; + +// @ts-ignore +export interface IMessage extends Document { + messageId: string; + conversationId: string; + user: string; + model?: string; + endpoint?: string; + conversationSignature?: string; + clientId?: string; + invocationId?: number; + parentMessageId?: string; + tokenCount?: number; + summaryTokenCount?: number; + sender?: string; + text?: string; + summary?: string; + isCreatedByUser: boolean; + unfinished?: boolean; + error?: boolean; + finish_reason?: string; + _meiliIndex?: boolean; + files?: unknown[]; + plugin?: { + latest?: string; + inputs?: unknown[]; + outputs?: string; + }; + plugins?: unknown[]; + content?: unknown[]; + thread_id?: string; + iconURL?: string; + attachments?: unknown[]; + expiredAt?: Date; + createdAt?: Date; + updatedAt?: Date; +}