1 line
10 KiB
JSON
1 line
10 KiB
JSON
{"repo": "bitan-del/gods-eye-desktop", "files": {"src/renderer/utils/model/modelPlatforms.ts": {"4165f4ed58a6043d4575b07dd47084c11130afec": {"t": 1785595501.7474966, "n": 9579, "h": "7a5c0d71d0c02541", "c": "/**\n * @license\n * Copyright 2025 Gods Eye (gods-eye.org)\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * 模型平台配置模块\n * Model Platform Configuration Module\n *\n * 集中管理所有模型平台的配置信息,便于扩展和维护\n * Centralized management of all model platform configurations for extensibility and maintainability\n */\n\n// Provider Logo imports\nimport GeminiLogo from '@/renderer/assets/logos/ai-major/gemini.svg';\nimport OpenAILogo from '@/renderer/assets/logos/ai-major/openai.svg';\nimport AnthropicLogo from '@/renderer/assets/logos/ai-major/anthropic.svg';\nimport BedrockLogo from '@/renderer/assets/logos/ai-cloud/bedrock.svg';\nimport DeepSeekLogo from '@/renderer/assets/logos/ai-major/deepseek.svg';\nimport OpenRouterLogo from '@/renderer/assets/logos/ai-cloud/openrouter.svg';\nimport SiliconFlowLogo from '@/renderer/assets/logos/ai-cloud/siliconflow.png';\nimport QwenLogo from '@/renderer/assets/logos/ai-china/qwen.svg';\nimport KimiLogo from '@/renderer/assets/logos/ai-china/kimi.svg';\nimport ZhipuLogo from '@/renderer/assets/logos/ai-china/zhipu.svg';\nimport XaiLogo from '@/renderer/assets/logos/ai-major/xai.svg';\nimport VolcengineLogo from '@/renderer/assets/logos/ai-china/volcengine.svg';\nimport BaiduLogo from '@/renderer/assets/logos/ai-china/baidu.svg';\nimport TencentLogo from '@/renderer/assets/logos/ai-china/tencent.svg';\nimport LingyiLogo from '@/renderer/assets/logos/ai-china/lingyiwanwu.svg';\nimport PoeLogo from '@/renderer/assets/logos/ai-cloud/poe.svg';\nimport ModelScopeLogo from '@/renderer/assets/logos/ai-cloud/modelscope.svg';\nimport InfiniAILogo from '@/renderer/assets/logos/ai-cloud/infiniai.svg';\nimport CtyunLogo from '@/renderer/assets/logos/ai-cloud/ctyun.svg';\nimport StepFunLogo from '@/renderer/assets/logos/ai-china/stepfun.svg';\nimport MiniMaxLogo from '@/renderer/assets/logos/ai-china/minimax.png';\nimport NewApiLogo from '@/renderer/assets/logos/ai-cloud/newapi.svg';\nimport NovitaLogo from '@/renderer/assets/logos/ai-cloud/novita.svg';\nimport PPIOLogo from '@/renderer/assets/logos/ai-cloud/ppio.svg';\nimport FalLogo from '@/renderer/assets/logos/ai-cloud/fal.svg';\n\n/**\n * 平台类型\n * Platform type\n */\nexport type PlatformType = 'gemini' | 'gemini-vertex-ai' | 'anthropic' | 'custom' | 'new-api' | 'bedrock' | 'fal';\n\n/**\n * 模型平台配置接口\n * Model Platform Configuration Interface\n */\nexport interface PlatformConfig {\n /** 平台名称 / Platform name */\n name: string;\n /** 平台值(用于表单) / Platform value (for form) */\n value: string;\n /** Logo 路径 / Logo path */\n logo: string | null;\n /** 平台标识 / Platform identifier */\n platform: PlatformType;\n /** Base URL(预设供应商使用) / Base URL (for preset providers) */\n baseUrl?: string;\n /** 国际化 key(可选,用于需要翻译的平台名称) / i18n key (optional, for platform names that need translation) */\n i18nKey?: string;\n}\n\n/**\n * 模型平台选项列表\n * Model Platform options list\n *\n * 顺序:\n * 1. Gemini (官方)\n * 2. Gemini Vertex AI\n * 3. 自定义(需要用户输入 base url)\n * 4+ 预设供应商\n */\nexport const MODEL_PLATFORMS: PlatformConfig[] = [\n // 自定义选项(需要用户输入 base url)/ Custom option (requires user to input base url)\n { name: 'Custom', value: 'custom', logo: null, platform: 'custom', i18nKey: 'settings.platformCustom' },\n\n // New API 多模型网关 / New API multi-model gateway\n { name: 'New API', value: 'new-api', logo: NewApiLogo, platform: 'new-api', i18nKey: 'settings.platformNewApi' },\n\n // fal.ai - Dedicated image generation platform (Imagen, FLUX, SD, etc.)\n { name: 'fal.ai', value: 'fal', logo: FalLogo, platform: 'fal', baseUrl: 'https://fal.run' },\n\n // 官方 Gemini 平台\n {\n name: 'Gemini',\n value: 'gemini',\n logo: GeminiLogo,\n platform: 'gemini',\n baseUrl: 'https://generativelanguage.googleapis.com',\n },\n { name: 'Gemini (Vertex AI)', value: 'gemini-vertex-ai', logo: GeminiLogo, platform: 'gemini-vertex-ai' },\n\n // 预设供应商(按字母顺序排列)\n { name: 'OpenAI', value: 'OpenAI', logo: OpenAILogo, platform: 'custom', baseUrl: 'https://api.openai.com/v1' },\n {\n name: 'Anthropic',\n value: 'Anthropic',\n logo: AnthropicLogo,\n platform: 'anthropic',\n baseUrl: 'https://api.anthropic.com',\n },\n {\n name: 'AWS Bedrock',\n value: 'AWS-Bedrock',\n logo: BedrockLogo,\n platform: 'bedrock',\n i18nKey: 'settings.platformBedrock',\n },\n {\n name: 'DeepSeek',\n value: 'DeepSeek',\n logo: DeepSeekLogo,\n platform: 'custom',\n baseUrl: 'https://api.deepseek.com/v1',\n },\n { name: 'MiniMax', value: 'MiniMax', logo: MiniMaxLogo, platform: 'custom', baseUrl: 'https://api.minimaxi.com/v1' },\n {\n name: 'Novita',\n value: 'Novita',\n logo: NovitaLogo,\n platform: 'custom',\n baseUrl: 'https://api.novita.ai/openai/v1',\n },\n {\n name: 'OpenRouter',\n value: 'OpenRouter',\n logo: OpenRouterLogo,\n platform: 'custom',\n baseUrl: 'https://openrouter.ai/api/v1',\n },\n {\n name: 'Dashscope',\n value: 'Dashscope',\n logo: QwenLogo,\n platform: 'custom',\n baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n },\n {\n name: 'Dashscope Coding Plan',\n value: 'Dashscope-Coding',\n logo: QwenLogo,\n platform: 'custom',\n baseUrl: 'https://coding.dashscope.aliyuncs.com/v1',\n },\n {\n name: 'SiliconFlow-CN',\n value: 'SiliconFlow-CN',\n logo: SiliconFlowLogo,\n platform: 'custom',\n baseUrl: 'https://api.siliconflow.cn/v1',\n },\n {\n name: 'SiliconFlow',\n value: 'SiliconFlow',\n logo: SiliconFlowLogo,\n platform: 'custom',\n baseUrl: 'https://api.siliconflow.com/v1',\n },\n {\n name: 'Zhipu',\n value: 'Zhipu',\n logo: ZhipuLogo,\n platform: 'custom',\n baseUrl: 'https://open.bigmodel.cn/api/paas/v4',\n },\n {\n name: 'Moonshot (China)',\n value: 'Moonshot',\n logo: KimiLogo,\n platform: 'custom',\n baseUrl: 'https://api.moonshot.cn/v1',\n },\n {\n name: 'Moonshot (Global)',\n value: 'Moonshot-Global',\n logo: KimiLogo,\n platform: 'custom',\n baseUrl: 'https://api.moonshot.ai/v1',\n },\n { name: 'xAI', value: 'xAI', logo: XaiLogo, platform: 'custom', baseUrl: 'https://api.x.ai/v1' },\n {\n name: 'Ark',\n value: 'Ark',\n logo: VolcengineLogo,\n platform: 'custom',\n baseUrl: 'https://ark.cn-beijing.volces.com/api/v3',\n },\n {\n name: 'Qianfan',\n value: 'Qianfan',\n logo: BaiduLogo,\n platform: 'custom',\n baseUrl: 'https://qianfan.baidubce.com/v2',\n },\n {\n name: 'Hunyuan',\n value: 'Hunyuan',\n logo: TencentLogo,\n platform: 'custom',\n baseUrl: 'https://api.hunyuan.cloud.tencent.com/v1',\n },\n { name: 'Lingyi', value: 'Lingyi', logo: LingyiLogo, platform: 'custom', baseUrl: 'https://api.lingyiwanwu.com/v1' },\n { name: 'Poe', value: 'Poe', logo: PoeLogo, platform: 'custom', baseUrl: 'https://api.poe.com/v1' },\n { name: 'PPIO', value: 'PPIO', logo: PPIOLogo, platform: 'custom', baseUrl: 'https://api.ppinfra.com/v3/openai' },\n {\n name: 'ModelScope',\n value: 'ModelScope',\n logo: ModelScopeLogo,\n platform: 'custom',\n baseUrl: 'https://api-inference.modelscope.cn/v1',\n },\n {\n name: 'InfiniAI',\n value: 'InfiniAI',\n logo: InfiniAILogo,\n platform: 'custom',\n baseUrl: 'https://cloud.infini-ai.com/maas/v1',\n },\n { name: 'Ctyun', value: 'Ctyun', logo: CtyunLogo, platform: 'custom', baseUrl: 'https://wishub-x1.ctyun.cn/v1' },\n { name: 'StepFun', value: 'StepFun', logo: StepFunLogo, platform: 'custom', baseUrl: 'https://api.stepfun.com/v1' },\n];\n\n/**\n * New API 协议选项\n * New API protocol options for per-model protocol configuration\n */\nexport const NEW_API_PROTOCOL_OPTIONS = [\n { label: 'OpenAI', value: 'openai' },\n { label: 'Gemini', value: 'gemini' },\n { label: 'Anthropic', value: 'anthropic' },\n];\n\n/**\n * 根据模型名称自动推断 New API 协议类型\n * Auto-detect New API protocol type based on model name\n */\nexport const detectNewApiProtocol = (modelName: string): string => {\n const name = modelName.toLowerCase();\n if (name.startsWith('claude') || name.startsWith('anthropic')) return 'anthropic';\n if (name.startsWith('gemini') || name.startsWith('models/gemini')) return 'gemini';\n // Default to openai (covers gpt, deepseek, qwen, o1, o3, etc.)\n return 'openai';\n};\n\n// ============ 工具函数 / Utility Functions ============\n\n/**\n * 根据 value 获取平台配置\n * Get platform config by value\n */\nexport const getPlatformByValue = (value: string): PlatformConfig | undefined => {\n return MODEL_PLATFORMS.find((p) => p.value === value);\n};\n\n/**\n * 获取所有预设供应商(有 baseUrl 的)\n * Get all preset providers (with baseUrl)\n */\nexport const getPresetProviders = (): PlatformConfig[] => {\n return MODEL_PLATFORMS.filter((p) => p.baseUrl);\n};\n\n/**\n * 获取官方 Gemini 平台\n * Get official Gemini platforms\n */\nexport const getGeminiPlatforms = (): PlatformConfig[] => {\n return MODEL_PLATFORMS.filter((p) => p.platform === 'gemini' || p.platform === 'gemini-vertex-ai');\n};\n\n/**\n * 检查平台是否为 Gemini 类型\n * Check if platform is Gemini type\n */\nexport const isGeminiPlatform = (platform: PlatformType): boolean => {\n return platform === 'gemini' || platform === 'gemini-vertex-ai';\n};\n\n/**\n * 检查是否为自定义选项(无预设 baseUrl)\n * Check if it's custom option (no preset baseUrl)\n */\nexport const isCustomOption = (value: string): boolean => {\n const platform = getPlatformByValue(value);\n return value === 'custom' && !platform?.baseUrl;\n};\n\n// Re-export from common for renderer convenience\nexport { isNewApiPlatform } from '@/common/utils/platformConstants';\n\n/**\n * 根据名称搜索平台(不区分大小写)\n * Search platforms by name (case-insensitive)\n */\nexport const searchPlatformsByName = (keyword: string): PlatformConfig[] => {\n const lowerKeyword = keyword.toLowerCase();\n return MODEL_PLATFORMS.filter((p) => p.name.toLowerCase().includes(lowerKeyword));\n};\n"}}}} |