{"repo": "2404589803/llm-api-testsuite", "files": {"index.js": {"2f87bace9ca03abb43cbe25d8f9797bfb48a22b5": {"t": 1785746018.219666, "n": 11055, "h": "60a4bcf327c51769", "c": "const baseUrls = {\n \"Baichuan\": {\n \"base_url\": \"https://api.baichuan-ai.com/v1\",\n \"chinese_name\": \"百川\"\n },\n \"DeepSeek\": {\n \"base_url\": \"https://api.deepseek.com\",\n \"chinese_name\": \"深度求索\"\n },\n \"Moonshot\": {\n \"base_url\": \"https://api.moonshot.cn/v1\",\n \"chinese_name\": \"月之暗面\"\n },\n \"OpenAI\": {\n \"base_url\": \"https://api.openai.com/v1\",\n \"chinese_name\": \"OpenAI\"\n },\n \"Qwen\": {\n \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n \"chinese_name\": \"通义千问\"\n },\n \"StepFun\": {\n \"base_url\": \"https://api.stepfun.com/v1\",\n \"chinese_name\": \"阶跃星辰\"\n },\n \"Zhipu\": {\n \"base_url\": \"https://open.bigmodel.cn/api/paas/v4/\",\n \"chinese_name\": \"智谱\"\n }\n};\n\nlet baseUrl = '';\nlet apiKey = '';\nlet models = [];\nlet currentTestingModel = null;\nlet isExpanded = false;\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const baseUrlSelect = document.getElementById('baseUrlSelect');\n const customBaseUrl = document.getElementById('customBaseUrl');\n const apiKeyInput = document.getElementById('apiKey');\n const apiKeyMask = document.getElementById('apiKeyMask');\n\n // 添加选项到下拉菜单\n for (const [key, value] of Object.entries(baseUrls)) {\n const option = document.createElement('option');\n option.value = key;\n option.textContent = value.chinese_name;\n baseUrlSelect.appendChild(option);\n }\n\n // 添加自定义选项\n const customOption = document.createElement('option');\n customOption.value = 'custom';\n customOption.textContent = '自定义';\n baseUrlSelect.appendChild(customOption);\n\n // 默认选择 OpenAI\n baseUrlSelect.value = 'OpenAI';\n\n // 处理下拉菜单变化\n baseUrlSelect.addEventListener('change', () => {\n if (baseUrlSelect.value === 'custom') {\n customBaseUrl.classList.remove('hidden');\n } else {\n customBaseUrl.classList.add('hidden');\n }\n });\n\n // 处理 API Key 输入\n apiKeyInput.addEventListener('input', () => {\n const maxVisibleChars = Math.floor(apiKeyInput.offsetWidth / 8) - 3; // 估算可见字符数\n const visibleStars = '*'.repeat(Math.min(apiKeyInput.value.length, maxVisibleChars));\n apiKeyMask.textContent = visibleStars + (apiKeyInput.value.length > maxVisibleChars ? '...' : '');\n });\n\n apiKeyInput.addEventListener('focus', () => {\n apiKeyMask.style.display = 'none';\n });\n\n apiKeyInput.addEventListener('blur', () => {\n if (apiKeyInput.value) {\n apiKeyMask.style.display = 'block';\n }\n });\n\n // 点击遮罩层时显示实际的 API Key 并允许编辑\n apiKeyMask.addEventListener('click', () => {\n apiKeyMask.style.display = 'none';\n apiKeyInput.focus();\n });\n\n document.getElementById('fetchModels').addEventListener('click', fetchModels);\n});\n\nasync function fetchModels() {\n const fetchButton = document.getElementById('fetchModels');\n const modelList = document.getElementById('modelList');\n \n fetchButton.disabled = true;\n fetchButton.innerHTML = '获取中';\n\n // 清空之前的模型列表\n modelList.innerHTML = '';\n\n const baseUrlSelect = document.getElementById('baseUrlSelect');\n const customBaseUrl = document.getElementById('customBaseUrl');\n \n if (baseUrlSelect.value === 'custom') {\n baseUrl = customBaseUrl.value.trim();\n } else {\n baseUrl = baseUrls[baseUrlSelect.value].base_url;\n }\n apiKey = document.getElementById('apiKey').value;\n\n if (!baseUrl || !apiKey) {\n displayError('请选择服务商(或输入自定义 Base URL)并输入 API Key');\n resetFetchButton(fetchButton);\n return;\n }\n\n try {\n const response = await fetch(`${baseUrl}/models`, {\n headers: { 'Authorization': `Bearer ${apiKey}` }\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const data = await response.json();\n models = data.data;\n await Promise.all(models.map(model => pingModel(model.id)));\n sortAndDisplayModels();\n } catch (error) {\n displayError(`获取模型列表失败: ${error.message}`);\n } finally {\n resetFetchButton(fetchButton);\n }\n}\n\nfunction displayError(message) {\n const modelList = document.getElementById('modelList');\n modelList.innerHTML = `\n