/** * 真测试:mock ChatOpenAI 抛 'Request timed out' 错误(模拟 book 43 真实场景) * 看 invokeWithRetry 是否真切到 bailian / volcengine */ const Module = require('module'); const origResolve = Module._resolveFilename; const origLoad = Module._load; // Monkey-patch 拦截 @langchain/openai const fakeTimeoutMsg = 'Request timed out (fake mock)'; let invokeCount = 0; const fakeChat = class { constructor(fields) { this.fields = fields; } async invoke() { invokeCount++; const modelName = this.fields?.model || 'unknown'; console.log(` [MOCK] 模拟 ChatOpenAI.invoke 第${invokeCount}次, model=${modelName} 抛 timeout`); const err = new Error(fakeTimeoutMsg); err.name = 'AbortError'; throw err; } }; Module._load = function(request, parent, isMain) { if (request === '@langchain/openai' || request === 'langchain/chat_models/openai') { console.log(` [MOCK] 拦截模块加载: ${request}`); return { ChatOpenAI: fakeChat }; } return origLoad.apply(this, arguments); }; const { callLLMWithMessages } = require('/data/ai/audio/server/dist/services/llm/index'); const messages = [ { role: 'user', content: 'Reply: HA_REAL_OK' }, ]; const targetModel = 'MiniMax-M2.7'; // 起点:minimax console.log('---TEST START--- target=' + targetModel + ' (mock 全抛 timeout)'); const t0 = Date.now(); (async () => { try { const r = await callLLMWithMessages(messages, targetModel, 30); console.log('UNEXPECTED_OK:', r.substring(0, 80)); } catch (e) { console.log('ERROR_NAME:', e.name); console.log('ERROR_MSG:', (e.message || '').substring(0, 500)); if (e.attempts) { console.log('PROVIDERS_TRIED:', e.attempts.length); for (const a of e.attempts) { console.log(' >>', a.provider + '/' + a.model, '|', a.errorType, '|', a.attempts, '次 |', (a.error || '').substring(0, 80)); } } else { console.log('NO_ATTEMPTS_FIELD'); } } console.log('ELAPSED:', Date.now() - t0, 'ms'); console.log('TOTAL_INVOKES:', invokeCount, '(预期 ≥ 3 = 同provider 3次 + 切下家)'); })();