fix_resolve2.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import re
  2. PATH = '/data/ai/audio/server/dist/services/llm/index.js'
  3. with open(PATH, 'r', encoding='utf-8') as f:
  4. src = f.read()
  5. OLD = """function resolveProviderKey(modelId) {
  6. const cfg = config_1.config.models.getModel?.(modelId);
  7. if (cfg?.vendor) {
  8. // 关键: 用 vendor+apiKey 指纹区分同一个 vendor 的不同 key (例如 minimax Key1 vs Key2)
  9. // 这样 fallback 不会把两个独立 key 当成同一个 provider 转一圈就停
  10. if (cfg.apiKey) {
  11. return cfg.vendor + ':' + cfg.apiKey.slice(-12);
  12. }
  13. return cfg.vendor;
  14. }
  15. // fallback: 从 registry 查找
  16. const registry = (0, provider_registry_1.getLlmRegistry)();
  17. for (const node of registry.listEnabled()) {
  18. if (node.provider.hasModel(modelId))
  19. return node.provider.vendor;
  20. }
  21. return modelId;
  22. }"""
  23. NEW = """function resolveProviderKey(modelId) {
  24. // 关键: 优先用 registry 查找(保留 vendorKey 区分), 而不是 config.models.getModel
  25. // 因为 getModel 只返回第一个匹配的, minimax Key1 和 Key2 都提供同名 modelId 时
  26. // 永远只会返回 Key1, 导致 Key2 被误判为 Key1 已经试过, fallback 转一圈就停
  27. const registry = (0, provider_registry_1.getLlmRegistry)();
  28. for (const node of registry.listEnabled()) {
  29. if (node.provider.hasModel(modelId)) {
  30. // 用 vendorKey + apiKey 指纹, 即使两个 key 同 vendor 也能区分
  31. const apiKey = node.provider._apiKey || '';
  32. if (apiKey) {
  33. return node.provider.vendor + ':' + apiKey.slice(-12);
  34. }
  35. return node.provider.vendor;
  36. }
  37. }
  38. // 最后 fallback: 直接看 models.json
  39. const cfg = config_1.config.models.getModel?.(modelId);
  40. return cfg?.vendor || modelId;
  41. }"""
  42. if OLD not in src:
  43. print("ERROR: OLD not found")
  44. raise SystemExit(1)
  45. src = src.replace(OLD, NEW)
  46. with open(PATH, 'w', encoding='utf-8') as f:
  47. f.write(src)
  48. print("OK: resolveProviderKey v2 patched (uses registry first)")