@lobehub/chat 1.3.2 → 1.3.4

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 (33) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/docs/self-hosting/advanced/webrtc.mdx +80 -0
  3. package/docs/self-hosting/advanced/webrtc.zh-CN.mdx +87 -0
  4. package/docs/usage/tools-calling/groq.zh-CN.mdx +12 -6
  5. package/locales/ar/setting.json +7 -2
  6. package/locales/bg-BG/setting.json +7 -2
  7. package/locales/de-DE/setting.json +7 -2
  8. package/locales/en-US/setting.json +7 -2
  9. package/locales/es-ES/setting.json +7 -2
  10. package/locales/fr-FR/setting.json +7 -2
  11. package/locales/it-IT/setting.json +7 -2
  12. package/locales/ja-JP/setting.json +7 -2
  13. package/locales/ko-KR/setting.json +7 -2
  14. package/locales/nl-NL/setting.json +7 -2
  15. package/locales/pl-PL/setting.json +7 -2
  16. package/locales/pt-BR/setting.json +7 -2
  17. package/locales/ru-RU/setting.json +7 -2
  18. package/locales/tr-TR/setting.json +7 -2
  19. package/locales/vi-VN/setting.json +11 -2
  20. package/locales/zh-CN/setting.json +7 -2
  21. package/locales/zh-TW/setting.json +7 -2
  22. package/package.json +1 -1
  23. package/src/app/(main)/settings/sync/features/Alert.tsx +17 -3
  24. package/src/app/(main)/settings/sync/features/WebRTC/index.tsx +15 -8
  25. package/src/config/modelProviders/index.ts +5 -0
  26. package/src/config/modelProviders/qwen.ts +5 -2
  27. package/src/const/url.ts +1 -0
  28. package/src/database/client/core/sync.ts +1 -8
  29. package/src/locales/default/setting.ts +7 -3
  30. package/src/store/user/slices/modelList/selectors/modelConfig.test.ts +19 -0
  31. package/src/store/user/slices/modelList/selectors/modelConfig.ts +4 -0
  32. package/src/store/user/slices/sync/action.ts +1 -1
  33. package/src/types/sync.ts +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,56 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ### [Version 1.3.4](https://github.com/lobehub/lobe-chat/compare/v1.3.3...v1.3.4)
6
+
7
+ <sup>Released on **2024-07-09**</sup>
8
+
9
+ #### ♻ Code Refactoring
10
+
11
+ - **misc**: Support disable clientFetch by default.
12
+
13
+ <br/>
14
+
15
+ <details>
16
+ <summary><kbd>Improvements and Fixes</kbd></summary>
17
+
18
+ #### Code refactoring
19
+
20
+ - **misc**: Support disable clientFetch by default, closes [#3133](https://github.com/lobehub/lobe-chat/issues/3133) [#3108](https://github.com/lobehub/lobe-chat/issues/3108) ([4415652](https://github.com/lobehub/lobe-chat/commit/4415652))
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.3.3](https://github.com/lobehub/lobe-chat/compare/v1.3.2...v1.3.3)
31
+
32
+ <sup>Released on **2024-07-09**</sup>
33
+
34
+ #### 🐛 Bug Fixes
35
+
36
+ - **misc**: Allow user to use their own WebRTC signaling.
37
+
38
+ <br/>
39
+
40
+ <details>
41
+ <summary><kbd>Improvements and Fixes</kbd></summary>
42
+
43
+ #### What's fixed
44
+
45
+ - **misc**: Allow user to use their own WebRTC signaling, closes [#3182](https://github.com/lobehub/lobe-chat/issues/3182) ([c7f8f38](https://github.com/lobehub/lobe-chat/commit/c7f8f38))
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 1.3.2](https://github.com/lobehub/lobe-chat/compare/v1.3.1...v1.3.2)
6
56
 
7
57
  <sup>Released on **2024-07-09**</sup>
@@ -0,0 +1,80 @@
1
+ # LobeChat WebRTC Sync
2
+
3
+ ## Introduction to WebRTC
4
+
5
+ WebRTC (Web Real-Time Communication) is a technology that enables peer-to-peer communication between browsers. In LobeChat, we experimentally implemented real-time data synchronization between devices based on WebRTC and YJS, without relying on traditional server databases. This solution offers high privacy, zero conflicts, and provides a real-time session synchronization experience.
6
+
7
+ ## Configuring WebRTC for Synchronization
8
+
9
+ To use the WebRTC synchronization feature in LobeChat, you need to complete the following steps:
10
+
11
+ <Steps>
12
+
13
+ ### Deploy Signaling Server
14
+
15
+ Deploy a WebRTC signaling server with one click using the Zeabur platform:
16
+
17
+ [![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/MY0JZG?referralCode=arvinxx)
18
+
19
+ Alternatively, you can view the [source code](https://github.com/lobehub/y-webrtc-signaling) and deploy it on your own.
20
+
21
+ After deployment, you will receive a URL, for example: `https://my-signaling-server.zeabur.app`.
22
+
23
+ ### Enable WebRTC Sync in the Deployment Instance
24
+
25
+ The WebRTC sync feature in LobeChat is hidden by default and needs to be enabled by adding the environment variable `FEATURE_FLAGS=+webrtc_sync`.
26
+
27
+ ### Configure WebRTC Sync Settings in LobeChat
28
+
29
+ 1. Open LobeChat settings -> Data Sync
30
+ 2. Enter the signaling server address in the WebRTC sync section;
31
+ 3. Set the sync channel name and password
32
+
33
+ <Image
34
+ alt={'LobeChat Data Sync Settings Page'}
35
+ height={356}
36
+ inStep
37
+ src={'https://github.com/lobehub/lobe-chat/assets/28616219/bf86bf1e-87fb-4015-8587-15ff28bb9c24'}
38
+ />
39
+
40
+ ### Repeat the Above Configuration on Devices that Need to Sync
41
+
42
+ Ensure all devices use the same signaling server, channel name, and password. Once configured, the devices should automatically start syncing data.
43
+
44
+ </Steps>
45
+
46
+ ## Limitations and Known Issues
47
+
48
+ Although WebRTC has the advantages of no database and flexibility, after extensive community testing, the following limitations and known issues have been identified:
49
+
50
+ ### Requirement for Devices to be Online Simultaneously
51
+
52
+ WebRTC requires devices to be online simultaneously to synchronize, meaning changes cannot be made on one device while offline and then synced later on another device.
53
+
54
+ This limitation is due to the communication nature of WebRTC. In a pure frontend, serverless scenario, data synchronization between two devices can only be achieved through peer-to-peer communication. When one device is online and the other is offline, it is impossible to determine where the data should come from. Only when both devices are online can data communication occur. This mode is more like an online chat room where everyone needs to be online to see each other's data and achieve synchronization.
55
+
56
+ Therefore, in certain situations, WebRTC's pure peer-to-peer approach may not fully meet users' needs (e.g., one device is a work computer, and the other is a home computer), and there are also some issues with data synchronization.
57
+
58
+ ### Network Issues Leading to Sync Failures
59
+
60
+ Due to the implementation mechanism of WebRTC, its peer-to-peer communication has strict network requirements. Many of our users have reported:
61
+
62
+ - Syncing between PCs is possible, but syncing between a mobile device with a SIM card and a PC is not, although syncing is possible when using the same WIFI as the PC;
63
+ - Syncing fails when switching networks.
64
+
65
+ ### Stability and Performance Issues
66
+
67
+ - Some users have reported ICE connection failures on the Firefox browser: [WebRTC Data Sync Feedback](https://github.com/lobehub/lobe-chat/issues/1683#issuecomment-2094745907)
68
+ - For extremely long text or large amounts of conversation records, the synchronization process may slow down or become unstable: [When the model outputs a very long conversation, the end of the conversation will contain synchronization-related content tags, leading to sync failures](https://github.com/lobehub/lobe-chat/issues/1962)
69
+
70
+ ## Our Recommendations
71
+
72
+ Considering the above reasons, we recommend users treat the WebRTC sync feature as experimental and regularly back up important data.
73
+
74
+ We have already released a more stable and user-friendly server database synchronization solution ([deployment guide](/docs/self-hosting/advanced/server-database)). We recommend users prioritize using the server database synchronization solution.
75
+
76
+ <Callout type={'warning'}>
77
+ Please note that we have officially announced the archiving of this sync feature in [PR
78
+ 3182](https://github.com/lobehub/lobe-chat/pull/3182), and the above issues will no longer be
79
+ considered for fixes.
80
+ </Callout>
@@ -0,0 +1,87 @@
1
+ ---
2
+ title: LobeChat WebRTC 同步配置指南
3
+ description: 在 LobeChat 中实现基于 WebRTC 和 YJS 的设备间实时数据同步。了解如何配置 WebRTC 并开启同步功能,以及使用局限性和已知问题。
4
+ tags:
5
+ - YJS
6
+ - 信令服务器
7
+ ---
8
+
9
+ # LobeChat WebRTC 同步
10
+
11
+ ## WebRTC 简介
12
+
13
+ WebRTC (Web Real-Time Communication) 是一项实现浏览器之间点对点通信的技术。在 LobeChat 中,我们实验性地基于 WebRTC 和 YJS 实现了设备间的实时数据同步,无需依赖传统的服务器数据库。这种方案具有高度隐私性、零冲突性,并能提供实时会话同步体验。
14
+
15
+ ## 配置 WebRTC 并实现同步
16
+
17
+ 要使用 LobeChat 的 WebRTC 同步功能,需要完成以下步骤:
18
+
19
+ <Steps>
20
+
21
+ ### 部署信令服务器
22
+
23
+ 使用 Zeabur 平台一键部署 WebRTC 信令服务器:
24
+
25
+ [![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/MY0JZG?referralCode=arvinxx)
26
+
27
+ 或者查看 [源码](https://github.com/lobehub/y-webrtc-signaling) 自行部署。
28
+
29
+ 部署完成后,可以得到一个 URL,例如:`https://my-signaling-server.zeabur.app`。
30
+
31
+ ### 在部署实例中开启 WebRTC 同步
32
+
33
+ LobeChat 默认隐藏了 WebRTC 同步功能,需要通过添加环境变量 `FEATURE_FLAGS=+webrtc_sync` 来开启 WebRTC 同步特性。
34
+
35
+ ### 配置 LobeChat 的 WebRTC 同步设置
36
+
37
+ 1. 打开 LobeChat 设置 -> 数据同步
38
+ 2. 在 WebRTC 同步中填写信令服务器地址;
39
+ 3. 设置同步频道名称和密码
40
+
41
+ <Image
42
+ alt={'LobeChat 数据同步设置页'}
43
+ height={356}
44
+ inStep
45
+ src={'https://github.com/lobehub/lobe-chat/assets/28616219/bf86bf1e-87fb-4015-8587-15ff28bb9c24'}
46
+ />
47
+
48
+ ### 在需要同步的设备上重复以上配置
49
+
50
+ 确保所有设备使用相同的信令服务器、频道名称和密码,完成配置后,设备间应该可以开始自动同步数据。
51
+
52
+ </Steps>
53
+
54
+ ## 使用局限性和已知问题
55
+
56
+ 虽然 WebRTC 具有无数据库、比较灵活的特性,但目前该功能经过大范围社区测试,存在以下局限性和已知问题:
57
+
58
+ ### 设备同时在线要求
59
+
60
+ WebRTC 要求设备同时在线才能进行同步,这意味着无法在一台设备离线时在另一台设备上进行更改并稍后同步。
61
+
62
+ 这是 WebRTC 本身的通信特性有关系,由于在纯前端、无服务端的情况下,两个设备的数据同步只能通过点对点通信的形式达成。当一个设备在线,一个设备离线的情况下,我们无从感知数据到底应该从哪来,只有当两台设备都在线的时候,双发数据才能通信。其实这种模式更像是一个在线聊天室,大家都在线时才能看到对方的数据,然后达成同步。
63
+
64
+ 因此 WebRTC 这种纯点对点的方式在某些情况下并无法完全满足用户的诉求(例如一个是公司电脑,一个是家里电脑),同时也存在一些数据同步层面的问题。
65
+
66
+ ### 网络问题可能导致同步失败
67
+
68
+ 由于 WebRTC 的实现机制,其点对点通信对于网络要求非常苛刻,我们的很多用户反馈:
69
+
70
+ - 在 PC 上可以互相同步、 手机 sim 卡无法和 PC 同步、但是换成和PC一样的WIFI可以和 PC 同步;
71
+ - 任何切换网络都无法同步;
72
+
73
+ ### 稳定性与性能问题
74
+
75
+ - 部分用户报告在 Firefox 浏览器上遇到 ICE 连接失败的问题:[WebRTC Data Sync Feedback](https://github.com/lobehub/lobe-chat/issues/1683#issuecomment-2094745907)
76
+ - 对于超长文本或大量对话记录,同步过程可能变慢或不稳定:[当模型输出超长对话时,对话末尾会出现同步相关的内容标签,导致同步失败](https://github.com/lobehub/lobe-chat/issues/1962)
77
+
78
+ ## 我们的建议
79
+
80
+ 鉴于以上原因,我们建议用户将 WebRTC 同步功能视为实验性功能,并定期备份重要数据。
81
+
82
+ 目前我们已经发布了更稳定、更用户友好的服务端数据库同步方案([部署指南](/zh/docs/self-hosting/advanced/server-database)),我们建议用户优先考虑使用服务端数据库同步方案。
83
+
84
+ <Callout type={'warning'}>
85
+ 请注意,我们已经在 [PR 3182](https://github.com/lobehub/lobe-chat/pull/3182)
86
+ 中正式宣布归档该同步特性,上述问题将不再考虑进行修复。
87
+ </Callout>
@@ -1,12 +1,19 @@
1
1
  ---
2
- title: Groq Tool Calling
2
+ title: Groq Tools Calling
3
+ description: >-
4
+ 了解 Groq 平台模型 Tools Calling的能力一览,包括LLAMA3 70B、LLAMA3
5
+ 8B和Mixtral-8x7B的简单和复杂指令调用情况。
6
+ tags:
7
+ - Groq 平台模型
8
+ - Tools Calling
9
+ - LLAMA3 70B
10
+ - LLAMA3 8B
11
+ - Mixtral-8x7B
3
12
  ---
4
13
 
5
14
  # Groq 平台模型 Tools Calling 评测(Llama 3/Mistral)
6
15
 
7
- <Callout type={'info'}>
8
- 由于 Groq 本身不支持 stream,因此 Tools Calling 的调用是普通请求。
9
- </Callout>
16
+ <Callout type={'info'}>由于 Groq 本身不支持 stream,因此 Tools Calling 的调用是普通请求。</Callout>
10
17
 
11
18
  Groq 平台的模型 Tools Calling 能力一览:
12
19
 
@@ -16,7 +23,6 @@ Groq 平台的模型 Tools Calling 能力一览:
16
23
  | LLAMA3 8B | ✅ | ❌ | ✅ | 🌟🌟 | 🌟 |
17
24
  | Mixtral-8x7B | ✅ | ❌ | ✅ | ⛔ | 🌟🌟 |
18
25
 
19
-
20
26
  ## LLAMA3 70B
21
27
 
22
28
  ### 简单调用指令:天气查询
@@ -120,7 +126,7 @@ LLAMA3 8B 在 DallE 的输出场景下,只会输出 1 张图片,而不是像
120
126
  POST /api/chat/groq 200 in 2517ms
121
127
  ```
122
128
 
123
- </details>
129
+ </details>
124
130
 
125
131
  ## Mixtral-8x7B
126
132
 
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "نظام التشغيل غير معروف"
346
346
  },
347
347
  "warning": {
348
- "message": "هذه الميزة لا تزال تحت التجربة وقد تكون هناك حالات غير متوقعة أو غير مستقرة، في حال واجهت مشكلة، يرجى تقديم ردود فعل في الوقت المناسب."
348
+ "tip": "بعد فترة اختبار عامة طويلة، قد لا يكون تزامن WebRTC مستقرًا بما يكفي لتلبية احتياجات التزامن العامة. يرجى <1>نشر خادم الإشارة</1> بنفسك قبل الاستخدام."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "اتصال البيانات النقطي الفوري يتطلب تواجد الأجهزة معًا للمزامنة",
363
363
  "enabled": {
364
- "invalid": "الرجاء إدخال اسم قناة المزامنة قبل تشغيلها",
364
+ "invalid": "الرجاء ملء اسم خادم الإشارة واسم القناة المتزامنة قبل تمكينها",
365
365
  "title": "تمكين المزامنة"
366
366
  },
367
+ "signaling": {
368
+ "desc": "سيستخدم WebRTC هذا العنوان للتزامن",
369
+ "placeholder": "الرجاء إدخال عنوان خادم الإشارة",
370
+ "title": "خادم الإشارة"
371
+ },
367
372
  "title": "WebRTC مزامنة"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Неизвестна операционна система"
346
346
  },
347
347
  "warning": {
348
- "message": "Тази функция в момента е експериментална и може да има неочаквано или нестабилно поведение. Ако срещнете някакви проблеми, моля, изпратете незабавна обратна връзка."
348
+ "tip": "След дълъг период на обществено тестване, синхронизацията на WebRTC може да не бъде стабилна за общите изисквания за синхронизация на данни. Моля, <1>инсталирайте сигналния сървър</1> и го използвайте след това."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Комуникацията на данни в реално време между партньори изисква всички устройства да бъдат онлайн за синхронизиране.",
363
363
  "enabled": {
364
- "invalid": "Моля, въведете име на канал за синхронизиране, преди да активирате",
364
+ "invalid": "Моля, попълнете адреса на сигналния сървър и името на синхронизиращия канал, преди да го активирате.",
365
365
  "title": "Активиране на синхронизиране"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC ще използва този адрес за синхронизация",
369
+ "placeholder": "Моля, въведете адреса на сигналния сървър",
370
+ "title": "Сигнален сървър"
371
+ },
367
372
  "title": "WebRTC синхронизиране"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Unbekanntes Betriebssystem"
346
346
  },
347
347
  "warning": {
348
- "message": "Diese Funktion ist derzeit experimentell und kann unerwartete oder instabile Situationen aufweisen. Bitte geben Sie bei Problemen rechtzeitig Feedback ab."
348
+ "tip": "Nach einer längeren Phase des Community-Tests kann die WebRTC-Synchronisierung möglicherweise nicht stabil genug sein, um allgemeine Synchronisierungsanforderungen zu erfüllen. Bitte <1>richten Sie einen Signalisierungsserver ein</1> und verwenden Sie ihn dann."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Echtzeit, Punkt-zu-Punkt-Datenkommunikation, bei der die Geräte gleichzeitig online sein müssen, um synchronisiert zu werden",
363
363
  "enabled": {
364
- "invalid": "Bitte geben Sie zuerst den Synchronisierungskanalnamen ein, bevor Sie die Synchronisierung aktivieren",
364
+ "invalid": "Bitte geben Sie zuerst den Signalisierungsserver und den Synchronisierungskanal an, bevor Sie dies aktivieren.",
365
365
  "title": "Synchronisierung aktivieren"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC wird diese Adresse für die Synchronisierung verwenden",
369
+ "placeholder": "Bitte geben Sie die Adresse des Signalisierungsservers ein",
370
+ "title": "Signalisierungsserver"
371
+ },
367
372
  "title": "WebRTC-Synchronisierung"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Unknown OS"
346
346
  },
347
347
  "warning": {
348
- "message": "This feature is currently experimental and may have unexpected or unstable behavior. If you encounter any issues, please submit feedback promptly."
348
+ "tip": "After a long period of community testing, WebRTC synchronization may not reliably meet general data synchronization needs. Please <1>deploy a signaling server</1> before use."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Real-time, peer-to-peer data communication requires all devices to be online for synchronization.",
363
363
  "enabled": {
364
- "invalid": "Please enter a sync channel name before enabling",
364
+ "invalid": "Please fill in the signaling server and synchronization channel name before enabling.",
365
365
  "title": "Enable Sync"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC will use this address for synchronization",
369
+ "placeholder": "Enter signaling server address",
370
+ "title": "Signaling Server"
371
+ },
367
372
  "title": "WebRTC Sync"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Sistema operativo desconocido"
346
346
  },
347
347
  "warning": {
348
- "message": "Esta función todavía está en fase experimental y puede presentar situaciones inesperadas o inestables. Si encuentras algún problema, por favor envía tus comentarios de inmediato."
348
+ "tip": "Después de un largo período de pruebas comunitarias, la sincronización WebRTC puede no ser capaz de satisfacer de manera estable las demandas generales de sincronización de datos. Por favor, <1>implementa tu propio servidor de señalización</1> antes de usarlo."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Comunicación de datos en tiempo real y punto a punto. Los dispositivos deben estar en línea simultáneamente para sincronizarse",
363
363
  "enabled": {
364
- "invalid": "Por favor, introduce el nombre del canal de sincronización antes de activar",
364
+ "invalid": "Por favor, completa la información del servidor de señalización y el nombre del canal de sincronización antes de habilitarlo",
365
365
  "title": "Activar sincronización"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC utilizará esta dirección para la sincronización",
369
+ "placeholder": "Introduce la dirección del servidor de señalización",
370
+ "title": "Servidor de señalización"
371
+ },
367
372
  "title": "Sincronización WebRTC"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Système d'exploitation inconnu"
346
346
  },
347
347
  "warning": {
348
- "message": "Cette fonctionnalité est actuellement expérimentale et peut présenter des comportements inattendus ou instables. En cas de problème, veuillez soumettre vos commentaires rapidement."
348
+ "tip": "Après une longue période de test communautaire, la synchronisation WebRTC peut ne pas répondre de manière stable aux besoins généraux de synchronisation des données. Veuillez <1>déployer votre propre serveur de signalisation</1> avant utilisation."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Communication de données en temps réel et en pair-à-pair. Les appareils doivent être en ligne simultanément pour se synchroniser",
363
363
  "enabled": {
364
- "invalid": "Veuillez entrer un nom de canal de synchronisation avant d'activer",
364
+ "invalid": "Veuillez saisir l'adresse du serveur de signalisation et le nom du canal de synchronisation avant d'activer.",
365
365
  "title": "Activer la synchronisation"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC utilisera cette adresse pour la synchronisation",
369
+ "placeholder": "Veuillez entrer l'adresse du serveur de signalisation",
370
+ "title": "Serveur de signalisation"
371
+ },
367
372
  "title": "Synchronisation WebRTC"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Sistema operativo sconosciuto"
346
346
  },
347
347
  "warning": {
348
- "message": "Questa funzione è attualmente sperimentale e potrebbe comportare comportamenti imprevisti o instabili. In caso di problemi, invia tempestivamente un feedback."
348
+ "tip": "Dopo un lungo periodo di test della comunità, la sincronizzazione WebRTC potrebbe non essere in grado di soddisfare in modo stabile le esigenze generali di sincronizzazione dei dati. Si prega di <1>configurare un server di segnalazione</1> prima di utilizzarlo."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Comunicazione dati in tempo reale punto a punto, entrambi i dispositivi devono essere online per sincronizzarsi",
363
363
  "enabled": {
364
- "invalid": "Per favore, inserisci un nome per il canale di sincronizzazione prima di abilitarlo",
364
+ "invalid": "Si prega di inserire l'indirizzo del server di segnalazione e il nome del canale di sincronizzazione prima di abilitare.",
365
365
  "title": "Abilita la sincronizzazione"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC utilizzerà questo indirizzo per la sincronizzazione",
369
+ "placeholder": "Inserisci l'indirizzo del server di segnalazione",
370
+ "title": "Server di segnalazione"
371
+ },
367
372
  "title": "Sincronizzazione WebRTC"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "不明なOS"
346
346
  },
347
347
  "warning": {
348
- "message": "この機能は現在実験的なものであり、予期しない不安定な状況が発生する可能性があります。問題が発生した場合はフィードバックを提出してください。"
348
+ "tip": "コミュニティの長期にわたる公開テストの結果、WebRTC 同期は一般的なデータ同期要求を安定して満たすことができない可能性があります。 <1>シグナリングサーバーをデプロイ</1> してからご使用ください。"
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "リアルタイムでピアツーピアのデータ通信を行い、デバイスが同時にオンラインである必要があります",
363
363
  "enabled": {
364
- "invalid": "同期チャネル名を入力してから有効にしてください",
364
+ "invalid": "シグナリングサーバーと同期チャネル名を入力してから有効にしてください",
365
365
  "title": "同期を有効にする"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC はこのアドレスを使用して同期します",
369
+ "placeholder": "シグナリングサーバーのアドレスを入力してください",
370
+ "title": "シグナリングサーバー"
371
+ },
367
372
  "title": "WebRTC 同期"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "알 수 없는 OS"
346
346
  },
347
347
  "warning": {
348
- "message": " 기능은 현재 실험적인 기능으로 예기치 않거나 불안정한 상황이 발생할있으며 문제가 발생하면 즉시 피드백을 제출해 주세요."
348
+ "tip": "커뮤니티 베타 테스트를 거친 후, WebRTC 동기화는 일반 데이터 동기화 요구를 안정적으로 충족시키지 못할 있습니다. <1>시그널링 서버를 배포</1>한 사용하십시오."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "실시간, 피어 투 피어 데이터 통신으로 장치가 동시에 온라인 상태여야만 동기화할 수 있습니다",
363
363
  "enabled": {
364
- "invalid": "동기화 채널 이름을 입력한 후에 활성화하세요",
364
+ "invalid": "시그널링 서버와 동기화 채널 이름을 입력한 후에 활성화하십시오.",
365
365
  "title": "동기화 활성화"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC는 이 주소를 사용하여 동기화합니다.",
369
+ "placeholder": "시그널링 서버 주소를 입력하세요",
370
+ "title": "시그널링 서버"
371
+ },
367
372
  "title": "WebRTC 동기화"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Onbekend besturingssysteem"
346
346
  },
347
347
  "warning": {
348
- "message": "Deze functie is momenteel experimenteel en kan onverwachte of onstabiele situaties veroorzaken. Als u problemen ondervindt, geef dan tijdig feedback."
348
+ "tip": "Na een lange periode van openbare tests in de community, kan WebRTC-synchronisatie mogelijk niet stabiel voldoen aan algemene synchronisatiebehoeften. Gelieve zelf een <1>signaleringsserver implementeren</1> voordat u het gebruikt."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Realtime, point-to-point datacommunicatie, apparaten moeten tegelijkertijd online zijn om te synchroniseren",
363
363
  "enabled": {
364
- "invalid": "Schakel de synchronisatie in nadat u de synchronisatiekanaalnaam heeft ingevuld",
364
+ "invalid": "Vul eerst de signaleringsserver en synchronisatiekanaalnaam in voordat u deze inschakelt",
365
365
  "title": "Synchronisatie inschakelen"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC zal dit adres gebruiken voor synchronisatie",
369
+ "placeholder": "Voer het adres van de signaleringsserver in",
370
+ "title": "Signaleringsserver"
371
+ },
367
372
  "title": "WebRTC Synchronisatie"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Nieznany system"
346
346
  },
347
347
  "warning": {
348
- "message": "Ta funkcja jest obecnie eksperymentalna i może działać nieprzewidywalnie lub niestabilnie. W przypadku problemów prosimy o natychmiastowe zgłoszenie opinii."
348
+ "tip": "After a long period of community testing, WebRTC synchronization may not be able to reliably meet general data synchronization needs. Please <1>deploy a signaling server</1> before use."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Bezpośrednia, punkt-do-punktu komunikacja danych w czasie rzeczywistym, wymaga jednoczesnej obecności urządzeń online do synchronizacji",
363
363
  "enabled": {
364
- "invalid": "Wprowadź nazwę kanału synchronizacji przed włączeniem",
364
+ "invalid": "Please fill in the signaling server and synchronization channel name before enabling.",
365
365
  "title": "Włącz synchronizację"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC will use this address for synchronization",
369
+ "placeholder": "Enter signaling server address",
370
+ "title": "Signaling Server"
371
+ },
367
372
  "title": "Synchronizacja WebRTC"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Sistema operacional desconhecido"
346
346
  },
347
347
  "warning": {
348
- "message": "Esta função ainda é experimental e pode apresentar comportamento inesperado ou instável. Se encontrar problemas, envie um feedback imediatamente."
348
+ "tip": "Após um longo período de testes comunitários, a sincronização WebRTC pode não atender de forma estável às demandas gerais de sincronização de dados. Por favor, <1>implante um servidor de sinalização</1> antes de usar."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Comunicação de dados em tempo real ponto a ponto. Os dispositivos precisam estar online simultaneamente para sincronizar",
363
363
  "enabled": {
364
- "invalid": "Por favor, insira o nome do canal de sincronização antes de ativar",
364
+ "invalid": "Por favor, preencha o endereço do servidor de sinalização e o nome do canal de sincronização antes de ativar.",
365
365
  "title": "Ativar sincronização"
366
366
  },
367
+ "signaling": {
368
+ "desc": "O WebRTC usará este endereço para sincronização",
369
+ "placeholder": "Insira o endereço do servidor de sinalização",
370
+ "title": "Servidor de Sinalização"
371
+ },
367
372
  "title": "Sincronização WebRTC"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Неизвестная система"
346
346
  },
347
347
  "warning": {
348
- "message": "Эта функция в настоящее время является экспериментальной и может работать нестабильно или непредсказуемо. Если вы столкнетесь с проблемами, пожалуйста, отправьте отзыв."
348
+ "tip": "После длительного общественного тестирования синхронизация WebRTC может не надежно удовлетворять общие потребности в синхронизации данных. Пожалуйста, <1>разверните собственный сигнальный сервер</1> перед использованием."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Реальное время, точка-точка передачи данных, устройства должны быть онлайн одновременно для синхронизации",
363
363
  "enabled": {
364
- "invalid": "Пожалуйста, введите имя канала синхронизации перед включением",
364
+ "invalid": "Пожалуйста, введите адрес сигнального сервера и имя канала синхронизации перед включением.",
365
365
  "title": "Включить синхронизацию"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC будет использовать этот адрес для синхронизации",
369
+ "placeholder": "Введите адрес сигнального сервера",
370
+ "title": "Сигнальный сервер"
371
+ },
367
372
  "title": "WebRTC синхронизация"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Bilinmeyen Sistem"
346
346
  },
347
347
  "warning": {
348
- "message": "Bu özellik şu anda deneysel bir özellik olup, beklenmedik veya kararsız durumlar yaşanabilir. Sorunla karşılaşırsanız lütfen geri bildirimde bulunun."
348
+ "tip": "WebRTC'nin uzun bir topluluk beta testinden sonra, genel veri senkronizasyon ihtiyaçlarını kararlı bir şekilde karşılayamayabileceği uyarısı. Lütfen <1> sinyal sunucusunu dağıtın </1> ve ardından kullanın."
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "Gerçek zamanlı, noktadan noktaya veri iletişimi, senkronizasyon için cihazların aynı anda çevrimiçi olması gerekir",
363
363
  "enabled": {
364
- "invalid": "Lütfen senkronizasyon kanalı adını girdikten sonra etkinleştirin",
364
+ "invalid": "Lütfen sinyal sunucusu ve senkronizasyon kanal adını girerek etkinleştirin",
365
365
  "title": "Senkronizasyonu Etkinleştir"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC senkronizasyon için bu adresi kullanacak",
369
+ "placeholder": "Lütfen sinyal sunucusu adresini girin",
370
+ "title": "Sinyal Sunucusu"
371
+ },
367
372
  "title": "WebRTC Senkronizasyonu"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "Hệ điều hành không xác định"
346
346
  },
347
347
  "warning": {
348
- "message": "Chức năng này hiện vẫn đang trong thử nghiệm, có thể gặp phải tình huống ngoài dự kiến hoặc không ổn định, nếu gặp vấn đề vui lòng gửi phản hồi ngay lập tức."
348
+ "tip": "经过较长一段时间社区公测,WebRTC 同步可能无法稳定满足通用的数据同步诉求。请自行 <1>部署信令服务器</1> 后使用。"
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,7 +361,6 @@
361
361
  },
362
362
  "desc": "Truyền thông dữ liệu thời gian thực, điểm-điểm, cần thiết bị cùng online mới có thể đồng bộ",
363
363
  "enabled": {
364
- "invalid": "Vui lòng nhập tên kênh đồng bộ trước khi bật",
365
364
  "title": "Bật đồng bộ"
366
365
  },
367
366
  "title": "WebRTC Đồng bộ"
@@ -407,5 +406,15 @@
407
406
  "store": "Cửa hàng tiện ích"
408
407
  },
409
408
  "title": "Công cụ mở rộng"
409
+ },
410
+ "webrtc": {
411
+ "enabled": {
412
+ "invalid": "请填写信令服务器和同步频道名称后再开启"
413
+ },
414
+ "signaling": {
415
+ "desc": "WebRTC sẽ sử dụng địa chỉ này để đồng bộ",
416
+ "placeholder": "Vui lòng nhập địa chỉ máy chủ tín hiệu",
417
+ "title": "Máy chủ tín hiệu"
418
+ }
410
419
  }
411
420
  }
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "未知系统"
346
346
  },
347
347
  "warning": {
348
- "message": "本功能目前仍为实验性功能,可能存在预期外或不稳定的情况,如遇到问题请及时提交反馈。"
348
+ "tip": "经过较长一段时间社区公测,WebRTC 同步可能无法稳定满足通用的数据同步诉求。请自行 <1>部署信令服务器</1> 后使用。"
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "实时、点对点的数据通信,需设备同时在线才可同步",
363
363
  "enabled": {
364
- "invalid": "请填写同步频道名称后再开启",
364
+ "invalid": "请填写信令服务器和同步频道名称后再开启",
365
365
  "title": "开启同步"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC 将使用该地址进行同步",
369
+ "placeholder": "请输入信令服务器地址",
370
+ "title": "信令服务器"
371
+ },
367
372
  "title": "WebRTC 同步"
368
373
  }
369
374
  },
@@ -345,7 +345,7 @@
345
345
  "unknownOS": "未知系統"
346
346
  },
347
347
  "warning": {
348
- "message": "本功能目前仍為實驗性功能,可能存在預期外或不穩定的情況,如遇到問題請及時提交反饋。"
348
+ "tip": "經過較長一段時間社區公測,WebRTC 同步可能無法穩定滿足通用的資料同步需求。請自行 <1>部署信令伺服器</1> 後使用。"
349
349
  },
350
350
  "webrtc": {
351
351
  "channelName": {
@@ -361,9 +361,14 @@
361
361
  },
362
362
  "desc": "實時、點對點的數據通信,需裝置同時在線才可同步",
363
363
  "enabled": {
364
- "invalid": "請填寫同步頻道名稱後再開啟",
364
+ "invalid": "請填寫信令伺服器和同步頻道名稱後再啟用",
365
365
  "title": "開啟同步"
366
366
  },
367
+ "signaling": {
368
+ "desc": "WebRTC 將使用該地址進行同步",
369
+ "placeholder": "請輸入信令伺服器地址",
370
+ "title": "信令伺服器"
371
+ },
367
372
  "title": "WebRTC 同步"
368
373
  }
369
374
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/chat",
3
- "version": "1.3.2",
3
+ "version": "1.3.4",
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,11 +1,13 @@
1
1
  'use client';
2
2
 
3
3
  import { Alert } from '@lobehub/ui';
4
+ import Link from 'next/link';
4
5
  import { memo } from 'react';
5
- import { useTranslation } from 'react-i18next';
6
+ import { Trans } from 'react-i18next';
6
7
  import { Flexbox } from 'react-layout-kit';
7
8
 
8
9
  import { MAX_WIDTH } from '@/const/layoutTokens';
10
+ import { WEBRTC_SYNC_DOCUMENTS } from '@/const/url';
9
11
  import { useUserStore } from '@/store/user';
10
12
  import { preferenceSelectors } from '@/store/user/selectors';
11
13
 
@@ -13,7 +15,6 @@ interface ExperimentAlertProps {
13
15
  mobile?: boolean;
14
16
  }
15
17
  const ExperimentAlert = memo<ExperimentAlertProps>(({ mobile }) => {
16
- const { t } = useTranslation('setting');
17
18
  const [hideSyncAlert, updatePreference] = useUserStore((s) => [
18
19
  preferenceSelectors.hideSyncAlert(s),
19
20
  s.updatePreference,
@@ -25,7 +26,20 @@ const ExperimentAlert = memo<ExperimentAlertProps>(({ mobile }) => {
25
26
  <Alert
26
27
  banner={mobile}
27
28
  closable
28
- message={t('sync.warning.message')}
29
+ message={
30
+ <Trans i18nKey="sync.warning.tip" ns={'setting'}>
31
+ 经过较长一段时间测试,WebRTC 同步可能无法稳定满足通用的数据同步诉求。请自行
32
+ <Link
33
+ aria-label={'Webrtc Sync deployment'}
34
+ href={WEBRTC_SYNC_DOCUMENTS}
35
+ style={{ color: 'inherit', textDecoration: 'underline' }}
36
+ target="_blank"
37
+ >
38
+ 部署信令服务器
39
+ </Link>
40
+ 后使用。
41
+ </Trans>
42
+ }
29
43
  onClose={() => {
30
44
  updatePreference({ hideSyncAlert: true });
31
45
  }}
@@ -25,9 +25,16 @@ const WebRTC = memo(() => {
25
25
  useSyncSettings(form);
26
26
 
27
27
  const channelName = AntForm.useWatch(['sync', 'webrtc', 'channelName'], form);
28
+ const signaling = AntForm.useWatch(['sync', 'webrtc', 'signaling'], form);
28
29
 
29
30
  const config: SettingItemGroup = {
30
31
  children: [
32
+ {
33
+ children: <Input placeholder={t('sync.webrtc.signaling.placeholder')} />,
34
+ desc: t('sync.webrtc.signaling.desc'),
35
+ label: t('sync.webrtc.signaling.title'),
36
+ name: ['sync', 'webrtc', 'signaling'],
37
+ },
31
38
  {
32
39
  children: <ChannelNameInput form={form} />,
33
40
  desc: t('sync.webrtc.channelName.desc'),
@@ -46,14 +53,14 @@ const WebRTC = memo(() => {
46
53
  name: ['sync', 'webrtc', 'channelPassword'],
47
54
  },
48
55
  {
49
- children: !channelName ? (
50
- <Tooltip title={t('sync.webrtc.enabled.invalid')}>
51
- <Switch disabled />
52
- </Tooltip>
53
- ) : (
54
- <Switch />
55
- // <SyncSwitch />
56
- ),
56
+ children:
57
+ !channelName || !signaling ? (
58
+ <Tooltip title={t('sync.webrtc.enabled.invalid')}>
59
+ <Switch disabled />
60
+ </Tooltip>
61
+ ) : (
62
+ <Switch />
63
+ ),
57
64
 
58
65
  label: t('sync.webrtc.enabled.title'),
59
66
  minWidth: undefined,
@@ -70,6 +70,11 @@ export const filterEnabledModels = (provider: ModelProviderCard) => {
70
70
  return provider.chatModels.filter((v) => v.enabled).map((m) => m.id);
71
71
  };
72
72
 
73
+ export const isProviderDisableBroswerRequest = (id: string) => {
74
+ const provider = DEFAULT_MODEL_PROVIDER_LIST.find((v) => v.id === id && v.disableBrowserRequest);
75
+ return !!provider;
76
+ };
77
+
73
78
  export { default as AnthropicProviderCard } from './anthropic';
74
79
  export { default as AzureProviderCard } from './azure';
75
80
  export { default as BaichuanProviderCard } from './baichuan';
@@ -18,14 +18,16 @@ const Qwen: ModelProviderCard = {
18
18
  tokens: 32_000,
19
19
  },
20
20
  {
21
- description: '通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入,当前通义千问2.5产品版本背后的API模型',
21
+ description:
22
+ '通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入,当前通义千问2.5产品版本背后的API模型',
22
23
  displayName: 'Qwen Max',
23
24
  enabled: true,
24
25
  id: 'qwen-max',
25
26
  tokens: 8000,
26
27
  },
27
28
  {
28
- description: '通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入,扩展了上下文窗口',
29
+ description:
30
+ '通义千问千亿级别超大规模语言模型,支持中文、英文等不同语言输入,扩展了上下文窗口',
29
31
  displayName: 'Qwen Max LongContext',
30
32
  id: 'qwen-max-longcontext',
31
33
  tokens: 30_000,
@@ -50,6 +52,7 @@ const Qwen: ModelProviderCard = {
50
52
  },
51
53
  ],
52
54
  checkModel: 'qwen-turbo',
55
+ disableBrowserRequest: true,
53
56
  id: 'qwen',
54
57
  modelList: { showModelFetcher: true },
55
58
  name: 'Qwen',
package/src/const/url.ts CHANGED
@@ -21,6 +21,7 @@ export const DOCKER_IMAGE = 'https://hub.docker.com/r/lobehub/lobe-chat';
21
21
  export const DOCUMENTS = urlJoin(OFFICIAL_SITE, '/docs');
22
22
  export const USAGE_DOCUMENTS = urlJoin(DOCUMENTS, '/usage');
23
23
  export const SELF_HOSTING_DOCUMENTS = urlJoin(DOCUMENTS, '/self-hosting');
24
+ export const WEBRTC_SYNC_DOCUMENTS = urlJoin(SELF_HOSTING_DOCUMENTS, '/advanced/webrtc');
24
25
 
25
26
  export const WIKI = urlJoin(GITHUB, 'wiki');
26
27
  export const WIKI_PLUGIN_GUIDE = urlJoin(USAGE_DOCUMENTS, '/plugins/development');
@@ -48,14 +48,7 @@ class DataSync {
48
48
  };
49
49
 
50
50
  connect = async (params: StartDataSyncParams) => {
51
- const {
52
- channel,
53
- onSyncEvent,
54
- onSyncStatusChange,
55
- user,
56
- onAwarenessChange,
57
- signaling = 'wss://y-webrtc-signaling.lobehub.com',
58
- } = params;
51
+ const { channel, onSyncEvent, onSyncStatusChange, user, onAwarenessChange, signaling } = params;
59
52
  // ====== 1. init yjs doc ====== //
60
53
 
61
54
  await this.initYDoc();
@@ -348,7 +348,7 @@ export default {
348
348
  unknownOS: '未知系统',
349
349
  },
350
350
  warning: {
351
- message: '本功能目前仍为实验性功能,可能存在预期外或不稳定的情况,如遇到问题请及时提交反馈。',
351
+ tip: '经过较长一段时间社区公测,WebRTC 同步可能无法稳定满足通用的数据同步诉求。请自行 <1>部署信令服务器</1> 后使用。',
352
352
  },
353
353
  webrtc: {
354
354
  channelName: {
@@ -364,10 +364,14 @@ export default {
364
364
  },
365
365
  desc: '实时、点对点的数据通信,需设备同时在线才可同步',
366
366
  enabled: {
367
- invalid: '请填写同步频道名称后再开启',
368
- // desc: 'WebRTC 将使用此名创建同步频道,确保频道名称唯一',
367
+ invalid: '请填写信令服务器和同步频道名称后再开启',
369
368
  title: '开启同步',
370
369
  },
370
+ signaling: {
371
+ desc: 'WebRTC 将使用该地址进行同步',
372
+ placeholder: '请输入信令服务器地址',
373
+ title: '信令服务器',
374
+ },
371
375
  title: 'WebRTC 同步',
372
376
  },
373
377
  },
@@ -109,6 +109,25 @@ describe('modelConfigSelectors', () => {
109
109
  } as UserSettingsState) as unknown as UserStore;
110
110
  expect(modelConfigSelectors.isProviderFetchOnClient('azure')(s)).toBe(true);
111
111
  });
112
+
113
+ // Qwen provider not work in broswer request. Please skip this case if it work in future.
114
+ // Issue: https://github.com/lobehub/lobe-chat/issues/3108
115
+ // PR: https://github.com/lobehub/lobe-chat/pull/3133
116
+ it('client fecth should be disabled if provider is disable broswer request', () => {
117
+ const s = merge(initialSettingsState, {
118
+ settings: {
119
+ languageModel: {
120
+ qwen: { fetchOnClient: true },
121
+ },
122
+ keyVaults: {
123
+ qwen: {
124
+ apiKey: 'apikey',
125
+ },
126
+ },
127
+ },
128
+ } as UserSettingsState) as unknown as UserStore;
129
+ expect(modelConfigSelectors.isAutoFetchModelsEnabled('qwen')(s)).toBe(false);
130
+ });
112
131
  });
113
132
 
114
133
  describe('getCustomModelCardById', () => {
@@ -1,3 +1,4 @@
1
+ import { isProviderDisableBroswerRequest } from '@/config/modelProviders';
1
2
  import { UserStore } from '@/store/user';
2
3
  import { GlobalLLMProviderKey } from '@/types/user/settings';
3
4
 
@@ -18,6 +19,9 @@ const providerWhitelist = new Set(['ollama']);
18
19
  const isProviderFetchOnClient = (provider: GlobalLLMProviderKey | string) => (s: UserStore) => {
19
20
  const config = getProviderConfigById(provider)(s);
20
21
 
22
+ // If the provider already disable broswer request in model config, force on Server.
23
+ if (isProviderDisableBroswerRequest(provider)) return false;
24
+
21
25
  // If the provider in the whitelist, follow the user settings
22
26
  if (providerWhitelist.has(provider) && typeof config?.fetchOnClient !== 'undefined')
23
27
  return config?.fetchOnClient;
@@ -46,7 +46,7 @@ export const createSyncSlice: StateCreator<
46
46
  // double-check the sync ability
47
47
  // if there is no channelName, don't start sync
48
48
  const sync = syncSettingsSelectors.webrtcConfig(get());
49
- if (!sync.channelName) return false;
49
+ if (!sync.channelName || !sync.signaling) return false;
50
50
 
51
51
  const name = syncSettingsSelectors.deviceName(get());
52
52
 
package/src/types/sync.ts CHANGED
@@ -23,7 +23,7 @@ export interface StartDataSyncParams {
23
23
  onAwarenessChange: OnAwarenessChange;
24
24
  onSyncEvent: OnSyncEvent;
25
25
  onSyncStatusChange: OnSyncStatusChange;
26
- signaling?: string;
26
+ signaling: string;
27
27
  user: SyncUserInfo;
28
28
  }
29
29