From 660d76cc5ff08b5505792a9dd9686d43a488cb47 Mon Sep 17 00:00:00 2001
From: xxshu026 <15197757832@163.com>
Date: Fri, 14 Aug 2026 11:11:06 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20add=20SSYCloud(=E8=83=9C=E7=AE=97?=
=?UTF-8?q?=E4=BA=91)=20LLM=20provider=20preset?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../settings/components/AddPlatformModal.tsx | 18 ++++++++++++++++--
.../src/renderer/services/i18n/i18n-keys.d.ts | 1 +
.../services/i18n/locales/de-DE/settings.json | 1 +
.../services/i18n/locales/en-US/settings.json | 1 +
.../services/i18n/locales/es-ES/settings.json | 1 +
.../services/i18n/locales/fa-IR/settings.json | 1 +
.../services/i18n/locales/fr-FR/settings.json | 1 +
.../services/i18n/locales/ja-JP/settings.json | 1 +
.../services/i18n/locales/ko-KR/settings.json | 1 +
.../services/i18n/locales/pt-BR/settings.json | 1 +
.../services/i18n/locales/ru-RU/settings.json | 1 +
.../services/i18n/locales/tr-TR/settings.json | 1 +
.../services/i18n/locales/uk-UA/settings.json | 1 +
.../services/i18n/locales/zh-CN/settings.json | 1 +
.../services/i18n/locales/zh-TW/settings.json | 1 +
.../renderer/utils/model/modelPlatforms.ts | 10 ++++++++++
tests/unit/renderer/modelPlatforms.test.ts | 19 +++++++++++++++++++
17 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/packages/desktop/src/renderer/pages/settings/components/AddPlatformModal.tsx b/packages/desktop/src/renderer/pages/settings/components/AddPlatformModal.tsx
index a47b606675e..0601b78693b 100644
--- a/packages/desktop/src/renderer/pages/settings/components/AddPlatformModal.tsx
+++ b/packages/desktop/src/renderer/pages/settings/components/AddPlatformModal.tsx
@@ -10,7 +10,7 @@ import { ipcBridge } from '@/common';
import { uuid } from '@/common/utils';
import { isGoogleApisHost } from '@/common/utils/urlValidation';
import ModalHOC from '@/renderer/utils/ui/ModalHOC';
-import { Form, Input, Message, Select, Switch } from '@arco-design/web-react';
+import { Form, Input, Link, Message, Select, Switch } from '@arco-design/web-react';
import { LinkCloud, Loading, PreviewOpen, Refresh, Search } from '@icon-park/react';
import React, { useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
@@ -29,6 +29,7 @@ import {
type PlatformConfig,
} from '@/renderer/utils/model/modelPlatforms';
import type { DeepLinkAddProviderDetail } from '@/renderer/hooks/system/useDeepLink';
+import { openExternalUrl } from '@/renderer/utils/platform';
/**
* Protocol icon configurations
@@ -531,7 +532,20 @@ const AddPlatformModal = ModalHOC<{
{/* API Key */}
+ {t('settings.apiKey')}
+ {selectedPlatform?.apiKeyUrl && (
+ {
+ void openExternalUrl(selectedPlatform.apiKeyUrl!);
+ }}
+ >
+ {t('settings.getApiKey')}
+
+ )}
+
+ }
required={!isBedrock}
rules={[{ required: !isBedrock }]}
field={'api_key'}
diff --git a/packages/desktop/src/renderer/services/i18n/i18n-keys.d.ts b/packages/desktop/src/renderer/services/i18n/i18n-keys.d.ts
index a9f2af981e3..1e260c3f63c 100644
--- a/packages/desktop/src/renderer/services/i18n/i18n-keys.d.ts
+++ b/packages/desktop/src/renderer/services/i18n/i18n-keys.d.ts
@@ -1888,6 +1888,7 @@ export type I18nKey =
| 'settings.gemini'
| 'settings.geminiApiKey'
| 'settings.geminiBaseUrl'
+ | 'settings.getApiKey'
| 'settings.goToModelSettings'
| 'settings.googleCloudProjectPlaceholder'
| 'settings.googleLogin'
diff --git a/packages/desktop/src/renderer/services/i18n/locales/de-DE/settings.json b/packages/desktop/src/renderer/services/i18n/locales/de-DE/settings.json
index d5988983294..3c31b96f685 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/de-DE/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/de-DE/settings.json
@@ -357,6 +357,7 @@
"baseUrlHint": "System fügt automatisch Anfragepfad an",
"modelNotFoundAfterUrlChange": "Modell {{model}} wurde unter der neuen Adresse nicht gefunden; wähle es erneut aus, wenn es nicht funktioniert.",
"apiKey": "API-Schlüssel",
+ "getApiKey": "API-Schlüssel abrufen",
"deleteModelConfirm": "Bist du sicher, dass du dieses Modell löschen möchtest?",
"deleteAllModelConfirm": "Bist du sicher, dass du alle Modelle löschen möchtest?",
"modelCount": "Modell",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/en-US/settings.json b/packages/desktop/src/renderer/services/i18n/locales/en-US/settings.json
index 98ce91c8e9e..f64077eb238 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/en-US/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/en-US/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "System will auto-append request path",
"modelNotFoundAfterUrlChange": "Model {{model}} was not found at the new address; reselect it if it doesn't work.",
"apiKey": "API Key",
+ "getApiKey": "Get API Key",
"deleteModelConfirm": "Are you sure you want to delete this model?",
"deleteAllModelConfirm": "Are you sure you want to delete all models?",
"modelCount": "Model",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/es-ES/settings.json b/packages/desktop/src/renderer/services/i18n/locales/es-ES/settings.json
index 280570840e1..8b57cf6854e 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/es-ES/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/es-ES/settings.json
@@ -355,6 +355,7 @@
"baseUrlHint": "El sistema agregará automáticamente la ruta de solicitud",
"modelNotFoundAfterUrlChange": "El modelo {{model}} no se encontró en la nueva dirección; vuelve a seleccionarlo si no funciona.",
"apiKey": "Clave API",
+ "getApiKey": "Obtener clave API",
"deleteModelConfirm": "¿Estás seguro de que deseas eliminar este modelo?",
"deleteAllModelConfirm": "¿Estás seguro de que deseas eliminar todos los modelos?",
"modelCount": "Modelo",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/fa-IR/settings.json b/packages/desktop/src/renderer/services/i18n/locales/fa-IR/settings.json
index 27829c4f4d0..e0f3facac81 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/fa-IR/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/fa-IR/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "سیستم بهصورت خودکار مسیر درخواست را اضافه میکند",
"modelNotFoundAfterUrlChange": "مدل {{model}} در آدرس جدید پیدا نشد؛ اگر کار نکرد، دوباره آن را انتخاب کنید.",
"apiKey": "کلید API",
+ "getApiKey": "دریافت کلید API",
"deleteModelConfirm": "آیا مطمئن هستید که میخواهید این مدل را حذف کنید؟",
"deleteAllModelConfirm": "آیا مطمئن هستید که میخواهید همه مدلها را حذف کنید؟",
"modelCount": "مدل",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/fr-FR/settings.json b/packages/desktop/src/renderer/services/i18n/locales/fr-FR/settings.json
index b46810f20a8..e7eb13e481b 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/fr-FR/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/fr-FR/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "Le système ajoutera automatiquement le chemin de la demande",
"modelNotFoundAfterUrlChange": "Le modèle {{model}} n'a pas été trouvé à la nouvelle adresse ; resélectionnez-le si cela ne fonctionne pas.",
"apiKey": "Clé API",
+ "getApiKey": "Obtenir une clé API",
"deleteModelConfirm": "Êtes-vous sûr de vouloir supprimer ce modèle ?",
"deleteAllModelConfirm": "Êtes-vous sûr de vouloir supprimer tous les modèles ?",
"modelCount": "Modèle",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/ja-JP/settings.json b/packages/desktop/src/renderer/services/i18n/locales/ja-JP/settings.json
index 9d2a3ee5795..2caca53316e 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/ja-JP/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/ja-JP/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "システムが自動的にリクエストパスを追加します",
"modelNotFoundAfterUrlChange": "モデル {{model}} は新しいアドレスで見つかりませんでした。利用できない場合は選択し直してください。",
"apiKey": "API キー",
+ "getApiKey": "API キーを取得",
"deleteModelConfirm": "このモデルを削除してもよろしいですか?",
"deleteAllModelConfirm": "すべてのモデルを削除してもよろしいですか?",
"modelCount": "モデル",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/ko-KR/settings.json b/packages/desktop/src/renderer/services/i18n/locales/ko-KR/settings.json
index 9783eb2e188..efd47a6be59 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/ko-KR/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/ko-KR/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "시스템이 자동으로 요청 경로를 추가합니다",
"modelNotFoundAfterUrlChange": "모델 {{model}}을(를) 새 주소에서 찾을 수 없습니다. 사용할 수 없는 경우 다시 선택하세요.",
"apiKey": "API 키",
+ "getApiKey": "API 키 받기",
"deleteModelConfirm": "이 모델을 삭제하시겠습니까?",
"deleteAllModelConfirm": "모든 모델을 삭제하시겠습니까?",
"modelCount": "모델",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/pt-BR/settings.json b/packages/desktop/src/renderer/services/i18n/locales/pt-BR/settings.json
index 6237f7f4525..8bf76c1349b 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/pt-BR/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/pt-BR/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "O sistema adicionará automaticamente o caminho da requisição",
"modelNotFoundAfterUrlChange": "O modelo {{model}} não foi encontrado no novo endereço; selecione-o novamente se não funcionar.",
"apiKey": "Chave de API",
+ "getApiKey": "Obter chave de API",
"deleteModelConfirm": "Tem certeza de que deseja excluir este modelo?",
"deleteAllModelConfirm": "Tem certeza de que deseja excluir todos os modelos?",
"modelCount": "Modelo",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/ru-RU/settings.json b/packages/desktop/src/renderer/services/i18n/locales/ru-RU/settings.json
index d57bd6ce673..b418e224d66 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/ru-RU/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/ru-RU/settings.json
@@ -362,6 +362,7 @@
"baseUrlHint": "Система автоматически добавит путь запроса",
"modelNotFoundAfterUrlChange": "Модель {{model}} не найдена по новому адресу; выберите её заново, если не работает.",
"apiKey": "API-ключ",
+ "getApiKey": "Получить API-ключ",
"deleteModelConfirm": "Вы уверены, что хотите удалить эту модель?",
"deleteAllModelConfirm": "Вы уверены, что хотите удалить все модели?",
"modelCount": "Модель",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/tr-TR/settings.json b/packages/desktop/src/renderer/services/i18n/locales/tr-TR/settings.json
index 95e8a08f069..c208a07df30 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/tr-TR/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/tr-TR/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "Sistem otomatik olarak istek yolunu ekleyecektir",
"modelNotFoundAfterUrlChange": "{{model}} modeli yeni adreste bulunamadı; çalışmazsa yeniden seçin.",
"apiKey": "API Anahtarı",
+ "getApiKey": "API Anahtarı Al",
"deleteModelConfirm": "Bu modeli silmek istediğinizden emin misiniz?",
"deleteAllModelConfirm": "Tüm modelleri silmek istediğinizden emin misiniz?",
"modelCount": "Model",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/uk-UA/settings.json b/packages/desktop/src/renderer/services/i18n/locales/uk-UA/settings.json
index 6790038baa9..72281a8c752 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/uk-UA/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/uk-UA/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "Система автоматично додасть шлях запиту",
"modelNotFoundAfterUrlChange": "Модель {{model}} не знайдено за новою адресою; виберіть її знову, якщо не працює.",
"apiKey": "API-ключ",
+ "getApiKey": "Отримати API-ключ",
"deleteModelConfirm": "Ви впевнені, що хочете видалити цю модель?",
"deleteAllModelConfirm": "Ви впевнені, що хочете видалити всі моделі?",
"modelCount": "Модель",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/zh-CN/settings.json b/packages/desktop/src/renderer/services/i18n/locales/zh-CN/settings.json
index d2c0ffb2a68..fef2a752d07 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/zh-CN/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/zh-CN/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "系统会自动拼接请求路径",
"modelNotFoundAfterUrlChange": "模型 {{model}} 在新地址未找到,如不可用请重新选择。",
"apiKey": "API Key",
+ "getApiKey": "获取 API Key",
"deleteModelConfirm": "是否删除该模型?",
"deleteAllModelConfirm": "是否删除所有模型?",
"modelCount": "模型",
diff --git a/packages/desktop/src/renderer/services/i18n/locales/zh-TW/settings.json b/packages/desktop/src/renderer/services/i18n/locales/zh-TW/settings.json
index 307cd33b9c0..009964cf658 100644
--- a/packages/desktop/src/renderer/services/i18n/locales/zh-TW/settings.json
+++ b/packages/desktop/src/renderer/services/i18n/locales/zh-TW/settings.json
@@ -365,6 +365,7 @@
"baseUrlHint": "系統會自動拼接請求路徑",
"modelNotFoundAfterUrlChange": "模型 {{model}} 在新位址未找到,如不可用請重新選擇。",
"apiKey": "API Key",
+ "getApiKey": "取得 API Key",
"deleteModelConfirm": "是否刪除該模型?",
"deleteAllModelConfirm": "是否刪除所有模型?",
"modelCount": "模型",
diff --git a/packages/desktop/src/renderer/utils/model/modelPlatforms.ts b/packages/desktop/src/renderer/utils/model/modelPlatforms.ts
index 0cb425d03f3..83590d5a0ac 100644
--- a/packages/desktop/src/renderer/utils/model/modelPlatforms.ts
+++ b/packages/desktop/src/renderer/utils/model/modelPlatforms.ts
@@ -41,6 +41,8 @@ export interface PlatformConfig {
base_url?: string;
/** 国际化 key(可选,用于需要翻译的平台名称) / i18n key (optional, for platform names that need translation) */
i18nKey?: string;
+ /** API Key 注册地址(可选) / API Key registration URL (optional) */
+ apiKeyUrl?: string;
}
/**
@@ -177,6 +179,14 @@ export const MODEL_PLATFORMS: PlatformConfig[] = [
platform: 'custom',
base_url: 'https://api.siliconflow.com/v1',
},
+ {
+ name: 'SSYCloud (胜算云)',
+ value: 'SSYCloud',
+ logo: buildLogoAssetUrl('ai-cloud/ssycloud.svg'),
+ platform: 'custom',
+ base_url: 'https://router.shengsuanyun.com/api/v1',
+ apiKeyUrl: 'https://www.shengsuanyun.com/?from=CH_VVVBZY1S',
+ },
{
name: 'Zhipu',
value: 'Zhipu',
diff --git a/tests/unit/renderer/modelPlatforms.test.ts b/tests/unit/renderer/modelPlatforms.test.ts
index 9c71d920b30..d79b6b5fd78 100644
--- a/tests/unit/renderer/modelPlatforms.test.ts
+++ b/tests/unit/renderer/modelPlatforms.test.ts
@@ -32,4 +32,23 @@ describe('MODEL_PLATFORMS ordering', () => {
'https://api.moonshot.ai/v1',
]);
});
+
+ it('defines SSYCloud as an OpenAI-compatible preset with an API key registration link', () => {
+ const ssyCloudEntries = MODEL_PLATFORMS.filter((p) => p.value === 'SSYCloud');
+
+ expect(ssyCloudEntries).toHaveLength(1);
+ expect(ssyCloudEntries[0]).toMatchObject({
+ name: 'SSYCloud (胜算云)',
+ logo: '/api/assets/logos/ai-cloud/ssycloud.svg',
+ platform: 'custom',
+ base_url: 'https://router.shengsuanyun.com/api/v1',
+ apiKeyUrl: 'https://www.shengsuanyun.com/?from=CH_VVVBZY1S',
+ });
+ });
+
+ it('does not show the SSYCloud API key link for unrelated providers', () => {
+ const openAI = MODEL_PLATFORMS.find((p) => p.value === 'OpenAI');
+
+ expect(openAI?.apiKeyUrl).toBeUndefined();
+ });
});