import re PATH = '/data/ai/audio/server/dist/services/llm/index.js' with open(PATH, 'r', encoding='utf-8') as f: src = f.read() # 替换 resolveProviderKey:vendor + apiKey 指纹 OLD = """function resolveProviderKey(modelId) { const cfg = config_1.config.models.getModel?.(modelId); if (cfg?.vendor) return cfg.vendor; // fallback: 从 registry 查找 const registry = (0, provider_registry_1.getLlmRegistry)(); for (const node of registry.listEnabled()) { if (node.provider.hasModel(modelId)) return node.provider.vendor; } return modelId; }""" NEW = """function resolveProviderKey(modelId) { const cfg = config_1.config.models.getModel?.(modelId); if (cfg?.vendor) { // 关键: 用 vendor+apiKey 指纹区分同一个 vendor 的不同 key (例如 minimax Key1 vs Key2) // 这样 fallback 不会把两个独立 key 当成同一个 provider 转一圈就停 if (cfg.apiKey) { return cfg.vendor + ':' + cfg.apiKey.slice(-12); } return cfg.vendor; } // fallback: 从 registry 查找 const registry = (0, provider_registry_1.getLlmRegistry)(); for (const node of registry.listEnabled()) { if (node.provider.hasModel(modelId)) return node.provider.vendor; } return modelId; }""" if OLD not in src: print("ERROR: OLD not found") raise SystemExit(1) src = src.replace(OLD, NEW) with open(PATH, 'w', encoding='utf-8') as f: f.write(src) print("OK: resolveProviderKey patched")