/** * normalizeConfig —— configSource 出口的唯一归一点。 * * `mode_model_config` 全量行的多形态(chain 为 JSON 文本 vs 已解析数组、含 enabled=0 行 vs 不含) * 在此一次性收敛为内部唯一形态 `{ [mode]: Array<{provider,model}> }`。经此之后,mode-router.js / * fallback.js 内部零 JSON.parse、零 Array.isArray、零空值分支——形态收口即此函数职责。 */ /** * @typedef {object} ModeConfigRow * @property {string} mode * @property {string|Array<{provider:string,model:string}>} chain JSON 文本或已解析数组(驱动侧差异)。 * @property {number|boolean} enabled */ /** * @param {ModeConfigRow[]} rows mode_model_config 全量行。 * @returns {{ [mode: string]: Array<{ provider: string, model: string }> }} */ export function normalizeConfig(rows) { /** @type {{ [mode: string]: Array<{ provider: string, model: string }> }} */ const config = {} for (const row of rows) { if (!row.enabled) continue const chain = typeof row.chain === 'string' ? JSON.parse(row.chain) : row.chain config[row.mode] = chain.map(({ provider, model }) => ({ provider, model })) } return config }