@lobehub/lobehub 2.0.0-next.26 → 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.
Files changed (61) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/changelog/v1.json +9 -0
  3. package/package.json +1 -1
  4. package/packages/types/src/topic/topic.ts +14 -0
  5. package/src/server/routers/lambda/topic.ts +7 -1
  6. package/src/services/aiModel/index.test.ts +3 -3
  7. package/src/services/aiModel/index.ts +56 -2
  8. package/src/services/aiProvider/index.test.ts +2 -2
  9. package/src/services/aiProvider/index.ts +48 -2
  10. package/src/services/chatGroup/index.ts +66 -2
  11. package/src/services/export/index.ts +10 -2
  12. package/src/services/file/index.ts +61 -2
  13. package/src/services/import/index.ts +133 -2
  14. package/src/services/message/index.ts +176 -2
  15. package/src/services/message/{__tests__/server.test.ts → server.test.ts} +3 -3
  16. package/src/services/plugin/index.test.ts +8 -0
  17. package/src/services/plugin/index.ts +53 -2
  18. package/src/services/session/index.test.ts +8 -0
  19. package/src/services/session/index.ts +145 -2
  20. package/src/services/thread/index.test.ts +8 -0
  21. package/src/services/thread/index.ts +38 -2
  22. package/src/services/topic/index.test.ts +8 -0
  23. package/src/services/topic/index.ts +76 -2
  24. package/src/services/user/index.test.ts +8 -0
  25. package/src/services/user/index.ts +53 -2
  26. package/src/store/aiInfra/slices/aiModel/action.test.ts +17 -9
  27. package/src/store/chat/slices/aiChat/actions/__tests__/helpers.ts +4 -2
  28. package/src/store/chat/slices/topic/action.test.ts +1 -1
  29. package/src/store/chat/slices/topic/action.ts +1 -2
  30. package/src/store/chat/slices/topic/reducer.ts +1 -2
  31. package/src/store/file/slices/chat/action.ts +1 -4
  32. package/src/store/file/slices/fileManager/action.ts +2 -3
  33. package/src/store/session/slices/sessionGroup/action.test.ts +5 -5
  34. package/src/store/user/slices/common/action.test.ts +1 -1
  35. package/src/services/aiModel/server.test.ts +0 -122
  36. package/src/services/aiModel/server.ts +0 -51
  37. package/src/services/aiModel/type.ts +0 -32
  38. package/src/services/aiProvider/server.ts +0 -43
  39. package/src/services/aiProvider/type.ts +0 -27
  40. package/src/services/chatGroup/server.ts +0 -67
  41. package/src/services/chatGroup/type.ts +0 -22
  42. package/src/services/export/server.ts +0 -9
  43. package/src/services/export/type.ts +0 -5
  44. package/src/services/file/server.ts +0 -53
  45. package/src/services/file/type.ts +0 -13
  46. package/src/services/import/server.ts +0 -133
  47. package/src/services/import/type.ts +0 -17
  48. package/src/services/message/server.ts +0 -151
  49. package/src/services/message/type.ts +0 -55
  50. package/src/services/plugin/server.ts +0 -42
  51. package/src/services/plugin/type.ts +0 -23
  52. package/src/services/session/server.test.ts +0 -260
  53. package/src/services/session/server.ts +0 -125
  54. package/src/services/session/type.ts +0 -82
  55. package/src/services/thread/server.ts +0 -32
  56. package/src/services/thread/type.ts +0 -21
  57. package/src/services/topic/server.ts +0 -57
  58. package/src/services/topic/type.ts +0 -40
  59. package/src/services/user/server.test.ts +0 -149
  60. package/src/services/user/server.ts +0 -47
  61. package/src/services/user/type.ts +0 -21
@@ -42,7 +42,7 @@ describe('createSessionGroupSlice', () => {
42
42
  it('should clear session groups and refresh sessions', async () => {
43
43
  const spyOn = vi
44
44
  .spyOn(sessionService, 'removeSessionGroups')
45
- .mockResolvedValueOnce(undefined);
45
+ .mockResolvedValueOnce(undefined as any);
46
46
  const spyOnRefreshSessions = vi.spyOn(useSessionStore.getState(), 'refreshSessions');
47
47
 
48
48
  const { result } = renderHook(() => useSessionStore());
@@ -59,7 +59,7 @@ describe('createSessionGroupSlice', () => {
59
59
  describe('removeSessionGroup', () => {
60
60
  it('should remove a session group and refresh sessions', async () => {
61
61
  const mockId = 'mock-id';
62
- vi.spyOn(sessionService, 'removeSessionGroup').mockResolvedValueOnce(undefined);
62
+ vi.spyOn(sessionService, 'removeSessionGroup').mockResolvedValueOnce(undefined as any);
63
63
  const spyOnRefreshSessions = vi.spyOn(useSessionStore.getState(), 'refreshSessions');
64
64
 
65
65
  const { result } = renderHook(() => useSessionStore());
@@ -77,7 +77,7 @@ describe('createSessionGroupSlice', () => {
77
77
  it('should update a session group id and refresh sessions', async () => {
78
78
  const mockSessionId = 'session-id';
79
79
  const mockGroupId = 'group-id';
80
- vi.spyOn(sessionService, 'updateSession').mockResolvedValueOnce(undefined);
80
+ vi.spyOn(sessionService, 'updateSession').mockResolvedValueOnce(undefined as any);
81
81
  const spyOnRefreshSessions = vi.spyOn(useSessionStore.getState(), 'refreshSessions');
82
82
 
83
83
  const { result } = renderHook(() => useSessionStore());
@@ -98,7 +98,7 @@ describe('createSessionGroupSlice', () => {
98
98
  const mockId = 'mock-id';
99
99
  const mockName = 'New Name';
100
100
  const spyOnRefreshSessions = vi.spyOn(useSessionStore.getState(), 'refreshSessions');
101
- vi.spyOn(sessionService, 'updateSessionGroup').mockResolvedValueOnce(undefined);
101
+ vi.spyOn(sessionService, 'updateSessionGroup').mockResolvedValueOnce(undefined as any);
102
102
 
103
103
  const { result } = renderHook(() => useSessionStore());
104
104
 
@@ -117,7 +117,7 @@ describe('createSessionGroupSlice', () => {
117
117
  { id: 'id1', sort: 0 },
118
118
  { id: 'id2', sort: 1 },
119
119
  ];
120
- vi.spyOn(sessionService, 'updateSessionGroupOrder').mockResolvedValueOnce(undefined);
120
+ vi.spyOn(sessionService, 'updateSessionGroupOrder').mockResolvedValueOnce(undefined as any);
121
121
  const spyOnRefreshSessions = vi.spyOn(useSessionStore.getState(), 'refreshSessions');
122
122
 
123
123
  const { result } = renderHook(() => useSessionStore());
@@ -30,7 +30,7 @@ describe('createCommonSlice', () => {
30
30
  const avatar = 'data:image/png;base64,';
31
31
 
32
32
  const spyOn = vi.spyOn(result.current, 'refreshUserState');
33
- const updateAvatarSpy = vi.spyOn(userService, 'updateAvatar').mockResolvedValue(undefined);
33
+ const updateAvatarSpy = vi.spyOn(userService, 'updateAvatar').mockResolvedValue({} as any);
34
34
 
35
35
  await act(async () => {
36
36
  await result.current.updateAvatar(avatar);
@@ -1,122 +0,0 @@
1
- import { AiProviderModelListItem } from 'model-bank';
2
- import { describe, expect, it, vi } from 'vitest';
3
-
4
- import { lambdaClient } from '@/libs/trpc/client';
5
-
6
- import { ServerService } from './server';
7
-
8
- vi.mock('@/libs/trpc/client', () => ({
9
- lambdaClient: {
10
- aiModel: {
11
- createAiModel: { mutate: vi.fn() },
12
- getAiProviderModelList: { query: vi.fn() },
13
- getAiModelById: { query: vi.fn() },
14
- toggleModelEnabled: { mutate: vi.fn() },
15
- updateAiModel: { mutate: vi.fn() },
16
- batchUpdateAiModels: { mutate: vi.fn() },
17
- batchToggleAiModels: { mutate: vi.fn() },
18
- clearModelsByProvider: { mutate: vi.fn() },
19
- clearRemoteModels: { mutate: vi.fn() },
20
- updateAiModelOrder: { mutate: vi.fn() },
21
- removeAiModel: { mutate: vi.fn() },
22
- },
23
- },
24
- }));
25
-
26
- describe('ServerService', () => {
27
- const service = new ServerService();
28
-
29
- it('should create AI model', async () => {
30
- const params = {
31
- id: 'test-id',
32
- providerId: 'test-provider',
33
- displayName: 'Test Model',
34
- };
35
- await service.createAiModel(params);
36
- expect(vi.mocked(lambdaClient.aiModel.createAiModel.mutate)).toHaveBeenCalledWith(params);
37
- });
38
-
39
- it('should get AI provider model list', async () => {
40
- await service.getAiProviderModelList('123');
41
- expect(vi.mocked(lambdaClient.aiModel.getAiProviderModelList.query)).toHaveBeenCalledWith({
42
- id: '123',
43
- });
44
- });
45
-
46
- it('should get AI model by id', async () => {
47
- await service.getAiModelById('123');
48
- expect(vi.mocked(lambdaClient.aiModel.getAiModelById.query)).toHaveBeenCalledWith({
49
- id: '123',
50
- });
51
- });
52
-
53
- it('should toggle model enabled', async () => {
54
- const params = { id: '123', providerId: 'test', enabled: true };
55
- await service.toggleModelEnabled(params);
56
- expect(vi.mocked(lambdaClient.aiModel.toggleModelEnabled.mutate)).toHaveBeenCalledWith(params);
57
- });
58
-
59
- it('should update AI model', async () => {
60
- const value = { contextWindowTokens: 4000, displayName: 'Updated Model' };
61
- await service.updateAiModel('123', 'openai', value);
62
- expect(vi.mocked(lambdaClient.aiModel.updateAiModel.mutate)).toHaveBeenCalledWith({
63
- id: '123',
64
- providerId: 'openai',
65
- value,
66
- });
67
- });
68
-
69
- it('should batch update AI models', async () => {
70
- const models: AiProviderModelListItem[] = [
71
- {
72
- id: '123',
73
- enabled: true,
74
- type: 'chat',
75
- },
76
- ];
77
- await service.batchUpdateAiModels('provider1', models);
78
- expect(vi.mocked(lambdaClient.aiModel.batchUpdateAiModels.mutate)).toHaveBeenCalledWith({
79
- id: 'provider1',
80
- models,
81
- });
82
- });
83
-
84
- it('should batch toggle AI models', async () => {
85
- const models = ['123', '456'];
86
- await service.batchToggleAiModels('provider1', models, true);
87
- expect(vi.mocked(lambdaClient.aiModel.batchToggleAiModels.mutate)).toHaveBeenCalledWith({
88
- id: 'provider1',
89
- models,
90
- enabled: true,
91
- });
92
- });
93
-
94
- it('should clear models by provider', async () => {
95
- await service.clearModelsByProvider('provider1');
96
- expect(vi.mocked(lambdaClient.aiModel.clearModelsByProvider.mutate)).toHaveBeenCalledWith({
97
- providerId: 'provider1',
98
- });
99
- });
100
-
101
- it('should clear remote models', async () => {
102
- await service.clearRemoteModels('provider1');
103
- expect(vi.mocked(lambdaClient.aiModel.clearRemoteModels.mutate)).toHaveBeenCalledWith({
104
- providerId: 'provider1',
105
- });
106
- });
107
-
108
- it('should update AI model order', async () => {
109
- const items = [{ id: '123', sort: 1 }];
110
- await service.updateAiModelOrder('provider1', items);
111
- expect(vi.mocked(lambdaClient.aiModel.updateAiModelOrder.mutate)).toHaveBeenCalledWith({
112
- providerId: 'provider1',
113
- sortMap: items,
114
- });
115
- });
116
-
117
- it('should delete AI model', async () => {
118
- const params = { id: '123', providerId: 'openai' };
119
- await service.deleteAiModel(params);
120
- expect(vi.mocked(lambdaClient.aiModel.removeAiModel.mutate)).toHaveBeenCalledWith(params);
121
- });
122
- });
@@ -1,51 +0,0 @@
1
- import { lambdaClient } from '@/libs/trpc/client';
2
- import { IAiModelService } from '@/services/aiModel/type';
3
-
4
- export class ServerService implements IAiModelService {
5
- createAiModel: IAiModelService['createAiModel'] = async (params) => {
6
- return lambdaClient.aiModel.createAiModel.mutate(params);
7
- };
8
-
9
- getAiProviderModelList: IAiModelService['getAiProviderModelList'] = async (id) => {
10
- return lambdaClient.aiModel.getAiProviderModelList.query({ id });
11
- };
12
-
13
- getAiModelById: IAiModelService['getAiModelById'] = async (id) => {
14
- return lambdaClient.aiModel.getAiModelById.query({ id });
15
- };
16
-
17
- toggleModelEnabled: IAiModelService['toggleModelEnabled'] = async (params) => {
18
- return lambdaClient.aiModel.toggleModelEnabled.mutate(params);
19
- };
20
-
21
- updateAiModel: IAiModelService['updateAiModel'] = async (id, providerId, value) => {
22
- return lambdaClient.aiModel.updateAiModel.mutate({ id, providerId, value });
23
- };
24
-
25
- batchUpdateAiModels: IAiModelService['batchUpdateAiModels'] = async (id, models) => {
26
- return lambdaClient.aiModel.batchUpdateAiModels.mutate({ id, models });
27
- };
28
-
29
- batchToggleAiModels: IAiModelService['batchToggleAiModels'] = async (id, models, enabled) => {
30
- return lambdaClient.aiModel.batchToggleAiModels.mutate({ enabled, id, models });
31
- };
32
-
33
- clearModelsByProvider: IAiModelService['clearModelsByProvider'] = async (providerId) => {
34
- return lambdaClient.aiModel.clearModelsByProvider.mutate({ providerId });
35
- };
36
-
37
- clearRemoteModels: IAiModelService['clearRemoteModels'] = async (providerId) => {
38
- return lambdaClient.aiModel.clearRemoteModels.mutate({ providerId });
39
- };
40
-
41
- updateAiModelOrder: IAiModelService['updateAiModelOrder'] = async (providerId, items) => {
42
- return lambdaClient.aiModel.updateAiModelOrder.mutate({ providerId, sortMap: items });
43
- };
44
-
45
- deleteAiModel: IAiModelService['deleteAiModel'] = async (params: {
46
- id: string;
47
- providerId: string;
48
- }) => {
49
- return lambdaClient.aiModel.removeAiModel.mutate(params);
50
- };
51
- }
@@ -1,32 +0,0 @@
1
- /* eslint-disable typescript-sort-keys/interface */
2
- import {
3
- AiModelSortMap,
4
- AiProviderModelListItem,
5
- CreateAiModelParams,
6
- ToggleAiModelEnableParams,
7
- UpdateAiModelParams,
8
- } from 'model-bank';
9
-
10
- export interface IAiModelService {
11
- createAiModel: (params: CreateAiModelParams) => Promise<any>;
12
-
13
- getAiProviderModelList: (id: string) => Promise<AiProviderModelListItem[]>;
14
-
15
- getAiModelById: (id: string) => Promise<any>;
16
-
17
- toggleModelEnabled: (params: ToggleAiModelEnableParams) => Promise<any>;
18
-
19
- updateAiModel: (id: string, providerId: string, value: UpdateAiModelParams) => Promise<any>;
20
-
21
- batchUpdateAiModels: (id: string, models: AiProviderModelListItem[]) => Promise<any>;
22
-
23
- batchToggleAiModels: (id: string, models: string[], enabled: boolean) => Promise<any>;
24
-
25
- clearRemoteModels: (providerId: string) => Promise<any>;
26
-
27
- clearModelsByProvider: (providerId: string) => Promise<any>;
28
-
29
- updateAiModelOrder: (providerId: string, items: AiModelSortMap[]) => Promise<any>;
30
-
31
- deleteAiModel: (params: { id: string; providerId: string }) => Promise<any>;
32
- }
@@ -1,43 +0,0 @@
1
- import { lambdaClient } from '@/libs/trpc/client';
2
-
3
- import { IAiProviderService } from './type';
4
-
5
- export class ServerService implements IAiProviderService {
6
- createAiProvider: IAiProviderService['createAiProvider'] = async (params) => {
7
- return lambdaClient.aiProvider.createAiProvider.mutate(params);
8
- };
9
-
10
- getAiProviderList: IAiProviderService['getAiProviderList'] = async () => {
11
- return lambdaClient.aiProvider.getAiProviderList.query();
12
- };
13
-
14
- getAiProviderById: IAiProviderService['getAiProviderById'] = async (id) => {
15
- return lambdaClient.aiProvider.getAiProviderById.query({ id });
16
- };
17
-
18
- toggleProviderEnabled: IAiProviderService['toggleProviderEnabled'] = async (id, enabled) => {
19
- return lambdaClient.aiProvider.toggleProviderEnabled.mutate({ enabled, id });
20
- };
21
-
22
- updateAiProvider: IAiProviderService['updateAiProvider'] = async (id, value) => {
23
- return lambdaClient.aiProvider.updateAiProvider.mutate({ id, value });
24
- };
25
-
26
- updateAiProviderConfig: IAiProviderService['updateAiProviderConfig'] = async (id, value) => {
27
- return lambdaClient.aiProvider.updateAiProviderConfig.mutate({ id, value });
28
- };
29
-
30
- updateAiProviderOrder: IAiProviderService['updateAiProviderOrder'] = async (items) => {
31
- return lambdaClient.aiProvider.updateAiProviderOrder.mutate({ sortMap: items });
32
- };
33
-
34
- deleteAiProvider: IAiProviderService['deleteAiProvider'] = async (id) => {
35
- return lambdaClient.aiProvider.removeAiProvider.mutate({ id });
36
- };
37
-
38
- getAiProviderRuntimeState: IAiProviderService['getAiProviderRuntimeState'] = async (
39
- isLogin?: boolean,
40
- ) => {
41
- return lambdaClient.aiProvider.getAiProviderRuntimeState.query({ isLogin });
42
- };
43
- }
@@ -1,27 +0,0 @@
1
- import {
2
- AiProviderDetailItem,
3
- AiProviderRuntimeState,
4
- AiProviderSortMap,
5
- CreateAiProviderParams,
6
- UpdateAiProviderConfigParams,
7
- } from '@/types/aiProvider';
8
-
9
- export interface IAiProviderService {
10
- createAiProvider: (params: CreateAiProviderParams) => Promise<any>;
11
-
12
- deleteAiProvider: (id: string) => Promise<any>;
13
-
14
- getAiProviderById: (id: string) => Promise<AiProviderDetailItem | undefined>;
15
-
16
- getAiProviderList: () => Promise<any>;
17
-
18
- getAiProviderRuntimeState: (isLogin?: boolean) => Promise<AiProviderRuntimeState>;
19
-
20
- toggleProviderEnabled: (id: string, enabled: boolean) => Promise<any>;
21
-
22
- updateAiProvider: (id: string, value: any) => Promise<any>;
23
-
24
- updateAiProviderConfig: (id: string, value: UpdateAiProviderConfigParams) => Promise<any>;
25
-
26
- updateAiProviderOrder: (items: AiProviderSortMap[]) => Promise<any>;
27
- }
@@ -1,67 +0,0 @@
1
- import {
2
- ChatGroupAgentItem,
3
- ChatGroupItem,
4
- NewChatGroup,
5
- NewChatGroupAgent,
6
- } from '@/database/schemas';
7
- import { lambdaClient } from '@/libs/trpc/client';
8
-
9
- import { IChatGroupService } from './type';
10
-
11
- export class ServerService implements IChatGroupService {
12
- createGroup(params: Omit<NewChatGroup, 'userId'>): Promise<ChatGroupItem> {
13
- return lambdaClient.group.createGroup.mutate({
14
- ...params,
15
- config: params.config as any,
16
- });
17
- }
18
-
19
- updateGroup(id: string, value: Partial<ChatGroupItem>): Promise<ChatGroupItem> {
20
- return lambdaClient.group.updateGroup.mutate({
21
- id,
22
- value: {
23
- ...value,
24
- config: value.config as any,
25
- },
26
- });
27
- }
28
-
29
- deleteGroup(id: string): Promise<any> {
30
- return lambdaClient.group.deleteGroup.mutate({ id });
31
- }
32
-
33
- getGroup(id: string): Promise<ChatGroupItem | undefined> {
34
- return lambdaClient.group.getGroup.query({ id });
35
- }
36
-
37
- getGroups(): Promise<ChatGroupItem[]> {
38
- return lambdaClient.group.getGroups.query();
39
- }
40
-
41
- addAgentsToGroup(groupId: string, agentIds: string[]): Promise<ChatGroupAgentItem[]> {
42
- return lambdaClient.group.addAgentsToGroup.mutate({ agentIds, groupId });
43
- }
44
-
45
- removeAgentsFromGroup(groupId: string, agentIds: string[]): Promise<any> {
46
- return lambdaClient.group.removeAgentsFromGroup.mutate({ agentIds, groupId });
47
- }
48
-
49
- updateAgentInGroup(
50
- groupId: string,
51
- agentId: string,
52
- updates: Partial<Pick<NewChatGroupAgent, 'order' | 'role'>>,
53
- ): Promise<ChatGroupAgentItem> {
54
- return lambdaClient.group.updateAgentInGroup.mutate({
55
- agentId,
56
- groupId,
57
- updates: {
58
- order: updates.order === null ? undefined : updates.order,
59
- role: updates.role === null ? undefined : updates.role,
60
- },
61
- });
62
- }
63
-
64
- getGroupAgents(groupId: string): Promise<ChatGroupAgentItem[]> {
65
- return lambdaClient.group.getGroupAgents.query({ groupId });
66
- }
67
- }
@@ -1,22 +0,0 @@
1
- import {
2
- ChatGroupAgentItem,
3
- ChatGroupItem,
4
- NewChatGroup,
5
- NewChatGroupAgent,
6
- } from '@/database/schemas';
7
-
8
- export interface IChatGroupService {
9
- addAgentsToGroup(groupId: string, agentIds: string[]): Promise<ChatGroupAgentItem[]>;
10
- createGroup(params: Omit<NewChatGroup, 'userId'>): Promise<ChatGroupItem>;
11
- deleteGroup(id: string): Promise<any>;
12
- getGroup(id: string): Promise<ChatGroupItem | undefined>;
13
- getGroupAgents(groupId: string): Promise<ChatGroupAgentItem[]>;
14
- getGroups(): Promise<ChatGroupItem[]>;
15
- removeAgentsFromGroup(groupId: string, agentIds: string[]): Promise<any>;
16
- updateAgentInGroup(
17
- groupId: string,
18
- agentId: string,
19
- updates: Partial<Pick<NewChatGroupAgent, 'order' | 'role'>>,
20
- ): Promise<ChatGroupAgentItem>;
21
- updateGroup(id: string, value: Partial<ChatGroupItem>): Promise<ChatGroupItem>;
22
- }
@@ -1,9 +0,0 @@
1
- import { lambdaClient } from '@/libs/trpc/client';
2
-
3
- import { IExportService } from './type';
4
-
5
- export class ServerService implements IExportService {
6
- exportData: IExportService['exportData'] = async () => {
7
- return await lambdaClient.exporter.exportData.mutate();
8
- };
9
- }
@@ -1,5 +0,0 @@
1
- import { ExportDatabaseData } from '@/types/export';
2
-
3
- export interface IExportService {
4
- exportData(): Promise<ExportDatabaseData>;
5
- }
@@ -1,53 +0,0 @@
1
- import { lambdaClient } from '@/libs/trpc/client';
2
- import { QueryFileListParams, QueryFileListSchemaType, UploadFileParams } from '@/types/files';
3
-
4
- import { IFileService } from './type';
5
-
6
- interface CreateFileParams extends Omit<UploadFileParams, 'url'> {
7
- knowledgeBaseId?: string;
8
- url: string;
9
- }
10
-
11
- export class ServerService implements IFileService {
12
- createFile: IFileService['createFile'] = async (params, knowledgeBaseId) => {
13
- return lambdaClient.file.createFile.mutate({ ...params, knowledgeBaseId } as CreateFileParams);
14
- };
15
-
16
- getFile: IFileService['getFile'] = async (id) => {
17
- const item = await lambdaClient.file.findById.query({ id });
18
-
19
- if (!item) {
20
- throw new Error('file not found');
21
- }
22
-
23
- return { ...item, type: item.fileType };
24
- };
25
-
26
- removeFile: IFileService['removeFile'] = async (id) => {
27
- await lambdaClient.file.removeFile.mutate({ id });
28
- };
29
-
30
- removeFiles: IFileService['removeFiles'] = async (ids) => {
31
- await lambdaClient.file.removeFiles.mutate({ ids });
32
- };
33
-
34
- removeAllFiles: IFileService['removeAllFiles'] = async () => {
35
- await lambdaClient.file.removeAllFiles.mutate();
36
- };
37
-
38
- getFiles = async (params: QueryFileListParams) => {
39
- return lambdaClient.file.getFiles.query(params as QueryFileListSchemaType);
40
- };
41
-
42
- getFileItem = async (id: string) => {
43
- return lambdaClient.file.getFileItemById.query({ id });
44
- };
45
-
46
- checkFileHash: IFileService['checkFileHash'] = async (hash) => {
47
- return lambdaClient.file.checkFileHash.mutate({ hash });
48
- };
49
-
50
- removeFileAsyncTask = async (id: string, type: 'embedding' | 'chunk') => {
51
- return lambdaClient.file.removeFileAsyncTask.mutate({ id, type });
52
- };
53
- }
@@ -1,13 +0,0 @@
1
- import { CheckFileHashResult, FileItem, UploadFileParams } from '@/types/files';
2
-
3
- export interface IFileService {
4
- checkFileHash(hash: string): Promise<CheckFileHashResult>;
5
- createFile(
6
- file: UploadFileParams,
7
- knowledgeBaseId?: string,
8
- ): Promise<{ id: string; url: string }>;
9
- getFile(id: string): Promise<FileItem>;
10
- removeAllFiles(): Promise<any>;
11
- removeFile(id: string): Promise<void>;
12
- removeFiles(ids: string[]): Promise<void>;
13
- }
@@ -1,133 +0,0 @@
1
- import { DefaultErrorShape } from '@trpc/server/unstable-core-do-not-import';
2
-
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 { ImportStage, OnImportCallbacks } from '@/types/importer';
8
- import { uuid } from '@/utils/uuid';
9
-
10
- import { IImportService } from './type';
11
-
12
- export class ServerService implements IImportService {
13
- importSettings: IImportService['importSettings'] = async (settings) => {
14
- await useUserStore.getState().importAppSettings(settings);
15
- };
16
-
17
- importData: IImportService['importData'] = async (data, callbacks) => {
18
- const handleError = (e: unknown) => {
19
- callbacks?.onStageChange?.(ImportStage.Error);
20
- const error = e as DefaultErrorShape;
21
-
22
- callbacks?.onError?.({
23
- code: error.data.code,
24
- httpStatus: error.data.httpStatus,
25
- message: error.message,
26
- path: error.data.path,
27
- });
28
- };
29
-
30
- const totalLength =
31
- (data.messages?.length || 0) +
32
- (data.sessionGroups?.length || 0) +
33
- (data.sessions?.length || 0) +
34
- (data.topics?.length || 0);
35
-
36
- if (totalLength < 500) {
37
- callbacks?.onStageChange?.(ImportStage.Importing);
38
- const time = Date.now();
39
- try {
40
- const result = await lambdaClient.importer.importByPost.mutate({ data });
41
- const duration = Date.now() - time;
42
-
43
- callbacks?.onStageChange?.(ImportStage.Success);
44
- callbacks?.onSuccess?.(result.results, duration);
45
- } catch (e) {
46
- handleError(e);
47
- }
48
-
49
- return;
50
- }
51
-
52
- await this.uploadData(data, { callbacks, handleError });
53
- };
54
-
55
- importPgData: IImportService['importPgData'] = async (
56
- data: ImportPgDataStructure,
57
- {
58
- callbacks,
59
- }: {
60
- callbacks?: OnImportCallbacks;
61
- overwriteExisting?: boolean;
62
- } = {},
63
- ): Promise<void> => {
64
- const handleError = (e: unknown) => {
65
- callbacks?.onStageChange?.(ImportStage.Error);
66
- const error = e as DefaultErrorShape;
67
-
68
- callbacks?.onError?.({
69
- code: error.data.code,
70
- httpStatus: error.data.httpStatus,
71
- message: error.message,
72
- path: error.data.path,
73
- });
74
- };
75
-
76
- const totalLength = Object.values(data.data)
77
- .map((d) => d.length)
78
- .reduce((a, b) => a + b, 0);
79
-
80
- if (totalLength < 500) {
81
- callbacks?.onStageChange?.(ImportStage.Importing);
82
- const time = Date.now();
83
- try {
84
- const result = await lambdaClient.importer.importPgByPost.mutate(data);
85
- const duration = Date.now() - time;
86
-
87
- callbacks?.onStageChange?.(ImportStage.Success);
88
- callbacks?.onSuccess?.(result.results, duration);
89
- } catch (e) {
90
- handleError(e);
91
- }
92
-
93
- return;
94
- }
95
-
96
- await this.uploadData(data, { callbacks, handleError });
97
- };
98
-
99
- private uploadData = async (
100
- data: object,
101
- { callbacks, handleError }: { callbacks?: OnImportCallbacks; handleError: (e: unknown) => any },
102
- ) => {
103
- // if the data is too large, upload it to S3 and upload by file
104
- const filename = `${uuid()}.json`;
105
-
106
- let pathname;
107
- try {
108
- callbacks?.onStageChange?.(ImportStage.Uploading);
109
- const result = await uploadService.uploadDataToS3(data, {
110
- filename,
111
- onProgress: (status, state) => {
112
- callbacks?.onFileUploading?.(state);
113
- },
114
- pathname: `import_config/${filename}`,
115
- });
116
- pathname = result.data.path;
117
- console.log(pathname);
118
- } catch {
119
- throw new Error('Upload Error');
120
- }
121
-
122
- callbacks?.onStageChange?.(ImportStage.Importing);
123
- const time = Date.now();
124
- try {
125
- const result = await lambdaClient.importer.importByFile.mutate({ pathname });
126
- const duration = Date.now() - time;
127
- callbacks?.onStageChange?.(ImportStage.Success);
128
- callbacks?.onSuccess?.(result.results, duration);
129
- } catch (e) {
130
- handleError(e);
131
- }
132
- };
133
- }
@@ -1,17 +0,0 @@
1
- import { ImportPgDataStructure } from '@/types/export';
2
- import { ImporterEntryData, OnImportCallbacks } from '@/types/importer';
3
- import { UserSettings } from '@/types/user/settings';
4
-
5
- export interface IImportService {
6
- importData(data: ImporterEntryData, callbacks?: OnImportCallbacks): Promise<void>;
7
-
8
- importPgData(
9
- data: ImportPgDataStructure,
10
- options?: {
11
- callbacks?: OnImportCallbacks;
12
- overwriteExisting?: boolean;
13
- },
14
- ): Promise<void>;
15
-
16
- importSettings(settings: UserSettings): Promise<void>;
17
- }