"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.config = void 0; const dotenv_1 = __importDefault(require("dotenv")); const path_1 = __importDefault(require("path")); const fs_1 = __importDefault(require("fs")); // 使用 process.cwd() 获取项目根目录(server目录) const projectRoot = process.cwd(); dotenv_1.default.config({ path: path_1.default.resolve(projectRoot, '.env') }); // 加载模型配置 const modelsConfig = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, 'models.json'), 'utf-8')); // 获取所有模型(扁平化) function getAllModels() { const models = []; for (const [vendorKey, vendor] of Object.entries(modelsConfig.vendors)) { for (const model of vendor.models) { models.push({ ...model, vendor: vendorKey, vendorName: vendor.name, baseUrl: vendor.baseUrl, apiKey: vendor.apiKey, apiType: vendor.apiType, }); } } return models; } // 获取启用的模型 function getEnabledModels() { return getAllModels().filter((m) => m.enabled); } // 根据 ID 获取模型配置 function getModel(id) { return getAllModels().find((m) => m.id === id); } // 根据类型获取模型列表 (text, tts, image, video) function getModelsByType(type) { return getAllModels().filter((m) => m.input?.includes(type) && m.enabled); } // 检查模型是否可切换(根据错误类型判断是否需要切换) function shouldSwitchModel(error) { if (!error) return false; const message = error?.message || error?.error?.message || ''; // 限流、余额不足、服务不可用、模型不支持等错误需要切换 const switchableErrors = [ 'rate limit', 'quota', 'token', 'balance', 'insufficient', 'invalid model', 'model not found', 'model not support', '429', '403', '502', '503', '504', 'too many requests', '请求过于频繁' ]; return switchableErrors.some(e => message.toLowerCase().includes(e)); } // 获取下一个可用模型(用于自动切换) function getNextModel(currentModelId, type) { const models = getModelsByType(type); const currentIndex = models.findIndex((m) => m.id === currentModelId); if (currentIndex === -1 || currentIndex >= models.length - 1) { return null; // 没有下一个模型 } return models[currentIndex + 1].id; } exports.config = { port: parseInt(process.env.PORT || '3000', 10), nodeEnv: process.env.NODE_ENV || 'development', mongodb: { uri: process.env.MONGODB_URI || 'mongodb://localhost:27017/audio-book', }, jwt: { // 临时硬编码,确保登录和验证一致 secret: 'my-jwt-secret-key-2024', expiresIn: process.env.JWT_EXPIRES_IN || '7d', }, // 阿里云百炼 DashScope TTS dashscope: { apiKey: process.env.DASHSCOPE_API_KEY || '', model: process.env.DASHSCOPE_MODEL || 'qwen3-tts-instruct-flash', voice: process.env.DASHSCOPE_VOICE || 'Cherry', // 可用 TTS 模型列表(随机选用) ttsModels: (process.env.DASHSCOPE_TTS_MODELS || 'qwen3-tts-instruct-flash').split(',').filter(Boolean), // 长文本模式使用 WebSocket 实时合成 useRealtime: process.env.DASHSCOPE_USE_REALTIME === 'true', realtimeModel: process.env.DASHSCOPE_REALTIME_MODEL || 'qwen3-tts-instruct-flash-realtime', }, // 模型配置(统一管理) models: { vendors: modelsConfig.vendors, list: getAllModels(), enabled: getEnabledModels(), getModel, getModelsByType, shouldSwitchModel, getNextModel, textGeneration: { defaultModel: modelsConfig.textGeneration.defaultModel, }, tts: { defaultModel: modelsConfig.tts.defaultModel, defaultVoice: modelsConfig.tts.defaultVoice, }, }, upload: { dir: path_1.default.join(process.cwd(), 'uploads'), maxSize: 50 * 1024 * 1024, // 50MB }, };