feat: show thinking indicator during AI processing, accept non-numeric verification codes
This commit is contained in:
@@ -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 发送成功,已标记已读")
|
||||
|
||||
Reference in New Issue
Block a user