@lobehub/chat 1.142.1 → 1.142.2
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/packages/context-engine/src/processors/__tests__/MessageContent.test.ts +17 -17
- package/packages/context-engine/src/types.ts +4 -4
- package/packages/database/src/models/__tests__/message.test.ts +2 -2
- package/packages/database/src/models/message.ts +9 -9
- package/packages/database/src/models/topic.ts +2 -2
- package/packages/prompts/src/chains/__tests__/summaryHistory.test.ts +2 -2
- package/packages/prompts/src/chains/summaryHistory.ts +2 -2
- package/packages/prompts/src/chains/summaryTitle.ts +2 -2
- package/packages/prompts/src/contexts/supervisor/makeDecision.ts +2 -2
- package/packages/prompts/src/prompts/chatMessages/index.test.ts +11 -11
- package/packages/prompts/src/prompts/chatMessages/index.ts +13 -10
- package/packages/prompts/src/prompts/groupChat/index.test.ts +3 -4
- package/packages/prompts/src/prompts/groupChat/index.ts +3 -3
- package/packages/types/src/aiChat.ts +2 -2
- package/packages/types/src/exportConfig.ts +3 -3
- package/packages/types/src/importer.ts +2 -2
- package/packages/types/src/message/common/base.ts +0 -146
- package/packages/types/src/message/common/index.ts +2 -0
- package/packages/types/src/message/common/metadata.ts +67 -0
- package/packages/types/src/message/{tools.ts → common/tools.ts} +1 -1
- package/packages/types/src/message/common/translate.ts +4 -0
- package/packages/types/src/message/db/index.ts +2 -0
- package/packages/types/src/message/db/item.ts +29 -0
- package/packages/types/src/message/db/params.ts +57 -0
- package/packages/types/src/message/index.ts +1 -1
- package/packages/types/src/message/ui/chat.ts +9 -41
- package/packages/types/src/message/ui/extra.ts +16 -0
- package/packages/types/src/message/ui/index.ts +1 -0
- package/packages/types/src/message/ui/rag.ts +10 -0
- package/src/app/[variants]/(main)/chat/(workspace)/features/ShareButton/index.tsx +0 -3
- package/src/app/[variants]/(main)/settings/provider/features/CreateNewProvider/index.tsx +1 -2
- package/src/database/_deprecated/models/__tests__/message.test.ts +6 -6
- package/src/database/_deprecated/models/message.ts +13 -13
- package/src/features/Conversation/Error/OllamaBizError/index.tsx +2 -2
- package/src/features/Conversation/Error/index.tsx +3 -3
- package/src/features/Conversation/Messages/Assistant/Actions/index.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Extra/index.test.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
- package/src/features/Conversation/Messages/Assistant/index.tsx +2 -2
- package/src/features/Conversation/Messages/Default.tsx +3 -3
- package/src/features/Conversation/Messages/Supervisor/index.tsx +2 -2
- package/src/features/Conversation/Messages/User/Actions.tsx +2 -2
- package/src/features/Conversation/Messages/User/MessageContent.tsx +2 -2
- package/src/features/Conversation/Messages/User/index.tsx +2 -2
- package/src/features/Conversation/components/ChatItem/ShareMessageModal/SharePdf/index.tsx +2 -2
- package/src/features/Conversation/components/ChatItem/ShareMessageModal/SharePdf/template.ts +2 -2
- package/src/features/Conversation/components/ShareMessageModal/ShareImage/Preview.tsx +2 -2
- package/src/features/Conversation/components/ShareMessageModal/ShareImage/index.tsx +2 -2
- package/src/features/Conversation/components/ShareMessageModal/ShareText/index.tsx +2 -2
- package/src/features/Conversation/components/ShareMessageModal/ShareText/template.test.ts +3 -3
- package/src/features/Conversation/components/ShareMessageModal/ShareText/template.ts +2 -2
- package/src/features/Conversation/components/ShareMessageModal/index.tsx +2 -2
- package/src/features/Conversation/types/index.ts +5 -5
- package/src/features/ShareModal/ShareJSON/generateMessages.test.ts +3 -3
- package/src/features/ShareModal/ShareJSON/generateMessages.ts +2 -2
- package/src/features/ShareModal/SharePdf/index.tsx +2 -2
- package/src/features/ShareModal/ShareText/template.test.ts +3 -3
- package/src/features/ShareModal/ShareText/template.ts +2 -2
- package/src/server/routers/lambda/__tests__/message.test.ts +2 -2
- package/src/server/routers/lambda/message.ts +2 -2
- package/src/services/chat/chat.test.ts +27 -25
- package/src/services/chat/contextEngineering.test.ts +21 -21
- package/src/services/chat/contextEngineering.ts +2 -2
- package/src/services/chat/index.ts +3 -3
- package/src/services/message/_deprecated.test.ts +2 -2
- package/src/services/message/_deprecated.ts +4 -4
- package/src/services/message/client.test.ts +4 -4
- package/src/services/message/client.ts +5 -5
- package/src/services/message/server.ts +3 -3
- package/src/services/message/type.ts +7 -7
- package/src/store/chat/helpers.test.ts +5 -5
- package/src/store/chat/helpers.ts +4 -5
- package/src/store/chat/initialState.ts +0 -3
- package/src/store/chat/slices/aiChat/actions/__tests__/fixtures.ts +4 -4
- package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +2 -2
- package/src/store/chat/slices/aiChat/actions/__tests__/rag.test.ts +6 -6
- package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +6 -6
- package/src/store/chat/slices/aiChat/actions/generateAIChatV2.ts +4 -4
- package/src/store/chat/slices/aiChat/actions/generateAIGroupChat.ts +10 -6
- package/src/store/chat/slices/aiChat/actions/memory.ts +2 -2
- package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +3 -3
- package/src/store/chat/slices/builtinTool/actions/__tests__/search.test.ts +3 -3
- package/src/store/chat/slices/message/action.test.ts +13 -8
- package/src/store/chat/slices/message/action.ts +4 -4
- package/src/store/chat/slices/message/initialState.ts +2 -2
- package/src/store/chat/slices/message/reducer.test.ts +6 -6
- package/src/store/chat/slices/message/reducer.ts +7 -4
- package/src/store/chat/slices/message/selectors.test.ts +9 -9
- package/src/store/chat/slices/message/selectors.ts +9 -9
- package/src/store/chat/slices/message/supervisor.ts +2 -2
- package/src/store/chat/slices/plugin/action.test.ts +16 -13
- package/src/store/chat/slices/plugin/action.ts +5 -4
- package/src/store/chat/slices/portal/selectors.test.ts +8 -8
- package/src/store/chat/slices/thread/action.test.ts +2 -2
- package/src/store/chat/slices/thread/action.ts +9 -5
- package/src/store/chat/slices/thread/selectors/index.ts +10 -11
- package/src/store/chat/slices/thread/selectors/util.ts +2 -4
- package/src/store/chat/slices/topic/action.test.ts +6 -6
- package/src/store/chat/slices/topic/action.ts +2 -2
- package/src/store/chat/store.ts +0 -3
- package/src/store/chat/slices/share/action.test.ts +0 -22
- package/src/store/chat/slices/share/action.ts +0 -18
- package/src/store/chat/slices/share/initialState.ts +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
# Changelog
|
|
4
4
|
|
|
5
|
+
### [Version 1.142.2](https://github.com/lobehub/lobe-chat/compare/v1.142.1...v1.142.2)
|
|
6
|
+
|
|
7
|
+
<sup>Released on **2025-10-26**</sup>
|
|
8
|
+
|
|
9
|
+
#### 💄 Styles
|
|
10
|
+
|
|
11
|
+
- **misc**: Improve provider modal height when creating custom provider.
|
|
12
|
+
|
|
13
|
+
<br/>
|
|
14
|
+
|
|
15
|
+
<details>
|
|
16
|
+
<summary><kbd>Improvements and Fixes</kbd></summary>
|
|
17
|
+
|
|
18
|
+
#### Styles
|
|
19
|
+
|
|
20
|
+
- **misc**: Improve provider modal height when creating custom provider, closes [#9870](https://github.com/lobehub/lobe-chat/issues/9870) ([55d92c0](https://github.com/lobehub/lobe-chat/commit/55d92c0))
|
|
21
|
+
|
|
22
|
+
</details>
|
|
23
|
+
|
|
24
|
+
<div align="right">
|
|
25
|
+
|
|
26
|
+
[](#readme-top)
|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
5
30
|
### [Version 1.142.1](https://github.com/lobehub/lobe-chat/compare/v1.142.0...v1.142.1)
|
|
6
31
|
|
|
7
32
|
<sup>Released on **2025-10-26**</sup>
|
package/changelog/v1.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/chat",
|
|
3
|
-
"version": "1.142.
|
|
3
|
+
"version": "1.142.2",
|
|
4
4
|
"description": "Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"framework",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChatImageItem,
|
|
1
|
+
import { ChatImageItem, ChatVideoItem, UIChatMessage } from '@lobechat/types';
|
|
2
2
|
import { describe, expect, it, vi } from 'vitest';
|
|
3
3
|
|
|
4
4
|
import type { PipelineContext } from '../../types';
|
|
@@ -15,7 +15,7 @@ vi.mock('@lobechat/utils/imageToBase64', async (importOriginal) => {
|
|
|
15
15
|
};
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
-
const createContext = (messages:
|
|
18
|
+
const createContext = (messages: UIChatMessage[]): PipelineContext => ({
|
|
19
19
|
initialState: { messages: [] } as any,
|
|
20
20
|
messages,
|
|
21
21
|
metadata: { model: 'gpt-4', provider: 'openai', maxTokens: 100000 },
|
|
@@ -37,7 +37,7 @@ describe('MessageContentProcessor', () => {
|
|
|
37
37
|
fileContext: { enabled: false },
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
-
const messages:
|
|
40
|
+
const messages: UIChatMessage[] = [
|
|
41
41
|
{
|
|
42
42
|
id: 'test',
|
|
43
43
|
role: 'user',
|
|
@@ -65,7 +65,7 @@ describe('MessageContentProcessor', () => {
|
|
|
65
65
|
fileContext: { enabled: false },
|
|
66
66
|
});
|
|
67
67
|
|
|
68
|
-
const messages:
|
|
68
|
+
const messages: UIChatMessage[] = [
|
|
69
69
|
{
|
|
70
70
|
id: 'test',
|
|
71
71
|
role: 'user',
|
|
@@ -100,7 +100,7 @@ describe('MessageContentProcessor', () => {
|
|
|
100
100
|
fileContext: { enabled: false },
|
|
101
101
|
});
|
|
102
102
|
|
|
103
|
-
const messages:
|
|
103
|
+
const messages: UIChatMessage[] = [
|
|
104
104
|
{
|
|
105
105
|
id: 'test',
|
|
106
106
|
role: 'user',
|
|
@@ -129,7 +129,7 @@ describe('MessageContentProcessor', () => {
|
|
|
129
129
|
fileContext: { enabled: false },
|
|
130
130
|
});
|
|
131
131
|
|
|
132
|
-
const messages:
|
|
132
|
+
const messages: UIChatMessage[] = [
|
|
133
133
|
{
|
|
134
134
|
id: 'test',
|
|
135
135
|
role: 'user',
|
|
@@ -161,7 +161,7 @@ describe('MessageContentProcessor', () => {
|
|
|
161
161
|
fileContext: { enabled: false },
|
|
162
162
|
});
|
|
163
163
|
|
|
164
|
-
const messages:
|
|
164
|
+
const messages: UIChatMessage[] = [
|
|
165
165
|
{
|
|
166
166
|
id: 'test',
|
|
167
167
|
role: 'assistant',
|
|
@@ -194,7 +194,7 @@ describe('MessageContentProcessor', () => {
|
|
|
194
194
|
fileContext: { enabled: false },
|
|
195
195
|
});
|
|
196
196
|
|
|
197
|
-
const messages:
|
|
197
|
+
const messages: UIChatMessage[] = [
|
|
198
198
|
{
|
|
199
199
|
id: 'test',
|
|
200
200
|
role: 'assistant',
|
|
@@ -228,7 +228,7 @@ describe('MessageContentProcessor', () => {
|
|
|
228
228
|
fileContext: { enabled: true },
|
|
229
229
|
});
|
|
230
230
|
|
|
231
|
-
const messages:
|
|
231
|
+
const messages: UIChatMessage[] = [
|
|
232
232
|
{
|
|
233
233
|
id: 'test',
|
|
234
234
|
role: 'user',
|
|
@@ -270,7 +270,7 @@ describe('MessageContentProcessor', () => {
|
|
|
270
270
|
fileContext: { enabled: false },
|
|
271
271
|
});
|
|
272
272
|
|
|
273
|
-
const messages:
|
|
273
|
+
const messages: UIChatMessage[] = [
|
|
274
274
|
{
|
|
275
275
|
id: 'test',
|
|
276
276
|
role: 'user',
|
|
@@ -306,7 +306,7 @@ describe('MessageContentProcessor', () => {
|
|
|
306
306
|
fileContext: { enabled: false },
|
|
307
307
|
});
|
|
308
308
|
|
|
309
|
-
const messages:
|
|
309
|
+
const messages: UIChatMessage[] = [
|
|
310
310
|
{
|
|
311
311
|
id: 'test',
|
|
312
312
|
role: 'assistant',
|
|
@@ -349,7 +349,7 @@ describe('MessageContentProcessor', () => {
|
|
|
349
349
|
fileContext: { enabled: true },
|
|
350
350
|
});
|
|
351
351
|
|
|
352
|
-
const messages:
|
|
352
|
+
const messages: UIChatMessage[] = [
|
|
353
353
|
{
|
|
354
354
|
id: 'test1',
|
|
355
355
|
role: 'user',
|
|
@@ -401,7 +401,7 @@ describe('MessageContentProcessor', () => {
|
|
|
401
401
|
fileContext: { enabled: false },
|
|
402
402
|
});
|
|
403
403
|
|
|
404
|
-
const messages:
|
|
404
|
+
const messages: UIChatMessage[] = [
|
|
405
405
|
{
|
|
406
406
|
id: 'test',
|
|
407
407
|
role: 'user',
|
|
@@ -429,7 +429,7 @@ describe('MessageContentProcessor', () => {
|
|
|
429
429
|
fileContext: { enabled: false },
|
|
430
430
|
});
|
|
431
431
|
|
|
432
|
-
const messages:
|
|
432
|
+
const messages: UIChatMessage[] = [
|
|
433
433
|
{
|
|
434
434
|
id: 'test',
|
|
435
435
|
role: 'user',
|
|
@@ -466,7 +466,7 @@ describe('MessageContentProcessor', () => {
|
|
|
466
466
|
fileContext: { enabled: false },
|
|
467
467
|
});
|
|
468
468
|
|
|
469
|
-
const messages:
|
|
469
|
+
const messages: UIChatMessage[] = [
|
|
470
470
|
{
|
|
471
471
|
id: 'test',
|
|
472
472
|
role: 'user',
|
|
@@ -496,7 +496,7 @@ describe('MessageContentProcessor', () => {
|
|
|
496
496
|
fileContext: { enabled: true, includeFileUrl: true },
|
|
497
497
|
});
|
|
498
498
|
|
|
499
|
-
const messages:
|
|
499
|
+
const messages: UIChatMessage[] = [
|
|
500
500
|
{
|
|
501
501
|
id: 'test',
|
|
502
502
|
role: 'user',
|
|
@@ -537,7 +537,7 @@ describe('MessageContentProcessor', () => {
|
|
|
537
537
|
fileContext: { enabled: false },
|
|
538
538
|
});
|
|
539
539
|
|
|
540
|
-
const messages:
|
|
540
|
+
const messages: UIChatMessage[] = [
|
|
541
541
|
{
|
|
542
542
|
id: 'test',
|
|
543
543
|
role: 'user',
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UIChatMessage } from '@lobechat/types';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* 智能体状态 - 从原项目类型推断
|
|
5
5
|
*/
|
|
6
6
|
export interface AgentState {
|
|
7
7
|
[key: string]: any;
|
|
8
|
-
messages:
|
|
8
|
+
messages: UIChatMessage[];
|
|
9
9
|
model?: string;
|
|
10
10
|
provider?: string;
|
|
11
11
|
systemRole?: string;
|
|
@@ -129,7 +129,7 @@ export type ProcessorTypeLegacy =
|
|
|
129
129
|
* Token 计数器接口
|
|
130
130
|
*/
|
|
131
131
|
export interface TokenCounter {
|
|
132
|
-
count: (messages:
|
|
132
|
+
count: (messages: UIChatMessage[] | string) => Promise<number>;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
/**
|
|
@@ -198,4 +198,4 @@ export class PipelineError extends Error {
|
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
200
|
|
|
201
|
-
export type {
|
|
201
|
+
export type { UIChatMessage } from '@lobechat/types';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DBMessageItem } from '@lobechat/types';
|
|
2
2
|
import dayjs from 'dayjs';
|
|
3
3
|
import { eq } from 'drizzle-orm';
|
|
4
4
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
@@ -919,7 +919,7 @@ describe('MessageModel', () => {
|
|
|
919
919
|
const newMessages = [
|
|
920
920
|
{ id: '1', role: 'user', content: 'message 1' },
|
|
921
921
|
{ id: '2', role: 'assistant', content: 'message 2' },
|
|
922
|
-
] as
|
|
922
|
+
] as DBMessageItem[];
|
|
923
923
|
|
|
924
924
|
// 调用 batchCreateMessages 方法
|
|
925
925
|
await messageModel.batchCreate(newMessages);
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ChatFileItem,
|
|
3
3
|
ChatImageItem,
|
|
4
|
-
ChatMessage,
|
|
5
4
|
ChatTTS,
|
|
6
5
|
ChatToolPayload,
|
|
7
6
|
ChatTranslate,
|
|
8
7
|
ChatVideoItem,
|
|
9
8
|
CreateMessageParams,
|
|
10
|
-
|
|
9
|
+
DBMessageItem,
|
|
11
10
|
ModelRankItem,
|
|
12
11
|
NewMessageQueryParams,
|
|
12
|
+
UIChatMessage,
|
|
13
13
|
UpdateMessageParams,
|
|
14
14
|
UpdateMessageRAGParams,
|
|
15
15
|
} from '@lobechat/types';
|
|
@@ -266,7 +266,7 @@ export class MessageModel {
|
|
|
266
266
|
.filter((relation) => relation.messageId === item.id)
|
|
267
267
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
268
268
|
.map<ChatVideoItem>(({ id, url, name }) => ({ alt: name!, id, url })),
|
|
269
|
-
} as unknown as
|
|
269
|
+
} as unknown as UIChatMessage;
|
|
270
270
|
},
|
|
271
271
|
);
|
|
272
272
|
};
|
|
@@ -302,7 +302,7 @@ export class MessageModel {
|
|
|
302
302
|
.orderBy(messages.createdAt)
|
|
303
303
|
.where(eq(messages.userId, this.userId));
|
|
304
304
|
|
|
305
|
-
return result as
|
|
305
|
+
return result as DBMessageItem[];
|
|
306
306
|
};
|
|
307
307
|
|
|
308
308
|
queryBySessionId = async (sessionId?: string | null) => {
|
|
@@ -311,7 +311,7 @@ export class MessageModel {
|
|
|
311
311
|
where: and(eq(messages.userId, this.userId), this.matchSession(sessionId)),
|
|
312
312
|
});
|
|
313
313
|
|
|
314
|
-
return result as
|
|
314
|
+
return result as DBMessageItem[];
|
|
315
315
|
};
|
|
316
316
|
|
|
317
317
|
queryByKeyword = async (keyword: string) => {
|
|
@@ -321,7 +321,7 @@ export class MessageModel {
|
|
|
321
321
|
where: and(eq(messages.userId, this.userId), like(messages.content, `%${keyword}%`)),
|
|
322
322
|
});
|
|
323
323
|
|
|
324
|
-
return result as
|
|
324
|
+
return result as DBMessageItem[];
|
|
325
325
|
};
|
|
326
326
|
|
|
327
327
|
count = async (params?: {
|
|
@@ -473,7 +473,7 @@ export class MessageModel {
|
|
|
473
473
|
...message
|
|
474
474
|
}: CreateMessageParams,
|
|
475
475
|
id: string = this.genId(),
|
|
476
|
-
): Promise<
|
|
476
|
+
): Promise<DBMessageItem> => {
|
|
477
477
|
return this.db.transaction(async (trx) => {
|
|
478
478
|
// Ensure group message does not populate sessionId
|
|
479
479
|
const normalizedMessage = message.groupId ? { ...message, sessionId: null } : message;
|
|
@@ -490,7 +490,7 @@ export class MessageModel {
|
|
|
490
490
|
updatedAt: updatedAt ? new Date(updatedAt) : undefined,
|
|
491
491
|
userId: this.userId,
|
|
492
492
|
})
|
|
493
|
-
.returning()) as
|
|
493
|
+
.returning()) as DBMessageItem[];
|
|
494
494
|
|
|
495
495
|
// Insert the plugin data if the message is a tool
|
|
496
496
|
if (message.role === 'tool') {
|
|
@@ -528,7 +528,7 @@ export class MessageModel {
|
|
|
528
528
|
});
|
|
529
529
|
};
|
|
530
530
|
|
|
531
|
-
batchCreate = async (newMessages:
|
|
531
|
+
batchCreate = async (newMessages: DBMessageItem[]) => {
|
|
532
532
|
const messagesToInsert = newMessages.map((m) => {
|
|
533
533
|
// TODO: need a better way to handle this
|
|
534
534
|
return { ...m, role: m.role as any, userId: this.userId };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DBMessageItem, TopicRankItem } from '@lobechat/types';
|
|
2
2
|
import { and, count, desc, eq, gt, ilike, inArray, isNull, or, sql } from 'drizzle-orm';
|
|
3
3
|
|
|
4
4
|
import { TopicItem, messages, topics } from '../schemas';
|
|
@@ -272,7 +272,7 @@ export class TopicModel {
|
|
|
272
272
|
id: idGenerator('messages'),
|
|
273
273
|
topicId: duplicatedTopic.id,
|
|
274
274
|
})
|
|
275
|
-
.returning()) as
|
|
275
|
+
.returning()) as DBMessageItem[];
|
|
276
276
|
|
|
277
277
|
return result[0];
|
|
278
278
|
}),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UIChatMessage } from '@lobechat/types';
|
|
2
2
|
import { Mock, describe, expect, it, vi } from 'vitest';
|
|
3
3
|
|
|
4
4
|
import { chainSummaryHistory } from '../summaryHistory';
|
|
@@ -9,7 +9,7 @@ describe('chainSummaryHistory', () => {
|
|
|
9
9
|
const messages = [
|
|
10
10
|
{ content: 'Hello, how can I assist you?', role: 'assistant' },
|
|
11
11
|
{ content: 'I need help with my account.', role: 'user' },
|
|
12
|
-
] as
|
|
12
|
+
] as UIChatMessage[];
|
|
13
13
|
|
|
14
14
|
// Act
|
|
15
15
|
const result = chainSummaryHistory(messages);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ChatStreamPayload, UIChatMessage } from '@lobechat/types';
|
|
2
2
|
|
|
3
3
|
import { chatHistoryPrompts } from '../prompts';
|
|
4
4
|
|
|
5
|
-
export const chainSummaryHistory = (messages:
|
|
5
|
+
export const chainSummaryHistory = (messages: UIChatMessage[]): Partial<ChatStreamPayload> => ({
|
|
6
6
|
messages: [
|
|
7
7
|
{
|
|
8
8
|
content: `You're an assistant who's good at extracting key takeaways from conversations and summarizing them. Please summarize according to the user's needs. The content you need to summarize is located in the <chat_history> </chat_history> group of xml tags. The summary needs to maintain the original language.`,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ChatStreamPayload, OpenAIChatMessage, UIChatMessage } from '@lobechat/types';
|
|
2
2
|
|
|
3
3
|
export const chainSummaryTitle = (
|
|
4
|
-
messages: (
|
|
4
|
+
messages: (UIChatMessage | OpenAIChatMessage)[],
|
|
5
5
|
locale: string,
|
|
6
6
|
): Partial<ChatStreamPayload> => ({
|
|
7
7
|
messages: [
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChatCompletionTool,
|
|
1
|
+
import { ChatCompletionTool, ChatStreamPayload, UIChatMessage } from '@lobechat/types';
|
|
2
2
|
|
|
3
3
|
import { groupChatPrompts, groupSupervisorPrompts } from '../../prompts';
|
|
4
4
|
import { SupervisorToolName, SupervisorTools } from './tools';
|
|
@@ -17,7 +17,7 @@ interface AgentItem {
|
|
|
17
17
|
export interface SupervisorContext {
|
|
18
18
|
allowDM?: boolean;
|
|
19
19
|
availableAgents: AgentItem[];
|
|
20
|
-
messages:
|
|
20
|
+
messages: UIChatMessage[];
|
|
21
21
|
// Group scene controls which tools are exposed (e.g., todos only in 'productive')
|
|
22
22
|
scene?: 'casual' | 'productive';
|
|
23
23
|
systemPrompt?: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UIChatMessage } from '@lobechat/types';
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
3
|
|
|
4
4
|
import {
|
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
|
|
11
11
|
let messageCounter = 0;
|
|
12
12
|
const createMessage = (
|
|
13
|
-
overrides: Partial<
|
|
14
|
-
):
|
|
13
|
+
overrides: Partial<UIChatMessage> & Pick<UIChatMessage, 'role' | 'content'>,
|
|
14
|
+
): UIChatMessage => ({
|
|
15
15
|
id: overrides.id ?? `msg-${++messageCounter}`,
|
|
16
16
|
createdAt: overrides.createdAt ?? 0,
|
|
17
17
|
updatedAt: overrides.updatedAt ?? 0,
|
|
@@ -22,7 +22,7 @@ const createMessage = (
|
|
|
22
22
|
describe('chatHistoryPrompts', () => {
|
|
23
23
|
// Test with empty messages array
|
|
24
24
|
it('should return empty chat history with empty messages', () => {
|
|
25
|
-
const messages:
|
|
25
|
+
const messages: UIChatMessage[] = [];
|
|
26
26
|
const result = chatHistoryPrompts(messages);
|
|
27
27
|
|
|
28
28
|
expect(result).toBe(`<chat_history>
|
|
@@ -37,7 +37,7 @@ describe('chatHistoryPrompts', () => {
|
|
|
37
37
|
role: 'user',
|
|
38
38
|
content: 'Hello',
|
|
39
39
|
},
|
|
40
|
-
] as
|
|
40
|
+
] as UIChatMessage[];
|
|
41
41
|
const result = chatHistoryPrompts(messages);
|
|
42
42
|
|
|
43
43
|
expect(result).toBe(`<chat_history>
|
|
@@ -60,7 +60,7 @@ describe('chatHistoryPrompts', () => {
|
|
|
60
60
|
role: 'user',
|
|
61
61
|
content: 'How are you?',
|
|
62
62
|
},
|
|
63
|
-
] as
|
|
63
|
+
] as UIChatMessage[];
|
|
64
64
|
const result = chatHistoryPrompts(messages);
|
|
65
65
|
|
|
66
66
|
expect(result).toBe(`<chat_history>
|
|
@@ -81,7 +81,7 @@ describe('chatHistoryPrompts', () => {
|
|
|
81
81
|
role: 'assistant',
|
|
82
82
|
content: '<test> & </test>',
|
|
83
83
|
},
|
|
84
|
-
] as
|
|
84
|
+
] as UIChatMessage[];
|
|
85
85
|
|
|
86
86
|
const result = chatHistoryPrompts(messages);
|
|
87
87
|
|
|
@@ -98,7 +98,7 @@ describe('chatHistoryPrompts', () => {
|
|
|
98
98
|
role: 'user',
|
|
99
99
|
content: 'Line 1\nLine 2',
|
|
100
100
|
},
|
|
101
|
-
] as
|
|
101
|
+
] as UIChatMessage[];
|
|
102
102
|
|
|
103
103
|
const result = chatHistoryPrompts(messages);
|
|
104
104
|
|
|
@@ -110,7 +110,7 @@ describe('chatHistoryPrompts', () => {
|
|
|
110
110
|
|
|
111
111
|
describe('groupSupervisorPrompts', () => {
|
|
112
112
|
it('should format messages and exclude supervisor role', () => {
|
|
113
|
-
const messages:
|
|
113
|
+
const messages: UIChatMessage[] = [
|
|
114
114
|
createMessage({ role: 'user', content: 'Hello everyone' }),
|
|
115
115
|
createMessage({ role: 'assistant', agentId: 'agent-1', content: 'Reporting in' }),
|
|
116
116
|
createMessage({
|
|
@@ -136,7 +136,7 @@ describe('groupSupervisorPrompts', () => {
|
|
|
136
136
|
|
|
137
137
|
describe('groupMemeberSpeakingPrompts', () => {
|
|
138
138
|
it('should wrap messages in chat_group tags', () => {
|
|
139
|
-
const messages:
|
|
139
|
+
const messages: UIChatMessage[] = [
|
|
140
140
|
createMessage({ role: 'user', content: 'Need assistance' }),
|
|
141
141
|
createMessage({ role: 'assistant', content: 'On it!' }),
|
|
142
142
|
];
|
|
@@ -156,7 +156,7 @@ describe('consolidateGroupChatHistory', () => {
|
|
|
156
156
|
});
|
|
157
157
|
|
|
158
158
|
it('should format messages with agent titles and default labels', () => {
|
|
159
|
-
const messages:
|
|
159
|
+
const messages: UIChatMessage[] = [
|
|
160
160
|
createMessage({ role: 'assistant', content: ' ' }), // filtered out
|
|
161
161
|
createMessage({ role: 'user', content: 'Hello group' }),
|
|
162
162
|
createMessage({ role: 'assistant', agentId: 'agent-1', content: 'Status update' }),
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UIChatMessage } from '@lobechat/types';
|
|
2
2
|
|
|
3
|
-
const chatMessage = (message:
|
|
3
|
+
const chatMessage = (message: UIChatMessage) => {
|
|
4
4
|
return `<${message.role}>${message.content}</${message.role}>`;
|
|
5
5
|
};
|
|
6
6
|
|
|
7
|
-
export const chatHistoryPrompts = (messages:
|
|
7
|
+
export const chatHistoryPrompts = (messages: UIChatMessage[]) => {
|
|
8
8
|
return `<chat_history>
|
|
9
9
|
${messages.map((m) => chatMessage(m)).join('\n')}
|
|
10
10
|
</chat_history>`;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
export const groupSupervisorPrompts = (messages:
|
|
14
|
-
const formatMessage = (message:
|
|
13
|
+
export const groupSupervisorPrompts = (messages: UIChatMessage[]) => {
|
|
14
|
+
const formatMessage = (message: UIChatMessage) => {
|
|
15
15
|
const author = message.role === 'user' ? 'user' : message.agentId || 'assistant';
|
|
16
16
|
const targetAttr = message.targetId ? ` target="${message.targetId}"` : '';
|
|
17
17
|
return `<message author="${author}"${targetAttr}>${message.content}</message>`;
|
|
@@ -23,7 +23,7 @@ export const groupSupervisorPrompts = (messages: ChatMessage[]) => {
|
|
|
23
23
|
return filteredMessages.map((m) => formatMessage(m)).join('\n');
|
|
24
24
|
};
|
|
25
25
|
|
|
26
|
-
export const groupMemeberSpeakingPrompts = (messages:
|
|
26
|
+
export const groupMemeberSpeakingPrompts = (messages: UIChatMessage[]) => {
|
|
27
27
|
return `<chat_group>
|
|
28
28
|
${messages.map((m) => chatMessage(m)).join('\n')}
|
|
29
29
|
</chat_group>`;
|
|
@@ -36,10 +36,13 @@ ${messages.map((m) => chatMessage(m)).join('\n')}
|
|
|
36
36
|
* - Agent sees DMs they sent
|
|
37
37
|
* - Agent sees user messages that are group messages or targeted to them
|
|
38
38
|
* - For DM messages not involving the agent, content is replaced with "***"
|
|
39
|
-
*
|
|
39
|
+
*
|
|
40
40
|
* TODO: Use context engineering to filter messages
|
|
41
41
|
*/
|
|
42
|
-
export const filterMessagesForAgent = (
|
|
42
|
+
export const filterMessagesForAgent = (
|
|
43
|
+
messages: UIChatMessage[],
|
|
44
|
+
agentId: string,
|
|
45
|
+
): UIChatMessage[] => {
|
|
43
46
|
return messages
|
|
44
47
|
.filter((message) => {
|
|
45
48
|
// Exclude supervisor messages (messages with role="supervisor")
|
|
@@ -107,7 +110,7 @@ export const filterMessagesForAgent = (messages: ChatMessage[], agentId: string)
|
|
|
107
110
|
* for use in system messages. Each message is formatted as "(AuthorName): content"
|
|
108
111
|
*/
|
|
109
112
|
export const consolidateGroupChatHistory = (
|
|
110
|
-
messages:
|
|
113
|
+
messages: UIChatMessage[],
|
|
111
114
|
agents: { id: string; title: string }[] = [],
|
|
112
115
|
) => {
|
|
113
116
|
if (messages.length === 0) return '';
|
|
@@ -115,7 +118,7 @@ export const consolidateGroupChatHistory = (
|
|
|
115
118
|
// Create a map for quick agent lookup
|
|
116
119
|
const agentMap = new Map(agents.map((agent) => [agent.id, agent.title]));
|
|
117
120
|
|
|
118
|
-
const formatMessage = (message:
|
|
121
|
+
const formatMessage = (message: UIChatMessage) => {
|
|
119
122
|
let authorName: string;
|
|
120
123
|
|
|
121
124
|
if (message.role === 'user') {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
+
import type { UIChatMessage } from '@lobechat/types';
|
|
1
2
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
3
|
|
|
3
|
-
import type { ChatMessage } from '@/types/index';
|
|
4
|
-
|
|
5
4
|
import { filterMessagesForAgent } from '../chatMessages';
|
|
6
5
|
import { buildGroupChatSystemPrompt } from './index';
|
|
7
6
|
|
|
@@ -13,7 +12,7 @@ describe('buildGroupChatSystemPrompt', () => {
|
|
|
13
12
|
vi.spyOn(Date, 'now').mockReturnValue(mockTimestamp);
|
|
14
13
|
});
|
|
15
14
|
|
|
16
|
-
const messages:
|
|
15
|
+
const messages: UIChatMessage[] = [
|
|
17
16
|
{
|
|
18
17
|
id: 'm1',
|
|
19
18
|
role: 'user',
|
|
@@ -109,7 +108,7 @@ describe('filterMessagesForAgent', () => {
|
|
|
109
108
|
role: 'user' | 'assistant' | 'system',
|
|
110
109
|
content: string,
|
|
111
110
|
options?: { agentId?: string; targetId?: string },
|
|
112
|
-
):
|
|
111
|
+
): UIChatMessage => ({
|
|
113
112
|
id,
|
|
114
113
|
role,
|
|
115
114
|
content,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UIChatMessage } from '@lobechat/types';
|
|
2
2
|
|
|
3
3
|
export interface GroupMemberInfo {
|
|
4
4
|
id: string;
|
|
@@ -27,7 +27,7 @@ export const buildGroupChatSystemPrompt = ({
|
|
|
27
27
|
baseSystemRole?: string;
|
|
28
28
|
groupMembers: GroupMemberInfo[];
|
|
29
29
|
instruction?: string;
|
|
30
|
-
messages:
|
|
30
|
+
messages: UIChatMessage[];
|
|
31
31
|
targetId?: string;
|
|
32
32
|
}): string => {
|
|
33
33
|
const membersTag = buildGroupMembersTag(groupMembers);
|
|
@@ -138,7 +138,7 @@ RULES:
|
|
|
138
138
|
WHEN ASKING AGENTS TO SPEAK:
|
|
139
139
|
|
|
140
140
|
- Only reference agents from the member list. Never invent new IDs.
|
|
141
|
-
- Do not excessivly gathering information from user, you should only ask for information when it's necessary.
|
|
141
|
+
- Do not excessivly gathering information from user, you should only ask for information when it's necessary.
|
|
142
142
|
- If need many information from user, make single agent to ask for all.
|
|
143
143
|
${dmRules}
|
|
144
144
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { UIChatMessage } from './message';
|
|
4
4
|
import { OpenAIChatMessage } from './openai/chat';
|
|
5
5
|
import { LobeUniformTool, LobeUniformToolSchema } from './tool';
|
|
6
6
|
import { ChatTopic } from './topic';
|
|
@@ -50,7 +50,7 @@ export const AiSendMessageServerSchema = z.object({
|
|
|
50
50
|
export interface SendMessageServerResponse {
|
|
51
51
|
assistantMessageId: string;
|
|
52
52
|
isCreateNewTopic: boolean;
|
|
53
|
-
messages:
|
|
53
|
+
messages: UIChatMessage[];
|
|
54
54
|
topicId: string;
|
|
55
55
|
topics?: ChatTopic[];
|
|
56
56
|
userMessageId: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UIChatMessage } from './message';
|
|
2
2
|
import { LobeSessions, SessionGroupItem } from './session';
|
|
3
3
|
import { ChatTopic } from './topic';
|
|
4
4
|
import { UserSettings } from './user/settings';
|
|
@@ -44,7 +44,7 @@ export interface ConfigModelMap {
|
|
|
44
44
|
* 配置状态:会话
|
|
45
45
|
*/
|
|
46
46
|
export interface ConfigStateSessions {
|
|
47
|
-
messages:
|
|
47
|
+
messages: UIChatMessage[];
|
|
48
48
|
sessionGroups: SessionGroupItem[];
|
|
49
49
|
sessions: LobeSessions;
|
|
50
50
|
topics: ChatTopic[];
|
|
@@ -54,7 +54,7 @@ export interface ConfigStateSessions {
|
|
|
54
54
|
* 配置状态:单个会话
|
|
55
55
|
*/
|
|
56
56
|
export interface ConfigStateSingleSession {
|
|
57
|
-
messages:
|
|
57
|
+
messages: UIChatMessage[];
|
|
58
58
|
sessions: LobeSessions;
|
|
59
59
|
topics: ChatTopic[];
|
|
60
60
|
}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
ChatTTS,
|
|
6
6
|
ChatToolPayload,
|
|
7
7
|
ChatTranslate,
|
|
8
|
-
|
|
8
|
+
UIMessageRoleType,
|
|
9
9
|
} from './message';
|
|
10
10
|
import { MetaData } from './meta';
|
|
11
11
|
import { SessionGroupId } from './session';
|
|
@@ -51,7 +51,7 @@ export interface ImportMessage {
|
|
|
51
51
|
pluginState?: any;
|
|
52
52
|
|
|
53
53
|
quotaId?: string;
|
|
54
|
-
role:
|
|
54
|
+
role: UIMessageRoleType;
|
|
55
55
|
|
|
56
56
|
sessionId?: string;
|
|
57
57
|
tool_call_id?: string;
|