Skip to content

Commit 04bb4a7

Browse files
committed
fix: 修复错误信息、reasoning_content 透传及豆包模型菜单问题
- 修�� Playwright TimeoutError 提示为页面操作超时(非网络问题) - 新增 CLICK_TIMEOUT 错误归一化处理,标记为 retryable - buildChatCompletion/buildChatCompletionChunk 支持 reasoningContent 参数 - doubao_text 模型选择菜单增加重试逻辑(最多 3 次),waitFor 超时从 2s 改为 5s
1 parent b5c9a79 commit 04bb4a7

3 files changed

Lines changed: 21 additions & 10 deletions

File tree

‎src/backend/adapter/doubao_text.js‎

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,26 @@ async function generate(context, prompt, imgPaths, modelId, meta = {}) {
6060
.first();
6161
let selectorExists = false;
6262
try {
63-
await modelSelectorBtn.waitFor({ state: 'attached', timeout: 1000 });
63+
await modelSelectorBtn.waitFor({ state: 'attached', timeout: 5000 });
6464
selectorExists = true;
6565
} catch (e) {
6666
selectorExists = false;
6767
}
6868

6969
if (selectorExists) {
70-
await safeClick(page, modelSelectorBtn, { bias: 'button' });
71-
await sleep(300, 500);
72-
7370
const menuItem = page.getByRole('menuitem', { name: modelMenuName });
74-
await menuItem.waitFor({ state: 'visible', timeout: 5000 });
71+
// 点击模型选择按钮,最多重试 3 次(菜单偶尔不弹出)
72+
for (let attempt = 1; attempt <= 3; attempt++) {
73+
await sleep(500, 1000);
74+
await safeClick(page, modelSelectorBtn, { bias: 'button' });
75+
try {
76+
await menuItem.waitFor({ state: 'visible', timeout: 3000 });
77+
break; // 菜单弹出,退出重试
78+
} catch {
79+
logger.warn('适配器', `模型菜单未弹出,重试 ${attempt}/3`, meta);
80+
if (attempt === 3) throw new Error('模型选择菜单未弹出');
81+
}
82+
}
7583
await safeClick(page, menuItem, { bias: 'button' });
7684
await sleep(200, 400);
7785
}

‎src/backend/utils/error.js‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,15 @@ export function normalizePageError(err, meta = {}) {
6868
logger.error('适配器', err.message, meta);
6969
return { error: err.message, code: ADAPTER_ERRORS.TIMEOUT_ERROR, retryable: true };
7070
}
71-
// 兼容原生 TimeoutError (其他地方抛出的)
71+
// CLICK_TIMEOUT: safeClick 内部超时
72+
if (err.message?.includes('CLICK_TIMEOUT')) {
73+
logger.error('适配器', `点击操作超时: ${err.message}`, meta);
74+
return { error: err.message, code: ADAPTER_ERRORS.TIMEOUT_ERROR, retryable: true };
75+
}
76+
// 兼容原生 TimeoutError (Playwright 元素操作超时等)
7277
if (err.name === 'TimeoutError' || err.message?.includes('Timeout')) {
73-
logger.error('适配器', '请求超时', meta);
74-
return { error: '请求超时, 请检查网络或稍后重试', code: ADAPTER_ERRORS.TIMEOUT_ERROR, retryable: true };
78+
logger.error('适配器', `页面操作超时: ${err.message}`, meta);
79+
return { error: '页面操作超时, 页面可能未正常加载或元素未找到', code: ADAPTER_ERRORS.TIMEOUT_ERROR, retryable: true };
7580
}
7681
// PAGE_ERROR_DETECTED: waitApiResponse 页面 UI 中检测到的错误关键词
7782
if (err.message?.startsWith('PAGE_ERROR_DETECTED:')) {

‎src/server/respond.js‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ export function buildChatCompletion(content, modelName, reasoningContent) {
114114
role: 'assistant',
115115
content: content
116116
};
117-
118117
if (reasoningContent) {
119118
message.reasoning_content = reasoningContent;
120119
}
@@ -142,7 +141,6 @@ export function buildChatCompletion(content, modelName, reasoningContent) {
142141
*/
143142
export function buildChatCompletionChunk(content, modelName, finishReason = 'stop', reasoningContent) {
144143
const delta = { content };
145-
146144
if (reasoningContent) {
147145
delta.reasoning_content = reasoningContent;
148146
}

0 commit comments

Comments
 (0)