From 0a4f0ccdbb2d2b93d22d36d7a08c2ef28ce8e982 Mon Sep 17 00:00:00 2001 From: jesxion Date: Mon, 13 Apr 2026 12:11:30 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96=E5=9B=9E=E5=A4=8D=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=9A=E5=8F=AA=E8=A6=81=E5=AF=B9=E6=96=B9=E6=9C=89?= =?UTF-8?q?=E6=96=B0=E6=B6=88=E6=81=AF=E5=B0=B1=E5=9B=9E=E5=A4=8D=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E4=BE=9D=E8=B5=96has=5Fnew=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 移除has_new_message依赖,只要有对方消息(is_self=False)就回复 2. 修复防重复逻辑:基于消息内容+聊天名的hash,10秒内不重复 3. 移除多余的chat_key赋值 --- src/core/__pycache__/engine.cpython-311.pyc | Bin 19944 -> 20171 bytes src/core/engine.py | 23 +++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/core/__pycache__/engine.cpython-311.pyc b/src/core/__pycache__/engine.cpython-311.pyc index df4e051ab4c0cfa5182fc3246cc10a74c76a9ed7..bedaa9d604c71eb07859938458130fd70444eedd 100644 GIT binary patch delta 1957 zcmZuyZA?>F7(S=Br62SI>4mm{w3QA;6bd*hAEO{0p;AEw{9>6BFL5{}Z-&(oiiqe=ZSQ+Qb%ho`ti2Z~UF>yM8Zs_%&i5cOb z0Dz15i8e;UNIw_oVz0n0=7fEKk#XWa&`-G~oP+~A<6`t4z?N`vvn`zDb?kne0~7yo z#F<^}RK}tJ@Jga{q|a2+jGPnWWfilRMUP78T1HY2=BtdDDU z!c~m5HrNW>at?UqB#*@@_$=fcJ|!mg)VvBqye0O=>pNgfX42-~fsSwI)Jj1V;X>4$ zsg9qip;v{iw270>P28>E6m0$caI==4f3NVV=}{mz2__JoWKJrUwDJ z7)~Wxo@<0g)ND?oUX@qCEW)oe`pzuYn_?#efC;b}Zq=Nm)MQUo2B#ty4gF^psZ7GjwCp?9iln7?+FAL#zab0~bh z=jqrN;cGrTDK@a>Xlq`*i0#IX=xSa8dY+e4+2C4A;=bve`u+&tJHikDICUKNk*E@m z=6eqD13i4-X@1~nPEL-CoHqaESC2cpqPAiK+Md6t&Wz1}j~;z|sxv(Jig`NLJ9WZ4 zqczogJlu1Ezjh@W{dDZGi^f6W@yp@ibJ2YHv4i~RXt5!SM!x(aGwZ@UTR~tIfpiQZ zYFA5JNZQio+TFr7J6qU;gmDnqg_aeVaP8I=>WO+O?5TJC>m z%fyHNhK>HljTnRPZ^8!La|7C@pti}cZJN}kpNyNdRCgK*EZLs^n>4QZ&Mo zOP)nWK6SA#yut%5iGWU<2C@Z>&|5vUZlLCT-MP9E`=~QuvIR}HDD!|$IZ<=0#&1{? zplgG4t)H$%1BD(#eSmHV(hdGtpSDA?Ms%eY|2oimi*1ReW*PXUr0QKf+|EzIct;t* zWip43x>K0$psBmG$f5K7Y&ihoS@d2}DqQK?T+|KYE|OAQLVp#TV6{(DvIWYCB_wQS zcXVKTTWKy_<2zlNEr1`O+hrZ_3@Wph!VTzC>rMSx5-TP!OdwKP@~g~B3H*e%mK&iR zb(Ie%RzOkWG?;}|K5NA`0o;zfm7{Pc+H9+W6Ub{TfxCV8Z6~4TH>?nn?Pzg2TXwfI zt!#)|Yj?1>(2=UtM< delta 1755 zcmZuxeN0nV6u-Bxg?<-!j}{6P`38%uv=vdH6hdjCge@V<=A4;iHGos1kEam#ii*1V z$4r_X7g%8pn84Z(H5w%%rrZ7Vz^B%0+9I>$S6Q&uY{2Ex3FJ!?G?Y!4pi9mW5@o)0 zpZvHa7w$O>u;|bpnm}h6f4Z11qFwT&?f~NTV%pOyVtQ_pLU20sy zWISdv*DzU+8FmfBB^aCy`>I*2hr2aZ*@h=24dMahSBdDnmR4JtLz<%!Nh^K1XQWeP zrfHIS)S-oxgf21^8&af4#p~fD*e!O5?-J_BzElgV15LByEJ#_5+8EB_V^8 zj7z>Nw&{^s$t*L=%=p9Rrii&IT<(aJI}-c}PgG|Zw@32qAsro2w(xvuq_|<$6Df9u zS=SAGo9zg(9Z}90Xuqe^FQGDxeZ2A^eMRe91JX!F)pTVz!}cf*!YTMXhB)< z>y2;Y>I}r?oO0Y@Yi_eO(<5QFKEl>7A!Vlh7tVOv`>r>%&K>4F5zZ6hJTSH?V6uie zTZFTPl4Hq>NuGGlmgk zKZ@~1DAwOxnx$4UzTkrsr^HaJ0!R!CT>@ z<{^9mOwLB!1KXV66keph=@hO}7^6ThN?t+XIyAQw;dbb4`B>+WWi6ol@%>%nKb|{7o2i=jp$rp?{zd zS4sEw3jKsS=QiR=_}pEJ_XK})tFh)wBB_$_^Hli>EPL|PX2|rQ3Fh2-uyn}rFl_D^ z(@>tsHc{CfxY6OkZ$f70i}+jU>vZB#nC{%RX_AuEJH`wQ3Ov1)`MVT;qF|&z?^QmZ v!dw!z!xrx{o&#Ig1i>G>3h?j2zq>}T<#`4xm(a8EVSN4Hr&%Ao*IoBNQADmn diff --git a/src/core/engine.py b/src/core/engine.py index 45aa280..b9bf09a 100644 --- a/src/core/engine.py +++ b/src/core/engine.py @@ -256,16 +256,18 @@ class WeChatAgent: chat_name = chat_info.get("current_chat", "") messages = chat_info.get("messages", []) - # 防重复处理(同一聊天 5 秒内不重复处理) + # 防重复处理:基于最新消息内容hash,10秒内不重复回复同一条 current_time = time.time() - chat_key = f"{chat_name}_{hash(str(messages[-1:]))}" - if chat_key in self._last_processed_time: - if current_time - self._last_processed_time[chat_key] < 5: - return + if messages: + latest_content = messages[0].get("content", "")[:50] # 取最新消息的前50字符 + dedup_key = f"{chat_name}_{latest_content}" + if dedup_key in self._last_processed_time: + if current_time - self._last_processed_time[dedup_key] < 10: + logger.debug(f"消息已处理过,跳过: {latest_content[:30]}") + return + self._last_processed_time[dedup_key] = current_time if has_new or messages: - self._last_processed_time[chat_key] = current_time - # 创建快照 snapshot = ChatSnapshot( timestamp=current_time, @@ -290,8 +292,9 @@ class WeChatAgent: }) # 判断是否需要回复 - if self.processor.should_reply(snapshot): - logger.info(f"需要回复,生成回复内容...") + # 策略:只要对方有新消息(is_self=False)就回复,不依赖 has_new_message + if messages and not messages[0].get("is_self", True): + logger.info(f"检测到对方新消息,准备回复...") reply = self.processor.generate_reply(snapshot) if reply: logger.info(f"发送回复: {reply[:50]}...") @@ -300,7 +303,7 @@ class WeChatAgent: else: logger.warning("生成回复为空") else: - logger.debug("不需要回复") + logger.debug("不需要回复(无新消息或自己发送)") except Exception as e: logger.error(f"轮询处理异常: {e}")