Просмотр исходного кода

Merge pull request #1541 from QuantumNous/fluent-read

feat: added "流畅阅读" (FluentRead) as a new chat provider option.
Calcium-Ion 6 месяцев назад
Родитель
Сommit
d6b03d4760
3 измененных файлов с 31 добавлено и 18 удалено
  1. 3 0
      setting/chat.go
  2. 8 0
      web/src/components/layout/SiderBar.js
  3. 20 18
      web/src/components/table/tokens/index.jsx

+ 3 - 0
setting/chat.go

@@ -12,6 +12,9 @@ var Chats = []map[string]string{
 	{
 		"Cherry Studio": "cherrystudio://providers/api-keys?v=1&data={cherryConfig}",
 	},
+	{
+		"流畅阅读": "fluentread",
+	},
 	{
 		"Lobe Chat 官方示例": "https://chat-preview.lobehub.com/?settings={\"keyVaults\":{\"openai\":{\"apiKey\":\"{key}\",\"baseURL\":\"{address}/v1\"}}}",
 	},

+ 8 - 0
web/src/components/layout/SiderBar.js

@@ -201,12 +201,20 @@ const SiderBar = ({ onNavigate = () => { } }) => {
         if (Array.isArray(chats)) {
           let chatItems = [];
           for (let i = 0; i < chats.length; i++) {
+            let shouldSkip = false;
             let chat = {};
             for (let key in chats[i]) {
+              let link = chats[i][key];
+              if (typeof link !== 'string') continue; // 确保链接是字符串
+              if (link.startsWith('fluent')) {
+                shouldSkip = true;
+                break; // 跳过 Fluent Read
+              }
               chat.text = key;
               chat.itemKey = 'chat' + i;
               chat.to = '/console/chat/' + i;
             }
+            if (shouldSkip || !chat.text) continue; // 避免推入空项
             chatItems.push(chat);
           }
           setChatItems(chatItems);

+ 20 - 18
web/src/components/table/tokens/index.jsx

@@ -88,27 +88,27 @@ function TokensPage() {
   function openFluentNotification(key) {
     const { t } = latestRef.current;
     const SUPPRESS_KEY = 'fluent_notify_suppressed';
-    if (localStorage.getItem(SUPPRESS_KEY) === '1') return;
+    if (modelOptions.length === 0) {
+      // fire-and-forget; a later effect will refresh the notice content
+      loadModels()
+    }
+    if (!key && localStorage.getItem(SUPPRESS_KEY) === '1') return;
     const container = document.getElementById('fluent-new-api-container');
     if (!container) {
-      Toast.warning(t('未检测到 Fluent 容器,请确认扩展已启用'));
+      Toast.warning(t('未检测到 FluentRead(流畅阅读),请确认扩展已启用'));
       return;
     }
     setPrefillKey(key || '');
     setFluentNoticeOpen(true);
-    if (modelOptions.length === 0) {
-      // fire-and-forget; a later effect will refresh the notice content
-      loadModels()
-    }
     Notification.info({
       id: 'fluent-detected',
-      title: t('检测到 Fluent(流畅阅读)'),
+      title: t('检测到 FluentRead(流畅阅读)'),
       content: (
         <div>
           <div style={{ marginBottom: 8 }}>
-            {prefillKey
-              ? t('已检测到 Fluent 扩展,已从操作中指定密钥,将使用该密钥进行填充。请选择模型后继续。')
-              : t('已检测到 Fluent 扩展,请选择模型后可一键填充当前选中令牌(或本页第一个令牌)。')}
+            {key
+              ? t('请选择模型。')
+              : t('选择模型后可一键填充当前选中令牌(或本页第一个令牌)。')}
           </div>
           <div style={{ marginBottom: 8 }}>
             <Select
@@ -124,15 +124,17 @@ function TokensPage() {
           </div>
           <Space>
             <Button theme="solid" type="primary" onClick={handlePrefillToFluent}>
-              {t('一键填充到 Fluent')}
-            </Button>
-            <Button type="warning" onClick={() => {
-              localStorage.setItem(SUPPRESS_KEY, '1');
-              Notification.close('fluent-detected');
-              Toast.info(t('已关闭后续提醒'));
-            }}>
-              {t('不再提醒')}
+              {t('一键填充到 FluentRead')}
             </Button>
+            {!key && (
+              <Button type="warning" onClick={() => {
+                localStorage.setItem(SUPPRESS_KEY, '1');
+                Notification.close('fluent-detected');
+                Toast.info(t('已关闭后续提醒'));
+              }}>
+                {t('不再提醒')}
+              </Button>
+            )}
             <Button type="tertiary" onClick={() => Notification.close('fluent-detected')}>
               {t('关闭')}
             </Button>