發佈 0.1.5:換模型後舊會話自動重開

根本原因:
codex 拒絕用不同模型 resume 舊會話(recorded with model X but resuming with Y),
bot 換模型設定後,既有聊天室的會話會直接報錯卡住。

修法:
偵測到模型不匹配(或會話已被清掉)時自動清除會話、開新會話重試,
並在回覆開頭註明已自動開新會話、舊記憶未帶入。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-07 11:56:22 +08:00
co-authored by Claude Fable 5
parent 8d4cec9bb3
commit 491ab5bc8f
2 changed files with 12 additions and 4 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "telegram-codex-bot", "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", "description": "Telegram bot powered by the local Codex CLI — zero-dependency, pm2-managed, with a built-in PM2 web viewer",
"license": "MIT", "license": "MIT",
"type": "commonjs", "type": "commonjs",
+11 -3
View File
@@ -224,13 +224,21 @@ function startBot(config) {
const existing = sessions.get(chatId); const existing = sessions.get(chatId);
let result; let result;
let sessionResetNote = '';
try { try {
result = await runCodex({ config, prompt, threadId: existing?.threadId || null, images, onProgress }); result = await runCodex({ config, prompt, threadId: existing?.threadId || null, images, onProgress });
} catch (err) { } catch (err) {
// 舊會話可能已被 codex 清掉,找不到就自動開新會話重試一次 // 舊會話 resume 不了的情況,自動開新會話重試一次
if (existing && /session|thread|conversation/i.test(err.message) && /not.*found|找不到|no .*(session|thread)/i.test(err.message)) { // 1) 會話已被 codex 清掉(not found
// 2) bot 換了模型,codex 拒絕跨模型 resumerecorded 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); sessions.clear(chatId);
result = await runCodex({ config, prompt, threadId: null, images, onProgress }); result = await runCodex({ config, prompt, threadId: null, images, onProgress });
sessionResetNote = modelMismatch
? '🆕 模型設定已變更,舊會話無法沿用,已自動開新會話(先前的對話記憶未帶入)。\n\n'
: '🆕 舊會話已失效,已自動開新會話。\n\n';
} else { } else {
throw err; throw err;
} }
@@ -239,7 +247,7 @@ function startBot(config) {
if (result.threadId) sessions.set(chatId, result.threadId); if (result.threadId) sessions.set(chatId, result.threadId);
const footer = buildFooter(config, result.usage, modelMeta, codexDefaults); 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.editOrSplit(chatId, statusMsg.message_id, html, { html: true });
await t.react(chatId, message.message_id, '👍'); await t.react(chatId, message.message_id, '👍');
} catch (error) { } catch (error) {