lifekline / test-apis.js
xiaobo ren
Update Gemini models to use available models (2.5-pro, 2.5-flash, 2.0-flash) and expand API test coverage
58d2e5a
/**
* 测试所有 API 连接
* 运行: node test-apis.js
*/
import { buildApiRequest, parseApiResponse, getApiConfigForModel } from './server/apiConfig.js';
import fetch from 'node-fetch';
const testModels = [
// OpenAI Models
{ name: 'gpt-5.1', provider: 'OpenAI GPT-5.1' },
{ name: 'gpt-5-mini', provider: 'OpenAI GPT-5 Mini' },
{ name: 'gpt-4.1', provider: 'OpenAI GPT-4.1' },
{ name: 'gpt-4o', provider: 'OpenAI GPT-4o' },
{ name: 'gpt-4o-mini', provider: 'OpenAI GPT-4o Mini' },
{ name: 'gpt-4-turbo', provider: 'OpenAI GPT-4 Turbo' },
// Grok Models (xAI)
{ name: 'grok-4-0709', provider: 'Grok 4 (xAI)' },
{ name: 'grok-4-1-fast-reasoning', provider: 'Grok 4.1 Fast Reasoning (xAI)' },
{ name: 'grok-4-1-fast-non-reasoning', provider: 'Grok 4.1 Fast Non-Reasoning (xAI)' },
{ name: 'grok-4-fast-reasoning', provider: 'Grok 4 Fast Reasoning (xAI)' },
// Claude Models (Anthropic)
{ name: 'claude-opus-4-5', provider: 'Claude Opus 4.5 (Anthropic)' },
{ name: 'claude-sonnet-4-5', provider: 'Claude Sonnet 4.5 (Anthropic)' },
{ name: 'claude-3-5-haiku-20241022', provider: 'Claude Haiku 3.5 (Anthropic)' },
// Gemini Models (Google)
{ name: 'gemini-2.5-pro', provider: 'Gemini 2.5 Pro (Google)' },
{ name: 'gemini-2.5-flash', provider: 'Gemini 2.5 Flash (Google)' },
{ name: 'gemini-2.0-flash', provider: 'Gemini 2.0 Flash (Google)' },
];
async function testAllApis() {
console.log('开始测试所有 API 连接...\n');
const results = [];
for (const { name, provider } of testModels) {
try {
console.log(`测试 ${provider} (${name})...`);
const config = getApiConfigForModel(name);
console.log(` API URL: ${config.baseUrl}`);
console.log(` 格式: ${config.format}`);
const testPrompt = 'Say "Hello" in one word.';
const apiRequest = buildApiRequest(name, 'You are a helpful assistant.', testPrompt, 0.7);
console.log(` 请求 URL: ${apiRequest.url.substring(0, 80)}...`);
const startTime = Date.now();
const response = await fetch(apiRequest.url, {
method: 'POST',
headers: apiRequest.headers,
body: JSON.stringify(apiRequest.body),
});
const elapsed = ((Date.now() - startTime) / 1000).toFixed(2);
if (!response.ok) {
const errorText = await response.text();
console.log(` ❌ 失败: HTTP ${response.status}`);
console.log(` 错误: ${errorText.substring(0, 150)}`);
results.push({
provider,
model: name,
status: 'FAILED',
statusCode: response.status,
error: errorText.substring(0, 200),
elapsed,
});
console.log('');
continue;
}
const data = await response.json();
const content = parseApiResponse(data, name);
console.log(` ✅ 成功: ${content?.substring(0, 50) || 'Empty response'}`);
console.log(` 响应时间: ${elapsed}s\n`);
results.push({
provider,
model: name,
status: 'SUCCESS',
statusCode: response.status,
response: content?.substring(0, 100) || 'Empty response',
elapsed,
});
} catch (error) {
console.log(` ❌ 异常: ${error.message}\n`);
results.push({
provider,
model: name,
status: 'ERROR',
error: error.message,
});
}
}
console.log('\n=== 测试结果汇总 ===');
const successCount = results.filter(r => r.status === 'SUCCESS').length;
const failCount = results.filter(r => r.status !== 'SUCCESS').length;
console.log(`成功: ${successCount}/${testModels.length}`);
console.log(`失败: ${failCount}/${testModels.length}\n`);
results.forEach(r => {
const icon = r.status === 'SUCCESS' ? '✅' : '❌';
console.log(`${icon} ${r.provider} (${r.model}): ${r.status}`);
if (r.status === 'SUCCESS') {
console.log(` 响应: ${r.response}`);
console.log(` 时间: ${r.elapsed}s`);
} else if (r.error) {
console.log(` 错误: ${r.error.substring(0, 100)}`);
}
console.log('');
});
return results;
}
testAllApis().catch(console.error);