@lobehub/chat 1.35.9 → 1.35.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/changelog/v1.json +9 -0
  3. package/package.json +1 -1
  4. package/src/app/(main)/repos/[id]/@menu/default.tsx +2 -1
  5. package/src/app/(main)/repos/[id]/page.tsx +2 -1
  6. package/src/database/schemas/topic.ts +3 -1
  7. package/src/database/server/core/dbForTest.ts +4 -6
  8. package/src/database/server/models/__tests__/_test_template.ts +3 -9
  9. package/src/database/server/models/__tests__/agent.test.ts +2 -8
  10. package/src/database/server/models/__tests__/asyncTask.test.ts +1 -7
  11. package/src/database/server/models/__tests__/chunk.test.ts +155 -16
  12. package/src/database/server/models/__tests__/file.test.ts +123 -15
  13. package/src/database/server/models/__tests__/knowledgeBase.test.ts +6 -12
  14. package/src/database/server/models/__tests__/message.test.ts +230 -7
  15. package/src/database/server/models/__tests__/nextauth.test.ts +1 -7
  16. package/src/database/server/models/__tests__/plugin.test.ts +1 -7
  17. package/src/database/server/models/__tests__/session.test.ts +169 -11
  18. package/src/database/server/models/__tests__/sessionGroup.test.ts +2 -8
  19. package/src/database/server/models/__tests__/topic.test.ts +1 -7
  20. package/src/database/server/models/__tests__/user.test.ts +55 -20
  21. package/src/database/server/models/_template.ts +10 -8
  22. package/src/database/server/models/agent.ts +17 -13
  23. package/src/database/server/models/asyncTask.ts +11 -9
  24. package/src/database/server/models/chunk.ts +19 -14
  25. package/src/database/server/models/embedding.ts +10 -8
  26. package/src/database/server/models/file.ts +19 -17
  27. package/src/database/server/models/knowledgeBase.ts +14 -12
  28. package/src/database/server/models/message.ts +36 -34
  29. package/src/database/server/models/plugin.ts +10 -8
  30. package/src/database/server/models/session.ts +23 -64
  31. package/src/database/server/models/sessionGroup.ts +11 -9
  32. package/src/database/server/models/thread.ts +11 -9
  33. package/src/database/server/models/topic.ts +19 -22
  34. package/src/database/server/models/user.ts +96 -84
  35. package/src/database/type.ts +7 -0
  36. package/src/libs/next-auth/adapter/index.ts +10 -10
  37. package/src/libs/trpc/async/asyncAuth.ts +2 -1
  38. package/src/server/routers/async/file.ts +5 -4
  39. package/src/server/routers/async/ragEval.ts +4 -3
  40. package/src/server/routers/lambda/_template.ts +2 -1
  41. package/src/server/routers/lambda/agent.ts +6 -5
  42. package/src/server/routers/lambda/chunk.ts +5 -5
  43. package/src/server/routers/lambda/file.ts +4 -3
  44. package/src/server/routers/lambda/knowledgeBase.ts +2 -1
  45. package/src/server/routers/lambda/message.ts +4 -2
  46. package/src/server/routers/lambda/plugin.ts +4 -2
  47. package/src/server/routers/lambda/ragEval.ts +2 -1
  48. package/src/server/routers/lambda/session.ts +4 -3
  49. package/src/server/routers/lambda/sessionGroup.ts +2 -1
  50. package/src/server/routers/lambda/thread.ts +3 -2
  51. package/src/server/routers/lambda/topic.ts +4 -2
  52. package/src/server/routers/lambda/user.ts +10 -9
  53. package/src/server/services/chunk/index.ts +3 -2
  54. package/src/server/services/nextAuthUser/index.ts +3 -3
  55. package/src/server/services/user/index.ts +7 -6
@@ -2,7 +2,7 @@ import { TRPCError } from '@trpc/server';
2
2
  import { eq } from 'drizzle-orm';
3
3
  import { DeepPartial } from 'utility-types';
4
4
 
5
- import { serverDB } from '@/database/server/core/db';
5
+ import { LobeChatDatabase } from '@/database/type';
6
6
  import { KeyVaultsGateKeeper } from '@/server/modules/KeyVaultsEncrypt';
7
7
  import { UserGuide, UserPreference } from '@/types/user';
8
8
  import { UserKeyVaults, UserSettings } from '@/types/user/settings';
@@ -18,38 +18,16 @@ export class UserNotFoundError extends TRPCError {
18
18
  }
19
19
 
20
20
  export class UserModel {
21
- static createUser = async (params: NewUser) => {
22
- // if user already exists, skip creation
23
- if (params.id) {
24
- const user = await serverDB.query.users.findFirst({ where: eq(users.id, params.id) });
25
- if (!!user) return;
26
- }
27
-
28
- const [user] = await serverDB
29
- .insert(users)
30
- .values({ ...params })
31
- .returning();
32
-
33
- // Create an inbox session for the user
34
- const model = new SessionModel(user.id);
35
-
36
- await model.createInbox();
37
- };
21
+ private userId: string;
22
+ private db: LobeChatDatabase;
38
23
 
39
- static deleteUser = async (id: string) => {
40
- return serverDB.delete(users).where(eq(users.id, id));
41
- };
42
-
43
- static findById = async (id: string) => {
44
- return serverDB.query.users.findFirst({ where: eq(users.id, id) });
45
- };
46
-
47
- static findByEmail = async (email: string) => {
48
- return serverDB.query.users.findFirst({ where: eq(users.email, email) });
49
- };
24
+ constructor(db: LobeChatDatabase, userId: string) {
25
+ this.userId = userId;
26
+ this.db = db;
27
+ }
50
28
 
51
- getUserState = async (id: string) => {
52
- const result = await serverDB
29
+ async getUserState() {
30
+ const result = await this.db
53
31
  .select({
54
32
  isOnboarded: users.isOnboarded,
55
33
  preference: users.preference,
@@ -63,7 +41,7 @@ export class UserModel {
63
41
  settingsTool: userSettings.tool,
64
42
  })
65
43
  .from(users)
66
- .where(eq(users.id, id))
44
+ .where(eq(users.id, this.userId))
67
45
  .leftJoin(userSettings, eq(users.id, userSettings.id));
68
46
 
69
47
  if (!result || !result[0]) {
@@ -82,7 +60,7 @@ export class UserModel {
82
60
  try {
83
61
  decryptKeyVaults = JSON.parse(plaintext);
84
62
  } catch (e) {
85
- console.error(`Failed to parse keyVaults ,userId: ${id}. Error:`, e);
63
+ console.error(`Failed to parse keyVaults ,userId: ${this.userId}. Error:`, e);
86
64
  }
87
65
  }
88
66
  }
@@ -101,54 +79,22 @@ export class UserModel {
101
79
  isOnboarded: state.isOnboarded,
102
80
  preference: state.preference as UserPreference,
103
81
  settings,
104
- userId: id,
82
+ userId: this.userId,
105
83
  };
106
- };
107
-
108
- static getUserApiKeys = async (id: string) => {
109
- const result = await serverDB
110
- .select({
111
- settingsKeyVaults: userSettings.keyVaults,
112
- })
113
- .from(userSettings)
114
- .where(eq(userSettings.id, id));
115
-
116
- if (!result || !result[0]) {
117
- throw new UserNotFoundError();
118
- }
119
-
120
- const state = result[0];
121
-
122
- // Decrypt keyVaults
123
- let decryptKeyVaults = {};
124
- if (state.settingsKeyVaults) {
125
- const gateKeeper = await KeyVaultsGateKeeper.initWithEnvKey();
126
- const { wasAuthentic, plaintext } = await gateKeeper.decrypt(state.settingsKeyVaults);
127
-
128
- if (wasAuthentic) {
129
- try {
130
- decryptKeyVaults = JSON.parse(plaintext);
131
- } catch (e) {
132
- console.error(`Failed to parse keyVaults ,userId: ${id}. Error:`, e);
133
- }
134
- }
135
- }
136
-
137
- return decryptKeyVaults as UserKeyVaults;
138
- };
84
+ }
139
85
 
140
- async updateUser(id: string, value: Partial<UserItem>) {
141
- return serverDB
86
+ async updateUser(value: Partial<UserItem>) {
87
+ return this.db
142
88
  .update(users)
143
89
  .set({ ...value, updatedAt: new Date() })
144
- .where(eq(users.id, id));
90
+ .where(eq(users.id, this.userId));
145
91
  }
146
92
 
147
- async deleteSetting(id: string) {
148
- return serverDB.delete(userSettings).where(eq(userSettings.id, id));
93
+ async deleteSetting() {
94
+ return this.db.delete(userSettings).where(eq(userSettings.id, this.userId));
149
95
  }
150
96
 
151
- async updateSetting(id: string, value: Partial<UserSettings>) {
97
+ async updateSetting(value: Partial<UserSettings>) {
152
98
  const { keyVaults, ...res } = value;
153
99
 
154
100
  // Encrypt keyVaults
@@ -165,33 +111,99 @@ export class UserModel {
165
111
  const newValue = { ...res, keyVaults: encryptedKeyVaults };
166
112
 
167
113
  // update or create user settings
168
- const settings = await serverDB.query.userSettings.findFirst({ where: eq(users.id, id) });
114
+ const settings = await this.db.query.userSettings.findFirst({
115
+ where: eq(users.id, this.userId),
116
+ });
169
117
  if (!settings) {
170
- await serverDB.insert(userSettings).values({ id, ...newValue });
118
+ await this.db.insert(userSettings).values({ id: this.userId, ...newValue });
171
119
  return;
172
120
  }
173
121
 
174
- return serverDB.update(userSettings).set(newValue).where(eq(userSettings.id, id));
122
+ return this.db.update(userSettings).set(newValue).where(eq(userSettings.id, this.userId));
175
123
  }
176
124
 
177
- async updatePreference(id: string, value: Partial<UserPreference>) {
178
- const user = await serverDB.query.users.findFirst({ where: eq(users.id, id) });
125
+ async updatePreference(value: Partial<UserPreference>) {
126
+ const user = await this.db.query.users.findFirst({ where: eq(users.id, this.userId) });
179
127
  if (!user) return;
180
128
 
181
- return serverDB
129
+ return this.db
182
130
  .update(users)
183
131
  .set({ preference: merge(user.preference, value) })
184
- .where(eq(users.id, id));
132
+ .where(eq(users.id, this.userId));
185
133
  }
186
134
 
187
- async updateGuide(id: string, value: Partial<UserGuide>) {
188
- const user = await serverDB.query.users.findFirst({ where: eq(users.id, id) });
135
+ async updateGuide(value: Partial<UserGuide>) {
136
+ const user = await this.db.query.users.findFirst({ where: eq(users.id, this.userId) });
189
137
  if (!user) return;
190
138
 
191
139
  const prevPreference = (user.preference || {}) as UserPreference;
192
- return serverDB
140
+ return this.db
193
141
  .update(users)
194
142
  .set({ preference: { ...prevPreference, guide: merge(prevPreference.guide || {}, value) } })
195
- .where(eq(users.id, id));
143
+ .where(eq(users.id, this.userId));
196
144
  }
145
+
146
+ // Static method
147
+
148
+ static createUser = async (db: LobeChatDatabase, params: NewUser) => {
149
+ // if user already exists, skip creation
150
+ if (params.id) {
151
+ const user = await db.query.users.findFirst({ where: eq(users.id, params.id) });
152
+ if (!!user) return;
153
+ }
154
+
155
+ const [user] = await db
156
+ .insert(users)
157
+ .values({ ...params })
158
+ .returning();
159
+
160
+ // Create an inbox session for the user
161
+ const model = new SessionModel(db, user.id);
162
+
163
+ await model.createInbox();
164
+ };
165
+
166
+ static deleteUser = async (db: LobeChatDatabase, id: string) => {
167
+ return db.delete(users).where(eq(users.id, id));
168
+ };
169
+
170
+ static findById = async (db: LobeChatDatabase, id: string) => {
171
+ return db.query.users.findFirst({ where: eq(users.id, id) });
172
+ };
173
+
174
+ static findByEmail = async (db: LobeChatDatabase, email: string) => {
175
+ return db.query.users.findFirst({ where: eq(users.email, email) });
176
+ };
177
+
178
+ static getUserApiKeys = async (db: LobeChatDatabase, id: string) => {
179
+ const result = await db
180
+ .select({
181
+ settingsKeyVaults: userSettings.keyVaults,
182
+ })
183
+ .from(userSettings)
184
+ .where(eq(userSettings.id, id));
185
+
186
+ if (!result || !result[0]) {
187
+ throw new UserNotFoundError();
188
+ }
189
+
190
+ const state = result[0];
191
+
192
+ // Decrypt keyVaults
193
+ let decryptKeyVaults = {};
194
+ if (state.settingsKeyVaults) {
195
+ const gateKeeper = await KeyVaultsGateKeeper.initWithEnvKey();
196
+ const { wasAuthentic, plaintext } = await gateKeeper.decrypt(state.settingsKeyVaults);
197
+
198
+ if (wasAuthentic) {
199
+ try {
200
+ decryptKeyVaults = JSON.parse(plaintext);
201
+ } catch (e) {
202
+ console.error(`Failed to parse keyVaults ,userId: ${id}. Error:`, e);
203
+ }
204
+ }
205
+ }
206
+
207
+ return decryptKeyVaults as UserKeyVaults;
208
+ };
197
209
  }
@@ -0,0 +1,7 @@
1
+ import type { NeonDatabase } from 'drizzle-orm/neon-serverless';
2
+
3
+ import * as schema from './schemas';
4
+
5
+ export type LobeChatDatabaseSchema = typeof schema;
6
+
7
+ export type LobeChatDatabase = NeonDatabase<LobeChatDatabaseSchema>;
@@ -33,8 +33,6 @@ const {
33
33
  * @returns {Adapter}
34
34
  */
35
35
  export function LobeNextAuthDbAdapter(serverDB: NeonDatabase<typeof schema>): Adapter {
36
- const userModel = new UserModel();
37
-
38
36
  return {
39
37
  async createAuthenticator(authenticator): Promise<AdapterAuthenticator> {
40
38
  const result = await serverDB
@@ -55,10 +53,10 @@ export function LobeNextAuthDbAdapter(serverDB: NeonDatabase<typeof schema>): Ad
55
53
  async createUser(user): Promise<AdapterUser> {
56
54
  const { id, name, email, emailVerified, image, providerAccountId } = user;
57
55
  // return the user if it already exists
58
- let existingUser = await UserModel.findByEmail(email);
56
+ let existingUser = await UserModel.findByEmail(serverDB, email);
59
57
  // If the user is not found by email, try to find by providerAccountId
60
58
  if (!existingUser && providerAccountId) {
61
- existingUser = await UserModel.findById(providerAccountId);
59
+ existingUser = await UserModel.findById(serverDB, providerAccountId);
62
60
  }
63
61
  if (existingUser) {
64
62
  const adapterUser = mapLobeUserToAdapterUser(existingUser);
@@ -66,6 +64,7 @@ export function LobeNextAuthDbAdapter(serverDB: NeonDatabase<typeof schema>): Ad
66
64
  }
67
65
  // create a new user if it does not exist
68
66
  await UserModel.createUser(
67
+ serverDB,
69
68
  mapAdapterUserToLobeUser({
70
69
  email,
71
70
  emailVerified,
@@ -91,10 +90,10 @@ export function LobeNextAuthDbAdapter(serverDB: NeonDatabase<typeof schema>): Ad
91
90
  return;
92
91
  },
93
92
  async deleteUser(id): Promise<AdapterUser | null | undefined> {
94
- const user = await UserModel.findById(id);
93
+ const user = await UserModel.findById(serverDB, id);
95
94
  if (!user) throw new Error('NextAuth: Delete User not found');
96
95
 
97
- await UserModel.deleteUser(id);
96
+ await UserModel.deleteUser(serverDB, id);
98
97
  return;
99
98
  },
100
99
 
@@ -145,7 +144,7 @@ export function LobeNextAuthDbAdapter(serverDB: NeonDatabase<typeof schema>): Ad
145
144
  },
146
145
 
147
146
  async getUser(id): Promise<AdapterUser | null> {
148
- const lobeUser = await UserModel.findById(id);
147
+ const lobeUser = await UserModel.findById(serverDB, id);
149
148
  if (!lobeUser) return null;
150
149
  return mapLobeUserToAdapterUser(lobeUser);
151
150
  },
@@ -170,7 +169,7 @@ export function LobeNextAuthDbAdapter(serverDB: NeonDatabase<typeof schema>): Ad
170
169
  },
171
170
 
172
171
  async getUserByEmail(email): Promise<AdapterUser | null> {
173
- const lobeUser = await UserModel.findByEmail(email);
172
+ const lobeUser = await UserModel.findByEmail(serverDB, email);
174
173
  return lobeUser ? mapLobeUserToAdapterUser(lobeUser) : null;
175
174
  },
176
175
 
@@ -228,10 +227,11 @@ export function LobeNextAuthDbAdapter(serverDB: NeonDatabase<typeof schema>): Ad
228
227
  },
229
228
 
230
229
  async updateUser(user): Promise<AdapterUser> {
231
- const lobeUser = await UserModel.findById(user?.id);
230
+ const lobeUser = await UserModel.findById(serverDB, user?.id);
232
231
  if (!lobeUser) throw new Error('NextAuth: User not found');
232
+ const userModel = new UserModel(serverDB, user.id);
233
233
 
234
- const updatedUser = await userModel.updateUser(user.id, {
234
+ const updatedUser = await userModel.updateUser({
235
235
  ...partialMapAdapterUserToLobeUser(user),
236
236
  });
237
237
  if (!updatedUser) throw new Error('NextAuth: Failed to update user');
@@ -1,6 +1,7 @@
1
1
  import { TRPCError } from '@trpc/server';
2
2
 
3
3
  import { serverDBEnv } from '@/config/db';
4
+ import { serverDB } from '@/database/server';
4
5
  import { UserModel } from '@/database/server/models/user';
5
6
 
6
7
  import { asyncTrpc } from './init';
@@ -12,7 +13,7 @@ export const asyncAuth = asyncTrpc.middleware(async (opts) => {
12
13
  throw new TRPCError({ code: 'UNAUTHORIZED' });
13
14
  }
14
15
 
15
- const result = await UserModel.findById(ctx.userId);
16
+ const result = await UserModel.findById(serverDB, ctx.userId);
16
17
 
17
18
  if (!result) {
18
19
  throw new TRPCError({ code: 'UNAUTHORIZED', message: 'user is invalid' });
@@ -5,6 +5,7 @@ import { z } from 'zod';
5
5
 
6
6
  import { fileEnv } from '@/config/file';
7
7
  import { DEFAULT_EMBEDDING_MODEL } from '@/const/settings';
8
+ import { serverDB } from '@/database/server';
8
9
  import { ASYNC_TASK_TIMEOUT, AsyncTaskModel } from '@/database/server/models/asyncTask';
9
10
  import { ChunkModel } from '@/database/server/models/chunk';
10
11
  import { EmbeddingModel } from '@/database/server/models/embedding';
@@ -28,11 +29,11 @@ const fileProcedure = asyncAuthedProcedure.use(async (opts) => {
28
29
 
29
30
  return opts.next({
30
31
  ctx: {
31
- asyncTaskModel: new AsyncTaskModel(ctx.userId),
32
- chunkModel: new ChunkModel(ctx.userId),
32
+ asyncTaskModel: new AsyncTaskModel(serverDB, ctx.userId),
33
+ chunkModel: new ChunkModel(serverDB, ctx.userId),
33
34
  chunkService: new ChunkService(ctx.userId),
34
- embeddingModel: new EmbeddingModel(ctx.userId),
35
- fileModel: new FileModel(ctx.userId),
35
+ embeddingModel: new EmbeddingModel(serverDB, ctx.userId),
36
+ fileModel: new FileModel(serverDB, ctx.userId),
36
37
  },
37
38
  });
38
39
  });
@@ -4,6 +4,7 @@ import { z } from 'zod';
4
4
 
5
5
  import { chainAnswerWithContext } from '@/chains/answerWithContext';
6
6
  import { DEFAULT_EMBEDDING_MODEL, DEFAULT_MODEL } from '@/const/settings';
7
+ import { serverDB } from '@/database/server';
7
8
  import { ChunkModel } from '@/database/server/models/chunk';
8
9
  import { EmbeddingModel } from '@/database/server/models/embedding';
9
10
  import { FileModel } from '@/database/server/models/file';
@@ -24,13 +25,13 @@ const ragEvalProcedure = asyncAuthedProcedure.use(async (opts) => {
24
25
 
25
26
  return opts.next({
26
27
  ctx: {
27
- chunkModel: new ChunkModel(ctx.userId),
28
+ chunkModel: new ChunkModel(serverDB, ctx.userId),
28
29
  chunkService: new ChunkService(ctx.userId),
29
30
  datasetRecordModel: new EvalDatasetRecordModel(ctx.userId),
30
- embeddingModel: new EmbeddingModel(ctx.userId),
31
+ embeddingModel: new EmbeddingModel(serverDB, ctx.userId),
31
32
  evalRecordModel: new EvaluationRecordModel(ctx.userId),
32
33
  evaluationModel: new EvalEvaluationModel(ctx.userId),
33
- fileModel: new FileModel(ctx.userId),
34
+ fileModel: new FileModel(serverDB, ctx.userId),
34
35
  },
35
36
  });
36
37
  });
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { serverDB } from '@/database/server';
3
4
  import { SessionGroupModel } from '@/database/server/models/sessionGroup';
4
5
  import { insertSessionGroupSchema } from '@/database/schemas';
5
6
  import { authedProcedure, router } from '@/libs/trpc';
@@ -10,7 +11,7 @@ const sessionProcedure = authedProcedure.use(async (opts) => {
10
11
 
11
12
  return opts.next({
12
13
  ctx: {
13
- sessionGroupModel: new SessionGroupModel(ctx.userId),
14
+ sessionGroupModel: new SessionGroupModel(serverDB, ctx.userId),
14
15
  },
15
16
  });
16
17
  });
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
 
3
3
  import { INBOX_SESSION_ID } from '@/const/session';
4
4
  import { DEFAULT_AGENT_CONFIG } from '@/const/settings';
5
+ import { serverDB } from '@/database/server';
5
6
  import { AgentModel } from '@/database/server/models/agent';
6
7
  import { FileModel } from '@/database/server/models/file';
7
8
  import { KnowledgeBaseModel } from '@/database/server/models/knowledgeBase';
@@ -16,10 +17,10 @@ const agentProcedure = authedProcedure.use(async (opts) => {
16
17
 
17
18
  return opts.next({
18
19
  ctx: {
19
- agentModel: new AgentModel(ctx.userId),
20
- fileModel: new FileModel(ctx.userId),
21
- knowledgeBaseModel: new KnowledgeBaseModel(ctx.userId),
22
- sessionModel: new SessionModel(ctx.userId),
20
+ agentModel: new AgentModel(serverDB, ctx.userId),
21
+ fileModel: new FileModel(serverDB, ctx.userId),
22
+ knowledgeBaseModel: new KnowledgeBaseModel(serverDB, ctx.userId),
23
+ sessionModel: new SessionModel(serverDB, ctx.userId),
23
24
  },
24
25
  });
25
26
  });
@@ -87,7 +88,7 @@ export const agentRouter = router({
87
88
  // if there is no session for user, create one
88
89
  if (!item) {
89
90
  // if there is no user, return default config
90
- const user = await UserModel.findById(ctx.userId);
91
+ const user = await UserModel.findById(serverDB, ctx.userId);
91
92
  if (!user) return DEFAULT_AGENT_CONFIG;
92
93
 
93
94
  const res = await ctx.sessionModel.createInbox();
@@ -21,12 +21,12 @@ const chunkProcedure = authedProcedure.use(keyVaults).use(async (opts) => {
21
21
 
22
22
  return opts.next({
23
23
  ctx: {
24
- asyncTaskModel: new AsyncTaskModel(ctx.userId),
25
- chunkModel: new ChunkModel(ctx.userId),
24
+ asyncTaskModel: new AsyncTaskModel(serverDB, ctx.userId),
25
+ chunkModel: new ChunkModel(serverDB, ctx.userId),
26
26
  chunkService: new ChunkService(ctx.userId),
27
- embeddingModel: new EmbeddingModel(ctx.userId),
28
- fileModel: new FileModel(ctx.userId),
29
- messageModel: new MessageModel(ctx.userId),
27
+ embeddingModel: new EmbeddingModel(serverDB, ctx.userId),
28
+ fileModel: new FileModel(serverDB, ctx.userId),
29
+ messageModel: new MessageModel(serverDB, ctx.userId),
30
30
  },
31
31
  });
32
32
  });
@@ -1,6 +1,7 @@
1
1
  import { TRPCError } from '@trpc/server';
2
2
  import { z } from 'zod';
3
3
 
4
+ import { serverDB } from '@/database/server';
4
5
  import { AsyncTaskModel } from '@/database/server/models/asyncTask';
5
6
  import { ChunkModel } from '@/database/server/models/chunk';
6
7
  import { FileModel } from '@/database/server/models/file';
@@ -15,9 +16,9 @@ const fileProcedure = authedProcedure.use(async (opts) => {
15
16
 
16
17
  return opts.next({
17
18
  ctx: {
18
- asyncTaskModel: new AsyncTaskModel(ctx.userId),
19
- chunkModel: new ChunkModel(ctx.userId),
20
- fileModel: new FileModel(ctx.userId),
19
+ asyncTaskModel: new AsyncTaskModel(serverDB, ctx.userId),
20
+ chunkModel: new ChunkModel(serverDB, ctx.userId),
21
+ fileModel: new FileModel(serverDB, ctx.userId),
21
22
  },
22
23
  });
23
24
  });
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { serverDB } from '@/database/server';
3
4
  import { KnowledgeBaseModel } from '@/database/server/models/knowledgeBase';
4
5
  import { insertKnowledgeBasesSchema } from '@/database/schemas';
5
6
  import { authedProcedure, router } from '@/libs/trpc';
@@ -10,7 +11,7 @@ const knowledgeBaseProcedure = authedProcedure.use(async (opts) => {
10
11
 
11
12
  return opts.next({
12
13
  ctx: {
13
- knowledgeBaseModel: new KnowledgeBaseModel(ctx.userId),
14
+ knowledgeBaseModel: new KnowledgeBaseModel(serverDB, ctx.userId),
14
15
  },
15
16
  });
16
17
  });
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { serverDB } from '@/database/server';
3
4
  import { MessageModel } from '@/database/server/models/message';
4
5
  import { updateMessagePluginSchema } from '@/database/schemas';
5
6
  import { authedProcedure, publicProcedure, router } from '@/libs/trpc';
@@ -12,7 +13,7 @@ const messageProcedure = authedProcedure.use(async (opts) => {
12
13
  const { ctx } = opts;
13
14
 
14
15
  return opts.next({
15
- ctx: { messageModel: new MessageModel(ctx.userId) },
16
+ ctx: { messageModel: new MessageModel(serverDB, ctx.userId) },
16
17
  });
17
18
  });
18
19
 
@@ -54,6 +55,7 @@ export const messageRouter = router({
54
55
  return ctx.messageModel.queryBySessionId(input.sessionId);
55
56
  }),
56
57
 
58
+ // TODO: 未来这部分方法也需要使用 authedProcedure
57
59
  getMessages: publicProcedure
58
60
  .input(
59
61
  z.object({
@@ -66,7 +68,7 @@ export const messageRouter = router({
66
68
  .query(async ({ input, ctx }) => {
67
69
  if (!ctx.userId) return [];
68
70
 
69
- const messageModel = new MessageModel(ctx.userId);
71
+ const messageModel = new MessageModel(serverDB, ctx.userId);
70
72
 
71
73
  return messageModel.query(input);
72
74
  }),
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { serverDB } from '@/database/server';
3
4
  import { PluginModel } from '@/database/server/models/plugin';
4
5
  import { authedProcedure, publicProcedure, router } from '@/libs/trpc';
5
6
  import { LobeTool } from '@/types/tool';
@@ -8,7 +9,7 @@ const pluginProcedure = authedProcedure.use(async (opts) => {
8
9
  const { ctx } = opts;
9
10
 
10
11
  return opts.next({
11
- ctx: { pluginModel: new PluginModel(ctx.userId) },
12
+ ctx: { pluginModel: new PluginModel(serverDB, ctx.userId) },
12
13
  });
13
14
  });
14
15
 
@@ -61,10 +62,11 @@ export const pluginRouter = router({
61
62
  return data.identifier;
62
63
  }),
63
64
 
65
+ // TODO: 未来这部分方法也需要使用 authedProcedure
64
66
  getPlugins: publicProcedure.query(async ({ ctx }): Promise<LobeTool[]> => {
65
67
  if (!ctx.userId) return [];
66
68
 
67
- const pluginModel = new PluginModel(ctx.userId);
69
+ const pluginModel = new PluginModel(serverDB, ctx.userId);
68
70
 
69
71
  return pluginModel.query();
70
72
  }),
@@ -6,6 +6,7 @@ import pMap from 'p-map';
6
6
  import { z } from 'zod';
7
7
 
8
8
  import { DEFAULT_EMBEDDING_MODEL, DEFAULT_MODEL } from '@/const/settings';
9
+ import { serverDB } from '@/database/server';
9
10
  import { FileModel } from '@/database/server/models/file';
10
11
  import {
11
12
  EvalDatasetModel,
@@ -34,7 +35,7 @@ const ragEvalProcedure = authedProcedure.use(keyVaults).use(async (opts) => {
34
35
  return opts.next({
35
36
  ctx: {
36
37
  datasetModel: new EvalDatasetModel(ctx.userId),
37
- fileModel: new FileModel(ctx.userId),
38
+ fileModel: new FileModel(serverDB, ctx.userId),
38
39
  datasetRecordModel: new EvalDatasetRecordModel(ctx.userId),
39
40
  evaluationModel: new EvalEvaluationModel(ctx.userId),
40
41
  evaluationRecordModel: new EvaluationRecordModel(ctx.userId),
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { serverDB } from '@/database/server';
3
4
  import { SessionModel } from '@/database/server/models/session';
4
5
  import { SessionGroupModel } from '@/database/server/models/sessionGroup';
5
6
  import { insertAgentSchema, insertSessionSchema } from '@/database/schemas';
@@ -15,8 +16,8 @@ const sessionProcedure = authedProcedure.use(async (opts) => {
15
16
 
16
17
  return opts.next({
17
18
  ctx: {
18
- sessionGroupModel: new SessionGroupModel(ctx.userId),
19
- sessionModel: new SessionModel(ctx.userId),
19
+ sessionGroupModel: new SessionGroupModel(serverDB, ctx.userId),
20
+ sessionModel: new SessionModel(serverDB, ctx.userId),
20
21
  },
21
22
  });
22
23
  });
@@ -84,7 +85,7 @@ export const sessionRouter = router({
84
85
  sessions: [],
85
86
  };
86
87
 
87
- const sessionModel = new SessionModel(ctx.userId);
88
+ const sessionModel = new SessionModel(serverDB, ctx.userId);
88
89
 
89
90
  return sessionModel.queryWithGroups();
90
91
  }),
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { serverDB } from '@/database/server';
3
4
  import { SessionGroupModel } from '@/database/server/models/sessionGroup';
4
5
  import { insertSessionGroupSchema } from '@/database/schemas';
5
6
  import { authedProcedure, router } from '@/libs/trpc';
@@ -10,7 +11,7 @@ const sessionProcedure = authedProcedure.use(async (opts) => {
10
11
 
11
12
  return opts.next({
12
13
  ctx: {
13
- sessionGroupModel: new SessionGroupModel(ctx.userId),
14
+ sessionGroupModel: new SessionGroupModel(serverDB, ctx.userId),
14
15
  },
15
16
  });
16
17
  });
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ import { serverDB } from '@/database/server';
3
4
  import { MessageModel } from '@/database/server/models/message';
4
5
  import { ThreadModel } from '@/database/server/models/thread';
5
6
  import { insertThreadSchema } from '@/database/schemas';
@@ -11,8 +12,8 @@ const threadProcedure = authedProcedure.use(async (opts) => {
11
12
 
12
13
  return opts.next({
13
14
  ctx: {
14
- messageModel: new MessageModel(ctx.userId),
15
- threadModel: new ThreadModel(ctx.userId),
15
+ messageModel: new MessageModel(serverDB, ctx.userId),
16
+ threadModel: new ThreadModel(serverDB, ctx.userId),
16
17
  },
17
18
  });
18
19
  });