Files

1 line
10 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}