@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.
- package/CHANGELOG.md +25 -0
- package/changelog/v1.json +9 -0
- package/package.json +1 -1
- package/src/app/(main)/repos/[id]/@menu/default.tsx +2 -1
- package/src/app/(main)/repos/[id]/page.tsx +2 -1
- package/src/database/schemas/topic.ts +3 -1
- package/src/database/server/core/dbForTest.ts +4 -6
- package/src/database/server/models/__tests__/_test_template.ts +3 -9
- package/src/database/server/models/__tests__/agent.test.ts +2 -8
- package/src/database/server/models/__tests__/asyncTask.test.ts +1 -7
- package/src/database/server/models/__tests__/chunk.test.ts +155 -16
- package/src/database/server/models/__tests__/file.test.ts +123 -15
- package/src/database/server/models/__tests__/knowledgeBase.test.ts +6 -12
- package/src/database/server/models/__tests__/message.test.ts +230 -7
- package/src/database/server/models/__tests__/nextauth.test.ts +1 -7
- package/src/database/server/models/__tests__/plugin.test.ts +1 -7
- package/src/database/server/models/__tests__/session.test.ts +169 -11
- package/src/database/server/models/__tests__/sessionGroup.test.ts +2 -8
- package/src/database/server/models/__tests__/topic.test.ts +1 -7
- package/src/database/server/models/__tests__/user.test.ts +55 -20
- package/src/database/server/models/_template.ts +10 -8
- package/src/database/server/models/agent.ts +17 -13
- package/src/database/server/models/asyncTask.ts +11 -9
- package/src/database/server/models/chunk.ts +19 -14
- package/src/database/server/models/embedding.ts +10 -8
- package/src/database/server/models/file.ts +19 -17
- package/src/database/server/models/knowledgeBase.ts +14 -12
- package/src/database/server/models/message.ts +36 -34
- package/src/database/server/models/plugin.ts +10 -8
- package/src/database/server/models/session.ts +23 -64
- package/src/database/server/models/sessionGroup.ts +11 -9
- package/src/database/server/models/thread.ts +11 -9
- package/src/database/server/models/topic.ts +19 -22
- package/src/database/server/models/user.ts +96 -84
- package/src/database/type.ts +7 -0
- package/src/libs/next-auth/adapter/index.ts +10 -10
- package/src/libs/trpc/async/asyncAuth.ts +2 -1
- package/src/server/routers/async/file.ts +5 -4
- package/src/server/routers/async/ragEval.ts +4 -3
- package/src/server/routers/lambda/_template.ts +2 -1
- package/src/server/routers/lambda/agent.ts +6 -5
- package/src/server/routers/lambda/chunk.ts +5 -5
- package/src/server/routers/lambda/file.ts +4 -3
- package/src/server/routers/lambda/knowledgeBase.ts +2 -1
- package/src/server/routers/lambda/message.ts +4 -2
- package/src/server/routers/lambda/plugin.ts +4 -2
- package/src/server/routers/lambda/ragEval.ts +2 -1
- package/src/server/routers/lambda/session.ts +4 -3
- package/src/server/routers/lambda/sessionGroup.ts +2 -1
- package/src/server/routers/lambda/thread.ts +3 -2
- package/src/server/routers/lambda/topic.ts +4 -2
- package/src/server/routers/lambda/user.ts +10 -9
- package/src/server/services/chunk/index.ts +3 -2
- package/src/server/services/nextAuthUser/index.ts +3 -3
- 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 {
|
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
|
-
|
22
|
-
|
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
|
-
|
40
|
-
|
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
|
-
|
52
|
-
const result = await
|
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,
|
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: ${
|
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:
|
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(
|
141
|
-
return
|
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,
|
90
|
+
.where(eq(users.id, this.userId));
|
145
91
|
}
|
146
92
|
|
147
|
-
async deleteSetting(
|
148
|
-
return
|
93
|
+
async deleteSetting() {
|
94
|
+
return this.db.delete(userSettings).where(eq(userSettings.id, this.userId));
|
149
95
|
}
|
150
96
|
|
151
|
-
async updateSetting(
|
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
|
114
|
+
const settings = await this.db.query.userSettings.findFirst({
|
115
|
+
where: eq(users.id, this.userId),
|
116
|
+
});
|
169
117
|
if (!settings) {
|
170
|
-
await
|
118
|
+
await this.db.insert(userSettings).values({ id: this.userId, ...newValue });
|
171
119
|
return;
|
172
120
|
}
|
173
121
|
|
174
|
-
return
|
122
|
+
return this.db.update(userSettings).set(newValue).where(eq(userSettings.id, this.userId));
|
175
123
|
}
|
176
124
|
|
177
|
-
async updatePreference(
|
178
|
-
const user = await
|
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
|
129
|
+
return this.db
|
182
130
|
.update(users)
|
183
131
|
.set({ preference: merge(user.preference, value) })
|
184
|
-
.where(eq(users.id,
|
132
|
+
.where(eq(users.id, this.userId));
|
185
133
|
}
|
186
134
|
|
187
|
-
async updateGuide(
|
188
|
-
const user = await
|
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
|
140
|
+
return this.db
|
193
141
|
.update(users)
|
194
142
|
.set({ preference: { ...prevPreference, guide: merge(prevPreference.guide || {}, value) } })
|
195
|
-
.where(eq(users.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
|
}
|
@@ -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(
|
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
|
});
|