models-validator.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. "use strict";
  2. /**
  3. * 模型验证工具 - 批量验证所有模型是否可用
  4. */
  5. var __importDefault = (this && this.__importDefault) || function (mod) {
  6. return (mod && mod.__esModule) ? mod : { "default": mod };
  7. };
  8. Object.defineProperty(exports, "__esModule", { value: true });
  9. exports.validateAllModels = validateAllModels;
  10. exports.validateModelsByType = validateModelsByType;
  11. exports.validateModel = validateModel;
  12. const openai_1 = require("@langchain/openai");
  13. const index_1 = require("./index");
  14. const fs_1 = __importDefault(require("fs"));
  15. const path_1 = __importDefault(require("path"));
  16. /**
  17. * 验证单个模型是否可用
  18. */
  19. async function validateModel(model) {
  20. const result = {
  21. id: model.id,
  22. name: model.name,
  23. input: model.input,
  24. vendor: model.vendorName || model.vendor,
  25. available: false,
  26. };
  27. // 检查 baseUrl 和 apiKey(现在在 vendor 级别,通过 config 注入到 model)
  28. if (!model.apiKey || !model.baseUrl) {
  29. result.error = '缺少 apiKey 或 baseUrl';
  30. return result;
  31. }
  32. const startTime = Date.now();
  33. try {
  34. // 只有 text 类型用 LangChain 测试
  35. if (model.input?.includes('text')) {
  36. const llm = new openai_1.ChatOpenAI({
  37. model: model.id,
  38. apiKey: model.apiKey,
  39. configuration: { baseURL: model.baseUrl },
  40. temperature: 0.7,
  41. timeout: 15000,
  42. });
  43. await llm.invoke('你好');
  44. }
  45. else {
  46. // TTS/Image/Video 暂时标记为待验证(需要不同的 SDK)
  47. result.available = false;
  48. result.responseTime = Date.now() - startTime;
  49. result.error = '需要手动验证';
  50. return result;
  51. }
  52. result.available = true;
  53. result.responseTime = Date.now() - startTime;
  54. }
  55. catch (error) {
  56. result.responseTime = Date.now() - startTime;
  57. const errorMsg = error.response?.data?.message || error.message || '未知错误';
  58. result.error = errorMsg;
  59. // 检查是否是认证错误(key 无效)
  60. if (error.response?.status === 401 || errorMsg.includes('invalid')) {
  61. result.error = `认证失败: ${errorMsg}`;
  62. }
  63. else if (error.response?.status === 403) {
  64. result.error = `权限不足: ${errorMsg}`;
  65. }
  66. else if (error.response?.status === 429) {
  67. result.error = `限流: ${errorMsg}`;
  68. }
  69. }
  70. return result;
  71. }
  72. /**
  73. * 批量验证所有模型
  74. */
  75. async function validateAllModels() {
  76. const models = index_1.config.models.list.filter((m) => m.enabled !== false);
  77. const results = [];
  78. console.log('\n========== 模型验证开始 ==========\n');
  79. for (const model of models) {
  80. process.stdout.write(`验证 ${model.id}... `);
  81. const result = await validateModel(model);
  82. results.push(result);
  83. if (result.available) {
  84. console.log(`✅ 可用 (${result.responseTime}ms)`);
  85. }
  86. else {
  87. console.log(`❌ 不可用 - ${result.error}`);
  88. }
  89. }
  90. const availableCount = results.filter(r => r.available).length;
  91. const unavailableCount = results.filter(r => !r.available).length;
  92. console.log('\n========== 验证结果 ==========');
  93. console.log(`总计: ${models.length} | 可用: ${availableCount} | 不可用: ${unavailableCount}`);
  94. const report = {
  95. timestamp: new Date().toISOString(),
  96. totalModels: models.length,
  97. availableModels: availableCount,
  98. unavailableModels: unavailableCount,
  99. results,
  100. };
  101. // 保存报告到文件
  102. const reportPath = path_1.default.join(process.cwd(), 'model-validation-report.json');
  103. fs_1.default.writeFileSync(reportPath, JSON.stringify(report, null, 2));
  104. console.log(`\n详细报告已保存: ${reportPath}`);
  105. return report;
  106. }
  107. /**
  108. * 仅验证特定类型的模型
  109. */
  110. async function validateModelsByType(type) {
  111. const models = index_1.config.models.getModelsByType(type);
  112. const results = [];
  113. console.log(`\n========== 验证 ${type} 模型 ==========\n`);
  114. for (const model of models) {
  115. process.stdout.write(`验证 ${model.id}... `);
  116. const result = await validateModel(model);
  117. results.push(result);
  118. if (result.available) {
  119. console.log(`✅ 可用 (${result.responseTime}ms)`);
  120. }
  121. else {
  122. console.log(`❌ 不可用 - ${result.error}`);
  123. }
  124. }
  125. const report = {
  126. timestamp: new Date().toISOString(),
  127. totalModels: models.length,
  128. availableModels: results.filter(r => r.available).length,
  129. unavailableModels: results.filter(r => !r.available).length,
  130. results,
  131. };
  132. return report;
  133. }
  134. // 如果直接运行此文件,执行验证
  135. if (require.main === module) {
  136. const args = process.argv.slice(2);
  137. const type = args[0];
  138. (async () => {
  139. if (type) {
  140. await validateModelsByType(type);
  141. }
  142. else {
  143. await validateAllModels();
  144. }
  145. process.exit(0);
  146. })();
  147. }