| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- "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
- },
- };
|