@lobehub/chat 1.68.3 → 1.68.5

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 (112) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +3 -3
  3. package/README.zh-CN.md +14 -17
  4. package/changelog/v1.json +18 -0
  5. package/docs/usage/providers/azureai.mdx +69 -0
  6. package/docs/usage/providers/azureai.zh-CN.mdx +69 -0
  7. package/docs/usage/providers/deepseek.mdx +3 -3
  8. package/docs/usage/providers/deepseek.zh-CN.mdx +5 -4
  9. package/docs/usage/providers/jina.mdx +51 -0
  10. package/docs/usage/providers/jina.zh-CN.mdx +51 -0
  11. package/docs/usage/providers/lmstudio.mdx +75 -0
  12. package/docs/usage/providers/lmstudio.zh-CN.mdx +75 -0
  13. package/docs/usage/providers/nvidia.mdx +55 -0
  14. package/docs/usage/providers/nvidia.zh-CN.mdx +55 -0
  15. package/docs/usage/providers/ppio.mdx +7 -7
  16. package/docs/usage/providers/ppio.zh-CN.mdx +6 -6
  17. package/docs/usage/providers/sambanova.mdx +50 -0
  18. package/docs/usage/providers/sambanova.zh-CN.mdx +50 -0
  19. package/docs/usage/providers/tencentcloud.mdx +49 -0
  20. package/docs/usage/providers/tencentcloud.zh-CN.mdx +49 -0
  21. package/docs/usage/providers/vertexai.mdx +59 -0
  22. package/docs/usage/providers/vertexai.zh-CN.mdx +59 -0
  23. package/docs/usage/providers/vllm.mdx +98 -0
  24. package/docs/usage/providers/vllm.zh-CN.mdx +98 -0
  25. package/docs/usage/providers/volcengine.mdx +47 -0
  26. package/docs/usage/providers/volcengine.zh-CN.mdx +48 -0
  27. package/locales/ar/chat.json +29 -0
  28. package/locales/ar/models.json +48 -0
  29. package/locales/ar/providers.json +3 -0
  30. package/locales/bg-BG/chat.json +29 -0
  31. package/locales/bg-BG/models.json +48 -0
  32. package/locales/bg-BG/providers.json +3 -0
  33. package/locales/de-DE/chat.json +29 -0
  34. package/locales/de-DE/models.json +48 -0
  35. package/locales/de-DE/providers.json +3 -0
  36. package/locales/en-US/chat.json +29 -0
  37. package/locales/en-US/models.json +48 -0
  38. package/locales/en-US/providers.json +3 -3
  39. package/locales/es-ES/chat.json +29 -0
  40. package/locales/es-ES/models.json +48 -0
  41. package/locales/es-ES/providers.json +3 -0
  42. package/locales/fa-IR/chat.json +29 -0
  43. package/locales/fa-IR/models.json +48 -0
  44. package/locales/fa-IR/providers.json +3 -0
  45. package/locales/fr-FR/chat.json +29 -0
  46. package/locales/fr-FR/models.json +48 -0
  47. package/locales/fr-FR/providers.json +3 -0
  48. package/locales/it-IT/chat.json +29 -0
  49. package/locales/it-IT/models.json +48 -0
  50. package/locales/it-IT/providers.json +3 -0
  51. package/locales/ja-JP/chat.json +29 -0
  52. package/locales/ja-JP/models.json +48 -0
  53. package/locales/ja-JP/providers.json +3 -0
  54. package/locales/ko-KR/chat.json +29 -0
  55. package/locales/ko-KR/models.json +48 -0
  56. package/locales/ko-KR/providers.json +3 -0
  57. package/locales/nl-NL/chat.json +29 -0
  58. package/locales/nl-NL/models.json +48 -0
  59. package/locales/nl-NL/providers.json +3 -0
  60. package/locales/pl-PL/chat.json +29 -0
  61. package/locales/pl-PL/models.json +48 -0
  62. package/locales/pl-PL/providers.json +3 -0
  63. package/locales/pt-BR/chat.json +29 -0
  64. package/locales/pt-BR/models.json +48 -0
  65. package/locales/pt-BR/providers.json +3 -0
  66. package/locales/ru-RU/chat.json +29 -0
  67. package/locales/ru-RU/models.json +48 -0
  68. package/locales/ru-RU/providers.json +3 -0
  69. package/locales/tr-TR/chat.json +29 -0
  70. package/locales/tr-TR/models.json +48 -0
  71. package/locales/tr-TR/providers.json +3 -0
  72. package/locales/vi-VN/chat.json +29 -0
  73. package/locales/vi-VN/models.json +48 -0
  74. package/locales/vi-VN/providers.json +3 -0
  75. package/locales/zh-CN/chat.json +29 -0
  76. package/locales/zh-CN/models.json +51 -3
  77. package/locales/zh-CN/providers.json +3 -4
  78. package/locales/zh-TW/chat.json +29 -0
  79. package/locales/zh-TW/models.json +48 -0
  80. package/locales/zh-TW/providers.json +3 -0
  81. package/package.json +1 -1
  82. package/packages/web-crawler/src/crawImpl/__test__/jina.test.ts +169 -0
  83. package/packages/web-crawler/src/crawImpl/naive.ts +29 -3
  84. package/packages/web-crawler/src/utils/errorType.ts +7 -0
  85. package/scripts/serverLauncher/startServer.js +11 -7
  86. package/src/config/modelProviders/index.ts +1 -1
  87. package/src/config/modelProviders/ppio.ts +1 -1
  88. package/src/features/Conversation/Extras/Assistant.tsx +12 -20
  89. package/src/features/Conversation/Extras/Usage/UsageDetail/ModelCard.tsx +130 -0
  90. package/src/features/Conversation/Extras/Usage/UsageDetail/TokenProgress.tsx +71 -0
  91. package/src/features/Conversation/Extras/Usage/UsageDetail/index.tsx +146 -0
  92. package/src/features/Conversation/Extras/Usage/UsageDetail/tokens.ts +94 -0
  93. package/src/features/Conversation/Extras/Usage/index.tsx +40 -0
  94. package/src/libs/agent-runtime/utils/streams/anthropic.test.ts +14 -0
  95. package/src/libs/agent-runtime/utils/streams/anthropic.ts +25 -0
  96. package/src/libs/agent-runtime/utils/streams/openai.test.ts +100 -10
  97. package/src/libs/agent-runtime/utils/streams/openai.ts +30 -4
  98. package/src/libs/agent-runtime/utils/streams/protocol.ts +4 -0
  99. package/src/locales/default/chat.ts +30 -1
  100. package/src/server/routers/tools/search.ts +1 -1
  101. package/src/store/aiInfra/slices/aiModel/initialState.ts +3 -1
  102. package/src/store/aiInfra/slices/aiModel/selectors.test.ts +1 -0
  103. package/src/store/aiInfra/slices/aiModel/selectors.ts +5 -0
  104. package/src/store/aiInfra/slices/aiProvider/action.ts +3 -1
  105. package/src/store/chat/slices/aiChat/actions/generateAIChat.ts +5 -1
  106. package/src/store/chat/slices/message/action.ts +3 -0
  107. package/src/store/global/initialState.ts +1 -0
  108. package/src/store/global/selectors/systemStatus.ts +2 -0
  109. package/src/types/message/base.ts +18 -0
  110. package/src/types/message/chat.ts +4 -3
  111. package/src/utils/fetch/fetchSSE.ts +24 -1
  112. package/src/utils/format.ts +3 -1
@@ -13,6 +13,23 @@ export interface ModelReasoning {
13
13
  signature?: string;
14
14
  }
15
15
 
16
+ export interface ModelTokensUsage {
17
+ acceptedPredictionTokens?: number;
18
+ cachedTokens?: number;
19
+ inputAudioTokens?: number;
20
+ inputCacheMissTokens?: number;
21
+ inputTokens?: number;
22
+ outputAudioTokens?: number;
23
+ outputTokens?: number;
24
+ reasoningTokens?: number;
25
+ rejectedPredictionTokens?: number;
26
+ totalTokens?: number;
27
+ }
28
+
29
+ export interface MessageMetadata extends ModelTokensUsage {
30
+ tps?: number;
31
+ }
32
+
16
33
  export type MessageRoleType = 'user' | 'system' | 'assistant' | 'tool';
17
34
 
18
35
  export interface MessageItem {
@@ -23,6 +40,7 @@ export interface MessageItem {
23
40
  error: any | null;
24
41
  favorite: boolean | null;
25
42
  id: string;
43
+ metadata?: MessageMetadata | null;
26
44
  model: string | null;
27
45
  observationId: string | null;
28
46
  parentId: string | null;
@@ -6,7 +6,7 @@ import { MetaData } from '@/types/meta';
6
6
  import { MessageSemanticSearchChunk } from '@/types/rag';
7
7
  import { GroundingSearch } from '@/types/search';
8
8
 
9
- import { MessageRoleType, ModelReasoning } from './base';
9
+ import { MessageMetadata, MessageRoleType, ModelReasoning } from './base';
10
10
  import { ChatPluginPayload, ChatToolPayload } from './tools';
11
11
  import { Translate } from './translate';
12
12
 
@@ -82,15 +82,16 @@ export interface ChatMessage {
82
82
  imageList?: ChatImageItem[];
83
83
  meta: MetaData;
84
84
 
85
+ metadata?: MessageMetadata | null;
85
86
  /**
86
87
  * observation id
87
88
  */
88
89
  observationId?: string;
90
+
89
91
  /**
90
92
  * parent message id
91
93
  */
92
94
  parentId?: string;
93
-
94
95
  plugin?: ChatPluginPayload;
95
96
  pluginError?: any;
96
97
  pluginState?: any;
@@ -100,8 +101,8 @@ export interface ChatMessage {
100
101
  quotaId?: string;
101
102
  ragQuery?: string | null;
102
103
  ragQueryId?: string | null;
103
- ragRawQuery?: string | null;
104
104
 
105
+ ragRawQuery?: string | null;
105
106
  reasoning?: ModelReasoning | null;
106
107
  /**
107
108
  * message role type
@@ -10,6 +10,7 @@ import {
10
10
  MessageToolCallChunk,
11
11
  MessageToolCallSchema,
12
12
  ModelReasoning,
13
+ ModelTokensUsage,
13
14
  } from '@/types/message';
14
15
  import { GroundingSearch } from '@/types/search';
15
16
 
@@ -28,9 +29,15 @@ export type OnFinishHandler = (
28
29
  toolCalls?: MessageToolCall[];
29
30
  traceId?: string | null;
30
31
  type?: SSEFinishType;
32
+ usage?: ModelTokensUsage;
31
33
  },
32
34
  ) => Promise<void>;
33
35
 
36
+ export interface MessageUsageChunk {
37
+ type: 'usage';
38
+ usage: ModelTokensUsage;
39
+ }
40
+
34
41
  export interface MessageTextChunk {
35
42
  text: string;
36
43
  type: 'text';
@@ -59,7 +66,12 @@ export interface FetchSSEOptions {
59
66
  onErrorHandle?: (error: ChatMessageError) => void;
60
67
  onFinish?: OnFinishHandler;
61
68
  onMessageHandle?: (
62
- chunk: MessageTextChunk | MessageToolCallsChunk | MessageReasoningChunk | MessageGroundingChunk,
69
+ chunk:
70
+ | MessageTextChunk
71
+ | MessageToolCallsChunk
72
+ | MessageReasoningChunk
73
+ | MessageGroundingChunk
74
+ | MessageUsageChunk,
63
75
  ) => void;
64
76
  smoothing?: SmoothingParams | boolean;
65
77
  }
@@ -317,6 +329,7 @@ export const fetchSSE = async (url: string, options: RequestInit & FetchSSEOptio
317
329
  });
318
330
 
319
331
  let grounding: GroundingSearch | undefined = undefined;
332
+ let usage: ModelTokensUsage | undefined = undefined;
320
333
  await fetchEventSource(url, {
321
334
  body: options.body,
322
335
  fetch: options?.fetcher,
@@ -377,6 +390,9 @@ export const fetchSSE = async (url: string, options: RequestInit & FetchSSEOptio
377
390
  }
378
391
 
379
392
  case 'text': {
393
+ // skip empty text
394
+ if (!data) break;
395
+
380
396
  if (textSmoothing) {
381
397
  textController.pushToQueue(data);
382
398
 
@@ -389,6 +405,12 @@ export const fetchSSE = async (url: string, options: RequestInit & FetchSSEOptio
389
405
  break;
390
406
  }
391
407
 
408
+ case 'usage': {
409
+ usage = data;
410
+ options.onMessageHandle?.({ type: 'usage', usage: data });
411
+ break;
412
+ }
413
+
392
414
  case 'grounding': {
393
415
  grounding = data;
394
416
  options.onMessageHandle?.({ grounding: data, type: 'grounding' });
@@ -475,6 +497,7 @@ export const fetchSSE = async (url: string, options: RequestInit & FetchSSEOptio
475
497
  toolCalls,
476
498
  traceId,
477
499
  type: finishedType,
500
+ usage,
478
501
  });
479
502
  }
480
503
  }
@@ -116,7 +116,9 @@ export const formatPrice = (price: number, fractionDigits: number = 2) => {
116
116
  return `${numeral(a).format('0,0')}.${b}`;
117
117
  };
118
118
 
119
- export const formatPriceByCurrency = (price: number, currency?: ModelPriceCurrency) => {
119
+ export const formatPriceByCurrency = (price?: number, currency?: ModelPriceCurrency) => {
120
+ if (!price) return '-';
121
+
120
122
  if (currency === 'CNY') {
121
123
  return formatPrice(price / USD_TO_CNY);
122
124
  }