@lobehub/lobehub 2.0.0-next.25 → 2.0.0-next.27
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 +50 -0
- package/changelog/v1.json +18 -0
- package/docs/development/database-schema.dbml +1 -0
- package/e2e/src/features/discover/detail-pages.feature +95 -0
- package/e2e/src/features/discover/interactions.feature +113 -0
- package/e2e/src/steps/discover/detail-pages.steps.ts +295 -0
- package/e2e/src/steps/discover/interactions.steps.ts +451 -0
- package/package.json +1 -1
- package/packages/database/migrations/0043_add_ai_model_settings.sql +1 -0
- package/packages/database/migrations/meta/0043_snapshot.json +8419 -0
- package/packages/database/migrations/meta/_journal.json +7 -0
- package/packages/database/src/core/migrations.json +10 -2
- package/packages/database/src/repositories/aiInfra/index.test.ts +198 -0
- package/packages/database/src/repositories/aiInfra/index.ts +2 -1
- package/packages/database/src/schemas/aiInfra.ts +2 -0
- package/packages/types/src/topic/topic.ts +14 -0
- package/src/server/routers/lambda/topic.ts +7 -1
- package/src/services/aiModel/index.test.ts +3 -3
- package/src/services/aiModel/index.ts +56 -2
- package/src/services/aiProvider/index.test.ts +2 -2
- package/src/services/aiProvider/index.ts +48 -2
- package/src/services/chatGroup/index.ts +66 -2
- package/src/services/export/index.ts +10 -2
- package/src/services/file/index.ts +61 -2
- package/src/services/import/index.ts +133 -2
- package/src/services/message/index.ts +176 -2
- package/src/services/message/{__tests__/server.test.ts → server.test.ts} +3 -3
- package/src/services/plugin/index.test.ts +8 -0
- package/src/services/plugin/index.ts +53 -2
- package/src/services/session/index.test.ts +8 -0
- package/src/services/session/index.ts +145 -2
- package/src/services/thread/index.test.ts +8 -0
- package/src/services/thread/index.ts +38 -2
- package/src/services/topic/index.test.ts +8 -0
- package/src/services/topic/index.ts +76 -2
- package/src/services/user/index.test.ts +8 -0
- package/src/services/user/index.ts +53 -2
- package/src/store/aiInfra/slices/aiModel/action.test.ts +17 -9
- package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +4 -2
- package/src/store/chat/slices/topic/action.test.ts +1 -1
- package/src/store/chat/slices/topic/action.ts +1 -2
- package/src/store/chat/slices/topic/reducer.ts +1 -2
- package/src/store/file/slices/chat/action.ts +1 -4
- package/src/store/file/slices/fileManager/action.ts +2 -3
- package/src/store/session/slices/sessionGroup/action.test.ts +5 -5
- package/src/store/user/slices/common/action.test.ts +1 -1
- package/src/services/aiModel/server.test.ts +0 -122
- package/src/services/aiModel/server.ts +0 -51
- package/src/services/aiModel/type.ts +0 -32
- package/src/services/aiProvider/server.ts +0 -43
- package/src/services/aiProvider/type.ts +0 -27
- package/src/services/chatGroup/server.ts +0 -67
- package/src/services/chatGroup/type.ts +0 -22
- package/src/services/export/server.ts +0 -9
- package/src/services/export/type.ts +0 -5
- package/src/services/file/server.ts +0 -53
- package/src/services/file/type.ts +0 -13
- package/src/services/import/server.ts +0 -133
- package/src/services/import/type.ts +0 -17
- package/src/services/message/server.ts +0 -151
- package/src/services/message/type.ts +0 -55
- package/src/services/plugin/server.ts +0 -42
- package/src/services/plugin/type.ts +0 -23
- package/src/services/session/server.test.ts +0 -260
- package/src/services/session/server.ts +0 -125
- package/src/services/session/type.ts +0 -82
- package/src/services/thread/server.ts +0 -32
- package/src/services/thread/type.ts +0 -21
- package/src/services/topic/server.ts +0 -57
- package/src/services/topic/type.ts +0 -40
- package/src/services/user/server.test.ts +0 -149
- package/src/services/user/server.ts +0 -47
- package/src/services/user/type.ts +0 -21
|
@@ -1,3 +1,134 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DefaultErrorShape } from '@trpc/server/unstable-core-do-not-import';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import { lambdaClient } from '@/libs/trpc/client';
|
|
4
|
+
import { uploadService } from '@/services/upload';
|
|
5
|
+
import { useUserStore } from '@/store/user';
|
|
6
|
+
import { ImportPgDataStructure } from '@/types/export';
|
|
7
|
+
import { ImporterEntryData, ImportStage, OnImportCallbacks } from '@/types/importer';
|
|
8
|
+
import { UserSettings } from '@/types/user/settings';
|
|
9
|
+
import { uuid } from '@/utils/uuid';
|
|
10
|
+
|
|
11
|
+
class ImportService {
|
|
12
|
+
importSettings = async (settings: UserSettings): Promise<void> => {
|
|
13
|
+
await useUserStore.getState().importAppSettings(settings);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
importData = async (data: ImporterEntryData, callbacks?: OnImportCallbacks): Promise<void> => {
|
|
17
|
+
const handleError = (e: unknown) => {
|
|
18
|
+
callbacks?.onStageChange?.(ImportStage.Error);
|
|
19
|
+
const error = e as DefaultErrorShape;
|
|
20
|
+
|
|
21
|
+
callbacks?.onError?.({
|
|
22
|
+
code: error.data.code,
|
|
23
|
+
httpStatus: error.data.httpStatus,
|
|
24
|
+
message: error.message,
|
|
25
|
+
path: error.data.path,
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const totalLength =
|
|
30
|
+
(data.messages?.length || 0) +
|
|
31
|
+
(data.sessionGroups?.length || 0) +
|
|
32
|
+
(data.sessions?.length || 0) +
|
|
33
|
+
(data.topics?.length || 0);
|
|
34
|
+
|
|
35
|
+
if (totalLength < 500) {
|
|
36
|
+
callbacks?.onStageChange?.(ImportStage.Importing);
|
|
37
|
+
const time = Date.now();
|
|
38
|
+
try {
|
|
39
|
+
const result = await lambdaClient.importer.importByPost.mutate({ data });
|
|
40
|
+
const duration = Date.now() - time;
|
|
41
|
+
|
|
42
|
+
callbacks?.onStageChange?.(ImportStage.Success);
|
|
43
|
+
callbacks?.onSuccess?.(result.results, duration);
|
|
44
|
+
} catch (e) {
|
|
45
|
+
handleError(e);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
await this.uploadData(data, { callbacks, handleError });
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
importPgData = async (
|
|
55
|
+
data: ImportPgDataStructure,
|
|
56
|
+
options?: {
|
|
57
|
+
callbacks?: OnImportCallbacks;
|
|
58
|
+
overwriteExisting?: boolean;
|
|
59
|
+
},
|
|
60
|
+
): Promise<void> => {
|
|
61
|
+
const { callbacks } = options || {};
|
|
62
|
+
|
|
63
|
+
const handleError = (e: unknown) => {
|
|
64
|
+
callbacks?.onStageChange?.(ImportStage.Error);
|
|
65
|
+
const error = e as DefaultErrorShape;
|
|
66
|
+
|
|
67
|
+
callbacks?.onError?.({
|
|
68
|
+
code: error.data.code,
|
|
69
|
+
httpStatus: error.data.httpStatus,
|
|
70
|
+
message: error.message,
|
|
71
|
+
path: error.data.path,
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const totalLength = Object.values(data.data)
|
|
76
|
+
.map((d) => d.length)
|
|
77
|
+
.reduce((a, b) => a + b, 0);
|
|
78
|
+
|
|
79
|
+
if (totalLength < 500) {
|
|
80
|
+
callbacks?.onStageChange?.(ImportStage.Importing);
|
|
81
|
+
const time = Date.now();
|
|
82
|
+
try {
|
|
83
|
+
const result = await lambdaClient.importer.importPgByPost.mutate(data);
|
|
84
|
+
const duration = Date.now() - time;
|
|
85
|
+
|
|
86
|
+
callbacks?.onStageChange?.(ImportStage.Success);
|
|
87
|
+
callbacks?.onSuccess?.(result.results, duration);
|
|
88
|
+
} catch (e) {
|
|
89
|
+
handleError(e);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
await this.uploadData(data, { callbacks, handleError });
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
private uploadData = async (
|
|
99
|
+
data: object,
|
|
100
|
+
{ callbacks, handleError }: { callbacks?: OnImportCallbacks; handleError: (e: unknown) => any },
|
|
101
|
+
) => {
|
|
102
|
+
// if the data is too large, upload it to S3 and upload by file
|
|
103
|
+
const filename = `${uuid()}.json`;
|
|
104
|
+
|
|
105
|
+
let pathname;
|
|
106
|
+
try {
|
|
107
|
+
callbacks?.onStageChange?.(ImportStage.Uploading);
|
|
108
|
+
const result = await uploadService.uploadDataToS3(data, {
|
|
109
|
+
filename,
|
|
110
|
+
onProgress: (status, state) => {
|
|
111
|
+
callbacks?.onFileUploading?.(state);
|
|
112
|
+
},
|
|
113
|
+
pathname: `import_config/${filename}`,
|
|
114
|
+
});
|
|
115
|
+
pathname = result.data.path;
|
|
116
|
+
console.log(pathname);
|
|
117
|
+
} catch {
|
|
118
|
+
throw new Error('Upload Error');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
callbacks?.onStageChange?.(ImportStage.Importing);
|
|
122
|
+
const time = Date.now();
|
|
123
|
+
try {
|
|
124
|
+
const result = await lambdaClient.importer.importByFile.mutate({ pathname });
|
|
125
|
+
const duration = Date.now() - time;
|
|
126
|
+
callbacks?.onStageChange?.(ImportStage.Success);
|
|
127
|
+
callbacks?.onSuccess?.(result.results, duration);
|
|
128
|
+
} catch (e) {
|
|
129
|
+
handleError(e);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export const importService = new ImportService();
|
|
@@ -1,3 +1,177 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import {
|
|
3
|
+
ChatMessageError,
|
|
4
|
+
ChatMessagePluginError,
|
|
5
|
+
ChatTranslate,
|
|
6
|
+
ChatTTS,
|
|
7
|
+
CreateMessageParams,
|
|
8
|
+
CreateMessageResult,
|
|
9
|
+
ModelRankItem,
|
|
10
|
+
UIChatMessage,
|
|
11
|
+
UpdateMessageParams,
|
|
12
|
+
UpdateMessageRAGParams,
|
|
13
|
+
UpdateMessageResult,
|
|
14
|
+
} from '@lobechat/types';
|
|
15
|
+
import type { HeatmapsProps } from '@lobehub/charts';
|
|
2
16
|
|
|
3
|
-
|
|
17
|
+
import { INBOX_SESSION_ID } from '@/const/session';
|
|
18
|
+
import { lambdaClient } from '@/libs/trpc/client';
|
|
19
|
+
import { useUserStore } from '@/store/user';
|
|
20
|
+
import { labPreferSelectors } from '@/store/user/selectors';
|
|
21
|
+
|
|
22
|
+
export class MessageService {
|
|
23
|
+
createMessage = async ({ sessionId, ...params }: CreateMessageParams): Promise<string> => {
|
|
24
|
+
return lambdaClient.message.createMessage.mutate({
|
|
25
|
+
...params,
|
|
26
|
+
sessionId: sessionId ? this.toDbSessionId(sessionId) : undefined,
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
createNewMessage = async ({
|
|
31
|
+
sessionId,
|
|
32
|
+
...params
|
|
33
|
+
}: CreateMessageParams): Promise<CreateMessageResult> => {
|
|
34
|
+
return lambdaClient.message.createNewMessage.mutate({
|
|
35
|
+
...params,
|
|
36
|
+
sessionId: sessionId ? this.toDbSessionId(sessionId) : undefined,
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
getMessages = async (
|
|
41
|
+
sessionId: string,
|
|
42
|
+
topicId?: string,
|
|
43
|
+
groupId?: string,
|
|
44
|
+
): Promise<UIChatMessage[]> => {
|
|
45
|
+
// Get user lab preference for message grouping
|
|
46
|
+
const useGroup = labPreferSelectors.enableAssistantMessageGroup(useUserStore.getState());
|
|
47
|
+
|
|
48
|
+
const data = await lambdaClient.message.getMessages.query({
|
|
49
|
+
groupId,
|
|
50
|
+
sessionId: this.toDbSessionId(sessionId),
|
|
51
|
+
topicId,
|
|
52
|
+
useGroup,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
return data as unknown as UIChatMessage[];
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
getGroupMessages = async (groupId: string, topicId?: string): Promise<UIChatMessage[]> => {
|
|
59
|
+
// Get user lab preference for message grouping
|
|
60
|
+
const useGroup = labPreferSelectors.enableAssistantMessageGroup(useUserStore.getState());
|
|
61
|
+
|
|
62
|
+
const data = await lambdaClient.message.getMessages.query({
|
|
63
|
+
groupId,
|
|
64
|
+
topicId,
|
|
65
|
+
useGroup,
|
|
66
|
+
});
|
|
67
|
+
return data as unknown as UIChatMessage[];
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
countMessages = async (params?: {
|
|
71
|
+
endDate?: string;
|
|
72
|
+
range?: [string, string];
|
|
73
|
+
startDate?: string;
|
|
74
|
+
}): Promise<number> => {
|
|
75
|
+
return lambdaClient.message.count.query(params);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
countWords = async (params?: {
|
|
79
|
+
endDate?: string;
|
|
80
|
+
range?: [string, string];
|
|
81
|
+
startDate?: string;
|
|
82
|
+
}): Promise<number> => {
|
|
83
|
+
return lambdaClient.message.countWords.query(params);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
rankModels = async (): Promise<ModelRankItem[]> => {
|
|
87
|
+
return lambdaClient.message.rankModels.query();
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
getHeatmaps = async (): Promise<HeatmapsProps['data']> => {
|
|
91
|
+
return lambdaClient.message.getHeatmaps.query();
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
updateMessageError = async (id: string, error: ChatMessageError) => {
|
|
95
|
+
return lambdaClient.message.update.mutate({ id, value: { error } });
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
updateMessagePluginArguments = async (id: string, value: string | Record<string, any>) => {
|
|
99
|
+
const args = typeof value === 'string' ? value : JSON.stringify(value);
|
|
100
|
+
return lambdaClient.message.updateMessagePlugin.mutate({ id, value: { arguments: args } });
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
updateMessage = async (
|
|
104
|
+
id: string,
|
|
105
|
+
value: Partial<UpdateMessageParams>,
|
|
106
|
+
options?: { sessionId?: string | null; topicId?: string | null },
|
|
107
|
+
): Promise<UpdateMessageResult> => {
|
|
108
|
+
return lambdaClient.message.update.mutate({
|
|
109
|
+
id,
|
|
110
|
+
sessionId: options?.sessionId,
|
|
111
|
+
topicId: options?.topicId,
|
|
112
|
+
value,
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
updateMessageTranslate = async (id: string, translate: Partial<ChatTranslate> | false) => {
|
|
117
|
+
return lambdaClient.message.updateTranslate.mutate({ id, value: translate as ChatTranslate });
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
updateMessageTTS = async (id: string, tts: Partial<ChatTTS> | false) => {
|
|
121
|
+
return lambdaClient.message.updateTTS.mutate({ id, value: tts });
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
updateMessagePluginState = async (id: string, value: Record<string, any>) => {
|
|
125
|
+
return lambdaClient.message.updatePluginState.mutate({ id, value });
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
updateMessagePluginError = async (id: string, error: ChatMessagePluginError | null) => {
|
|
129
|
+
return lambdaClient.message.updatePluginError.mutate({ id, value: error as any });
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
updateMessageRAG = async (id: string, data: UpdateMessageRAGParams): Promise<void> => {
|
|
133
|
+
return lambdaClient.message.updateMessageRAG.mutate({ id, value: data });
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
removeMessage = async (id: string) => {
|
|
137
|
+
return lambdaClient.message.removeMessage.mutate({ id });
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
removeMessages = async (ids: string[]) => {
|
|
141
|
+
return lambdaClient.message.removeMessages.mutate({ ids });
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
removeMessagesByAssistant = async (sessionId: string, topicId?: string) => {
|
|
145
|
+
return lambdaClient.message.removeMessagesByAssistant.mutate({
|
|
146
|
+
sessionId: this.toDbSessionId(sessionId),
|
|
147
|
+
topicId,
|
|
148
|
+
});
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
removeMessagesByGroup = async (groupId: string, topicId?: string) => {
|
|
152
|
+
return lambdaClient.message.removeMessagesByGroup.mutate({
|
|
153
|
+
groupId,
|
|
154
|
+
topicId,
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
removeAllMessages = async () => {
|
|
159
|
+
return lambdaClient.message.removeAllMessages.mutate();
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
private toDbSessionId = (sessionId: string | undefined) => {
|
|
163
|
+
return sessionId === INBOX_SESSION_ID ? null : sessionId;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
hasMessages = async (): Promise<boolean> => {
|
|
167
|
+
const number = await this.countMessages();
|
|
168
|
+
return number > 0;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
messageCountToCheckTrace = async (): Promise<boolean> => {
|
|
172
|
+
const number = await this.countMessages();
|
|
173
|
+
return number >= 4;
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export const messageService = new MessageService();
|
|
@@ -2,11 +2,11 @@ import { describe, expect, it } from 'vitest';
|
|
|
2
2
|
|
|
3
3
|
import { INBOX_SESSION_ID } from '@/const/session';
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { MessageService } from './index';
|
|
6
6
|
|
|
7
|
-
describe('
|
|
7
|
+
describe('MessageService', () => {
|
|
8
8
|
describe('toDbSessionId', () => {
|
|
9
|
-
const service = new
|
|
9
|
+
const service = new MessageService();
|
|
10
10
|
// @ts-ignore access private method for testing
|
|
11
11
|
const toDbSessionId = service.toDbSessionId;
|
|
12
12
|
|
|
@@ -1,3 +1,54 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { LobeTool } from '@lobechat/types';
|
|
2
|
+
import { LobeChatPluginManifest } from '@lobehub/chat-plugin-sdk';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
import { lambdaClient } from '@/libs/trpc/client';
|
|
5
|
+
import { LobeToolCustomPlugin } from '@/types/tool/plugin';
|
|
6
|
+
|
|
7
|
+
export interface InstallPluginParams {
|
|
8
|
+
customParams?: Record<string, any>;
|
|
9
|
+
identifier: string;
|
|
10
|
+
manifest: LobeChatPluginManifest;
|
|
11
|
+
settings?: Record<string, any>;
|
|
12
|
+
type: 'plugin' | 'customPlugin';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class PluginService {
|
|
16
|
+
installPlugin = async (plugin: InstallPluginParams): Promise<void> => {
|
|
17
|
+
await lambdaClient.plugin.createOrInstallPlugin.mutate(plugin);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
getInstalledPlugins = (): Promise<LobeTool[]> => {
|
|
21
|
+
return lambdaClient.plugin.getPlugins.query();
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
uninstallPlugin = async (identifier: string): Promise<void> => {
|
|
25
|
+
await lambdaClient.plugin.removePlugin.mutate({ id: identifier });
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
createCustomPlugin = async (customPlugin: LobeToolCustomPlugin): Promise<void> => {
|
|
29
|
+
await lambdaClient.plugin.createPlugin.mutate({ ...customPlugin, type: 'customPlugin' });
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
updatePlugin = async (id: string, value: Partial<LobeToolCustomPlugin>): Promise<void> => {
|
|
33
|
+
await lambdaClient.plugin.updatePlugin.mutate({
|
|
34
|
+
customParams: value.customParams,
|
|
35
|
+
id,
|
|
36
|
+
manifest: value.manifest,
|
|
37
|
+
settings: value.settings,
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
updatePluginManifest = async (id: string, manifest: LobeChatPluginManifest): Promise<void> => {
|
|
42
|
+
await lambdaClient.plugin.updatePlugin.mutate({ id, manifest });
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
removeAllPlugins = async (): Promise<void> => {
|
|
46
|
+
await lambdaClient.plugin.removeAllPlugins.mutate();
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
updatePluginSettings = async (id: string, settings: any, signal?: AbortSignal): Promise<void> => {
|
|
50
|
+
await lambdaClient.plugin.updatePlugin.mutate({ id, settings }, { signal });
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const pluginService = new PluginService();
|
|
@@ -1,3 +1,146 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
import type { PartialDeep } from 'type-fest';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
+
import { lambdaClient } from '@/libs/trpc/client';
|
|
5
|
+
import { LobeAgentChatConfig, LobeAgentConfig } from '@/types/agent';
|
|
6
|
+
import { MetaData } from '@/types/meta';
|
|
7
|
+
import { BatchTaskResult } from '@/types/service';
|
|
8
|
+
import {
|
|
9
|
+
ChatSessionList,
|
|
10
|
+
LobeAgentSession,
|
|
11
|
+
LobeSessionType,
|
|
12
|
+
LobeSessions,
|
|
13
|
+
SessionGroupItem,
|
|
14
|
+
SessionGroups,
|
|
15
|
+
SessionRankItem,
|
|
16
|
+
UpdateSessionParams,
|
|
17
|
+
} from '@/types/session';
|
|
18
|
+
|
|
19
|
+
export class SessionService {
|
|
20
|
+
hasSessions = async (): Promise<boolean> => {
|
|
21
|
+
const result = await this.countSessions();
|
|
22
|
+
return result === 0;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
createSession = async (
|
|
26
|
+
type: LobeSessionType,
|
|
27
|
+
data: Partial<LobeAgentSession>,
|
|
28
|
+
): Promise<string> => {
|
|
29
|
+
const { config, group, meta, ...session } = data;
|
|
30
|
+
return lambdaClient.session.createSession.mutate({
|
|
31
|
+
config: { ...config, ...meta } as any,
|
|
32
|
+
session: { ...session, groupId: group },
|
|
33
|
+
type,
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
cloneSession = (id: string, newTitle: string): Promise<string | undefined> => {
|
|
38
|
+
return lambdaClient.session.cloneSession.mutate({ id, newTitle });
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
getGroupedSessions = (): Promise<ChatSessionList> => {
|
|
42
|
+
return lambdaClient.session.getGroupedSessions.query();
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
countSessions = async (params?: {
|
|
46
|
+
endDate?: string;
|
|
47
|
+
range?: [string, string];
|
|
48
|
+
startDate?: string;
|
|
49
|
+
}): Promise<number> => {
|
|
50
|
+
return lambdaClient.session.countSessions.query(params);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
rankSessions = async (limit?: number): Promise<SessionRankItem[]> => {
|
|
54
|
+
return lambdaClient.session.rankSessions.query(limit);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
updateSession = (id: string, data: Partial<UpdateSessionParams>) => {
|
|
58
|
+
const { group, pinned, meta, updatedAt } = data;
|
|
59
|
+
return lambdaClient.session.updateSession.mutate({
|
|
60
|
+
id,
|
|
61
|
+
value: { groupId: group === 'default' ? null : group, pinned, ...meta, updatedAt },
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// TODO: Need to be fixed
|
|
66
|
+
getSessionConfig = async (id: string): Promise<LobeAgentConfig> => {
|
|
67
|
+
// @ts-ignore
|
|
68
|
+
return lambdaClient.agent.getAgentConfig.query({ sessionId: id });
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
updateSessionConfig = (
|
|
72
|
+
id: string,
|
|
73
|
+
config: PartialDeep<LobeAgentConfig>,
|
|
74
|
+
signal?: AbortSignal,
|
|
75
|
+
) => {
|
|
76
|
+
return lambdaClient.session.updateSessionConfig.mutate(
|
|
77
|
+
{ id, value: config },
|
|
78
|
+
{
|
|
79
|
+
context: { showNotification: false },
|
|
80
|
+
signal,
|
|
81
|
+
},
|
|
82
|
+
);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
updateSessionMeta = (id: string, meta: Partial<MetaData>, signal?: AbortSignal) => {
|
|
86
|
+
return lambdaClient.session.updateSessionConfig.mutate({ id, value: meta }, { signal });
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
updateSessionChatConfig = (
|
|
90
|
+
id: string,
|
|
91
|
+
value: Partial<LobeAgentChatConfig>,
|
|
92
|
+
signal?: AbortSignal,
|
|
93
|
+
) => {
|
|
94
|
+
return lambdaClient.session.updateSessionChatConfig.mutate({ id, value }, { signal });
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
searchSessions = (keywords: string): Promise<LobeSessions> => {
|
|
98
|
+
return lambdaClient.session.searchSessions.query({ keywords });
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
removeSession = (id: string) => {
|
|
102
|
+
return lambdaClient.session.removeSession.mutate({ id });
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
removeAllSessions = () => {
|
|
106
|
+
return lambdaClient.session.removeAllSessions.mutate();
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// ************************************** //
|
|
110
|
+
// *********** SessionGroup *********** //
|
|
111
|
+
// ************************************** //
|
|
112
|
+
|
|
113
|
+
createSessionGroup = (name: string, sort?: number): Promise<string> => {
|
|
114
|
+
return lambdaClient.sessionGroup.createSessionGroup.mutate({ name, sort });
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
getSessionGroups = (): Promise<SessionGroupItem[]> => {
|
|
118
|
+
return lambdaClient.sessionGroup.getSessionGroup.query();
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* 需要废弃
|
|
123
|
+
* @deprecated
|
|
124
|
+
*/
|
|
125
|
+
batchCreateSessionGroups = (groups: SessionGroups): Promise<BatchTaskResult> => {
|
|
126
|
+
return Promise.resolve({ added: 0, ids: [], skips: [], success: true });
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
removeSessionGroup = (id: string, removeChildren?: boolean) => {
|
|
130
|
+
return lambdaClient.sessionGroup.removeSessionGroup.mutate({ id, removeChildren });
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
removeSessionGroups = () => {
|
|
134
|
+
return lambdaClient.sessionGroup.removeAllSessionGroups.mutate();
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
updateSessionGroup = (id: string, value: Partial<SessionGroupItem>) => {
|
|
138
|
+
return lambdaClient.sessionGroup.updateSessionGroup.mutate({ id, value });
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
updateSessionGroupOrder = (sortMap: { id: string; sort: number }[]) => {
|
|
142
|
+
return lambdaClient.sessionGroup.updateSessionGroupOrder.mutate({ sortMap });
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export const sessionService = new SessionService();
|
|
@@ -1,3 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { CreateMessageParams } from '@lobechat/types';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
import { INBOX_SESSION_ID } from '@/const/session';
|
|
4
|
+
import { lambdaClient } from '@/libs/trpc/client';
|
|
5
|
+
import { CreateThreadParams, ThreadItem } from '@/types/topic';
|
|
6
|
+
|
|
7
|
+
interface CreateThreadWithMessageParams extends CreateThreadParams {
|
|
8
|
+
message: CreateMessageParams;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class ThreadService {
|
|
12
|
+
getThreads = (topicId: string): Promise<ThreadItem[]> => {
|
|
13
|
+
return lambdaClient.thread.getThreads.query({ topicId });
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
createThreadWithMessage = async ({
|
|
17
|
+
message,
|
|
18
|
+
...params
|
|
19
|
+
}: CreateThreadWithMessageParams): Promise<{ messageId: string; threadId: string }> => {
|
|
20
|
+
return lambdaClient.thread.createThreadWithMessage.mutate({
|
|
21
|
+
...params,
|
|
22
|
+
message: { ...message, sessionId: this.toDbSessionId(message.sessionId) },
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
updateThread = async (id: string, data: Partial<ThreadItem>) => {
|
|
27
|
+
return lambdaClient.thread.updateThread.mutate({ id, value: data });
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
removeThread = async (id: string) => {
|
|
31
|
+
return lambdaClient.thread.removeThread.mutate({ id });
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
private toDbSessionId = (sessionId: string | undefined) => {
|
|
35
|
+
return sessionId === INBOX_SESSION_ID ? null : sessionId;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const threadService = new ThreadService();
|
|
@@ -1,3 +1,77 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { INBOX_SESSION_ID } from '@/const/session';
|
|
2
|
+
import { lambdaClient } from '@/libs/trpc/client';
|
|
3
|
+
import { BatchTaskResult } from '@/types/service';
|
|
4
|
+
import { ChatTopic, CreateTopicParams, QueryTopicParams, TopicRankItem } from '@/types/topic';
|
|
2
5
|
|
|
3
|
-
export
|
|
6
|
+
export class TopicService {
|
|
7
|
+
createTopic = (params: CreateTopicParams): Promise<string> => {
|
|
8
|
+
return lambdaClient.topic.createTopic.mutate({
|
|
9
|
+
...params,
|
|
10
|
+
sessionId: this.toDbSessionId(params.sessionId),
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
batchCreateTopics = (importTopics: ChatTopic[]): Promise<BatchTaskResult> => {
|
|
15
|
+
return lambdaClient.topic.batchCreateTopics.mutate(importTopics);
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
cloneTopic = (id: string, newTitle?: string): Promise<string> => {
|
|
19
|
+
return lambdaClient.topic.cloneTopic.mutate({ id, newTitle });
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
getTopics = (params: QueryTopicParams): Promise<ChatTopic[]> => {
|
|
23
|
+
return lambdaClient.topic.getTopics.query({
|
|
24
|
+
...params,
|
|
25
|
+
containerId: this.toDbSessionId(params.containerId),
|
|
26
|
+
}) as any;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
getAllTopics = (): Promise<ChatTopic[]> => {
|
|
30
|
+
return lambdaClient.topic.getAllTopics.query() as any;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
countTopics = async (params?: {
|
|
34
|
+
endDate?: string;
|
|
35
|
+
range?: [string, string];
|
|
36
|
+
startDate?: string;
|
|
37
|
+
}): Promise<number> => {
|
|
38
|
+
return lambdaClient.topic.countTopics.query(params);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
rankTopics = async (limit?: number): Promise<TopicRankItem[]> => {
|
|
42
|
+
return lambdaClient.topic.rankTopics.query(limit);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
searchTopics = (keywords: string, sessionId?: string, groupId?: string): Promise<ChatTopic[]> => {
|
|
46
|
+
return lambdaClient.topic.searchTopics.query({
|
|
47
|
+
groupId,
|
|
48
|
+
keywords,
|
|
49
|
+
sessionId: this.toDbSessionId(sessionId),
|
|
50
|
+
}) as any;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
updateTopic = (id: string, data: Partial<ChatTopic>) => {
|
|
54
|
+
return lambdaClient.topic.updateTopic.mutate({ id, value: data });
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
removeTopic = (id: string) => {
|
|
58
|
+
return lambdaClient.topic.removeTopic.mutate({ id });
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
removeTopics = (sessionId: string) => {
|
|
62
|
+
return lambdaClient.topic.batchDeleteBySessionId.mutate({ id: this.toDbSessionId(sessionId) });
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
batchRemoveTopics = (topics: string[]) => {
|
|
66
|
+
return lambdaClient.topic.batchDelete.mutate({ ids: topics });
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
removeAllTopic = () => {
|
|
70
|
+
return lambdaClient.topic.removeAllTopics.mutate();
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
private toDbSessionId = (sessionId?: string | null) =>
|
|
74
|
+
sessionId === INBOX_SESSION_ID ? null : sessionId;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export const topicService = new TopicService();
|