Files

1 line
27 KiB
JSON

{"repo": "astreox/uevo-cli", "files": {"packages/core/src/core/modelProviderMapping.ts": {"56d746d4ffce8f1d4c74cf32b522f99a10b4957e": {"t": 1785745586.7612538, "n": 6478, "h": "aeb9e0698c409071", "c": "/**\n * @license\n * Copyright 2025 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AIProvider } from './aiProvider.js';\n\n// 重新导出AIProvider以便其他模块使用\nexport { AIProvider };\n\n/**\n * 模型名称到提供商的映射\n * 用于根据模型名称自动确定应该使用哪个AI提供商\n */\nexport const MODEL_PROVIDER_MAPPING: Record<string, AIProvider> = {\n // Gemini 模型\n 'gemini-1.5-pro': AIProvider.GEMINI,\n 'gemini-1.5-flash': AIProvider.GEMINI,\n 'gemini-1.5-pro-002': AIProvider.GEMINI,\n 'gemini-1.5-flash-002': AIProvider.GEMINI,\n 'gemini-2.0-flash-exp': AIProvider.GEMINI,\n 'gemini-2.5-pro': AIProvider.GEMINI,\n 'gemini-pro': AIProvider.GEMINI,\n 'gemini-pro-vision': AIProvider.GEMINI,\n\n // DeepSeek 模型\n 'deepseek-chat': AIProvider.DEEPSEEK,\n 'deepseek-coder': AIProvider.DEEPSEEK,\n 'deepseek-reasoner': AIProvider.DEEPSEEK,\n 'deepseek-v3': AIProvider.DEEPSEEK,\n 'deepseek-r1': AIProvider.DEEPSEEK,\n\n // Anthropic 模型\n // Claude 4 Models (Latest Generation)\n 'claude-opus-4-20250514': AIProvider.ANTHROPIC,\n 'claude-opus-4-0': AIProvider.ANTHROPIC,\n 'claude-sonnet-4-20250514': AIProvider.ANTHROPIC,\n 'claude-sonnet-4-0': AIProvider.ANTHROPIC,\n \n // Claude 3.7 Models\n 'claude-3-7-sonnet-20250219': AIProvider.ANTHROPIC,\n 'claude-3-7-sonnet-latest': AIProvider.ANTHROPIC,\n \n // Claude 3.5 Models\n 'claude-3-5-sonnet-20241022': AIProvider.ANTHROPIC,\n 'claude-3-5-sonnet-latest': AIProvider.ANTHROPIC,\n 'claude-3-5-sonnet-20240620': AIProvider.ANTHROPIC,\n 'claude-3-5-haiku-20241022': AIProvider.ANTHROPIC,\n 'claude-3-5-haiku-latest': AIProvider.ANTHROPIC,\n \n // Claude 3 Models\n 'claude-3-opus-20240229': AIProvider.ANTHROPIC,\n 'claude-3-opus-latest': AIProvider.ANTHROPIC,\n 'claude-3-sonnet-20240229': AIProvider.ANTHROPIC,\n 'claude-3-haiku-20240307': AIProvider.ANTHROPIC,\n \n // Legacy Claude Models\n 'claude-2.1': AIProvider.ANTHROPIC,\n 'claude-2.0': AIProvider.ANTHROPIC,\n 'claude-instant-1.2': AIProvider.ANTHROPIC,\n\n // OpenAI 模型\n 'gpt-4o': AIProvider.OPENAI,\n 'gpt-4o-mini': AIProvider.OPENAI,\n 'gpt-4-turbo': AIProvider.OPENAI,\n 'gpt-4': AIProvider.OPENAI,\n 'gpt-3.5-turbo': AIProvider.OPENAI,\n 'o1-preview': AIProvider.OPENAI,\n 'o1-mini': AIProvider.OPENAI,\n\n // 阿里云通义千问模型\n 'qwen-turbo': AIProvider.ALIYUN,\n 'qwen-plus': AIProvider.ALIYUN,\n 'qwen-max': AIProvider.ALIYUN,\n 'qwen-long': AIProvider.ALIYUN,\n 'qwen-max-longcontext': AIProvider.ALIYUN,\n 'qwen-vl-plus': AIProvider.ALIYUN,\n 'qwen-vl-max': AIProvider.ALIYUN,\n 'qwen-audio-turbo': AIProvider.ALIYUN,\n 'qwen-audio-chat': AIProvider.ALIYUN,\n \n // Qwen2.5 系列模型\n 'qwen2.5-72b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-32b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-14b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-3b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-1.5b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-0.5b-instruct': AIProvider.ALIYUN,\n \n // Qwen Coder 系列模型\n 'qwen-coder-turbo': AIProvider.ALIYUN,\n 'qwen-coder-plus': AIProvider.ALIYUN,\n 'qwen2.5-coder-32b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-14b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-3b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-1.5b-instruct': AIProvider.ALIYUN,\n \n // Qwen Math 系列模型\n 'qwen2.5-math-72b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-math-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-math-1.5b-instruct': AIProvider.ALIYUN,\n\n // OpenRouter 模型 (通常带有提供商前缀)\n 'openai/gpt-4o': AIProvider.OPENROUTER,\n 'openai/gpt-4o-mini': AIProvider.OPENROUTER,\n 'openai/gpt-3.5-turbo': AIProvider.OPENROUTER,\n 'anthropic/claude-3.5-sonnet': AIProvider.OPENROUTER,\n 'anthropic/claude-3-opus': AIProvider.OPENROUTER,\n 'deepseek/deepseek-chat': AIProvider.OPENROUTER,\n 'google/gemini-pro': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-405b-instruct': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-70b-instruct': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-8b-instruct': AIProvider.OPENROUTER,\n};\n\n/**\n * 根据模型名称获取对应的AI提供商\n * @param modelName 模型名称\n * @returns AI提供商,如果未找到映射则返回GEMINI作为默认值\n */\nexport function getProviderForModel(modelName: string): AIProvider {\n // 直接查找映射\n if (MODEL_PROVIDER_MAPPING[modelName]) {\n return MODEL_PROVIDER_MAPPING[modelName];\n }\n\n // 模糊匹配:基于模型名称前缀或关键词\n const lowerModelName = modelName.toLowerCase();\n\n if (lowerModelName.includes('gemini') || lowerModelName.includes('bison')) {\n return AIProvider.GEMINI;\n }\n\n if (lowerModelName.includes('deepseek')) {\n return AIProvider.DEEPSEEK;\n }\n\n if (lowerModelName.includes('claude')) {\n return AIProvider.ANTHROPIC;\n }\n\n if (lowerModelName.includes('gpt') || lowerModelName.includes('o1')) {\n return AIProvider.OPENAI;\n }\n\n if (lowerModelName.includes('qwen') || lowerModelName.includes('tongyi')) {\n return AIProvider.ALIYUN;\n }\n\n // 如果包含 '/' 符号,可能是OpenRouter格式\n if (lowerModelName.includes('/')) {\n return AIProvider.OPENROUTER;\n }\n\n // 默认返回GEMINI\n return AIProvider.GEMINI;\n}\n\n/**\n * 获取指定提供商的环境变量名称\n * @param provider AI提供商\n * @returns 环境变量名称\n */\nexport function getEnvVarForProvider(provider: AIProvider): string {\n const envVarMap: Record<AIProvider, string> = {\n [AIProvider.GEMINI]: 'GEMINI_API_KEY',\n [AIProvider.DEEPSEEK]: 'DEEPSEEK_API_KEY',\n [AIProvider.ANTHROPIC]: 'ANTHROPIC_API_KEY',\n [AIProvider.OPENAI]: 'OPENAI_API_KEY',\n [AIProvider.OPENROUTER]: 'OPENROUTER_API_KEY',\n [AIProvider.ALIYUN]: 'DASHSCOPE_API_KEY',\n };\n return envVarMap[provider];\n}\n\n/**\n * 检查指定提供商的API密钥是否已配置\n * @param provider AI提供商\n * @returns 是否已配置API密钥\n */\nexport function isProviderConfigured(provider: AIProvider): boolean {\n const envVar = getEnvVarForProvider(provider);\n return !!process.env[envVar];\n}\n\n/**\n * 获取模型的推荐配置信息\n * @param modelName 模型名称\n * @returns 配置信息对象\n */\nexport function getModelInfo(modelName: string): {\n provider: AIProvider;\n envVar: string;\n isConfigured: boolean;\n providerName: string;\n} {\n const provider = getProviderForModel(modelName);\n const envVar = getEnvVarForProvider(provider);\n const isConfigured = isProviderConfigured(provider);\n \n const providerNames: Record<AIProvider, string> = {\n [AIProvider.GEMINI]: 'Google Gemini',\n [AIProvider.DEEPSEEK]: 'DeepSeek',\n [AIProvider.ANTHROPIC]: 'Anthropic Claude',\n [AIProvider.OPENAI]: 'OpenAI',\n [AIProvider.OPENROUTER]: 'OpenRouter',\n [AIProvider.ALIYUN]: 'Alibaba Cloud (阿里云)',\n };\n\n return {\n provider,\n envVar,\n isConfigured,\n providerName: providerNames[provider],\n };\n}"}, "23af9c9c1e3bb21f39ee3f5ae219aa92f3099bdc": {"t": 1785754531.9578218, "n": 6478, "h": "aeb9e0698c409071", "c": "/**\n * @license\n * Copyright 2025 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AIProvider } from './aiProvider.js';\n\n// 重新导出AIProvider以便其他模块使用\nexport { AIProvider };\n\n/**\n * 模型名称到提供商的映射\n * 用于根据模型名称自动确定应该使用哪个AI提供商\n */\nexport const MODEL_PROVIDER_MAPPING: Record<string, AIProvider> = {\n // Gemini 模型\n 'gemini-1.5-pro': AIProvider.GEMINI,\n 'gemini-1.5-flash': AIProvider.GEMINI,\n 'gemini-1.5-pro-002': AIProvider.GEMINI,\n 'gemini-1.5-flash-002': AIProvider.GEMINI,\n 'gemini-2.0-flash-exp': AIProvider.GEMINI,\n 'gemini-2.5-pro': AIProvider.GEMINI,\n 'gemini-pro': AIProvider.GEMINI,\n 'gemini-pro-vision': AIProvider.GEMINI,\n\n // DeepSeek 模型\n 'deepseek-chat': AIProvider.DEEPSEEK,\n 'deepseek-coder': AIProvider.DEEPSEEK,\n 'deepseek-reasoner': AIProvider.DEEPSEEK,\n 'deepseek-v3': AIProvider.DEEPSEEK,\n 'deepseek-r1': AIProvider.DEEPSEEK,\n\n // Anthropic 模型\n // Claude 4 Models (Latest Generation)\n 'claude-opus-4-20250514': AIProvider.ANTHROPIC,\n 'claude-opus-4-0': AIProvider.ANTHROPIC,\n 'claude-sonnet-4-20250514': AIProvider.ANTHROPIC,\n 'claude-sonnet-4-0': AIProvider.ANTHROPIC,\n \n // Claude 3.7 Models\n 'claude-3-7-sonnet-20250219': AIProvider.ANTHROPIC,\n 'claude-3-7-sonnet-latest': AIProvider.ANTHROPIC,\n \n // Claude 3.5 Models\n 'claude-3-5-sonnet-20241022': AIProvider.ANTHROPIC,\n 'claude-3-5-sonnet-latest': AIProvider.ANTHROPIC,\n 'claude-3-5-sonnet-20240620': AIProvider.ANTHROPIC,\n 'claude-3-5-haiku-20241022': AIProvider.ANTHROPIC,\n 'claude-3-5-haiku-latest': AIProvider.ANTHROPIC,\n \n // Claude 3 Models\n 'claude-3-opus-20240229': AIProvider.ANTHROPIC,\n 'claude-3-opus-latest': AIProvider.ANTHROPIC,\n 'claude-3-sonnet-20240229': AIProvider.ANTHROPIC,\n 'claude-3-haiku-20240307': AIProvider.ANTHROPIC,\n \n // Legacy Claude Models\n 'claude-2.1': AIProvider.ANTHROPIC,\n 'claude-2.0': AIProvider.ANTHROPIC,\n 'claude-instant-1.2': AIProvider.ANTHROPIC,\n\n // OpenAI 模型\n 'gpt-4o': AIProvider.OPENAI,\n 'gpt-4o-mini': AIProvider.OPENAI,\n 'gpt-4-turbo': AIProvider.OPENAI,\n 'gpt-4': AIProvider.OPENAI,\n 'gpt-3.5-turbo': AIProvider.OPENAI,\n 'o1-preview': AIProvider.OPENAI,\n 'o1-mini': AIProvider.OPENAI,\n\n // 阿里云通义千问模型\n 'qwen-turbo': AIProvider.ALIYUN,\n 'qwen-plus': AIProvider.ALIYUN,\n 'qwen-max': AIProvider.ALIYUN,\n 'qwen-long': AIProvider.ALIYUN,\n 'qwen-max-longcontext': AIProvider.ALIYUN,\n 'qwen-vl-plus': AIProvider.ALIYUN,\n 'qwen-vl-max': AIProvider.ALIYUN,\n 'qwen-audio-turbo': AIProvider.ALIYUN,\n 'qwen-audio-chat': AIProvider.ALIYUN,\n \n // Qwen2.5 系列模型\n 'qwen2.5-72b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-32b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-14b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-3b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-1.5b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-0.5b-instruct': AIProvider.ALIYUN,\n \n // Qwen Coder 系列模型\n 'qwen-coder-turbo': AIProvider.ALIYUN,\n 'qwen-coder-plus': AIProvider.ALIYUN,\n 'qwen2.5-coder-32b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-14b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-3b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-1.5b-instruct': AIProvider.ALIYUN,\n \n // Qwen Math 系列模型\n 'qwen2.5-math-72b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-math-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-math-1.5b-instruct': AIProvider.ALIYUN,\n\n // OpenRouter 模型 (通常带有提供商前缀)\n 'openai/gpt-4o': AIProvider.OPENROUTER,\n 'openai/gpt-4o-mini': AIProvider.OPENROUTER,\n 'openai/gpt-3.5-turbo': AIProvider.OPENROUTER,\n 'anthropic/claude-3.5-sonnet': AIProvider.OPENROUTER,\n 'anthropic/claude-3-opus': AIProvider.OPENROUTER,\n 'deepseek/deepseek-chat': AIProvider.OPENROUTER,\n 'google/gemini-pro': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-405b-instruct': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-70b-instruct': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-8b-instruct': AIProvider.OPENROUTER,\n};\n\n/**\n * 根据模型名称获取对应的AI提供商\n * @param modelName 模型名称\n * @returns AI提供商,如果未找到映射则返回GEMINI作为默认值\n */\nexport function getProviderForModel(modelName: string): AIProvider {\n // 直接查找映射\n if (MODEL_PROVIDER_MAPPING[modelName]) {\n return MODEL_PROVIDER_MAPPING[modelName];\n }\n\n // 模糊匹配:基于模型名称前缀或关键词\n const lowerModelName = modelName.toLowerCase();\n\n if (lowerModelName.includes('gemini') || lowerModelName.includes('bison')) {\n return AIProvider.GEMINI;\n }\n\n if (lowerModelName.includes('deepseek')) {\n return AIProvider.DEEPSEEK;\n }\n\n if (lowerModelName.includes('claude')) {\n return AIProvider.ANTHROPIC;\n }\n\n if (lowerModelName.includes('gpt') || lowerModelName.includes('o1')) {\n return AIProvider.OPENAI;\n }\n\n if (lowerModelName.includes('qwen') || lowerModelName.includes('tongyi')) {\n return AIProvider.ALIYUN;\n }\n\n // 如果包含 '/' 符号,可能是OpenRouter格式\n if (lowerModelName.includes('/')) {\n return AIProvider.OPENROUTER;\n }\n\n // 默认返回GEMINI\n return AIProvider.GEMINI;\n}\n\n/**\n * 获取指定提供商的环境变量名称\n * @param provider AI提供商\n * @returns 环境变量名称\n */\nexport function getEnvVarForProvider(provider: AIProvider): string {\n const envVarMap: Record<AIProvider, string> = {\n [AIProvider.GEMINI]: 'GEMINI_API_KEY',\n [AIProvider.DEEPSEEK]: 'DEEPSEEK_API_KEY',\n [AIProvider.ANTHROPIC]: 'ANTHROPIC_API_KEY',\n [AIProvider.OPENAI]: 'OPENAI_API_KEY',\n [AIProvider.OPENROUTER]: 'OPENROUTER_API_KEY',\n [AIProvider.ALIYUN]: 'DASHSCOPE_API_KEY',\n };\n return envVarMap[provider];\n}\n\n/**\n * 检查指定提供商的API密钥是否已配置\n * @param provider AI提供商\n * @returns 是否已配置API密钥\n */\nexport function isProviderConfigured(provider: AIProvider): boolean {\n const envVar = getEnvVarForProvider(provider);\n return !!process.env[envVar];\n}\n\n/**\n * 获取模型的推荐配置信息\n * @param modelName 模型名称\n * @returns 配置信息对象\n */\nexport function getModelInfo(modelName: string): {\n provider: AIProvider;\n envVar: string;\n isConfigured: boolean;\n providerName: string;\n} {\n const provider = getProviderForModel(modelName);\n const envVar = getEnvVarForProvider(provider);\n const isConfigured = isProviderConfigured(provider);\n \n const providerNames: Record<AIProvider, string> = {\n [AIProvider.GEMINI]: 'Google Gemini',\n [AIProvider.DEEPSEEK]: 'DeepSeek',\n [AIProvider.ANTHROPIC]: 'Anthropic Claude',\n [AIProvider.OPENAI]: 'OpenAI',\n [AIProvider.OPENROUTER]: 'OpenRouter',\n [AIProvider.ALIYUN]: 'Alibaba Cloud (阿里云)',\n };\n\n return {\n provider,\n envVar,\n isConfigured,\n providerName: providerNames[provider],\n };\n}"}, "b2009e598b1648425ad02c1a7224cb2640187209": {"t": 1785754533.1423595, "n": 5883, "h": "01636ab62643d883", "c": "/**\n * @license\n * Copyright 2025 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AIProvider } from './aiClient.js';\n\n// 重新导出AIProvider以便其他模块使用\nexport { AIProvider };\n\n/**\n * 模型名称到提供商的映射\n * 用于根据模型名称自动确定应该使用哪个AI提供商\n */\nexport const MODEL_PROVIDER_MAPPING: Record<string, AIProvider> = {\n // Gemini 模型\n 'gemini-1.5-pro': AIProvider.GEMINI,\n 'gemini-1.5-flash': AIProvider.GEMINI,\n 'gemini-1.5-pro-002': AIProvider.GEMINI,\n 'gemini-1.5-flash-002': AIProvider.GEMINI,\n 'gemini-2.0-flash-exp': AIProvider.GEMINI,\n 'gemini-2.5-pro': AIProvider.GEMINI,\n 'gemini-pro': AIProvider.GEMINI,\n 'gemini-pro-vision': AIProvider.GEMINI,\n\n // DeepSeek 模型\n 'deepseek-chat': AIProvider.DEEPSEEK,\n 'deepseek-coder': AIProvider.DEEPSEEK,\n 'deepseek-reasoner': AIProvider.DEEPSEEK,\n 'deepseek-v3': AIProvider.DEEPSEEK,\n 'deepseek-r1': AIProvider.DEEPSEEK,\n\n // Anthropic 模型\n 'claude-3-5-sonnet-20241022': AIProvider.ANTHROPIC,\n 'claude-3-5-sonnet-20240620': AIProvider.ANTHROPIC,\n 'claude-3-5-haiku-20241022': AIProvider.ANTHROPIC,\n 'claude-3-opus-20240229': AIProvider.ANTHROPIC,\n 'claude-3-sonnet-20240229': AIProvider.ANTHROPIC,\n 'claude-3-haiku-20240307': AIProvider.ANTHROPIC,\n 'claude-2.1': AIProvider.ANTHROPIC,\n 'claude-2.0': AIProvider.ANTHROPIC,\n 'claude-instant-1.2': AIProvider.ANTHROPIC,\n\n // OpenAI 模型\n 'gpt-4o': AIProvider.OPENAI,\n 'gpt-4o-mini': AIProvider.OPENAI,\n 'gpt-4-turbo': AIProvider.OPENAI,\n 'gpt-4': AIProvider.OPENAI,\n 'gpt-3.5-turbo': AIProvider.OPENAI,\n 'o1-preview': AIProvider.OPENAI,\n 'o1-mini': AIProvider.OPENAI,\n\n // 阿里云通义千问模型\n 'qwen-turbo': AIProvider.ALIYUN,\n 'qwen-plus': AIProvider.ALIYUN,\n 'qwen-max': AIProvider.ALIYUN,\n 'qwen-long': AIProvider.ALIYUN,\n 'qwen-max-longcontext': AIProvider.ALIYUN,\n 'qwen-vl-plus': AIProvider.ALIYUN,\n 'qwen-vl-max': AIProvider.ALIYUN,\n 'qwen-audio-turbo': AIProvider.ALIYUN,\n 'qwen-audio-chat': AIProvider.ALIYUN,\n \n // Qwen2.5 系列模型\n 'qwen2.5-72b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-32b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-14b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-3b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-1.5b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-0.5b-instruct': AIProvider.ALIYUN,\n \n // Qwen Coder 系列模型\n 'qwen-coder-turbo': AIProvider.ALIYUN,\n 'qwen-coder-plus': AIProvider.ALIYUN,\n 'qwen2.5-coder-32b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-14b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-3b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-1.5b-instruct': AIProvider.ALIYUN,\n \n // Qwen Math 系列模型\n 'qwen2.5-math-72b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-math-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-math-1.5b-instruct': AIProvider.ALIYUN,\n\n // OpenRouter 模型 (通常带有提供商前缀)\n 'openai/gpt-4o': AIProvider.OPENROUTER,\n 'openai/gpt-4o-mini': AIProvider.OPENROUTER,\n 'openai/gpt-3.5-turbo': AIProvider.OPENROUTER,\n 'anthropic/claude-3.5-sonnet': AIProvider.OPENROUTER,\n 'anthropic/claude-3-opus': AIProvider.OPENROUTER,\n 'deepseek/deepseek-chat': AIProvider.OPENROUTER,\n 'google/gemini-pro': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-405b-instruct': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-70b-instruct': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-8b-instruct': AIProvider.OPENROUTER,\n};\n\n/**\n * 根据模型名称获取对应的AI提供商\n * @param modelName 模型名称\n * @returns AI提供商,如果未找到映射则返回GEMINI作为默认值\n */\nexport function getProviderForModel(modelName: string): AIProvider {\n // 直接查找映射\n if (MODEL_PROVIDER_MAPPING[modelName]) {\n return MODEL_PROVIDER_MAPPING[modelName];\n }\n\n // 模糊匹配:基于模型名称前缀或关键词\n const lowerModelName = modelName.toLowerCase();\n\n if (lowerModelName.includes('gemini') || lowerModelName.includes('bison')) {\n return AIProvider.GEMINI;\n }\n\n if (lowerModelName.includes('deepseek')) {\n return AIProvider.DEEPSEEK;\n }\n\n if (lowerModelName.includes('claude')) {\n return AIProvider.ANTHROPIC;\n }\n\n if (lowerModelName.includes('gpt') || lowerModelName.includes('o1')) {\n return AIProvider.OPENAI;\n }\n\n if (lowerModelName.includes('qwen') || lowerModelName.includes('tongyi')) {\n return AIProvider.ALIYUN;\n }\n\n // 如果包含 '/' 符号,可能是OpenRouter格式\n if (lowerModelName.includes('/')) {\n return AIProvider.OPENROUTER;\n }\n\n // 默认返回GEMINI\n return AIProvider.GEMINI;\n}\n\n/**\n * 获取指定提供商的环境变量名称\n * @param provider AI提供商\n * @returns 环境变量名称\n */\nexport function getEnvVarForProvider(provider: AIProvider): string {\n const envVarMap: Record<AIProvider, string> = {\n [AIProvider.GEMINI]: 'GEMINI_API_KEY',\n [AIProvider.DEEPSEEK]: 'DEEPSEEK_API_KEY',\n [AIProvider.ANTHROPIC]: 'ANTHROPIC_API_KEY',\n [AIProvider.OPENAI]: 'OPENAI_API_KEY',\n [AIProvider.OPENROUTER]: 'OPENROUTER_API_KEY',\n [AIProvider.ALIYUN]: 'DASHSCOPE_API_KEY',\n };\n return envVarMap[provider];\n}\n\n/**\n * 检查指定提供商的API密钥是否已配置\n * @param provider AI提供商\n * @returns 是否已配置API密钥\n */\nexport function isProviderConfigured(provider: AIProvider): boolean {\n const envVar = getEnvVarForProvider(provider);\n return !!process.env[envVar];\n}\n\n/**\n * 获取模型的推荐配置信息\n * @param modelName 模型名称\n * @returns 配置信息对象\n */\nexport function getModelInfo(modelName: string): {\n provider: AIProvider;\n envVar: string;\n isConfigured: boolean;\n providerName: string;\n} {\n const provider = getProviderForModel(modelName);\n const envVar = getEnvVarForProvider(provider);\n const isConfigured = isProviderConfigured(provider);\n \n const providerNames: Record<AIProvider, string> = {\n [AIProvider.GEMINI]: 'Google Gemini',\n [AIProvider.DEEPSEEK]: 'DeepSeek',\n [AIProvider.ANTHROPIC]: 'Anthropic Claude',\n [AIProvider.OPENAI]: 'OpenAI',\n [AIProvider.OPENROUTER]: 'OpenRouter',\n [AIProvider.ALIYUN]: 'Alibaba Cloud (阿里云)',\n };\n\n return {\n provider,\n envVar,\n isConfigured,\n providerName: providerNames[provider],\n };\n}"}, "ef46e9403293d23c26e8e7a95ff988b1042fb3a6": {"t": 1785754534.6527617, "n": 5881, "h": "d11d7a532d25a12e", "c": "/**\n * @license\n * Copyright 2025 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AIProvider } from './aiClient.js';\n\n// 重新导出AIProvider以便其他模块使用\nexport { AIProvider };\n\n/**\n * 模型名称到提供商的映射\n * 用于根据模型名称自动确定应该使用哪个AI提供商\n */\nexport const MODEL_PROVIDER_MAPPING: Record<string, AIProvider> = {\n // Gemini 模型\n 'gemini-1.5-pro': AIProvider.GEMINI,\n 'gemini-1.5-flash': AIProvider.GEMINI,\n 'gemini-1.5-pro-002': AIProvider.GEMINI,\n 'gemini-1.5-flash-002': AIProvider.GEMINI,\n 'gemini-2.0-flash-exp': AIProvider.GEMINI,\n 'gemini-2.5-pro': AIProvider.GEMINI,\n 'gemini-pro': AIProvider.GEMINI,\n 'gemini-pro-vision': AIProvider.GEMINI,\n\n // DeepSeek 模型\n 'deepseek-chat': AIProvider.DEEPSEEK,\n 'deepseek-coder': AIProvider.DEEPSEEK,\n 'deepseek-reasoner': AIProvider.DEEPSEEK,\n 'deepseek-v3': AIProvider.DEEPSEEK,\n 'deepseek-r1': AIProvider.DEEPSEEK,\n\n // Anthropic 模型\n 'claude-3-5-sonnet-20241022': AIProvider.ANTHROPIC,\n 'claude-3-5-sonnet-20240620': AIProvider.ANTHROPIC,\n 'claude-3-5-haiku-20241022': AIProvider.ANTHROPIC,\n 'claude-3-opus-20240229': AIProvider.ANTHROPIC,\n 'claude-3-sonnet-20240229': AIProvider.ANTHROPIC,\n 'claude-3-haiku-20240307': AIProvider.ANTHROPIC,\n 'claude-2.1': AIProvider.ANTHROPIC,\n 'claude-2.0': AIProvider.ANTHROPIC,\n 'claude-instant-1.2': AIProvider.ANTHROPIC,\n\n // OpenAI 模型\n 'gpt-4o': AIProvider.OPENAI,\n 'gpt-4o-mini': AIProvider.OPENAI,\n 'gpt-4-turbo': AIProvider.OPENAI,\n 'gpt-4': AIProvider.OPENAI,\n 'gpt-3.5-turbo': AIProvider.OPENAI,\n 'o1-preview': AIProvider.OPENAI,\n 'o1-mini': AIProvider.OPENAI,\n\n // 阿里云通义千问模型\n 'qwen-turbo': AIProvider.ALIYUN,\n 'qwen-plus': AIProvider.ALIYUN,\n 'qwen-max': AIProvider.ALIYUN,\n 'qwen-long': AIProvider.ALIYUN,\n 'qwen-max-longcontext': AIProvider.ALIYUN,\n 'qwen-vl-plus': AIProvider.ALIYUN,\n 'qwen-vl-max': AIProvider.ALIYUN,\n 'qwen-audio-turbo': AIProvider.ALIYUN,\n 'qwen-audio-chat': AIProvider.ALIYUN,\n \n // Qwen2.5 系列模型\n 'qwen2.5-72b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-32b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-14b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-3b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-1.5b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-0.5b-instruct': AIProvider.ALIYUN,\n \n // Qwen Coder 系列模型\n 'qwen-coder-turbo': AIProvider.ALIYUN,\n 'qwen-coder-plus': AIProvider.ALIYUN,\n 'qwen2.5-coder-32b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-14b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-3b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-coder-1.5b-instruct': AIProvider.ALIYUN,\n \n // Qwen Math 系列模型\n 'qwen2.5-math-72b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-math-7b-instruct': AIProvider.ALIYUN,\n 'qwen2.5-math-1.5b-instruct': AIProvider.ALIYUN,\n\n // OpenRouter 模型 (通常带有提供商前缀)\n 'openai/gpt-4o': AIProvider.OPENROUTER,\n 'openai/gpt-4o-mini': AIProvider.OPENROUTER,\n 'openai/gpt-3.5-turbo': AIProvider.OPENROUTER,\n 'anthropic/claude-3.5-sonnet': AIProvider.OPENROUTER,\n 'anthropic/claude-3-opus': AIProvider.OPENROUTER,\n 'deepseek/deepseek-chat': AIProvider.OPENROUTER,\n 'google/gemini-pro': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-405b-instruct': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-70b-instruct': AIProvider.OPENROUTER,\n 'meta-llama/llama-3.1-8b-instruct': AIProvider.OPENROUTER,\n};\n\n/**\n * 根据模型名称获取对应的AI提供商\n * @param modelName 模型名称\n * @returns AI提供商,如果未找到映射则返回GEMINI作为默认值\n */\nexport function getProviderForModel(modelName: string): AIProvider {\n // 直接查找映射\n if (MODEL_PROVIDER_MAPPING[modelName]) {\n return MODEL_PROVIDER_MAPPING[modelName];\n }\n\n // 模糊匹配:基于模型名称前缀或关键词\n const lowerModelName = modelName.toLowerCase();\n\n if (lowerModelName.includes('gemini') || lowerModelName.includes('bison')) {\n return AIProvider.GEMINI;\n }\n\n if (lowerModelName.includes('deepseek')) {\n return AIProvider.DEEPSEEK;\n }\n\n if (lowerModelName.includes('claude')) {\n return AIProvider.ANTHROPIC;\n }\n\n if (lowerModelName.includes('gpt') || lowerModelName.includes('o1')) {\n return AIProvider.OPENAI;\n }\n\n if (lowerModelName.includes('qwen') || lowerModelName.includes('tongyi')) {\n return AIProvider.ALIYUN;\n }\n\n // 如果包含 '/' 符号,可能是OpenRouter格式\n if (lowerModelName.includes('/')) {\n return AIProvider.OPENROUTER;\n }\n\n // 默认返回GEMINI\n return AIProvider.GEMINI;\n}\n\n/**\n * 获取指定提供商的环境变量名称\n * @param provider AI提供商\n * @returns 环境变量名称\n */\nexport function getEnvVarForProvider(provider: AIProvider): string {\n const envVarMap: Record<AIProvider, string> = {\n [AIProvider.GEMINI]: 'UEVO_API_KEY',\n [AIProvider.DEEPSEEK]: 'DEEPSEEK_API_KEY',\n [AIProvider.ANTHROPIC]: 'ANTHROPIC_API_KEY',\n [AIProvider.OPENAI]: 'OPENAI_API_KEY',\n [AIProvider.OPENROUTER]: 'OPENROUTER_API_KEY',\n [AIProvider.ALIYUN]: 'DASHSCOPE_API_KEY',\n };\n return envVarMap[provider];\n}\n\n/**\n * 检查指定提供商的API密钥是否已配置\n * @param provider AI提供商\n * @returns 是否已配置API密钥\n */\nexport function isProviderConfigured(provider: AIProvider): boolean {\n const envVar = getEnvVarForProvider(provider);\n return !!process.env[envVar];\n}\n\n/**\n * 获取模型的推荐配置信息\n * @param modelName 模型名称\n * @returns 配置信息对象\n */\nexport function getModelInfo(modelName: string): {\n provider: AIProvider;\n envVar: string;\n isConfigured: boolean;\n providerName: string;\n} {\n const provider = getProviderForModel(modelName);\n const envVar = getEnvVarForProvider(provider);\n const isConfigured = isProviderConfigured(provider);\n \n const providerNames: Record<AIProvider, string> = {\n [AIProvider.GEMINI]: 'Google Gemini',\n [AIProvider.DEEPSEEK]: 'DeepSeek',\n [AIProvider.ANTHROPIC]: 'Anthropic Claude',\n [AIProvider.OPENAI]: 'OpenAI',\n [AIProvider.OPENROUTER]: 'OpenRouter',\n [AIProvider.ALIYUN]: 'Alibaba Cloud (阿里云)',\n };\n\n return {\n provider,\n envVar,\n isConfigured,\n providerName: providerNames[provider],\n };\n}"}}}}