fix_ts_errors.py 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. PATH = '/data/ai/audio/server/src/services/llm/index.ts'
  2. with open(PATH, 'r', encoding='utf-8') as f:
  3. src = f.read()
  4. # Fix 1: 替换 n -> node (line 142)
  5. src = src.replace(
  6. "if (!n.provider.hasModel(modelId)) continue;\n const fp = n.provider.vendor + ':' + (node.provider._apiKey || '').slice(-12);",
  7. "if (!n.provider.hasModel(modelId)) continue;\n const fp = n.provider.vendor + ':' + ((n.provider as any)._apiKey || '').slice(-12);",
  8. )
  9. # Fix 2: pickNextModelAfterFailure 里的 _apiKey 加 as any
  10. src = src.replace(
  11. "const fp = node.provider.vendor + ':' + (node.provider._apiKey || '').slice(-12);",
  12. "const fp = node.provider.vendor + ':' + ((node.provider as any)._apiKey || '').slice(-12);",
  13. )
  14. # Fix 3: findVendorForModel 里的 _apiKey 也加 as any
  15. src = src.replace(
  16. " if (tried.has(fp)) continue;\n return n;\n }\n return registry.listAvailable().find(n => n.provider.hasModel(modelId)) || null;",
  17. " if (tried.has(fp)) continue;\n return n;\n }\n return registry.listAvailable().find(n => n.provider.hasModel(modelId)) || null;",
  18. 0
  19. ) # noop
  20. # 找 findVendorForModel 函数, 把它的 _apiKey 也加 as any
  21. old_fvf = """function findVendorForModel(modelId) {
  22. const registry = getLlmRegistry();
  23. const tried = _currentTriedNodes();
  24. for (const n of registry.listAvailable()) {
  25. if (!n.provider.hasModel(modelId)) continue;
  26. const fp = n.provider.vendor + ':' + (n.provider._apiKey || '').slice(-12);
  27. if (tried.has(fp)) continue;
  28. return n;
  29. }
  30. return registry.listAvailable().find(n => n.provider.hasModel(modelId)) || null;
  31. }"""
  32. new_fvf = """function findVendorForModel(modelId) {
  33. const registry = getLlmRegistry();
  34. const tried = _currentTriedNodes();
  35. for (const n of registry.listAvailable()) {
  36. if (!n.provider.hasModel(modelId)) continue;
  37. const fp = n.provider.vendor + ':' + ((n.provider as any)._apiKey || '').slice(-12);
  38. if (tried.has(fp)) continue;
  39. return n;
  40. }
  41. return registry.listAvailable().find(n => n.provider.hasModel(modelId)) || null;
  42. }"""
  43. if old_fvf in src:
  44. src = src.replace(old_fvf, new_fvf)
  45. print("OK: findVendorForModel ts-fix")
  46. else:
  47. print("WARN: findVendorForModel pattern not found (may have been modified)")
  48. # 同样把 resolveProviderKey 里的 _apiKey 加 as any (兼容)
  49. old_rpk = """function resolveProviderKey(modelId) {
  50. // 关键: 优先用 registry 查找(保留 vendorKey 区分), 而不是 config.models.getModel
  51. // 因为 getModel 只返回第一个匹配的, minimax Key1 和 Key2 都提供同名 modelId 时
  52. // 永远只会返回 Key1, 导致 Key2 被误判为 Key1 已经试过, fallback 转一圈就停
  53. const registry = getLlmRegistry();
  54. for (const node of registry.listEnabled()) {
  55. if (node.provider.hasModel(modelId)) {
  56. // 用 vendorKey + apiKey 指纹, 即使两个 key 同 vendor 也能区分
  57. const apiKey = node.provider._apiKey || '';
  58. if (apiKey) {
  59. return node.provider.vendor + ':' + apiKey.slice(-12);
  60. }
  61. return node.provider.vendor;
  62. }
  63. }
  64. // 最后 fallback: 直接看 models.json
  65. const cfg = config.models.getModel?.(modelId);
  66. return cfg?.vendor || modelId;
  67. }"""
  68. new_rpk = """function resolveProviderKey(modelId) {
  69. const registry = getLlmRegistry();
  70. for (const node of registry.listEnabled()) {
  71. if (node.provider.hasModel(modelId)) {
  72. const apiKey = (node.provider as any)._apiKey || '';
  73. if (apiKey) {
  74. return node.provider.vendor + ':' + apiKey.slice(-12);
  75. }
  76. return node.provider.vendor;
  77. }
  78. }
  79. const cfg = config.models.getModel?.(modelId);
  80. return cfg?.vendor || modelId;
  81. }"""
  82. if old_rpk in src:
  83. src = src.replace(old_rpk, new_rpk)
  84. print("OK: resolveProviderKey ts-fix")
  85. else:
  86. print("WARN: resolveProviderKey pattern not found")
  87. with open(PATH, 'w', encoding='utf-8') as f:
  88. f.write(src)
  89. print("done")