From 0abb7de5d3e75cce0e8e9a672f66cb86aaba3347 Mon Sep 17 00:00:00 2001 From: Zichao Lin Date: Fri, 17 Jul 2026 18:30:57 +0800 Subject: [PATCH] fix: move regenerate to AI thread pool, fix parse_mode None error --- src/tg_bot.py | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/tg_bot.py b/src/tg_bot.py index 4b7611d..b9abb40 100644 --- a/src/tg_bot.py +++ b/src/tg_bot.py @@ -1,5 +1,7 @@ import json import logging +import threading +from concurrent.futures import ThreadPoolExecutor from email.utils import parseaddr import requests from src.config import TelegramConfig, Config @@ -10,6 +12,8 @@ from src.database import save_email_context, load_email_context, save_conversati logger = logging.getLogger(__name__) +_ai_pool = ThreadPoolExecutor(max_workers=3, thread_name_prefix="ai_regen") + # ── Public API ────────────────────────────────────────── @@ -246,6 +250,24 @@ def _tg_req(tg_cfg: TelegramConfig, method: str, payload: dict) -> dict: # ── Update handling ───────────────────────────────────── +def _do_regen(cfg: Config, chat_id: int, msg_id: int, ctx: dict, conv: dict): + """在 AI 线程池中执行换一批,不阻塞按钮轮询""" + try: + new_suggestions = generate_more_replies( + cfg.ai, ctx["sender"], ctx["subject"], ctx["original_body"], + conv.get("all_suggestions", []), + ) + except Exception as e: + send_text(cfg.telegram, str(chat_id), f"生成失败: {e}") + return + if new_suggestions: + conv["ai_suggestions"] = new_suggestions + conv["all_suggestions"].extend(new_suggestions) + save_conversation(chat_id, conv) + logger.info("[ai_regen] 新生成 %d 条回复", len(new_suggestions)) + _show_ai_suggestions(cfg.telegram, chat_id, msg_id, new_suggestions) + + def _handle_update(tg_cfg: TelegramConfig, cfg: Config, update: dict): if "callback_query" in update: _handle_callback(tg_cfg, cfg, update["callback_query"]) @@ -345,21 +367,10 @@ def _handle_callback(tg_cfg: TelegramConfig, cfg: Config, cb: dict): # AI 处理中 _tg_req(tg_cfg, "editMessageText", { "chat_id": chat_id, "message_id": msg_id, - "text": "🤖 AI思考中...", "parse_mode": None, + "text": "🤖 AI思考中...", }) - try: - new_suggestions = generate_more_replies( - cfg.ai, ctx["sender"], ctx["subject"], ctx["original_body"], - conv.get("all_suggestions", []), - ) - except Exception as e: - send_text(tg_cfg, str(chat_id), f"生成失败: {e}") - return - if new_suggestions: - conv["ai_suggestions"] = new_suggestions - conv["all_suggestions"].extend(new_suggestions) - logger.info(" 新生成 %d 条回复", len(new_suggestions)) - _show_ai_suggestions(tg_cfg, chat_id, msg_id, new_suggestions) + # 丢到 AI 线程池处理,不阻塞按钮轮询 + _ai_pool.submit(_do_regen, cfg, chat_id, msg_id, ctx, conv) elif action == CALLBACK_HINT and ctx: prompt_msg_id = send_text(