@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.
- package/CHANGELOG.md +25 -0
- package/changelog/v1.json +9 -0
- package/next.config.ts +1 -0
- package/package.json +1 -1
- package/packages/const/src/index.ts +1 -0
- package/packages/const/src/session.ts +4 -11
- package/packages/database/src/models/__tests__/message.test.ts +41 -0
- package/packages/database/src/models/message.ts +21 -13
- package/packages/database/src/models/topic.ts +4 -9
- package/packages/types/src/aiChat.ts +55 -0
- package/packages/types/src/index.ts +4 -0
- package/packages/types/src/message/base.ts +17 -4
- package/packages/types/src/message/chat.ts +1 -15
- package/packages/types/src/message/index.ts +1 -0
- package/packages/types/src/message/rag.ts +21 -0
- package/packages/utils/src/index.ts +1 -0
- package/packages/utils/src/object.test.ts +11 -0
- package/src/server/routers/lambda/__tests__/message.test.ts +30 -0
- package/src/server/routers/lambda/aiChat.test.ts +107 -0
- package/src/server/routers/lambda/aiChat.ts +80 -0
- package/src/server/routers/lambda/index.ts +2 -0
- package/src/server/routers/lambda/message.ts +7 -0
- package/src/server/services/aiChat/index.test.ts +57 -0
- package/src/server/services/aiChat/index.ts +36 -0
- package/src/services/aiChat.ts +12 -0
- package/src/services/message/_deprecated.ts +4 -0
- package/src/services/message/client.ts +5 -0
- package/src/services/message/server.ts +4 -0
- package/src/services/message/type.ts +2 -0
- package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +11 -1
- package/src/store/chat/slices/aiChat/actions/generateAIChatV2.ts +410 -0
- package/src/store/chat/slices/aiChat/actions/index.ts +7 -1
- package/src/store/chat/slices/message/action.ts +38 -1
- package/src/store/chat/slices/message/reducer.ts +11 -0
- 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 =
|
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);
|