Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/adonisjinggw_hjzl.json
T

1 line
11 KiB
JSON

{"repo": "adonisjinggw/hjzl", "files": {"services/apiConfigValidator.ts": {"48cd6fbcda3a638f39114a5e6a8802d8fba594bd": {"t": 1785768879.1255078, "n": 9268, "h": "a32d758ab95a23fa", "c": "/**\n * API配置验证服务\n * 统一检查和验证所有API服务的配置问题\n */\n\nimport type { ApiConfig } from '../types';\n\n/**\n * API验证结果接口\n */\nexport interface ApiValidationResult {\n provider: string;\n category: 'text' | 'image';\n status: 'valid' | 'warning' | 'error' | 'missing';\n message: string;\n suggestions?: string[];\n autoFix?: () => ApiConfig;\n}\n\n/**\n * 已知的正确API端点配置\n */\nconst CORRECT_ENDPOINTS: Record<string, string> = {\n // 文本生成服务\n 'openai': 'https://api.openai.com/v1',\n 'gemini': 'https://generativelanguage.googleapis.com/v1beta',\n 'anthropic': 'https://api.anthropic.com/v1',\n 'deepseek': 'https://api.deepseek.com/v1',\n 'zhipu': 'https://open.bigmodel.cn/api/paas/v4',\n 'moonshot': 'https://api.moonshot.cn/v1',\n 'siliconflow': 'https://api.siliconflow.cn/v1',\n 'groq': 'https://api.groq.com/openai/v1',\n 'hunyuan': 'https://api.hunyuan.cloud.tencent.com/v1',\n \n // 图像生成服务\n 'openai_dalle': 'https://api.openai.com/v1',\n 'stability': 'https://api.stability.ai/v1',\n 'tencent_hunyuan': 'https://api.hunyuan.cloud.tencent.com/v1',\n 'jiemeng': 'https://visual.volcengineapi.com',\n 'pollinations': 'https://image.pollinations.ai',\n 'huggingface': 'https://api-inference.huggingface.co'\n};\n\n/**\n * API密钥格式验证规则\n */\nconst API_KEY_PATTERNS: Record<string, RegExp> = {\n 'openai': /^sk-[A-Za-z0-9]{48,}$/,\n 'openai_dalle': /^sk-[A-Za-z0-9]{48,}$/,\n 'anthropic': /^sk-ant-[A-Za-z0-9\\-_]{95,}$/,\n 'gemini': /^[A-Za-z0-9\\-_]{39}$/,\n 'deepseek': /^sk-[A-Za-z0-9]{48,}$/,\n 'stability': /^sk-[A-Za-z0-9]{64}$/,\n 'zhipu': /^[A-Za-z0-9]{32}\\.[A-Za-z0-9]{6}$/,\n 'moonshot': /^sk-[A-Za-z0-9]{48,}$/,\n 'siliconflow': /^sk-[A-Za-z0-9]{48,}$/,\n 'tencent_hunyuan': /^sk-[A-Za-z0-9\\-_]{20,}$/,\n 'jiemeng': /^[A-Za-z0-9]{32,}$/\n};\n\n/**\n * 验证单个API配置\n */\nexport function validateApiConfig(\n provider: string,\n config: any,\n category: 'text' | 'image'\n): ApiValidationResult {\n const result: ApiValidationResult = {\n provider,\n category,\n status: 'valid',\n message: '配置正常',\n suggestions: []\n };\n\n // 检查是否配置了API密钥\n if (!config?.apiKey) {\n return {\n ...result,\n status: 'missing',\n message: '未配置API密钥',\n suggestions: ['请在对应的配置页面中添加有效的API密钥']\n };\n }\n\n // 检查API密钥格式\n const keyPattern = API_KEY_PATTERNS[provider];\n if (keyPattern && !keyPattern.test(config.apiKey)) {\n result.status = 'warning';\n result.message = 'API密钥格式可能不正确';\n result.suggestions?.push(\n `${provider} API密钥格式通常为:${getExpectedKeyFormat(provider)}`\n );\n }\n\n // 检查端点配置\n const customEndpoint = config.customEndpoint;\n const correctEndpoint = CORRECT_ENDPOINTS[provider];\n \n if (customEndpoint) {\n // 检查是否使用了示例地址\n if (customEndpoint.includes('api.example.com')) {\n return {\n ...result,\n status: 'error',\n message: '使用了示例API端点',\n suggestions: [\n '请更改为正确的API端点地址',\n `推荐端点:${correctEndpoint}`\n ],\n autoFix: () => createFixedConfig(provider, config, correctEndpoint)\n };\n }\n\n // 检查端点是否正确\n if (correctEndpoint && !customEndpoint.startsWith(correctEndpoint.split('/').slice(0, 3).join('/'))) {\n result.status = 'warning';\n result.message = '自定义端点可能不正确';\n result.suggestions?.push(`官方推荐端点:${correctEndpoint}`);\n }\n }\n\n // 特殊检查:腾讯混元的文生文和文生图分离\n if (provider === 'tencent_hunyuan' && category === 'image') {\n if (customEndpoint && customEndpoint.includes('hunyuan.tencentcloudapi.com')) {\n return {\n ...result,\n status: 'error',\n message: '腾讯混元图像生成不支持腾讯云原生API格式',\n suggestions: [\n '图像生成请使用OpenAI兼容格式',\n '推荐端点:https://api.hunyuan.cloud.tencent.com/v1',\n '如需使用腾讯云原生API,请等待后续版本支持'\n ],\n autoFix: () => createFixedConfig(provider, config, CORRECT_ENDPOINTS[provider])\n };\n }\n }\n\n return result;\n}\n\n/**\n * 验证完整的API配置\n */\nexport function validateFullApiConfig(config: ApiConfig): ApiValidationResult[] {\n const results: ApiValidationResult[] = [];\n\n // 验证文本生成配置\n if (config.textGeneration?.enablePaid && config.textGeneration?.provider) {\n results.push(validateApiConfig(\n config.textGeneration.provider,\n config.textGeneration,\n 'text'\n ));\n }\n\n // 验证图像生成配置\n if (config.imageGeneration?.enablePaid && config.imageGeneration?.provider) {\n results.push(validateApiConfig(\n config.imageGeneration.provider,\n config.imageGeneration,\n 'image'\n ));\n }\n\n return results;\n}\n\n/**\n * 获取API密钥的期望格式描述\n */\nfunction getExpectedKeyFormat(provider: string): string {\n const formats: Record<string, string> = {\n 'openai': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n 'openai_dalle': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n 'anthropic': 'sk-ant-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n 'gemini': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n 'deepseek': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n 'stability': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n 'zhipu': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxx',\n 'moonshot': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n 'siliconflow': 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n 'tencent_hunyuan': 'sk-xxxxxxxxxxxxxxxxxxxxx',\n 'jiemeng': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'\n };\n \n return formats[provider] || 'API密钥格式请参考官方文档';\n}\n\n/**\n * 创建修复后的配置\n */\nfunction createFixedConfig(provider: string, originalConfig: any, correctEndpoint: string): ApiConfig {\n // 这里返回一个修复建议,实际的自动修复需要在UI层面实现\n return originalConfig;\n}\n\n/**\n * 批量测试所有已配置的API连接\n */\nexport async function testAllConfiguredApis(config: ApiConfig): Promise<Record<string, any>> {\n const testResults: Record<string, any> = {};\n\n // 测试文本生成API\n if (config.textGeneration?.enablePaid && config.textGeneration?.apiKey) {\n const provider = config.textGeneration.provider;\n try {\n switch (provider) {\n case 'openai':\n const { testOpenAIConnection } = await import('./openaiService');\n testResults[provider] = await testOpenAIConnection(config.textGeneration.apiKey);\n break;\n case 'claude':\n const { testClaudeConnection } = await import('./claudeService');\n testResults[provider] = await testClaudeConnection(config.textGeneration.apiKey);\n break;\n case 'gemini':\n // Gemini测试需要特殊处理\n testResults[provider] = { success: true, message: 'Gemini配置检查完成' };\n break;\n case 'deepseek':\n const { testDeepSeekConnection } = await import('./deepseekService');\n testResults[provider] = await testDeepSeekConnection(\n config.textGeneration.apiKey, \n { model: config.textGeneration.model }\n );\n break;\n case 'hunyuan':\n const { testTencentHunyuanConnection } = await import('./tencentHunyuanService');\n testResults[provider] = await testTencentHunyuanConnection();\n break;\n // 可以继续添加其他服务商\n }\n } catch (error) {\n testResults[provider] = {\n success: false,\n message: `测试失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n\n // 测试图像生成API\n if (config.imageGeneration?.enablePaid && config.imageGeneration?.apiKey) {\n const provider = config.imageGeneration.provider;\n try {\n switch (provider) {\n case 'openai_dalle':\n const { testOpenAIDalleConnection } = await import('./openaiDalleService');\n testResults[provider] = await testOpenAIDalleConnection(config.imageGeneration.apiKey);\n break;\n case 'stability':\n const { testStabilityConnection } = await import('./stabilityService');\n testResults[provider] = await testStabilityConnection(config.imageGeneration.apiKey);\n break;\n case 'tencent_hunyuan':\n const { testTencentHunyuanImageConnection } = await import('./tencentHunyuanService');\n testResults[provider] = await testTencentHunyuanImageConnection();\n break;\n // 可以继续添加其他服务商\n }\n } catch (error) {\n testResults[provider] = {\n success: false,\n message: `测试失败: ${error instanceof Error ? error.message : '未知错误'}`\n };\n }\n }\n\n return testResults;\n}\n\n/**\n * 生成API配置健康报告\n */\nexport function generateApiHealthReport(config: ApiConfig): {\n overall: 'healthy' | 'warning' | 'critical';\n summary: string;\n details: ApiValidationResult[];\n recommendations: string[];\n} {\n const validationResults = validateFullApiConfig(config);\n \n const errorCount = validationResults.filter(r => r.status === 'error').length;\n const warningCount = validationResults.filter(r => r.status === 'warning').length;\n \n let overall: 'healthy' | 'warning' | 'critical';\n let summary: string;\n \n if (errorCount > 0) {\n overall = 'critical';\n summary = `发现 ${errorCount} 个严重配置问题需要立即修复`;\n } else if (warningCount > 0) {\n overall = 'warning';\n summary = `发现 ${warningCount} 个配置警告,建议检查优化`;\n } else {\n overall = 'healthy';\n summary = 'API配置健康,所有服务配置正常';\n }\n \n const recommendations: string[] = [\n '定期检查API密钥是否过期',\n '确保使用官方推荐的API端点',\n '监控API调用额度和使用情况',\n '备用多个API服务以确保稳定性'\n ];\n \n return {\n overall,\n summary,\n details: validationResults,\n recommendations\n };\n} "}}}}