@lobehub/chat 1.110.1 → 1.110.3

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 (126) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/Dockerfile +1 -1
  3. package/apps/desktop/.i18nrc.js +2 -1
  4. package/apps/desktop/package.json +1 -2
  5. package/apps/desktop/resources/locales/ar/menu.json +1 -0
  6. package/apps/desktop/resources/locales/bg-BG/menu.json +1 -0
  7. package/apps/desktop/resources/locales/de-DE/menu.json +1 -0
  8. package/apps/desktop/resources/locales/en-US/menu.json +1 -0
  9. package/apps/desktop/resources/locales/es-ES/menu.json +1 -0
  10. package/apps/desktop/resources/locales/fa-IR/menu.json +1 -0
  11. package/apps/desktop/resources/locales/fr-FR/menu.json +1 -0
  12. package/apps/desktop/resources/locales/it-IT/menu.json +1 -0
  13. package/apps/desktop/resources/locales/ja-JP/menu.json +1 -0
  14. package/apps/desktop/resources/locales/ko-KR/menu.json +1 -0
  15. package/apps/desktop/resources/locales/nl-NL/menu.json +1 -0
  16. package/apps/desktop/resources/locales/pl-PL/menu.json +1 -0
  17. package/apps/desktop/resources/locales/pt-BR/menu.json +1 -0
  18. package/apps/desktop/resources/locales/ru-RU/menu.json +1 -0
  19. package/apps/desktop/resources/locales/tr-TR/menu.json +1 -0
  20. package/apps/desktop/resources/locales/vi-VN/menu.json +1 -0
  21. package/apps/desktop/resources/locales/zh-CN/menu.json +1 -0
  22. package/apps/desktop/resources/locales/zh-TW/menu.json +1 -0
  23. package/apps/desktop/src/main/controllers/MenuCtr.ts +2 -2
  24. package/apps/desktop/src/main/controllers/__tests__/MenuCtr.test.ts +13 -13
  25. package/apps/desktop/src/main/locales/default/menu.ts +1 -0
  26. package/apps/desktop/src/main/menus/impls/linux.ts +9 -24
  27. package/apps/desktop/src/main/menus/impls/macOS.ts +9 -28
  28. package/apps/desktop/src/main/menus/impls/windows.ts +9 -27
  29. package/changelog/v1.json +21 -0
  30. package/locales/ar/modelProvider.json +10 -1
  31. package/locales/ar/models.json +19 -1
  32. package/locales/bg-BG/modelProvider.json +10 -1
  33. package/locales/bg-BG/models.json +19 -1
  34. package/locales/de-DE/modelProvider.json +10 -1
  35. package/locales/de-DE/models.json +19 -1
  36. package/locales/en-US/modelProvider.json +10 -1
  37. package/locales/en-US/models.json +19 -1
  38. package/locales/es-ES/modelProvider.json +10 -1
  39. package/locales/es-ES/models.json +19 -1
  40. package/locales/fa-IR/modelProvider.json +10 -1
  41. package/locales/fa-IR/models.json +19 -1
  42. package/locales/fr-FR/modelProvider.json +10 -1
  43. package/locales/fr-FR/models.json +19 -1
  44. package/locales/it-IT/modelProvider.json +10 -1
  45. package/locales/it-IT/models.json +19 -1
  46. package/locales/ja-JP/modelProvider.json +10 -1
  47. package/locales/ja-JP/models.json +19 -1
  48. package/locales/ko-KR/modelProvider.json +10 -1
  49. package/locales/ko-KR/models.json +19 -1
  50. package/locales/nl-NL/modelProvider.json +10 -1
  51. package/locales/nl-NL/models.json +19 -1
  52. package/locales/pl-PL/modelProvider.json +10 -1
  53. package/locales/pl-PL/models.json +19 -1
  54. package/locales/pt-BR/modelProvider.json +10 -1
  55. package/locales/pt-BR/models.json +19 -1
  56. package/locales/ru-RU/modelProvider.json +10 -1
  57. package/locales/ru-RU/models.json +19 -1
  58. package/locales/tr-TR/modelProvider.json +10 -1
  59. package/locales/tr-TR/models.json +19 -1
  60. package/locales/vi-VN/modelProvider.json +10 -1
  61. package/locales/vi-VN/models.json +19 -1
  62. package/locales/zh-CN/modelProvider.json +10 -1
  63. package/locales/zh-CN/models.json +19 -1
  64. package/locales/zh-TW/modelProvider.json +10 -1
  65. package/locales/zh-TW/models.json +19 -1
  66. package/next.config.ts +1 -0
  67. package/package.json +4 -4
  68. package/packages/electron-client-ipc/src/events/menu.ts +1 -1
  69. package/packages/types/package.json +3 -0
  70. package/packages/types/src/agent/chatConfig.ts +1 -1
  71. package/packages/types/src/agent/index.ts +3 -4
  72. package/packages/types/src/discover/assistants.ts +3 -3
  73. package/packages/types/src/message/chat.ts +4 -4
  74. package/src/app/(backend)/_deprecated/createBizOpenAI/auth.ts +2 -1
  75. package/src/app/(backend)/_deprecated/createBizOpenAI/createAzureOpenai.ts +1 -1
  76. package/src/app/(backend)/_deprecated/createBizOpenAI/createOpenai.ts +1 -1
  77. package/src/app/(backend)/_deprecated/createBizOpenAI/index.ts +1 -1
  78. package/src/app/(backend)/middleware/auth/index.test.ts +1 -1
  79. package/src/app/(backend)/middleware/auth/index.ts +1 -1
  80. package/src/app/(backend)/middleware/auth/utils.ts +1 -1
  81. package/src/app/(backend)/webapi/chat/[provider]/route.test.ts +1 -1
  82. package/src/app/(backend)/webapi/chat/[provider]/route.ts +2 -1
  83. package/src/app/(backend)/webapi/models/[provider]/pull/route.ts +2 -1
  84. package/src/app/(backend)/webapi/models/[provider]/route.ts +1 -1
  85. package/src/app/(backend)/webapi/plugin/gateway/route.ts +1 -1
  86. package/src/app/(backend)/webapi/text-to-image/[provider]/route.ts +1 -1
  87. package/src/app/[variants]/(main)/settings/_layout/Desktop/index.tsx +2 -1
  88. package/src/app/[variants]/(main)/settings/provider/_layout/Desktop/Container.tsx +1 -0
  89. package/src/app/[variants]/(main)/settings/provider/_layout/Desktop/index.tsx +4 -9
  90. package/src/app/[variants]/(main)/settings/provider/features/ModelList/DisabledModels.tsx +15 -5
  91. package/src/app/[variants]/(main)/settings/provider/features/ModelList/EnabledModelList/index.tsx +22 -4
  92. package/src/app/[variants]/(main)/settings/provider/features/ModelList/index.tsx +99 -3
  93. package/src/app/[variants]/layout.tsx +2 -1
  94. package/src/components/InnerLink.tsx +20 -0
  95. package/src/config/modelProviders/ai302.ts +1 -0
  96. package/src/config/modelProviders/openai.ts +1 -0
  97. package/src/features/ChatInput/Desktop/InputArea/index.tsx +14 -0
  98. package/src/features/Conversation/Error/index.tsx +1 -1
  99. package/src/features/Conversation/components/ChatItem/index.tsx +18 -1
  100. package/src/features/ElectronTitlebar/UpdateModal.tsx +15 -3
  101. package/src/features/Portal/Artifacts/Header.tsx +1 -1
  102. package/src/hooks/usePlatform.ts +1 -1
  103. package/src/layout/GlobalProvider/index.tsx +3 -0
  104. package/src/libs/model-runtime/RouterRuntime/createRuntime.ts +2 -2
  105. package/src/locales/default/modelProvider.ts +9 -0
  106. package/src/server/ld.ts +1 -1
  107. package/src/services/__tests__/chat.test.ts +1 -1
  108. package/src/services/chat.ts +1 -1
  109. package/src/services/electron/system.ts +3 -1
  110. package/src/store/chat/slices/message/action.ts +1 -1
  111. package/src/store/chat/slices/plugin/action.ts +1 -1
  112. package/src/store/serverConfig/Provider.tsx +7 -2
  113. package/src/store/serverConfig/store.ts +2 -0
  114. package/src/utils/errorResponse.test.ts +1 -1
  115. package/src/utils/errorResponse.ts +2 -1
  116. package/src/utils/fetch/__tests__/parseError.test.ts +1 -2
  117. package/src/utils/fetch/fetchSSE.ts +2 -1
  118. package/src/utils/fetch/parseError.ts +1 -1
  119. package/tsconfig.json +1 -1
  120. package/.dockerignore +0 -9
  121. package/packages/file-loaders/src/loaders/docx/fixtures/test.docx +0 -0
  122. package/packages/file-loaders/src/loaders/excel/fixtures/test.xlsx +0 -0
  123. package/packages/file-loaders/src/loaders/pptx/fixtures/test.pptx +0 -0
  124. package/packages/file-loaders/test/fixtures/test.docx +0 -0
  125. package/packages/file-loaders/test/fixtures/test.pptx +0 -0
  126. /package/{packages/types/src → src/types}/next.ts +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,65 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 1.110.3](https://github.com/lobehub/lobe-chat/compare/v1.110.2...v1.110.3)
6
+
7
+ <sup>Released on **2025-08-06**</sup>
8
+
9
+ #### 💄 Styles
10
+
11
+ - **misc**: Fix provider setting page hydration error.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### Styles
19
+
20
+ - **misc**: Fix provider setting page hydration error, closes [#8695](https://github.com/lobehub/lobe-chat/issues/8695) ([88e7d2a](https://github.com/lobehub/lobe-chat/commit/88e7d2a))
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 1.110.2](https://github.com/lobehub/lobe-chat/compare/v1.110.1...v1.110.2)
31
+
32
+ <sup>Released on **2025-08-06**</sup>
33
+
34
+ #### 🐛 Bug Fixes
35
+
36
+ - **misc**: Fix fail to fetch aihubmix model on client mode.
37
+
38
+ #### 💄 Styles
39
+
40
+ - **misc**: Add context menu for desktop, support different model tabs.
41
+
42
+ <br/>
43
+
44
+ <details>
45
+ <summary><kbd>Improvements and Fixes</kbd></summary>
46
+
47
+ #### What's fixed
48
+
49
+ - **misc**: Fix fail to fetch aihubmix model on client mode, closes [#8689](https://github.com/lobehub/lobe-chat/issues/8689) ([3dcc5da](https://github.com/lobehub/lobe-chat/commit/3dcc5da))
50
+
51
+ #### Styles
52
+
53
+ - **misc**: Add context menu for desktop, closes [#8691](https://github.com/lobehub/lobe-chat/issues/8691) ([0b30d05](https://github.com/lobehub/lobe-chat/commit/0b30d05))
54
+ - **misc**: Support different model tabs, closes [#8693](https://github.com/lobehub/lobe-chat/issues/8693) ([6d531d7](https://github.com/lobehub/lobe-chat/commit/6d531d7))
55
+
56
+ </details>
57
+
58
+ <div align="right">
59
+
60
+ [![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)
61
+
62
+ </div>
63
+
5
64
  ### [Version 1.110.1](https://github.com/lobehub/lobe-chat/compare/v1.110.0...v1.110.1)
6
65
 
7
66
  <sup>Released on **2025-08-06**</sup>
package/Dockerfile CHANGED
@@ -247,7 +247,7 @@ ENV \
247
247
  # Tencent Cloud
248
248
  TENCENT_CLOUD_API_KEY="" TENCENT_CLOUD_MODEL_LIST="" \
249
249
  # Infini-AI
250
- INFINIAI_API_KEY="" INFINIAI_MODEL_LIST=""
250
+ INFINIAI_API_KEY="" INFINIAI_MODEL_LIST="" \
251
251
  # 302.AI
252
252
  AI302_API_KEY="" AI302_MODEL_LIST=""
253
253
 
@@ -23,8 +23,9 @@ module.exports = defineConfig({
23
23
  'vi-VN',
24
24
  'fa-IR',
25
25
  ],
26
+ saveImmediately: true,
26
27
  temperature: 0,
27
- modelName: 'gpt-4o-mini',
28
+ modelName: 'gpt-4.1-mini',
28
29
  experimental: {
29
30
  jsonMode: true,
30
31
  },
@@ -20,11 +20,10 @@
20
20
  "electron:dev": "electron-vite dev",
21
21
  "electron:run-unpack": "electron .",
22
22
  "format": "prettier --write ",
23
- "i18n": "bun run scripts/i18nWorkflow/index.ts && lobe-i18n",
23
+ "i18n": "tsx scripts/i18nWorkflow/index.ts && lobe-i18n",
24
24
  "postinstall": "electron-builder install-app-deps",
25
25
  "install-isolated": "pnpm install",
26
26
  "lint": "eslint --cache ",
27
- "pg-server": "bun run scripts/pglite-server.ts",
28
27
  "start": "electron-vite preview",
29
28
  "test": "vitest --run",
30
29
  "typecheck": "tsgo --noEmit -p tsconfig.json"
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "نسخ",
16
16
  "cut": "قص",
17
+ "delete": "حذف",
17
18
  "paste": "لصق",
18
19
  "redo": "إعادة",
19
20
  "selectAll": "تحديد الكل",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Копиране",
16
16
  "cut": "Изрязване",
17
+ "delete": "Изтрий",
17
18
  "paste": "Поставяне",
18
19
  "redo": "Повторно",
19
20
  "selectAll": "Избери всичко",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Kopieren",
16
16
  "cut": "Ausschneiden",
17
+ "delete": "Löschen",
17
18
  "paste": "Einfügen",
18
19
  "redo": "Wiederherstellen",
19
20
  "selectAll": "Alles auswählen",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Copy",
16
16
  "cut": "Cut",
17
+ "delete": "Delete",
17
18
  "paste": "Paste",
18
19
  "redo": "Redo",
19
20
  "selectAll": "Select All",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Copiar",
16
16
  "cut": "Cortar",
17
+ "delete": "Eliminar",
17
18
  "paste": "Pegar",
18
19
  "redo": "Rehacer",
19
20
  "selectAll": "Seleccionar todo",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "کپی",
16
16
  "cut": "برش",
17
+ "delete": "حذف",
17
18
  "paste": "چسباندن",
18
19
  "redo": "انجام مجدد",
19
20
  "selectAll": "انتخاب همه",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Copier",
16
16
  "cut": "Couper",
17
+ "delete": "Supprimer",
17
18
  "paste": "Coller",
18
19
  "redo": "Rétablir",
19
20
  "selectAll": "Tout sélectionner",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Copia",
16
16
  "cut": "Taglia",
17
+ "delete": "Elimina",
17
18
  "paste": "Incolla",
18
19
  "redo": "Ripeti",
19
20
  "selectAll": "Seleziona tutto",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "コピー",
16
16
  "cut": "切り取り",
17
+ "delete": "削除",
17
18
  "paste": "貼り付け",
18
19
  "redo": "やり直し",
19
20
  "selectAll": "すべて選択",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "복사",
16
16
  "cut": "잘라내기",
17
+ "delete": "삭제",
17
18
  "paste": "붙여넣기",
18
19
  "redo": "다시 실행",
19
20
  "selectAll": "모두 선택",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Kopiëren",
16
16
  "cut": "Knippen",
17
+ "delete": "Verwijderen",
17
18
  "paste": "Plakken",
18
19
  "redo": "Opnieuw doen",
19
20
  "selectAll": "Alles selecteren",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Kopiuj",
16
16
  "cut": "Wytnij",
17
+ "delete": "Usuń",
17
18
  "paste": "Wklej",
18
19
  "redo": "Ponów",
19
20
  "selectAll": "Zaznacz wszystko",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Copiar",
16
16
  "cut": "Cortar",
17
+ "delete": "Excluir",
17
18
  "paste": "Colar",
18
19
  "redo": "Refazer",
19
20
  "selectAll": "Selecionar Tudo",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Копировать",
16
16
  "cut": "Вырезать",
17
+ "delete": "Удалить",
17
18
  "paste": "Вставить",
18
19
  "redo": "Повторить",
19
20
  "selectAll": "Выбрать все",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Kopyala",
16
16
  "cut": "Kes",
17
+ "delete": "Sil",
17
18
  "paste": "Yapıştır",
18
19
  "redo": "Yinele",
19
20
  "selectAll": "Tümünü Seç",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "Sao chép",
16
16
  "cut": "Cắt",
17
+ "delete": "Xóa",
17
18
  "paste": "Dán",
18
19
  "redo": "Làm lại",
19
20
  "selectAll": "Chọn tất cả",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "复制",
16
16
  "cut": "剪切",
17
+ "delete": "删除",
17
18
  "paste": "粘贴",
18
19
  "redo": "重做",
19
20
  "selectAll": "全选",
@@ -14,6 +14,7 @@
14
14
  "edit": {
15
15
  "copy": "複製",
16
16
  "cut": "剪下",
17
+ "delete": "刪除",
17
18
  "paste": "貼上",
18
19
  "redo": "重做",
19
20
  "selectAll": "全選",
@@ -14,8 +14,8 @@ export default class MenuController extends ControllerModule {
14
14
  * 显示上下文菜单
15
15
  */
16
16
  @ipcClientEvent('showContextMenu')
17
- showContextMenu(type: string, data?: any) {
18
- return this.app.menuManager.showContextMenu(type, data);
17
+ showContextMenu(params: { data?: any; type: string }) {
18
+ return this.app.menuManager.showContextMenu(params.type, params.data);
19
19
  }
20
20
 
21
21
  /**
@@ -29,9 +29,9 @@ describe('MenuController', () => {
29
29
  it('should call menuManager.refreshMenus', () => {
30
30
  // 模拟返回值
31
31
  mockRefreshMenus.mockReturnValueOnce(true);
32
-
32
+
33
33
  const result = menuController.refreshAppMenu();
34
-
34
+
35
35
  expect(mockRefreshMenus).toHaveBeenCalled();
36
36
  expect(result).toBe(true);
37
37
  });
@@ -41,9 +41,9 @@ describe('MenuController', () => {
41
41
  it('should call menuManager.showContextMenu with type only', () => {
42
42
  const menuType = 'chat';
43
43
  mockShowContextMenu.mockReturnValueOnce({ shown: true });
44
-
45
- const result = menuController.showContextMenu(menuType);
46
-
44
+
45
+ const result = menuController.showContextMenu({ type: menuType });
46
+
47
47
  expect(mockShowContextMenu).toHaveBeenCalledWith(menuType, undefined);
48
48
  expect(result).toEqual({ shown: true });
49
49
  });
@@ -52,9 +52,9 @@ describe('MenuController', () => {
52
52
  const menuType = 'file';
53
53
  const menuData = { fileId: '123', filePath: '/path/to/file.txt' };
54
54
  mockShowContextMenu.mockReturnValueOnce({ shown: true });
55
-
56
- const result = menuController.showContextMenu(menuType, menuData);
57
-
55
+
56
+ const result = menuController.showContextMenu({ type: menuType, data: menuData });
57
+
58
58
  expect(mockShowContextMenu).toHaveBeenCalledWith(menuType, menuData);
59
59
  expect(result).toEqual({ shown: true });
60
60
  });
@@ -63,20 +63,20 @@ describe('MenuController', () => {
63
63
  describe('setDevMenuVisibility', () => {
64
64
  it('should call menuManager.rebuildAppMenu with showDevItems true', () => {
65
65
  mockRebuildAppMenu.mockReturnValueOnce(true);
66
-
66
+
67
67
  const result = menuController.setDevMenuVisibility(true);
68
-
68
+
69
69
  expect(mockRebuildAppMenu).toHaveBeenCalledWith({ showDevItems: true });
70
70
  expect(result).toBe(true);
71
71
  });
72
72
 
73
73
  it('should call menuManager.rebuildAppMenu with showDevItems false', () => {
74
74
  mockRebuildAppMenu.mockReturnValueOnce(true);
75
-
75
+
76
76
  const result = menuController.setDevMenuVisibility(false);
77
-
77
+
78
78
  expect(mockRebuildAppMenu).toHaveBeenCalledWith({ showDevItems: false });
79
79
  expect(result).toBe(true);
80
80
  });
81
81
  });
82
- });
82
+ });
@@ -14,6 +14,7 @@ const menu = {
14
14
  edit: {
15
15
  copy: '复制',
16
16
  cut: '剪切',
17
+ delete: '删除',
17
18
  paste: '粘贴',
18
19
  redo: '重做',
19
20
  selectAll: '全选',
@@ -181,29 +181,15 @@ export class LinuxMenu extends BaseMenuPlatform implements IMenuPlatform {
181
181
  }
182
182
 
183
183
  private getChatContextMenuTemplate(data?: any): MenuItemConstructorOptions[] {
184
+ console.log(data);
184
185
  const t = this.app.i18n.ns('menu');
185
- const commonT = this.app.i18n.ns('common');
186
186
 
187
- const items: MenuItemConstructorOptions[] = [
188
- { label: t('edit.copy'), role: 'copy' },
189
- { label: t('edit.paste'), role: 'paste' },
187
+ return [
188
+ { accelerator: 'Ctrl+C', label: t('edit.copy'), role: 'copy' },
189
+ { accelerator: 'Ctrl+V', label: t('edit.paste'), role: 'paste' },
190
190
  { type: 'separator' },
191
191
  { label: t('edit.selectAll'), role: 'selectAll' },
192
192
  ];
193
-
194
- if (data?.messageId) {
195
- items.push(
196
- { type: 'separator' },
197
- {
198
- click: () => {
199
- console.log('尝试删除消息:', data.messageId);
200
- },
201
- label: commonT('actions.delete'),
202
- },
203
- );
204
- }
205
-
206
- return items;
207
193
  }
208
194
 
209
195
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -211,14 +197,13 @@ export class LinuxMenu extends BaseMenuPlatform implements IMenuPlatform {
211
197
  const t = this.app.i18n.ns('menu');
212
198
 
213
199
  return [
214
- { label: t('edit.cut'), role: 'cut' },
215
- { label: t('edit.copy'), role: 'copy' },
216
- { label: t('edit.paste'), role: 'paste' },
200
+ { accelerator: 'Ctrl+X', label: t('edit.cut'), role: 'cut' },
201
+ { accelerator: 'Ctrl+C', label: t('edit.copy'), role: 'copy' },
202
+ { accelerator: 'Ctrl+V', label: t('edit.paste'), role: 'paste' },
217
203
  { type: 'separator' },
218
- { label: t('edit.undo'), role: 'undo' },
219
- { label: t('edit.redo'), role: 'redo' },
204
+ { accelerator: 'Ctrl+A', label: t('edit.selectAll'), role: 'selectAll' },
220
205
  { type: 'separator' },
221
- { label: t('edit.selectAll'), role: 'selectAll' },
206
+ { label: t('edit.delete'), role: 'delete' },
222
207
  ];
223
208
  }
224
209
 
@@ -301,48 +301,29 @@ export class MacOSMenu extends BaseMenuPlatform implements IMenuPlatform {
301
301
  }
302
302
 
303
303
  private getChatContextMenuTemplate(data?: any): MenuItemConstructorOptions[] {
304
+ console.log(data);
304
305
  const t = this.app.i18n.ns('menu');
305
- const commonT = this.app.i18n.ns('common');
306
306
 
307
- const items: MenuItemConstructorOptions[] = [
308
- { label: t('edit.cut'), role: 'cut' },
309
- { label: t('edit.copy'), role: 'copy' },
310
- { label: t('edit.paste'), role: 'paste' },
307
+ return [
308
+ { accelerator: 'Command+C', label: t('edit.copy'), role: 'copy' },
309
+ { accelerator: 'Command+V', label: t('edit.paste'), role: 'paste' },
311
310
  { type: 'separator' },
312
311
  { label: t('edit.selectAll'), role: 'selectAll' },
313
312
  ];
314
-
315
- if (data?.messageId) {
316
- items.push(
317
- { type: 'separator' },
318
- {
319
- click: () => {
320
- console.log('尝试删除消息:', data.messageId);
321
- // 调用 MessageService (假设存在)
322
- // const messageService = this.app.getService(MessageService);
323
- // messageService?.deleteMessage(data.messageId);
324
- },
325
- label: commonT('actions.delete'),
326
- },
327
- );
328
- }
329
- return items;
330
313
  }
331
314
 
332
315
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
333
316
  private getEditorContextMenuTemplate(_data?: any): MenuItemConstructorOptions[] {
334
317
  const t = this.app.i18n.ns('menu');
335
318
 
336
- // 编辑器特定的上下文菜单
337
319
  return [
338
- { label: t('edit.cut'), role: 'cut' },
339
- { label: t('edit.copy'), role: 'copy' },
340
- { label: t('edit.paste'), role: 'paste' },
320
+ { accelerator: 'Command+X', label: t('edit.cut'), role: 'cut' },
321
+ { accelerator: 'Command+C', label: t('edit.copy'), role: 'copy' },
322
+ { accelerator: 'Command+V', label: t('edit.paste'), role: 'paste' },
341
323
  { type: 'separator' },
342
- { label: t('edit.undo'), role: 'undo' },
343
- { label: t('edit.redo'), role: 'redo' },
324
+ { accelerator: 'Command+A', label: t('edit.selectAll'), role: 'selectAll' },
344
325
  { type: 'separator' },
345
- { label: t('edit.selectAll'), role: 'selectAll' },
326
+ { label: t('edit.delete'), role: 'delete' },
346
327
  ];
347
328
  }
348
329
 
@@ -161,32 +161,15 @@ export class WindowsMenu extends BaseMenuPlatform implements IMenuPlatform {
161
161
  }
162
162
 
163
163
  private getChatContextMenuTemplate(data?: any): MenuItemConstructorOptions[] {
164
+ console.log(data);
164
165
  const t = this.app.i18n.ns('menu');
165
- const commonT = this.app.i18n.ns('common');
166
166
 
167
- const items: MenuItemConstructorOptions[] = [
168
- { label: t('edit.copy'), role: 'copy' },
169
- { label: t('edit.paste'), role: 'paste' },
167
+ return [
168
+ { accelerator: 'Ctrl+C', label: t('edit.copy'), role: 'copy' },
169
+ { accelerator: 'Ctrl+V', label: t('edit.paste'), role: 'paste' },
170
170
  { type: 'separator' },
171
171
  { label: t('edit.selectAll'), role: 'selectAll' },
172
172
  ];
173
-
174
- if (data?.messageId) {
175
- items.push(
176
- { type: 'separator' },
177
- {
178
- click: () => {
179
- console.log('尝试删除消息:', data.messageId);
180
- // 调用 MessageService (假设存在)
181
- // const messageService = this.app.getService(MessageService);
182
- // messageService?.deleteMessage(data.messageId);
183
- },
184
- label: commonT('actions.delete'),
185
- },
186
- );
187
- }
188
-
189
- return items;
190
173
  }
191
174
 
192
175
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -194,14 +177,13 @@ export class WindowsMenu extends BaseMenuPlatform implements IMenuPlatform {
194
177
  const t = this.app.i18n.ns('menu');
195
178
 
196
179
  return [
197
- { label: t('edit.cut'), role: 'cut' },
198
- { label: t('edit.copy'), role: 'copy' },
199
- { label: t('edit.paste'), role: 'paste' },
180
+ { accelerator: 'Ctrl+X', label: t('edit.cut'), role: 'cut' },
181
+ { accelerator: 'Ctrl+C', label: t('edit.copy'), role: 'copy' },
182
+ { accelerator: 'Ctrl+V', label: t('edit.paste'), role: 'paste' },
200
183
  { type: 'separator' },
201
- { label: t('edit.undo'), role: 'undo' },
202
- { label: t('edit.redo'), role: 'redo' },
184
+ { accelerator: 'Ctrl+A', label: t('edit.selectAll'), role: 'selectAll' },
203
185
  { type: 'separator' },
204
- { label: t('edit.selectAll'), role: 'selectAll' },
186
+ { label: t('edit.delete'), role: 'delete' },
205
187
  ];
206
188
  }
207
189
 
package/changelog/v1.json CHANGED
@@ -1,4 +1,25 @@
1
1
  [
2
+ {
3
+ "children": {
4
+ "improvements": [
5
+ "Fix provider setting page hydration error."
6
+ ]
7
+ },
8
+ "date": "2025-08-06",
9
+ "version": "1.110.3"
10
+ },
11
+ {
12
+ "children": {
13
+ "fixes": [
14
+ "Fix fail to fetch aihubmix model on client mode."
15
+ ],
16
+ "improvements": [
17
+ "Add context menu for desktop, support different model tabs."
18
+ ]
19
+ },
20
+ "date": "2025-08-06",
21
+ "version": "1.110.2"
22
+ },
2
23
  {
3
24
  "children": {
4
25
  "fixes": [
@@ -306,6 +306,7 @@
306
306
  "latestTime": "آخر تحديث: {{time}}",
307
307
  "noLatestTime": "لم يتم الحصول على القائمة بعد"
308
308
  },
309
+ "noModelsInCategory": "لا توجد نماذج مفعلة في هذا التصنيف",
309
310
  "resetAll": {
310
311
  "conform": "هل أنت متأكد من إعادة تعيين جميع التعديلات على النموذج الحالي؟ بعد إعادة التعيين، ستعود قائمة النماذج الحالية إلى الحالة الافتراضية",
311
312
  "success": "تمت إعادة التعيين بنجاح",
@@ -316,7 +317,15 @@
316
317
  "title": "قائمة النماذج",
317
318
  "total": "إجمالي {{count}} نموذج متاح"
318
319
  },
319
- "searchNotFound": "لم يتم العثور على نتائج البحث"
320
+ "searchNotFound": "لم يتم العثور على نتائج البحث",
321
+ "tabs": {
322
+ "all": "الكل",
323
+ "chat": "الدردشة",
324
+ "embedding": "التضمين",
325
+ "image": "صورة",
326
+ "stt": "تحويل الكلام إلى نص",
327
+ "tts": "تحويل النص إلى كلام"
328
+ }
320
329
  },
321
330
  "sortModal": {
322
331
  "success": "تم تحديث الترتيب بنجاح",
@@ -74,6 +74,9 @@
74
74
  "DeepSeek-V3": {
75
75
  "description": "DeepSeek-V3 هو نموذج MoE تم تطويره ذاتيًا بواسطة شركة DeepSeek. حقق DeepSeek-V3 نتائج تقييم تفوقت على نماذج مفتوحة المصدر الأخرى مثل Qwen2.5-72B و Llama-3.1-405B، وفي الأداء ينافس النماذج المغلقة الرائدة عالميًا مثل GPT-4o و Claude-3.5-Sonnet."
76
76
  },
77
+ "DeepSeek-V3-Fast": {
78
+ "description": "مزود النموذج: منصة sophnet. DeepSeek V3 Fast هو النسخة السريعة عالية TPS من إصدار DeepSeek V3 0324، غير مكوّن بالكامل، يتمتع بقدرات برمجية ورياضية أقوى واستجابة أسرع!"
79
+ },
77
80
  "Doubao-lite-128k": {
78
81
  "description": "Doubao-lite يتميز بسرعة استجابة فائقة وقيمة أفضل مقابل المال، ويوفر خيارات أكثر مرونة للعملاء في سيناريوهات مختلفة. يدعم الاستدلال والتخصيص مع نافذة سياق 128k."
79
82
  },
@@ -608,6 +611,9 @@
608
611
  "aya:35b": {
609
612
  "description": "Aya 23 هو نموذج متعدد اللغات أطلقته Cohere، يدعم 23 لغة، مما يسهل التطبيقات اللغوية المتنوعة."
610
613
  },
614
+ "azure-DeepSeek-R1-0528": {
615
+ "description": "مقدم من مايكروسوفت؛ تم ترقية نموذج DeepSeek R1 بإصدار فرعي، الإصدار الحالي هو DeepSeek-R1-0528. في التحديث الأخير، حسّن DeepSeek R1 بشكل كبير عمق الاستدلال وقدرات التنبؤ من خلال زيادة موارد الحوسبة وإدخال آليات تحسين الخوارزميات في مرحلة ما بعد التدريب. النموذج يحقق أداءً ممتازًا في اختبارات معيارية متعددة مثل الرياضيات والبرمجة والمنطق العام، وأداؤه الكلي يقترب من النماذج الرائدة مثل O3 و Gemini 2.5 Pro."
616
+ },
611
617
  "baichuan/baichuan2-13b-chat": {
612
618
  "description": "Baichuan-13B هو نموذج لغوي كبير مفتوح المصدر قابل للاستخدام التجاري تم تطويره بواسطة Baichuan Intelligence، ويحتوي على 13 مليار معلمة، وقد حقق أفضل النتائج في المعايير الصينية والإنجليزية."
613
619
  },
@@ -668,6 +674,9 @@
668
674
  "claude-3-sonnet-20240229": {
669
675
  "description": "Claude 3 Sonnet يوفر توازنًا مثاليًا بين الذكاء والسرعة لحمولات العمل المؤسسية. يقدم أقصى فائدة بسعر أقل، موثوق ومناسب للنشر على نطاق واسع."
670
676
  },
677
+ "claude-opus-4-1-20250805": {
678
+ "description": "Claude Opus 4.1 هو أحدث وأقوى نموذج من Anthropic لمعالجة المهام المعقدة للغاية. يتميز بأداء ذكي وسلس وفهم عميق."
679
+ },
671
680
  "claude-opus-4-20250514": {
672
681
  "description": "Claude Opus 4 هو أقوى نموذج من Anthropic لمعالجة المهام المعقدة للغاية. إنه يتفوق في الأداء والذكاء والسلاسة والفهم."
673
682
  },
@@ -2123,6 +2132,12 @@
2123
2132
  "openai/gpt-4o-mini": {
2124
2133
  "description": "GPT-4o mini هو أحدث نموذج من OpenAI تم إطلاقه بعد GPT-4 Omni، ويدعم إدخال النصوص والصور وإخراج النصوص. كأحد نماذجهم المتقدمة الصغيرة، فهو أرخص بكثير من النماذج الرائدة الأخرى في الآونة الأخيرة، وأرخص بأكثر من 60% من GPT-3.5 Turbo. يحتفظ بذكاء متقدم مع قيمة ممتازة. حصل GPT-4o mini على 82% في اختبار MMLU، وهو حاليًا يتفوق على GPT-4 في تفضيلات الدردشة."
2125
2134
  },
2135
+ "openai/gpt-oss-120b": {
2136
+ "description": "OpenAI GPT-OSS 120B هو نموذج لغوي رائد يحتوي على 120 مليار معلمة، مزود بميزات تصفح الإنترنت وتنفيذ الأكواد، ويتميز بقدرات استدلالية."
2137
+ },
2138
+ "openai/gpt-oss-20b": {
2139
+ "description": "OpenAI GPT-OSS 20B هو نموذج لغوي رائد يحتوي على 20 مليار معلمة، مزود بميزات تصفح الإنترنت وتنفيذ الأكواد، ويتميز بقدرات استدلالية."
2140
+ },
2126
2141
  "openai/o1": {
2127
2142
  "description": "o1 هو نموذج الاستدلال الجديد من OpenAI، يدعم إدخال الصور والنصوص ويخرج نصًا، مناسب للمهام المعقدة التي تتطلب معرفة عامة واسعة. يتميز هذا النموذج بسياق يصل إلى 200 ألف كلمة وتاريخ معرفة حتى أكتوبر 2023."
2128
2143
  },
@@ -2411,8 +2426,11 @@
2411
2426
  "qwen3-coder-480b-a35b-instruct": {
2412
2427
  "description": "نسخة مفتوحة المصدر من نموذج كود Tongyi Qianwen. أحدث نموذج qwen3-coder-480b-a35b-instruct مبني على Qwen3 لتوليد الكود، يتمتع بقدرات قوية كوكيل برمجي، بارع في استدعاء الأدوات والتفاعل مع البيئة، قادر على البرمجة الذاتية مع أداء برمجي ممتاز وقدرات عامة."
2413
2428
  },
2429
+ "qwen3-coder-flash": {
2430
+ "description": "نموذج كود Tongyi Qianwen. أحدث سلسلة نماذج Qwen3-Coder مبنية على Qwen3 لتوليد الأكواد، تتمتع بقدرات وكيل ترميز قوية، بارعة في استدعاء الأدوات والتفاعل مع البيئة، قادرة على البرمجة الذاتية، وتجمع بين مهارات برمجية ممتازة وقدرات عامة."
2431
+ },
2414
2432
  "qwen3-coder-plus": {
2415
- "description": "نموذج كود Tongyi Qianwen. أحدث سلسلة Qwen3-Coder-Plus مبنية على Qwen3 لتوليد الكود، تتمتع بقدرات قوية كوكيل برمجي، بارعة في استدعاء الأدوات والتفاعل مع البيئة، قادرة على البرمجة الذاتية مع أداء برمجي ممتاز وقدرات عامة."
2433
+ "description": "نموذج كود Tongyi Qianwen. أحدث سلسلة نماذج Qwen3-Coder مبنية على Qwen3 لتوليد الأكواد، تتمتع بقدرات وكيل ترميز قوية، بارعة في استدعاء الأدوات والتفاعل مع البيئة، قادرة على البرمجة الذاتية، وتجمع بين مهارات برمجية ممتازة وقدرات عامة."
2416
2434
  },
2417
2435
  "qwq": {
2418
2436
  "description": "QwQ هو نموذج بحث تجريبي يركز على تحسين قدرات الاستدلال للذكاء الاصطناعي."