| 6 | * @returns {Object} 包含apiKeys数组和adminKey的对象 |
| 7 | */ |
| 8 | const parseApiKeys = (apiKeyEnv = process.env.API_KEY) => { |
| 9 | if (!apiKeyEnv) { |
| 10 | return { apiKeys: [], adminKey: null } |
| 11 | } |
| 12 | |
| 13 | const slots = apiKeyEnv.split(',').map(key => key.trim()) |
| 14 | // 空槽位 = 变量没展开(`API_KEY=${A},${B}` 里 A 未定义就变成 `,B`)。旧代码把空槽 |
| 15 | // 过滤掉照常启动:admin key 静默变成了后面那个客户端 key,dashboard 用真正的 admin |
| 16 | // key 反而报 "invalid"。2026-09-16 qwen-next 就是这样丢掉后台访问的。没人会故意写 |
| 17 | // 出空槽,所以这里直接拒绝启动,而不是带着残缺的密钥表跑下去。 |
| 18 | const emptyAt = slots.map((key, index) => (key.length === 0 ? index + 1 : 0)).filter(Boolean) |
| 19 | if (emptyAt.length > 0) { |
| 20 | throw new Error( |
| 21 | `API_KEY 有 ${emptyAt.length} 个空槽位(第 ${emptyAt.join('、')} 位,共 ${slots.length} 位)——` + |
| 22 | '多半是环境变量没有展开。请检查部署时是否注入了全部密钥(例如 compose 的 ${...} 是否有值)。' |