@lobehub/chat 0.161.17 → 0.161.19

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 (40) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/locales/ar/chat.json +1 -0
  3. package/locales/ar/components.json +2 -1
  4. package/locales/bg-BG/chat.json +1 -0
  5. package/locales/bg-BG/components.json +2 -1
  6. package/locales/de-DE/chat.json +1 -0
  7. package/locales/de-DE/components.json +2 -1
  8. package/locales/en-US/chat.json +1 -0
  9. package/locales/en-US/components.json +2 -1
  10. package/locales/es-ES/chat.json +1 -0
  11. package/locales/es-ES/components.json +2 -1
  12. package/locales/fr-FR/chat.json +1 -0
  13. package/locales/fr-FR/components.json +2 -1
  14. package/locales/it-IT/chat.json +1 -0
  15. package/locales/it-IT/components.json +2 -1
  16. package/locales/ja-JP/chat.json +1 -0
  17. package/locales/ja-JP/components.json +2 -1
  18. package/locales/ko-KR/chat.json +1 -0
  19. package/locales/ko-KR/components.json +2 -1
  20. package/locales/nl-NL/chat.json +1 -0
  21. package/locales/nl-NL/components.json +2 -1
  22. package/locales/pl-PL/chat.json +1 -0
  23. package/locales/pl-PL/components.json +2 -1
  24. package/locales/pt-BR/chat.json +1 -0
  25. package/locales/pt-BR/components.json +2 -1
  26. package/locales/ru-RU/chat.json +1 -0
  27. package/locales/ru-RU/components.json +2 -1
  28. package/locales/tr-TR/chat.json +1 -0
  29. package/locales/tr-TR/components.json +2 -1
  30. package/locales/vi-VN/chat.json +1 -0
  31. package/locales/vi-VN/components.json +2 -1
  32. package/locales/zh-CN/chat.json +1 -0
  33. package/locales/zh-CN/components.json +2 -1
  34. package/locales/zh-TW/chat.json +1 -0
  35. package/locales/zh-TW/components.json +2 -1
  36. package/package.json +1 -1
  37. package/src/config/llm.ts +0 -4
  38. package/src/features/ChatInput/ActionBar/Token/TokenProgress.tsx +80 -0
  39. package/src/features/ChatInput/ActionBar/Token/TokenTag.tsx +79 -35
  40. package/src/locales/default/chat.ts +1 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 0.161.19](https://github.com/lobehub/lobe-chat/compare/v0.161.18...v0.161.19)
6
+
7
+ <sup>Released on **2024-05-25**</sup>
8
+
9
+ #### 💄 Styles
10
+
11
+ - **misc**: Update token tag popover style.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### Styles
19
+
20
+ - **misc**: Update token tag popover style, closes [#2631](https://github.com/lobehub/lobe-chat/issues/2631) ([7635129](https://github.com/lobehub/lobe-chat/commit/7635129))
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
+
30
+ ### [Version 0.161.18](https://github.com/lobehub/lobe-chat/compare/v0.161.17...v0.161.18)
31
+
32
+ <sup>Released on **2024-05-25**</sup>
33
+
34
+ #### 🐛 Bug Fixes
35
+
36
+ - **misc**: Fix aws log.
37
+
38
+ <br/>
39
+
40
+ <details>
41
+ <summary><kbd>Improvements and Fixes</kbd></summary>
42
+
43
+ #### What's fixed
44
+
45
+ - **misc**: Fix aws log ([58f3ed1](https://github.com/lobehub/lobe-chat/commit/58f3ed1))
46
+
47
+ </details>
48
+
49
+ <div align="right">
50
+
51
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
52
+
53
+ </div>
54
+
5
55
  ### [Version 0.161.17](https://github.com/lobehub/lobe-chat/compare/v0.161.16...v0.161.17)
6
56
 
7
57
  <sup>Released on **2024-05-25**</sup>
@@ -84,6 +84,7 @@
84
84
  "chats": "رسائل المحادثة",
85
85
  "rest": "المتبقي",
86
86
  "systemRole": "تعيين الدور",
87
+ "title": "تفاصيل الرمز",
87
88
  "tools": "تعيين الإضافات",
88
89
  "total": "الإجمالي",
89
90
  "used": "المستخدم"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "يدعم هذا النموذج استدعاء الوظائف",
7
7
  "tokens": "يدعم هذا النموذج حتى {{tokens}} رمزًا في جلسة واحدة",
8
8
  "vision": "يدعم هذا النموذج التعرف البصري"
9
- }
9
+ },
10
+ "removed": "هذا النموذج لم يعد متوفر في القائمة، سيتم إزالته تلقائيًا إذا تم إلغاء تحديده"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "لا توجد نماذج ممكن تمكينها، يرجى الانتقال إلى الإعدادات لتمكينها",
@@ -84,6 +84,7 @@
84
84
  "chats": "Чат съобщения",
85
85
  "rest": "Оставащи",
86
86
  "systemRole": "Настройки на ролята",
87
+ "title": "Детайли на токена",
87
88
  "tools": "Настройки на плъгина",
88
89
  "total": "Общо налични",
89
90
  "used": "Общо използвани"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Този модел поддържа функционални обаждания (Function Call)",
7
7
  "tokens": "Този модел поддържа до {{tokens}} токена за една сесия",
8
8
  "vision": "Този модел поддържа визуално разпознаване"
9
- }
9
+ },
10
+ "removed": "Този модел не се намира в списъка. Ако бъде отменен изборът, той ще бъде автоматично премахнат."
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "Няма активирани модели, моля, посетете настройките и ги активирайте",
@@ -84,6 +84,7 @@
84
84
  "chats": "Chats",
85
85
  "rest": "Verbleibend",
86
86
  "systemRole": "Systemrolle",
87
+ "title": "Kontextdetails",
87
88
  "tools": "Werkzeuge",
88
89
  "total": "Insgesamt",
89
90
  "used": "Verwendet"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Dieses Modell unterstützt Funktionsaufrufe.",
7
7
  "tokens": "Dieses Modell unterstützt maximal {{tokens}} Tokens pro Sitzung.",
8
8
  "vision": "Dieses Modell unterstützt die visuelle Erkennung."
9
- }
9
+ },
10
+ "removed": "Das Modell wurde aus der Liste entfernt. Wenn Sie die Auswahl aufheben, wird es automatisch entfernt."
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "Kein aktiviertes Modell. Bitte gehen Sie zu den Einstellungen, um es zu aktivieren.",
@@ -84,6 +84,7 @@
84
84
  "chats": "Chat Messages",
85
85
  "rest": "Remaining",
86
86
  "systemRole": "Role Settings",
87
+ "title": "Context Details",
87
88
  "tools": "Plugin Settings",
88
89
  "total": "Total Available",
89
90
  "used": "Total Used"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "This model supports function call.",
7
7
  "tokens": "This model supports up to {{tokens}} tokens in a single session.",
8
8
  "vision": "This model supports visual recognition."
9
- }
9
+ },
10
+ "removed": "The model is not in the list. It will be automatically removed if deselected."
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "No enabled model. Please go to settings to enable.",
@@ -84,6 +84,7 @@
84
84
  "chats": "Mensajes de chat",
85
85
  "rest": "Restante",
86
86
  "systemRole": "Rol del sistema",
87
+ "title": "Detalles del token",
87
88
  "tools": "Herramientas",
88
89
  "total": "Total",
89
90
  "used": "Utilizado"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Este modelo admite llamadas de función.",
7
7
  "tokens": "Este modelo admite un máximo de {{tokens}} tokens por sesión.",
8
8
  "vision": "Este modelo admite el reconocimiento visual."
9
- }
9
+ },
10
+ "removed": "El modelo no está en la lista, se eliminará automáticamente si se cancela la selección"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "No hay modelos habilitados. Vaya a la configuración para habilitarlos.",
@@ -84,6 +84,7 @@
84
84
  "chats": "Messages de discussion",
85
85
  "rest": "Restant disponible",
86
86
  "systemRole": "Rôle système",
87
+ "title": "Détails du jeton",
87
88
  "tools": "Paramètres du plugin",
88
89
  "total": "Total disponible",
89
90
  "used": "Total utilisé"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Ce modèle prend en charge les appels de fonction.",
7
7
  "tokens": "Ce modèle prend en charge jusqu'à {{tokens}} jetons par session.",
8
8
  "vision": "Ce modèle prend en charge la reconnaissance visuelle."
9
- }
9
+ },
10
+ "removed": "Le modèle n'est pas dans la liste, il sera automatiquement supprimé si vous annulez la sélection"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "Aucun modèle activé. Veuillez vous rendre dans les paramètres pour l'activer.",
@@ -84,6 +84,7 @@
84
84
  "chats": "Chat",
85
85
  "rest": "Rimanenti",
86
86
  "systemRole": "Ruolo di sistema",
87
+ "title": "Dettagli del Token",
87
88
  "tools": "Strumenti",
88
89
  "total": "Totale",
89
90
  "used": "Utilizzati"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Questo modello supporta la chiamata di funzioni.",
7
7
  "tokens": "Questo modello supporta un massimo di {{tokens}} token per sessione.",
8
8
  "vision": "Questo modello supporta il riconoscimento visivo."
9
- }
9
+ },
10
+ "removed": "Il modello non è più nella lista, verrà rimosso automaticamente se deselezionato"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "Nessun modello attivo. Vai alle impostazioni per attivarne uno.",
@@ -84,6 +84,7 @@
84
84
  "chats": "チャットメッセージ",
85
85
  "rest": "残り利用可能",
86
86
  "systemRole": "システムロール設定",
87
+ "title": "コンテキストの詳細",
87
88
  "tools": "ツール設定",
88
89
  "total": "合計利用可能",
89
90
  "used": "合計使用"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "このモデルは関数呼び出し(Function Call)をサポートしています。",
7
7
  "tokens": "このモデルは1つのセッションあたり最大{{tokens}}トークンをサポートしています。",
8
8
  "vision": "このモデルはビジョン認識をサポートしています。"
9
- }
9
+ },
10
+ "removed": "選択されたモデルはリストから削除されました。選択を解除すると自動的に削除されます。"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "有効なモデルがありません。設定に移動して有効にしてください。",
@@ -84,6 +84,7 @@
84
84
  "chats": "채팅 메시지",
85
85
  "rest": "남은 사용량",
86
86
  "systemRole": "시스템 역할",
87
+ "title": "컨텍스트 세부 정보",
87
88
  "tools": "도구 설정",
88
89
  "total": "총 사용량",
89
90
  "used": "총 사용"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "이 모델은 함수 호출을 지원합니다",
7
7
  "tokens": "이 모델은 단일 세션당 최대 {{tokens}} 토큰을 지원합니다",
8
8
  "vision": "이 모델은 시각 인식을 지원합니다"
9
- }
9
+ },
10
+ "removed": "모델이 목록에서 제거되었습니다. 선택이 취소되면 자동으로 제거됩니다."
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "활성화된 모델이 없습니다. 설정으로 이동하여 활성화하세요",
@@ -84,6 +84,7 @@
84
84
  "chats": "Chats",
85
85
  "rest": "Rust",
86
86
  "systemRole": "Systeemrol",
87
+ "title": "Contextuele details",
87
88
  "tools": "Tools",
88
89
  "total": "Totaal",
89
90
  "used": "Gebruikt"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "This model supports function call.",
7
7
  "tokens": "This model supports up to {{tokens}} tokens in a single session.",
8
8
  "vision": "This model supports visual recognition."
9
- }
9
+ },
10
+ "removed": "Dit model staat niet meer in de lijst. Als je het deselecteert, wordt het automatisch verwijderd."
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "No enabled model, please go to settings to enable.",
@@ -84,6 +84,7 @@
84
84
  "chats": "Rozmowy",
85
85
  "rest": "Pozostałe",
86
86
  "systemRole": "Rola systemowa",
87
+ "title": "Szczegóły tokena",
87
88
  "tools": "Narzędzia",
88
89
  "total": "Razem",
89
90
  "used": "Wykorzystane"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Ten model obsługuje wywołania funkcji (Function Call).",
7
7
  "tokens": "Ten model obsługuje maksymalnie {{tokens}} tokenów w pojedynczej sesji.",
8
8
  "vision": "Ten model obsługuje rozpoznawanie wizualne."
9
- }
9
+ },
10
+ "removed": "Ten model nie znajduje się na liście, jeśli zostanie odznaczony, zostanie automatycznie usunięty"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "Brak włączonych modeli, przejdź do ustawień i włącz je",
@@ -84,6 +84,7 @@
84
84
  "chats": "Mensagens de bate-papo",
85
85
  "rest": "Restante disponível",
86
86
  "systemRole": "Configuração de papel do sistema",
87
+ "title": "Detalhes do Token",
87
88
  "tools": "Configuração de plug-ins",
88
89
  "total": "Total disponível",
89
90
  "used": "Total utilizado"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Este modelo suporta chamadas de função.",
7
7
  "tokens": "Este modelo suporta no máximo {{tokens}} tokens por sessão.",
8
8
  "vision": "Este modelo suporta reconhecimento visual."
9
- }
9
+ },
10
+ "removed": "Este modelo não está na lista, se for desmarcado, será removido automaticamente"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "Nenhum modelo habilitado. Por favor, vá para as configurações e habilite um.",
@@ -84,6 +84,7 @@
84
84
  "chats": "Чаты",
85
85
  "rest": "Остаток",
86
86
  "systemRole": "Роль системы",
87
+ "title": "Детали контекста",
87
88
  "tools": "Инструменты",
88
89
  "total": "Всего",
89
90
  "used": "Использовано"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Эта модель поддерживает вызов функций",
7
7
  "tokens": "Эта модель поддерживает до {{tokens}} токенов в одной сессии",
8
8
  "vision": "Эта модель поддерживает распознавание изображений"
9
- }
9
+ },
10
+ "removed": "Эта модель не находится в списке. Если вы ее отмените, она будет автоматически удалена"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "Нет активированных моделей. Пожалуйста, перейдите в настройки и включите модель",
@@ -84,6 +84,7 @@
84
84
  "chats": "Sohbetler",
85
85
  "rest": "Kalan",
86
86
  "systemRole": "Sistem Rolü",
87
+ "title": "Bağlam Detayları",
87
88
  "tools": "Araçlar",
88
89
  "total": "Toplam",
89
90
  "used": "Kullanılan"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Bu model fonksiyon çağrısını destekler",
7
7
  "tokens": "Bu model tek bir oturumda en fazla {{tokens}} Token destekler",
8
8
  "vision": "Bu model görüntü tanımıyı destekler"
9
- }
9
+ },
10
+ "removed": "Bu model listeden çıkarıldı, seçiminizi kaldırırsanız otomatik olarak kaldırılacaktır"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "Etkinleştirilmiş model bulunmamaktadır, lütfen ayarlara giderek açın",
@@ -84,6 +84,7 @@
84
84
  "chats": "Tin nhắn trò chuyện",
85
85
  "rest": "Còn lại",
86
86
  "systemRole": "Vai trò hệ thống",
87
+ "title": "Chi tiết Ngữ cảnh",
87
88
  "tools": "Công cụ",
88
89
  "total": "Tổng cộng",
89
90
  "used": "Đã sử dụng"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "Mô hình này hỗ trợ cuộc gọi hàm (Function Call)",
7
7
  "tokens": "Mỗi phiên của mô hình này hỗ trợ tối đa {{tokens}} Tokens",
8
8
  "vision": "Mô hình này hỗ trợ nhận diện hình ảnh"
9
- }
9
+ },
10
+ "removed": "Mô hình này không còn trong danh sách, nếu bỏ chọn sẽ tự động xóa"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "Không có mô hình nào được kích hoạt, vui lòng điều chỉnh trong cài đặt",
@@ -84,6 +84,7 @@
84
84
  "chats": "会话消息",
85
85
  "rest": "剩余可用",
86
86
  "systemRole": "角色设定",
87
+ "title": "上下文明细",
87
88
  "tools": "插件设定",
88
89
  "total": "总共可用",
89
90
  "used": "总计使用"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "该模型支持函数调用(Function Call)",
7
7
  "tokens": "该模型单个会话最多支持 {{tokens}} Tokens",
8
8
  "vision": "该模型支持视觉识别"
9
- }
9
+ },
10
+ "removed": "该模型不在列表中,若取消选中将会自动移除"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "没有启用的模型,请前往设置开启",
@@ -84,6 +84,7 @@
84
84
  "chats": "聊天訊息",
85
85
  "rest": "剩餘可用",
86
86
  "systemRole": "角色設定",
87
+ "title": "上下文詳細資訊",
87
88
  "tools": "外掛程式設定",
88
89
  "total": "總共可用",
89
90
  "used": "總計使用"
@@ -6,7 +6,8 @@
6
6
  "functionCall": "該模型支援函式呼叫(Function Call)",
7
7
  "tokens": "該模型單一會話最多支援 {{tokens}} Tokens",
8
8
  "vision": "該模型支援視覺辨識"
9
- }
9
+ },
10
+ "removed": "該模型不在清單中,若取消選取將會自動移除"
10
11
  },
11
12
  "ModelSwitchPanel": {
12
13
  "emptyModel": "沒有啟用的模型,請前往設定開啟",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "0.161.17",
3
+ "version": "0.161.19",
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",
package/src/config/llm.ts CHANGED
@@ -47,10 +47,6 @@ export const getLLMConfig = () => {
47
47
  regions = process.env.OPENAI_FUNCTION_REGIONS.split(',');
48
48
  }
49
49
 
50
- console.log('AWS_REGION:', process.env.AWS_REGION);
51
- console.log('AWS_ACCESS_KEY_ID:', process.env.AWS_ACCESS_KEY_ID);
52
- console.log('AWS_SECRET_ACCESS_KEY:', process.env.AWS_SECRET_ACCESS_KEY);
53
-
54
50
  return createEnv({
55
51
  server: {
56
52
  API_KEY_SELECT_MODE: z.string().optional(),
@@ -0,0 +1,80 @@
1
+ import { Divider } from 'antd';
2
+ import { useTheme } from 'antd-style';
3
+ import numeral from 'numeral';
4
+ import { memo } from 'react';
5
+ import { Flexbox } from 'react-layout-kit';
6
+
7
+ interface TokenProgressItem {
8
+ color: string;
9
+ id: string;
10
+ title: string;
11
+ value: number;
12
+ }
13
+
14
+ interface TokenProgressProps {
15
+ data: TokenProgressItem[];
16
+ showIcon?: boolean;
17
+ showTotal?: string;
18
+ }
19
+
20
+ const format = (number: number) => numeral(number).format('0,0');
21
+
22
+ const TokenProgress = memo<TokenProgressProps>(({ data, showIcon, showTotal }) => {
23
+ const theme = useTheme();
24
+ const total = data.reduce((acc, item) => acc + item.value, 0);
25
+ return (
26
+ <Flexbox gap={8} style={{ position: 'relative' }} width={'100%'}>
27
+ <Flexbox
28
+ height={6}
29
+ horizontal
30
+ style={{
31
+ background: total === 0 ? theme.colorFill : undefined,
32
+ borderRadius: 3,
33
+ overflow: 'hidden',
34
+ position: 'relative',
35
+ }}
36
+ width={'100%'}
37
+ >
38
+ {data.map((item) => (
39
+ <Flexbox
40
+ height={'100%'}
41
+ key={item.id}
42
+ style={{ background: item.color, flex: item.value }}
43
+ />
44
+ ))}
45
+ </Flexbox>
46
+ <Flexbox>
47
+ {data.map((item) => (
48
+ <Flexbox align={'center'} gap={4} horizontal justify={'space-between'} key={item.id}>
49
+ <Flexbox align={'center'} gap={4} horizontal>
50
+ {showIcon && (
51
+ <div
52
+ style={{
53
+ background: item.color,
54
+ borderRadius: '50%',
55
+ flex: 'none',
56
+ height: 6,
57
+ width: 6,
58
+ }}
59
+ />
60
+ )}
61
+ <div style={{ color: theme.colorTextSecondary }}>{item.title}</div>
62
+ </Flexbox>
63
+ <div style={{ fontWeight: 500 }}>{format(item.value)}</div>
64
+ </Flexbox>
65
+ ))}
66
+ {showTotal && (
67
+ <>
68
+ <Divider style={{ marginBlock: 8 }} />
69
+ <Flexbox align={'center'} gap={4} horizontal justify={'space-between'}>
70
+ <div style={{ color: theme.colorTextSecondary }}>{showTotal}</div>
71
+ <div style={{ fontWeight: 500 }}>{format(total)}</div>
72
+ </Flexbox>
73
+ </>
74
+ )}
75
+ </Flexbox>
76
+ </Flexbox>
77
+ );
78
+ });
79
+
80
+ export default TokenProgress;
@@ -1,8 +1,10 @@
1
1
  import { TokenTag, Tooltip } from '@lobehub/ui';
2
+ import { Popover } from 'antd';
3
+ import { useTheme } from 'antd-style';
2
4
  import numeral from 'numeral';
3
5
  import { memo } from 'react';
4
6
  import { useTranslation } from 'react-i18next';
5
- import { Flexbox } from 'react-layout-kit';
7
+ import { Center, Flexbox } from 'react-layout-kit';
6
8
 
7
9
  import { useTokenCount } from '@/hooks/useTokenCount';
8
10
  import { useAgentStore } from '@/store/agent';
@@ -14,10 +16,11 @@ import { toolSelectors } from '@/store/tool/selectors';
14
16
  import { useUserStore } from '@/store/user';
15
17
  import { modelProviderSelectors } from '@/store/user/selectors';
16
18
 
17
- const format = (number: number) => numeral(number).format('0,0');
19
+ import TokenProgress from './TokenProgress';
18
20
 
19
21
  const Token = memo(() => {
20
- const { t } = useTranslation('chat');
22
+ const { t } = useTranslation(['chat', 'components']);
23
+ const theme = useTheme();
21
24
 
22
25
  const [input, messageString] = useChatStore((s) => [
23
26
  s.inputMessage,
@@ -55,38 +58,79 @@ const Token = memo(() => {
55
58
 
56
59
  // Total token
57
60
  const totalToken = systemRoleToken + toolsToken + chatsToken;
61
+
62
+ const content = (
63
+ <Flexbox gap={12} style={{ minWidth: 200 }}>
64
+ <Flexbox align={'center'} gap={4} horizontal justify={'space-between'} width={'100%'}>
65
+ <div style={{ color: theme.colorTextDescription }}>{t('tokenDetails.title')}</div>
66
+ <Tooltip
67
+ overlayStyle={{ maxWidth: 'unset', pointerEvents: 'none' }}
68
+ title={t('ModelSelect.featureTag.tokens', {
69
+ ns: 'components',
70
+ tokens: numeral(maxTokens).format('0,0'),
71
+ })}
72
+ >
73
+ <Center
74
+ height={20}
75
+ paddingInline={4}
76
+ style={{
77
+ background: theme.colorFillTertiary,
78
+ borderRadius: 4,
79
+ color: theme.colorTextSecondary,
80
+ fontFamily: theme.fontFamilyCode,
81
+ fontSize: 11,
82
+ }}
83
+ >
84
+ TOKEN
85
+ </Center>
86
+ </Tooltip>
87
+ </Flexbox>
88
+ <TokenProgress
89
+ data={[
90
+ {
91
+ color: theme.magenta,
92
+ id: 'systemRole',
93
+ title: t('tokenDetails.systemRole'),
94
+ value: systemRoleToken,
95
+ },
96
+ {
97
+ color: theme.geekblue,
98
+ id: 'tools',
99
+ title: t('tokenDetails.tools'),
100
+ value: toolsToken,
101
+ },
102
+ {
103
+ color: theme.gold,
104
+ id: 'chats',
105
+ title: t('tokenDetails.chats'),
106
+ value: chatsToken,
107
+ },
108
+ ]}
109
+ showIcon
110
+ />
111
+ <TokenProgress
112
+ data={[
113
+ {
114
+ color: theme.colorSuccess,
115
+ id: 'used',
116
+ title: t('tokenDetails.used'),
117
+ value: totalToken,
118
+ },
119
+ {
120
+ color: theme.colorFill,
121
+ id: 'rest',
122
+ title: t('tokenDetails.rest'),
123
+ value: maxTokens - totalToken,
124
+ },
125
+ ]}
126
+ showIcon
127
+ showTotal={t('tokenDetails.total')}
128
+ />
129
+ </Flexbox>
130
+ );
131
+
58
132
  return (
59
- <Tooltip
60
- placement={'bottom'}
61
- title={
62
- <Flexbox width={150}>
63
- <Flexbox horizontal justify={'space-between'}>
64
- <span>{t('tokenDetails.systemRole')}</span>
65
- <span>{format(systemRoleToken)}</span>
66
- </Flexbox>
67
- <Flexbox horizontal justify={'space-between'}>
68
- <span>{t('tokenDetails.tools')}</span>
69
- <span>{format(toolsToken)}</span>
70
- </Flexbox>
71
- <Flexbox horizontal justify={'space-between'}>
72
- <span>{t('tokenDetails.chats')}</span>
73
- <span>{format(chatsToken)}</span>
74
- </Flexbox>
75
- <Flexbox horizontal justify={'space-between'}>
76
- <span>{t('tokenDetails.used')}</span>
77
- <span>{format(totalToken)}</span>
78
- </Flexbox>
79
- <Flexbox horizontal justify={'space-between'} style={{ marginTop: 8 }}>
80
- <span>{t('tokenDetails.total')}</span>
81
- <span>{format(maxTokens)}</span>
82
- </Flexbox>
83
- <Flexbox horizontal justify={'space-between'}>
84
- <span>{t('tokenDetails.rest')}</span>
85
- <span>{format(maxTokens - totalToken)}</span>
86
- </Flexbox>
87
- </Flexbox>
88
- }
89
- >
133
+ <Popover arrow={false} content={content} placement={'top'} trigger={['hover', 'click']}>
90
134
  <TokenTag
91
135
  displayMode={'used'}
92
136
  maxValue={maxTokens}
@@ -98,7 +142,7 @@ const Token = memo(() => {
98
142
  }}
99
143
  value={totalToken}
100
144
  />
101
- </Tooltip>
145
+ </Popover>
102
146
  );
103
147
  });
104
148
 
@@ -85,6 +85,7 @@ export default {
85
85
  chats: '会话消息',
86
86
  rest: '剩余可用',
87
87
  systemRole: '角色设定',
88
+ title: '上下文明细',
88
89
  tools: '插件设定',
89
90
  total: '总共可用',
90
91
  used: '总计使用',