@lobehub/chat 1.121.1 → 1.122.0

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 (35) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/changelog/v1.json +9 -0
  3. package/next.config.ts +1 -0
  4. package/package.json +1 -1
  5. package/packages/const/src/index.ts +1 -0
  6. package/packages/const/src/session.ts +4 -11
  7. package/packages/database/src/models/__tests__/message.test.ts +41 -0
  8. package/packages/database/src/models/message.ts +21 -13
  9. package/packages/database/src/models/topic.ts +4 -9
  10. package/packages/types/src/aiChat.ts +55 -0
  11. package/packages/types/src/index.ts +4 -0
  12. package/packages/types/src/message/base.ts +17 -4
  13. package/packages/types/src/message/chat.ts +1 -15
  14. package/packages/types/src/message/index.ts +1 -0
  15. package/packages/types/src/message/rag.ts +21 -0
  16. package/packages/utils/src/index.ts +1 -0
  17. package/packages/utils/src/object.test.ts +11 -0
  18. package/src/server/routers/lambda/__tests__/message.test.ts +30 -0
  19. package/src/server/routers/lambda/aiChat.test.ts +107 -0
  20. package/src/server/routers/lambda/aiChat.ts +80 -0
  21. package/src/server/routers/lambda/index.ts +2 -0
  22. package/src/server/routers/lambda/message.ts +7 -0
  23. package/src/server/services/aiChat/index.test.ts +57 -0
  24. package/src/server/services/aiChat/index.ts +36 -0
  25. package/src/services/aiChat.ts +12 -0
  26. package/src/services/message/_deprecated.ts +4 -0
  27. package/src/services/message/client.ts +5 -0
  28. package/src/services/message/server.ts +4 -0
  29. package/src/services/message/type.ts +2 -0
  30. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +11 -1
  31. package/src/store/chat/slices/aiChat/actions/generateAIChatV2.ts +410 -0
  32. package/src/store/chat/slices/aiChat/actions/index.ts +7 -1
  33. package/src/store/chat/slices/message/action.ts +38 -1
  34. package/src/store/chat/slices/message/reducer.ts +11 -0
  35. package/src/store/chat/slices/topic/reducer.ts +14 -1
@@ -22,6 +22,7 @@ import {
22
22
  ModelReasoning,
23
23
  } from '@/types/message';
24
24
  import { ChatImageItem } from '@/types/message/image';
25
+ import { UpdateMessageRAGParams } from '@/types/message/rag';
25
26
  import { GroundingSearch } from '@/types/search';
26
27
  import { TraceEventPayloads } from '@/types/trace';
27
28
  import { Action, setNamespace } from '@/utils/storeDebug';
@@ -39,6 +40,7 @@ const SWR_USE_FETCH_MESSAGES = 'SWR_USE_FETCH_MESSAGES';
39
40
  export interface ChatMessageAction {
40
41
  // create
41
42
  addAIMessage: () => Promise<void>;
43
+ addUserMessage: (params: { message: string; fileList?: string[] }) => Promise<void>;
42
44
  // delete
43
45
  /**
44
46
  * clear message on the active session
@@ -59,10 +61,11 @@ export interface ChatMessageAction {
59
61
  ) => SWRResponse<ChatMessage[]>;
60
62
  copyMessage: (id: string, content: string) => Promise<void>;
61
63
  refreshMessages: () => Promise<void>;
62
-
64
+ replaceMessages: (messages: ChatMessage[]) => void;
63
65
  // ========= ↓ Internal Method ↓ ========== //
64
66
  // ========================================== //
65
67
  // ========================================== //
68
+ internal_updateMessageRAG: (id: string, input: UpdateMessageRAGParams) => Promise<void>;
66
69
 
67
70
  /**
68
71
  * update message at the frontend
@@ -213,6 +216,21 @@ export const chatMessage: StateCreator<
213
216
 
214
217
  updateInputMessage('');
215
218
  },
219
+ addUserMessage: async ({ message, fileList }) => {
220
+ const { internal_createMessage, updateInputMessage, activeTopicId, activeId } = get();
221
+ if (!activeId) return;
222
+
223
+ await internal_createMessage({
224
+ content: message,
225
+ files: fileList,
226
+ role: 'user',
227
+ sessionId: activeId,
228
+ // if there is activeTopicId,then add topicId to message
229
+ topicId: activeTopicId,
230
+ });
231
+
232
+ updateInputMessage('');
233
+ },
216
234
  copyMessage: async (id, content) => {
217
235
  await copyToClipboard(content);
218
236
 
@@ -266,6 +284,25 @@ export const chatMessage: StateCreator<
266
284
  refreshMessages: async () => {
267
285
  await mutate([SWR_USE_FETCH_MESSAGES, get().activeId, get().activeTopicId]);
268
286
  },
287
+ replaceMessages: (messages) => {
288
+ set(
289
+ {
290
+ messagesMap: {
291
+ ...get().messagesMap,
292
+ [messageMapKey(get().activeId, get().activeTopicId)]: messages,
293
+ },
294
+ },
295
+ false,
296
+ 'replaceMessages',
297
+ );
298
+ },
299
+
300
+ internal_updateMessageRAG: async (id, data) => {
301
+ const { refreshMessages } = get();
302
+
303
+ await messageService.updateMessageRAG(id, data);
304
+ await refreshMessages();
305
+ },
269
306
 
270
307
  // the internal process method of the AI message
271
308
  internal_dispatchMessage: (payload) => {
@@ -11,6 +11,11 @@ import {
11
11
  import { merge } from '@/utils/merge';
12
12
 
13
13
  interface UpdateMessages {
14
+ type: 'updateMessages';
15
+ value: ChatMessage[];
16
+ }
17
+
18
+ interface UpdateMessage {
14
19
  id: string;
15
20
  type: 'updateMessage';
16
21
  value: Partial<ChatMessage>;
@@ -72,6 +77,7 @@ interface UpdateMessageExtra {
72
77
 
73
78
  export type MessageDispatch =
74
79
  | CreateMessage
80
+ | UpdateMessage
75
81
  | UpdateMessages
76
82
  | UpdatePluginState
77
83
  | UpdateMessageExtra
@@ -194,6 +200,11 @@ export const messagesReducer = (state: ChatMessage[], payload: MessageDispatch):
194
200
  draftState.push({ ...value, createdAt: Date.now(), id, meta: {}, updatedAt: Date.now() });
195
201
  });
196
202
  }
203
+
204
+ case 'updateMessages': {
205
+ return payload.value;
206
+ }
207
+
197
208
  case 'deleteMessage': {
198
209
  return produce(state, (draft) => {
199
210
  const { id } = payload;
@@ -14,12 +14,21 @@ interface UpdateChatTopicAction {
14
14
  value: Partial<ChatTopic>;
15
15
  }
16
16
 
17
+ interface UpdateTopicsAction {
18
+ type: 'updateTopics';
19
+ value: ChatTopic[];
20
+ }
21
+
17
22
  interface DeleteChatTopicAction {
18
23
  id: string;
19
24
  type: 'deleteTopic';
20
25
  }
21
26
 
22
- export type ChatTopicDispatch = AddChatTopicAction | UpdateChatTopicAction | DeleteChatTopicAction;
27
+ export type ChatTopicDispatch =
28
+ | AddChatTopicAction
29
+ | UpdateChatTopicAction
30
+ | DeleteChatTopicAction
31
+ | UpdateTopicsAction;
23
32
 
24
33
  export const topicReducer = (state: ChatTopic[] = [], payload: ChatTopicDispatch): ChatTopic[] => {
25
34
  switch (payload.type) {
@@ -51,6 +60,10 @@ export const topicReducer = (state: ChatTopic[] = [], payload: ChatTopicDispatch
51
60
  });
52
61
  }
53
62
 
63
+ case 'updateTopics': {
64
+ return payload.value;
65
+ }
66
+
54
67
  case 'deleteTopic': {
55
68
  return produce(state, (draftState) => {
56
69
  const topicIndex = draftState.findIndex((topic) => topic.id === payload.id);