Files
CC-Switch/src/config/geminiProviderPresets.ts
T
Jason 4f355970e1 chore(presets): remove LemonData provider and demote SudoCode to regular provider
- LemonData: delete the provider preset from all apps (claude, claude-desktop,
  codex, gemini, hermes, opencode, openclaw), remove partner promotion copy
  (zh/en/ja/zh-TW), icon index/metadata entries, sponsor ads in all READMEs,
  and the logo/icon PNG assets.
- SudoCode: drop the isPartner flag and partnerPromotionKey across all app
  presets and remove the now-orphaned partner promotion copy; it stays as a
  regular third_party provider, keeping its icon.
2026-06-11 23:15:11 +08:00

419 lines
11 KiB
TypeScript

import type { ProviderCategory } from "@/types";
/**
* Gemini 预设供应商的视觉主题配置
*/
export interface GeminiPresetTheme {
/** 图标类型:'gemini' | 'generic' */
icon?: "gemini" | "generic";
/** 背景色(选中状态),支持 hex 颜色 */
backgroundColor?: string;
/** 文字色(选中状态),支持 hex 颜色 */
textColor?: string;
}
export interface GeminiProviderPreset {
name: string;
nameKey?: string; // i18n key for localized display name
websiteUrl: string;
apiKeyUrl?: string;
settingsConfig: object;
baseURL?: string;
model?: string;
description?: string;
category?: ProviderCategory;
isPartner?: boolean;
partnerPromotionKey?: string;
endpointCandidates?: string[];
theme?: GeminiPresetTheme;
// 图标配置
icon?: string; // 图标名称
iconColor?: string; // 图标颜色
}
export const geminiProviderPresets: GeminiProviderPreset[] = [
{
name: "Google Official",
websiteUrl: "https://ai.google.dev/",
apiKeyUrl: "https://aistudio.google.com/apikey",
settingsConfig: {
env: {},
},
description: "Google 官方 Gemini API (OAuth)",
category: "official",
partnerPromotionKey: "google-official",
theme: {
icon: "gemini",
backgroundColor: "#4285F4",
textColor: "#FFFFFF",
},
icon: "gemini",
iconColor: "#4285F4",
},
{
name: "Shengsuanyun",
nameKey: "providerForm.presets.shengsuanyun",
websiteUrl: "https://www.shengsuanyun.com/?from=CH_4HHXMRYF",
apiKeyUrl: "https://www.shengsuanyun.com/?from=CH_4HHXMRYF",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://router.shengsuanyun.com/api",
GEMINI_MODEL: "google/gemini-3.5-flash",
},
},
baseURL: "https://router.shengsuanyun.com/api",
model: "google/gemini-3.5-flash",
description: "Shengsuanyun",
category: "aggregator",
isPartner: true,
partnerPromotionKey: "shengsuanyun",
icon: "shengsuanyun",
},
{
name: "Unity2.ai",
websiteUrl: "https://unity2.ai",
apiKeyUrl: "https://unity2.ai/register?source=ccs",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://api.unity2.ai",
GEMINI_MODEL: "gemini-3.1-pro",
},
},
baseURL: "https://api.unity2.ai",
model: "gemini-3.1-pro",
description: "Unity2.ai",
category: "aggregator",
isPartner: true,
partnerPromotionKey: "unity2",
icon: "unity2",
},
{
name: "PackyCode",
websiteUrl: "https://www.packyapi.com",
apiKeyUrl: "https://www.packyapi.com/register?aff=cc-switch",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://www.packyapi.com",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://www.packyapi.com",
model: "gemini-3.5-flash",
description: "PackyCode",
category: "third_party",
isPartner: true,
partnerPromotionKey: "packycode",
endpointCandidates: [
"https://api-slb.packyapi.com",
"https://www.packyapi.com",
],
icon: "packycode",
},
{
name: "APIKEY.FUN",
websiteUrl: "https://apikey.fun",
apiKeyUrl: "https://apikey.fun/register?aff=CCSwitch",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://api.apikey.fun",
GEMINI_API_KEY: "",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://api.apikey.fun",
model: "gemini-3.5-flash",
description: "APIKEY.FUN",
category: "third_party",
isPartner: true,
partnerPromotionKey: "apikeyfun",
endpointCandidates: ["https://api.apikey.fun", "https://slb.apikey.fun"],
icon: "apikeyfun",
},
{
name: "APINebula",
websiteUrl: "https://apinebula.com",
apiKeyUrl: "https://apinebula.com/02rw5X",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://apinebula.com",
GEMINI_API_KEY: "",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://apinebula.com",
model: "gemini-3.5-flash",
description: "APINebula",
category: "third_party",
isPartner: true,
partnerPromotionKey: "apinebula",
endpointCandidates: ["https://apinebula.com"],
icon: "apinebula",
},
{
name: "SudoCode",
websiteUrl: "https://sudocode.us",
apiKeyUrl: "https://sudocode.us",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://sudocode.us",
GEMINI_API_KEY: "",
GEMINI_MODEL: "gemini-3.1-flash-lite",
},
},
baseURL: "https://sudocode.us",
model: "gemini-3.1-flash-lite",
description: "SudoCode",
category: "third_party",
endpointCandidates: ["https://sudocode.us", "https://sudocode.run"],
icon: "sudocode",
},
{
name: "Cubence",
websiteUrl: "https://cubence.com",
apiKeyUrl: "https://cubence.com/signup?code=CCSWITCH&source=ccs",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://api.cubence.com",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://api.cubence.com",
model: "gemini-3.5-flash",
description: "Cubence",
category: "third_party",
isPartner: true,
partnerPromotionKey: "cubence",
endpointCandidates: [
"https://api.cubence.com/v1",
"https://api-cf.cubence.com/v1",
"https://api-dmit.cubence.com/v1",
"https://api-bwg.cubence.com/v1",
],
icon: "cubence",
iconColor: "#000000",
},
{
name: "AIGoCode",
websiteUrl: "https://aigocode.com",
apiKeyUrl: "https://aigocode.com/invite/CC-SWITCH",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://api.aigocode.com",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://api.aigocode.com",
model: "gemini-3.5-flash",
description: "AIGoCode",
category: "third_party",
isPartner: true,
partnerPromotionKey: "aigocode",
endpointCandidates: ["https://api.aigocode.com"],
icon: "aigocode",
iconColor: "#5B7FFF",
},
{
name: "AICodeMirror",
websiteUrl: "https://www.aicodemirror.com",
apiKeyUrl: "https://www.aicodemirror.com/register?invitecode=9915W3",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://api.aicodemirror.com/api/gemini",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://api.aicodemirror.com/api/gemini",
model: "gemini-3.5-flash",
description: "AICodeMirror",
category: "third_party",
isPartner: true,
partnerPromotionKey: "aicodemirror",
endpointCandidates: [
"https://api.aicodemirror.com/api/gemini",
"https://api.claudecode.net.cn/api/gemini",
],
icon: "aicodemirror",
iconColor: "#000000",
},
{
name: "CrazyRouter",
websiteUrl: "https://www.crazyrouter.com",
apiKeyUrl: "https://www.crazyrouter.com/register?aff=OZcm&ref=cc-switch",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://cn.crazyrouter.com",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://cn.crazyrouter.com",
model: "gemini-3.5-flash",
description: "CrazyRouter",
category: "third_party",
isPartner: true,
partnerPromotionKey: "crazyrouter",
endpointCandidates: ["https://cn.crazyrouter.com"],
icon: "crazyrouter",
iconColor: "#000000",
},
{
name: "SSSAiCode",
websiteUrl: "https://sssaicodeapi.com",
apiKeyUrl: "https://sssaicodeapi.com/register?ref=DCP0SM",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://node-hk.sssaicodeapi.com/api",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://node-hk.sssaicodeapi.com/api",
model: "gemini-3.5-flash",
description: "SSSAiCode",
category: "third_party",
isPartner: true,
partnerPromotionKey: "sssaicode",
endpointCandidates: [
"https://node-hk.sssaicodeapi.com/api",
"https://node-hk.sssaiapi.com/api",
"https://node-cf.sssaicodeapi.com/api",
],
icon: "sssaicode",
iconColor: "#000000",
},
{
name: "CTok.ai",
websiteUrl: "https://ctok.ai",
apiKeyUrl: "https://ctok.ai",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://api.ctok.ai/v1beta",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://api.ctok.ai/v1beta",
model: "gemini-3.5-flash",
description: "CTok",
category: "third_party",
isPartner: true,
partnerPromotionKey: "ctok",
endpointCandidates: ["https://api.ctok.ai/v1beta"],
icon: "ctok",
iconColor: "#000000",
},
{
name: "E-FlowCode",
websiteUrl: "https://e-flowcode.cc",
apiKeyUrl: "https://e-flowcode.cc",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://e-flowcode.cc",
GEMINI_API_KEY: "",
GEMINI_MODEL: "gemini-3.5-flash",
},
config: {
general: {
previewFeatures: true,
sessionRetention: {
enabled: true,
maxAge: "30d",
warningAcknowledged: true,
},
},
mcpServers: {},
security: {
auth: {
selectedType: "gemini-api-key",
},
},
},
},
baseURL: "https://e-flowcode.cc",
model: "gemini-3.5-flash",
description: "E-FlowCode",
category: "third_party",
endpointCandidates: ["https://e-flowcode.cc"],
icon: "eflowcode",
iconColor: "#000000",
},
{
name: "CherryIN",
websiteUrl: "https://open.cherryin.ai",
apiKeyUrl: "https://open.cherryin.ai/console/token",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://open.cherryin.net",
GEMINI_API_KEY: "",
GEMINI_MODEL: "google/gemini-3.5-flash",
},
},
baseURL: "https://open.cherryin.net",
model: "google/gemini-3.5-flash",
description: "CherryIN",
category: "aggregator",
endpointCandidates: ["https://open.cherryin.net"],
icon: "cherryin",
},
{
name: "OpenRouter",
websiteUrl: "https://openrouter.ai",
apiKeyUrl: "https://openrouter.ai/keys",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://openrouter.ai/api",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://openrouter.ai/api",
model: "gemini-3.5-flash",
description: "OpenRouter",
category: "aggregator",
icon: "openrouter",
iconColor: "#6566F1",
},
{
name: "TheRouter",
websiteUrl: "https://therouter.ai",
apiKeyUrl: "https://dashboard.therouter.ai",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "https://api.therouter.ai",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
baseURL: "https://api.therouter.ai",
model: "gemini-3.5-flash",
description: "TheRouter",
category: "aggregator",
endpointCandidates: ["https://api.therouter.ai"],
},
{
name: "自定义",
websiteUrl: "",
settingsConfig: {
env: {
GOOGLE_GEMINI_BASE_URL: "",
GEMINI_MODEL: "gemini-3.5-flash",
},
},
model: "gemini-3.5-flash",
description: "自定义 Gemini API 端点",
category: "custom",
},
];
export function getGeminiPresetByName(
name: string,
): GeminiProviderPreset | undefined {
return geminiProviderPresets.find((preset) => preset.name === name);
}
export function getGeminiPresetByUrl(
url: string,
): GeminiProviderPreset | undefined {
if (!url) return undefined;
return geminiProviderPresets.find(
(preset) =>
preset.baseURL &&
url.toLowerCase().includes(preset.baseURL.toLowerCase()),
);
}