| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- "use strict";
- /**
- * 模型验证工具 - 批量验证所有模型是否可用
- */
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.validateAllModels = validateAllModels;
- exports.validateModelsByType = validateModelsByType;
- exports.validateModel = validateModel;
- const openai_1 = require("@langchain/openai");
- const index_1 = require("./index");
- const fs_1 = __importDefault(require("fs"));
- const path_1 = __importDefault(require("path"));
- /**
- * 验证单个模型是否可用
- */
- async function validateModel(model) {
- const result = {
- id: model.id,
- name: model.name,
- input: model.input,
- vendor: model.vendorName || model.vendor,
- available: false,
- };
- // 检查 baseUrl 和 apiKey(现在在 vendor 级别,通过 config 注入到 model)
- if (!model.apiKey || !model.baseUrl) {
- result.error = '缺少 apiKey 或 baseUrl';
- return result;
- }
- const startTime = Date.now();
- try {
- // 只有 text 类型用 LangChain 测试
- if (model.input?.includes('text')) {
- const llm = new openai_1.ChatOpenAI({
- model: model.id,
- apiKey: model.apiKey,
- configuration: { baseURL: model.baseUrl },
- temperature: 0.7,
- timeout: 15000,
- });
- await llm.invoke('你好');
- }
- else {
- // TTS/Image/Video 暂时标记为待验证(需要不同的 SDK)
- result.available = false;
- result.responseTime = Date.now() - startTime;
- result.error = '需要手动验证';
- return result;
- }
- result.available = true;
- result.responseTime = Date.now() - startTime;
- }
- catch (error) {
- result.responseTime = Date.now() - startTime;
- const errorMsg = error.response?.data?.message || error.message || '未知错误';
- result.error = errorMsg;
- // 检查是否是认证错误(key 无效)
- if (error.response?.status === 401 || errorMsg.includes('invalid')) {
- result.error = `认证失败: ${errorMsg}`;
- }
- else if (error.response?.status === 403) {
- result.error = `权限不足: ${errorMsg}`;
- }
- else if (error.response?.status === 429) {
- result.error = `限流: ${errorMsg}`;
- }
- }
- return result;
- }
- /**
- * 批量验证所有模型
- */
- async function validateAllModels() {
- const models = index_1.config.models.list.filter((m) => m.enabled !== false);
- const results = [];
- console.log('\n========== 模型验证开始 ==========\n');
- for (const model of models) {
- process.stdout.write(`验证 ${model.id}... `);
- const result = await validateModel(model);
- results.push(result);
- if (result.available) {
- console.log(`✅ 可用 (${result.responseTime}ms)`);
- }
- else {
- console.log(`❌ 不可用 - ${result.error}`);
- }
- }
- const availableCount = results.filter(r => r.available).length;
- const unavailableCount = results.filter(r => !r.available).length;
- console.log('\n========== 验证结果 ==========');
- console.log(`总计: ${models.length} | 可用: ${availableCount} | 不可用: ${unavailableCount}`);
- const report = {
- timestamp: new Date().toISOString(),
- totalModels: models.length,
- availableModels: availableCount,
- unavailableModels: unavailableCount,
- results,
- };
- // 保存报告到文件
- const reportPath = path_1.default.join(process.cwd(), 'model-validation-report.json');
- fs_1.default.writeFileSync(reportPath, JSON.stringify(report, null, 2));
- console.log(`\n详细报告已保存: ${reportPath}`);
- return report;
- }
- /**
- * 仅验证特定类型的模型
- */
- async function validateModelsByType(type) {
- const models = index_1.config.models.getModelsByType(type);
- const results = [];
- console.log(`\n========== 验证 ${type} 模型 ==========\n`);
- for (const model of models) {
- process.stdout.write(`验证 ${model.id}... `);
- const result = await validateModel(model);
- results.push(result);
- if (result.available) {
- console.log(`✅ 可用 (${result.responseTime}ms)`);
- }
- else {
- console.log(`❌ 不可用 - ${result.error}`);
- }
- }
- const report = {
- timestamp: new Date().toISOString(),
- totalModels: models.length,
- availableModels: results.filter(r => r.available).length,
- unavailableModels: results.filter(r => !r.available).length,
- results,
- };
- return report;
- }
- // 如果直接运行此文件,执行验证
- if (require.main === module) {
- const args = process.argv.slice(2);
- const type = args[0];
- (async () => {
- if (type) {
- await validateModelsByType(type);
- }
- else {
- await validateAllModels();
- }
- process.exit(0);
- })();
- }
|