diff --git a/package.json b/package.json index 2ef334d..3e4aebe 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "telegram-codex-bot", - "version": "0.1.4", + "version": "0.1.5", "description": "Telegram bot powered by the local Codex CLI — zero-dependency, pm2-managed, with a built-in PM2 web viewer", "license": "MIT", "type": "commonjs", diff --git a/src/bot.js b/src/bot.js index 9b5a676..9f0c7f5 100644 --- a/src/bot.js +++ b/src/bot.js @@ -224,13 +224,21 @@ function startBot(config) { const existing = sessions.get(chatId); let result; + let sessionResetNote = ''; try { result = await runCodex({ config, prompt, threadId: existing?.threadId || null, images, onProgress }); } catch (err) { - // 舊會話可能已被 codex 清掉,找不到就自動開新會話重試一次 - if (existing && /session|thread|conversation/i.test(err.message) && /not.*found|找不到|no .*(session|thread)/i.test(err.message)) { + // 舊會話 resume 不了的情況,自動開新會話重試一次: + // 1) 會話已被 codex 清掉(not found) + // 2) bot 換了模型,codex 拒絕跨模型 resume(recorded with model X but resuming with Y) + const sessionGone = /session|thread|conversation/i.test(err.message) && /not.*found|找不到|no .*(session|thread)/i.test(err.message); + const modelMismatch = /recorded with model/i.test(err.message); + if (existing && (sessionGone || modelMismatch)) { sessions.clear(chatId); result = await runCodex({ config, prompt, threadId: null, images, onProgress }); + sessionResetNote = modelMismatch + ? '🆕 模型設定已變更,舊會話無法沿用,已自動開新會話(先前的對話記憶未帶入)。\n\n' + : '🆕 舊會話已失效,已自動開新會話。\n\n'; } else { throw err; } @@ -239,7 +247,7 @@ function startBot(config) { if (result.threadId) sessions.set(chatId, result.threadId); const footer = buildFooter(config, result.usage, modelMeta, codexDefaults); - const html = t.mdToTgHtml((result.text || '(Codex 沒有回覆文字)') + footer); + const html = t.mdToTgHtml(sessionResetNote + (result.text || '(Codex 沒有回覆文字)') + footer); await t.editOrSplit(chatId, statusMsg.message_id, html, { html: true }); await t.react(chatId, message.message_id, '👍'); } catch (error) {