feat: show thinking indicator during AI processing, accept non-numeric verification codes

This commit is contained in:
2026-07-11 22:54:06 +08:00
parent 1c7d0c1b00
commit fc4c5a175c
3 changed files with 69 additions and 10 deletions

View File

@@ -3,7 +3,7 @@ from typing import Generator, Optional
from src.config import Config
from src.email_client import fetch_unseen_emails, mark_as_seen, Email
from src.ai_client import summarize_email
from src.tg_bot import send_summary, format_summary
from src.tg_bot import send_summary, send_thinking, edit_message, format_summary
logger = logging.getLogger(__name__)
@@ -23,6 +23,10 @@ def poll_accounts(cfg: Config) -> Generator[tuple[int, Email], None, None]:
def ai_process(cfg: Config, acct_idx: int, mail: Email) -> Optional[dict]:
logger.info(f" 正在摘要: {mail.subject}")
# 先发思考中消息
thinking_msg_id = send_thinking(cfg.telegram, cfg.telegram.chat_id)
logger.info(f" 思考中消息已发送: msg_id={thinking_msg_id}")
summary = summarize_email(cfg.ai, mail.recipient, mail.subject, mail.sender, mail.body, mail.account_email)
summary["recipient"] = mail.recipient
if "@" not in summary.get("sender", ""):
@@ -38,18 +42,44 @@ def ai_process(cfg: Config, acct_idx: int, mail: Email) -> Optional[dict]:
"acct_idx": acct_idx,
"account_email": mail.account_email,
"uid": mail.uid,
"thinking_msg_id": thinking_msg_id,
}
def tg_send_and_mark(cfg: Config, info: dict):
acct = cfg.email_accounts[info["acct_idx"]]
send_summary(cfg.telegram, cfg.telegram.chat_id,
info["text"], info["data"],
info["original_body"], info["acct_idx"],
original_sender=info.get("original_sender", ""),
original_recipient=info.get("original_recipient", ""),
original_reply_to=info.get("original_reply_to", ""),
account_email=info.get("account_email", ""))
# 只有 send_summary 成功返回(未抛异常)才标记已读
thinking_msg_id = info.get("thinking_msg_id")
if thinking_msg_id:
# 编辑思考中消息为实际摘要
from src.tg_bot import _summary_keyboard
can_reply = info["data"].get("can_reply", True)
is_promotion = info["data"].get("category") == "promotion"
links = info["data"].get("links", [])
edit_message(cfg.telegram, cfg.telegram.chat_id, thinking_msg_id,
info["text"], _summary_keyboard(can_reply, is_promotion, links))
# 保存上下文用于回调
from src.tg_bot import _email_contexts
_email_contexts[thinking_msg_id] = {
"summary_text": info["text"],
"summary_data": info["data"],
"original_body": info["original_body"][:10000],
"original_sender": info.get("original_sender", ""),
"original_recipient": info.get("original_recipient", ""),
"original_reply_to": info.get("original_reply_to", ""),
"account_email": info.get("account_email", ""),
"sender": info["data"].get("sender", ""),
"subject": info["data"].get("subject", ""),
"can_reply": can_reply,
}
else:
# 兜底:没有思考中消息就正常发送
send_summary(cfg.telegram, cfg.telegram.chat_id,
info["text"], info["data"],
info["original_body"], info["acct_idx"],
original_sender=info.get("original_sender", ""),
original_recipient=info.get("original_recipient", ""),
original_reply_to=info.get("original_reply_to", ""),
account_email=info.get("account_email", ""))
# 只有发送成功才标记已读
mark_as_seen(acct, [info["uid"]])
logger.info(f" TG 发送成功,已标记已读")