@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.
Files changed (107) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/changelog/v1.json +9 -0
  3. package/package.json +1 -1
  4. package/packages/context-engine/src/processors/__tests__/MessageContent.test.ts +17 -17
  5. package/packages/context-engine/src/types.ts +4 -4
  6. package/packages/database/src/models/__tests__/message.test.ts +2 -2
  7. package/packages/database/src/models/message.ts +9 -9
  8. package/packages/database/src/models/topic.ts +2 -2
  9. package/packages/prompts/src/chains/__tests__/summaryHistory.test.ts +2 -2
  10. package/packages/prompts/src/chains/summaryHistory.ts +2 -2
  11. package/packages/prompts/src/chains/summaryTitle.ts +2 -2
  12. package/packages/prompts/src/contexts/supervisor/makeDecision.ts +2 -2
  13. package/packages/prompts/src/prompts/chatMessages/index.test.ts +11 -11
  14. package/packages/prompts/src/prompts/chatMessages/index.ts +13 -10
  15. package/packages/prompts/src/prompts/groupChat/index.test.ts +3 -4
  16. package/packages/prompts/src/prompts/groupChat/index.ts +3 -3
  17. package/packages/types/src/aiChat.ts +2 -2
  18. package/packages/types/src/exportConfig.ts +3 -3
  19. package/packages/types/src/importer.ts +2 -2
  20. package/packages/types/src/message/common/base.ts +0 -146
  21. package/packages/types/src/message/common/index.ts +2 -0
  22. package/packages/types/src/message/common/metadata.ts +67 -0
  23. package/packages/types/src/message/{tools.ts → common/tools.ts} +1 -1
  24. package/packages/types/src/message/common/translate.ts +4 -0
  25. package/packages/types/src/message/db/index.ts +2 -0
  26. package/packages/types/src/message/db/item.ts +29 -0
  27. package/packages/types/src/message/db/params.ts +57 -0
  28. package/packages/types/src/message/index.ts +1 -1
  29. package/packages/types/src/message/ui/chat.ts +9 -41
  30. package/packages/types/src/message/ui/extra.ts +16 -0
  31. package/packages/types/src/message/ui/index.ts +1 -0
  32. package/packages/types/src/message/ui/rag.ts +10 -0
  33. package/src/app/[variants]/(main)/chat/(workspace)/features/ShareButton/index.tsx +0 -3
  34. package/src/app/[variants]/(main)/settings/provider/features/CreateNewProvider/index.tsx +1 -2
  35. package/src/database/_deprecated/models/__tests__/message.test.ts +6 -6
  36. package/src/database/_deprecated/models/message.ts +13 -13
  37. package/src/features/Conversation/Error/OllamaBizError/index.tsx +2 -2
  38. package/src/features/Conversation/Error/index.tsx +3 -3
  39. package/src/features/Conversation/Messages/Assistant/Actions/index.tsx +2 -2
  40. package/src/features/Conversation/Messages/Assistant/Extra/index.test.tsx +2 -2
  41. package/src/features/Conversation/Messages/Assistant/MessageContent.tsx +2 -2
  42. package/src/features/Conversation/Messages/Assistant/Tool/Render/CustomRender.tsx +2 -2
  43. package/src/features/Conversation/Messages/Assistant/index.tsx +2 -2
  44. package/src/features/Conversation/Messages/Default.tsx +3 -3
  45. package/src/features/Conversation/Messages/Supervisor/index.tsx +2 -2
  46. package/src/features/Conversation/Messages/User/Actions.tsx +2 -2
  47. package/src/features/Conversation/Messages/User/MessageContent.tsx +2 -2
  48. package/src/features/Conversation/Messages/User/index.tsx +2 -2
  49. package/src/features/Conversation/components/ChatItem/ShareMessageModal/SharePdf/index.tsx +2 -2
  50. package/src/features/Conversation/components/ChatItem/ShareMessageModal/SharePdf/template.ts +2 -2
  51. package/src/features/Conversation/components/ShareMessageModal/ShareImage/Preview.tsx +2 -2
  52. package/src/features/Conversation/components/ShareMessageModal/ShareImage/index.tsx +2 -2
  53. package/src/features/Conversation/components/ShareMessageModal/ShareText/index.tsx +2 -2
  54. package/src/features/Conversation/components/ShareMessageModal/ShareText/template.test.ts +3 -3
  55. package/src/features/Conversation/components/ShareMessageModal/ShareText/template.ts +2 -2
  56. package/src/features/Conversation/components/ShareMessageModal/index.tsx +2 -2
  57. package/src/features/Conversation/types/index.ts +5 -5
  58. package/src/features/ShareModal/ShareJSON/generateMessages.test.ts +3 -3
  59. package/src/features/ShareModal/ShareJSON/generateMessages.ts +2 -2
  60. package/src/features/ShareModal/SharePdf/index.tsx +2 -2
  61. package/src/features/ShareModal/ShareText/template.test.ts +3 -3
  62. package/src/features/ShareModal/ShareText/template.ts +2 -2
  63. package/src/server/routers/lambda/__tests__/message.test.ts +2 -2
  64. package/src/server/routers/lambda/message.ts +2 -2
  65. package/src/services/chat/chat.test.ts +27 -25
  66. package/src/services/chat/contextEngineering.test.ts +21 -21
  67. package/src/services/chat/contextEngineering.ts +2 -2
  68. package/src/services/chat/index.ts +3 -3
  69. package/src/services/message/_deprecated.test.ts +2 -2
  70. package/src/services/message/_deprecated.ts +4 -4
  71. package/src/services/message/client.test.ts +4 -4
  72. package/src/services/message/client.ts +5 -5
  73. package/src/services/message/server.ts +3 -3
  74. package/src/services/message/type.ts +7 -7
  75. package/src/store/chat/helpers.test.ts +5 -5
  76. package/src/store/chat/helpers.ts +4 -5
  77. package/src/store/chat/initialState.ts +0 -3
  78. package/src/store/chat/slices/aiChat/actions/__tests__/fixtures.ts +4 -4
  79. package/src/store/chat/slices/aiChat/actions/__tests__/generateAIChatV2.test.ts +2 -2
  80. package/src/store/chat/slices/aiChat/actions/__tests__/rag.test.ts +6 -6
  81. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +6 -6
  82. package/src/store/chat/slices/aiChat/actions/generateAIChatV2.ts +4 -4
  83. package/src/store/chat/slices/aiChat/actions/generateAIGroupChat.ts +10 -6
  84. package/src/store/chat/slices/aiChat/actions/memory.ts +2 -2
  85. package/src/store/chat/slices/builtinTool/actions/__tests__/dalle.test.ts +3 -3
  86. package/src/store/chat/slices/builtinTool/actions/__tests__/search.test.ts +3 -3
  87. package/src/store/chat/slices/message/action.test.ts +13 -8
  88. package/src/store/chat/slices/message/action.ts +4 -4
  89. package/src/store/chat/slices/message/initialState.ts +2 -2
  90. package/src/store/chat/slices/message/reducer.test.ts +6 -6
  91. package/src/store/chat/slices/message/reducer.ts +7 -4
  92. package/src/store/chat/slices/message/selectors.test.ts +9 -9
  93. package/src/store/chat/slices/message/selectors.ts +9 -9
  94. package/src/store/chat/slices/message/supervisor.ts +2 -2
  95. package/src/store/chat/slices/plugin/action.test.ts +16 -13
  96. package/src/store/chat/slices/plugin/action.ts +5 -4
  97. package/src/store/chat/slices/portal/selectors.test.ts +8 -8
  98. package/src/store/chat/slices/thread/action.test.ts +2 -2
  99. package/src/store/chat/slices/thread/action.ts +9 -5
  100. package/src/store/chat/slices/thread/selectors/index.ts +10 -11
  101. package/src/store/chat/slices/thread/selectors/util.ts +2 -4
  102. package/src/store/chat/slices/topic/action.test.ts +6 -6
  103. package/src/store/chat/slices/topic/action.ts +2 -2
  104. package/src/store/chat/store.ts +0 -3
  105. package/src/store/chat/slices/share/action.test.ts +0 -22
  106. package/src/store/chat/slices/share/action.ts +0 -18
  107. 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
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#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
@@ -1,4 +1,13 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "improvements": [
5
+ "Improve provider modal height when creating custom provider."
6
+ ]
7
+ },
8
+ "date": "2025-10-26",
9
+ "version": "1.142.2"
10
+ },
2
11
  {
3
12
  "children": {
4
13
  "improvements": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "1.142.1",
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, ChatMessage, ChatVideoItem } from '@lobechat/types';
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: ChatMessage[]): PipelineContext => ({
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
540
+ const messages: UIChatMessage[] = [
541
541
  {
542
542
  id: 'test',
543
543
  role: 'user',
@@ -1,11 +1,11 @@
1
- import { ChatMessage } from '@lobechat/types';
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: ChatMessage[];
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: ChatMessage[] | string) => Promise<number>;
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 { ChatMessage } from '@lobechat/types';
201
+ export type { UIChatMessage } from '@lobechat/types';
@@ -1,4 +1,4 @@
1
- import { MessageItem } from '@lobechat/types';
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 MessageItem[];
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
- MessageItem,
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 ChatMessage;
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 MessageItem[];
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 MessageItem[];
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 MessageItem[];
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<MessageItem> => {
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 MessageItem[];
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: MessageItem[]) => {
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 { MessageItem, TopicRankItem } from '@lobechat/types';
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 MessageItem[];
275
+ .returning()) as DBMessageItem[];
276
276
 
277
277
  return result[0];
278
278
  }),
@@ -1,4 +1,4 @@
1
- import { ChatMessage } from '@lobechat/types';
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 ChatMessage[];
12
+ ] as UIChatMessage[];
13
13
 
14
14
  // Act
15
15
  const result = chainSummaryHistory(messages);
@@ -1,8 +1,8 @@
1
- import { ChatMessage, ChatStreamPayload } from '@lobechat/types';
1
+ import { ChatStreamPayload, UIChatMessage } from '@lobechat/types';
2
2
 
3
3
  import { chatHistoryPrompts } from '../prompts';
4
4
 
5
- export const chainSummaryHistory = (messages: ChatMessage[]): Partial<ChatStreamPayload> => ({
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 { ChatMessage, ChatStreamPayload, OpenAIChatMessage } from '@lobechat/types';
1
+ import { ChatStreamPayload, OpenAIChatMessage, UIChatMessage } from '@lobechat/types';
2
2
 
3
3
  export const chainSummaryTitle = (
4
- messages: (ChatMessage | OpenAIChatMessage)[],
4
+ messages: (UIChatMessage | OpenAIChatMessage)[],
5
5
  locale: string,
6
6
  ): Partial<ChatStreamPayload> => ({
7
7
  messages: [
@@ -1,4 +1,4 @@
1
- import { ChatCompletionTool, ChatMessage, ChatStreamPayload } from '@lobechat/types';
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: ChatMessage[];
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 { ChatMessage } from '@lobechat/types';
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<ChatMessage> & Pick<ChatMessage, 'role' | 'content'>,
14
- ): ChatMessage => ({
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: ChatMessage[] = [];
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 ChatMessage[];
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 ChatMessage[];
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 ChatMessage[];
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 ChatMessage[];
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: ChatMessage[] = [
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: ChatMessage[] = [
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: ChatMessage[] = [
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 { ChatMessage } from '@lobechat/types';
1
+ import { UIChatMessage } from '@lobechat/types';
2
2
 
3
- const chatMessage = (message: ChatMessage) => {
3
+ const chatMessage = (message: UIChatMessage) => {
4
4
  return `<${message.role}>${message.content}</${message.role}>`;
5
5
  };
6
6
 
7
- export const chatHistoryPrompts = (messages: ChatMessage[]) => {
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: ChatMessage[]) => {
14
- const formatMessage = (message: ChatMessage) => {
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: ChatMessage[]) => {
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 = (messages: ChatMessage[], agentId: string): ChatMessage[] => {
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: ChatMessage[],
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: ChatMessage) => {
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: ChatMessage[] = [
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
- ): ChatMessage => ({
111
+ ): UIChatMessage => ({
113
112
  id,
114
113
  role,
115
114
  content,
@@ -1,4 +1,4 @@
1
- import { ChatMessage } from '@/types/index';
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: ChatMessage[];
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 { ChatMessage } from './message';
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: ChatMessage[];
53
+ messages: UIChatMessage[];
54
54
  topicId: string;
55
55
  topics?: ChatTopic[];
56
56
  userMessageId: string;
@@ -1,4 +1,4 @@
1
- import { ChatMessage } from './message';
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: ChatMessage[];
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: ChatMessage[];
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
- MessageRoleType,
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: MessageRoleType;
54
+ role: UIMessageRoleType;
55
55
 
56
56
  sessionId?: string;
57
57
  tool_call_id?: string;