diff --git a/README.md b/README.md index 966da243..7b193144 100644 --- a/README.md +++ b/README.md @@ -256,6 +256,13 @@ Codex support is powered by [musistudio/codexl](https://github.com/musistudio/co Fenno.ai + + + Unity2.Ai icon +
+ Unity2.Ai +
+ diff --git a/README_zh.md b/README_zh.md index 2f2013b1..1aeaafb8 100644 --- a/README_zh.md +++ b/README_zh.md @@ -256,6 +256,13 @@ CCR 可以完全通过桌面 UI 完成配置。首次使用建议按下面顺序 Fenno.ai + + + Unity2.Ai 图标 +
+ Unity2.Ai +
+ diff --git a/docs/public/provider-icons/unity2.jpg b/docs/public/provider-icons/unity2.jpg new file mode 100644 index 00000000..e83c9e02 Binary files /dev/null and b/docs/public/provider-icons/unity2.jpg differ diff --git a/docs/src/content/docs/en/configuration/provider-deeplink.md b/docs/src/content/docs/en/configuration/provider-deeplink.md index 137d8d94..6399137d 100644 --- a/docs/src/content/docs/en/configuration/provider-deeplink.md +++ b/docs/src/content/docs/en/configuration/provider-deeplink.md @@ -78,6 +78,10 @@ Choose a provider below to get started. CCR shows what will be added before savi TeamoRouterAnthropic / Chat / Responses + + + Unity2.AiOpenAI compatible gateway + code0.aiAnthropic / Chat / Responses diff --git a/docs/src/content/docs/zh/configuration/provider-deeplink.md b/docs/src/content/docs/zh/configuration/provider-deeplink.md index a2814711..6bcecfd5 100644 --- a/docs/src/content/docs/zh/configuration/provider-deeplink.md +++ b/docs/src/content/docs/zh/configuration/provider-deeplink.md @@ -78,6 +78,10 @@ lead: 快速添加常见模型供应商,确认无误后即可保存,减少 TeamoRouterAnthropic / Chat / Responses + + + Unity2.AiOpenAI 兼容网关 + code0.aiAnthropic / Chat / Responses diff --git a/docs/src/styles/global.css b/docs/src/styles/global.css index 094438bf..25640e25 100644 --- a/docs/src/styles/global.css +++ b/docs/src/styles/global.css @@ -1318,6 +1318,12 @@ h1 { --provider-brand-3: #f4f4f5; } +.doc-markdown a.provider-import-button.provider-unity2 { + --provider-brand: #050505; + --provider-brand-2: #7a7f85; + --provider-brand-3: #f4f5f6; +} + .doc-markdown a.provider-import-button.provider-code0 { --provider-brand: #101214; --provider-brand-2: #267dff; diff --git a/packages/core/src/providers/presets/index.ts b/packages/core/src/providers/presets/index.ts index 2a56d91a..e607f39e 100644 --- a/packages/core/src/providers/presets/index.ts +++ b/packages/core/src/providers/presets/index.ts @@ -15,6 +15,7 @@ import { qiniuAiProviderPreset } from "@ccr/core/providers/presets/qiniu-ai/inde import { runApiProviderPreset } from "@ccr/core/providers/presets/runapi/index"; import { siliconFlowProviderPreset } from "@ccr/core/providers/presets/siliconflow/index"; import { teamoRouterProviderPreset } from "@ccr/core/providers/presets/teamorouter/index"; +import { unity2ProviderPreset } from "@ccr/core/providers/presets/unity2/index"; import { zaiGlobalCodingProviderPreset } from "@ccr/core/providers/presets/zai-global-coding/index"; import { zaiGlobalGeneralProviderPreset } from "@ccr/core/providers/presets/zai-global-general/index"; import { zhipuCnCodingProviderPreset } from "@ccr/core/providers/presets/zhipu-cn-coding/index"; @@ -52,6 +53,7 @@ export const providerPresets: ProviderPreset[] = [ fennoProviderPreset, runApiProviderPreset, teamoRouterProviderPreset, + unity2ProviderPreset, code0ProviderPreset, claudeApiProviderPreset ]; diff --git a/packages/core/src/providers/presets/unity2/index.ts b/packages/core/src/providers/presets/unity2/index.ts new file mode 100644 index 00000000..528b9b49 --- /dev/null +++ b/packages/core/src/providers/presets/unity2/index.ts @@ -0,0 +1,15 @@ +import { defaultProviderAccountConfig, type ProviderPreset } from "@ccr/core/providers/presets/types"; + +export const unity2ProviderPreset: ProviderPreset = { + account: defaultProviderAccountConfig, + aliases: ["unity2", "unity2.ai", "unity2 ai", "unity 2"], + endpoints: [ + { + baseUrl: "https://unity2.ai/v1", + protocols: ["openai_chat_completions"] + } + ], + id: "unity2", + name: "Unity2.Ai", + websiteUrl: "https://unity2.ai/register?source=claudecoderouter" +}; diff --git a/packages/ui/src/assets/provider-icons/unity2.jpg b/packages/ui/src/assets/provider-icons/unity2.jpg new file mode 100644 index 00000000..e83c9e02 Binary files /dev/null and b/packages/ui/src/assets/provider-icons/unity2.jpg differ diff --git a/packages/ui/src/pages/home/shared/options.ts b/packages/ui/src/pages/home/shared/options.ts index bb693555..2c6b74e8 100644 --- a/packages/ui/src/pages/home/shared/options.ts +++ b/packages/ui/src/pages/home/shared/options.ts @@ -55,6 +55,7 @@ import qiniuAiProviderIconUrl from "@/assets/provider-icons/qiniu-ai.png"; import runapiProviderIconUrl from "@/assets/provider-icons/runapi.jpg"; import siliconflowProviderIconUrl from "@/assets/provider-icons/siliconflow.png"; import teamorouterProviderIconUrl from "@/assets/provider-icons/teamorouter.png"; +import unity2ProviderIconUrl from "@/assets/provider-icons/unity2.jpg"; import zaiGlobalCodingProviderIconUrl from "@/assets/provider-icons/zai-global-coding.svg"; import zaiGlobalGeneralProviderIconUrl from "@/assets/provider-icons/zai-global-general.svg"; import zhipuCnCodingProviderIconUrl from "@/assets/provider-icons/zhipu-cn-coding.png"; @@ -339,6 +340,7 @@ export const providerPresetIconUrls: Record = { runapi: runapiProviderIconUrl, siliconflow: siliconflowProviderIconUrl, teamorouter: teamorouterProviderIconUrl, + unity2: unity2ProviderIconUrl, "zai-global-coding": zaiGlobalCodingProviderIconUrl, "zai-global-general": zaiGlobalGeneralProviderIconUrl, "zhipu-cn-coding": zhipuCnCodingProviderIconUrl, diff --git a/tests/main/provider-preset-utils.test.mjs b/tests/main/provider-preset-utils.test.mjs index 062f72e5..f8166e72 100644 --- a/tests/main/provider-preset-utils.test.mjs +++ b/tests/main/provider-preset-utils.test.mjs @@ -18,6 +18,9 @@ import { import { qiniuAiProviderPreset } from "../../packages/core/src/providers/presets/qiniu-ai/index.ts"; +import { + unity2ProviderPreset +} from "../../packages/core/src/providers/presets/unity2/index.ts"; const openAiPreset = { aliases: ["OpenAI", "ChatGPT"], @@ -85,6 +88,13 @@ test("sponsor provider presets expose requested endpoints and protocols", () => assert.deepEqual(qiniuAiProviderPreset.endpoints[0]?.protocols, [ "openai_chat_completions" ]); + + assert.equal(unity2ProviderPreset.websiteUrl, "https://unity2.ai/register?source=claudecoderouter"); + assert.equal(providerPresetMatchesBaseUrl(unity2ProviderPreset, "https://unity2.ai/v1/chat/completions"), true); + assert.equal(providerPresetMatchesBaseUrl(unity2ProviderPreset, "https://api.unity2.ai/v1"), false); + assert.deepEqual(unity2ProviderPreset.endpoints[0]?.protocols, [ + "openai_chat_completions" + ]); }); test("provider identity safety does not block branded third-party endpoints", () => {