test_timeout_mock.cjs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /**
  2. * 真测试:mock ChatOpenAI 抛 'Request timed out' 错误(模拟 book 43 真实场景)
  3. * 看 invokeWithRetry 是否真切到 bailian / volcengine
  4. */
  5. const Module = require('module');
  6. const origResolve = Module._resolveFilename;
  7. const origLoad = Module._load;
  8. // Monkey-patch 拦截 @langchain/openai
  9. const fakeTimeoutMsg = 'Request timed out (fake mock)';
  10. let invokeCount = 0;
  11. const fakeChat = class {
  12. constructor(fields) { this.fields = fields; }
  13. async invoke() {
  14. invokeCount++;
  15. const modelName = this.fields?.model || 'unknown';
  16. console.log(` [MOCK] 模拟 ChatOpenAI.invoke 第${invokeCount}次, model=${modelName} 抛 timeout`);
  17. const err = new Error(fakeTimeoutMsg);
  18. err.name = 'AbortError';
  19. throw err;
  20. }
  21. };
  22. Module._load = function(request, parent, isMain) {
  23. if (request === '@langchain/openai' || request === 'langchain/chat_models/openai') {
  24. console.log(` [MOCK] 拦截模块加载: ${request}`);
  25. return { ChatOpenAI: fakeChat };
  26. }
  27. return origLoad.apply(this, arguments);
  28. };
  29. const { callLLMWithMessages } = require('/data/ai/audio/server/dist/services/llm/index');
  30. const messages = [
  31. { role: 'user', content: 'Reply: HA_REAL_OK' },
  32. ];
  33. const targetModel = 'MiniMax-M2.7'; // 起点:minimax
  34. console.log('---TEST START--- target=' + targetModel + ' (mock 全抛 timeout)');
  35. const t0 = Date.now();
  36. (async () => {
  37. try {
  38. const r = await callLLMWithMessages(messages, targetModel, 30);
  39. console.log('UNEXPECTED_OK:', r.substring(0, 80));
  40. } catch (e) {
  41. console.log('ERROR_NAME:', e.name);
  42. console.log('ERROR_MSG:', (e.message || '').substring(0, 500));
  43. if (e.attempts) {
  44. console.log('PROVIDERS_TRIED:', e.attempts.length);
  45. for (const a of e.attempts) {
  46. console.log(' >>', a.provider + '/' + a.model, '|', a.errorType, '|', a.attempts, '次 |', (a.error || '').substring(0, 80));
  47. }
  48. } else {
  49. console.log('NO_ATTEMPTS_FIELD');
  50. }
  51. }
  52. console.log('ELAPSED:', Date.now() - t0, 'ms');
  53. console.log('TOTAL_INVOKES:', invokeCount, '(预期 ≥ 3 = 同provider 3次 + 切下家)');
  54. })();