From b71a95f67384036273f7d3af16c6c93c3442a04f Mon Sep 17 00:00:00 2001 From: xxm Date: Mon, 17 Aug 2026 17:55:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20promote=E8=BF=9B=E8=87=AA=E9=80=89XMPP?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E9=99=84=E5=AE=8C=E6=95=B412=E7=BB=B4?= =?UTF-8?q?=E9=87=8D=E8=AF=84=E5=85=A8=E6=96=87(=E8=80=81=E8=8E=AB?= =?UTF-8?q?=E8=A6=81=E6=B1=82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/profile-scripts/promote_candidates.py | 26 +++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/deploy/profile-scripts/promote_candidates.py b/deploy/profile-scripts/promote_candidates.py index 0217b8a5..f21d5fe5 100644 --- a/deploy/profile-scripts/promote_candidates.py +++ b/deploy/profile-scripts/promote_candidates.py @@ -51,6 +51,7 @@ def main(): print(f"[PROMOTE] 待处理 {len(rows)} 个候选(本次最多 {MAX_NEW_PER_RUN} 个新提拔)", flush=True) promoted = 0 processed = 0 + newly_promoted_codes = [] for r in rows: if over_budget(): print(f"[PROMOTE] 已达时长护栏 {TOTAL_TIME_BUDGET}s,停止本批(已处理{processed})", flush=True) @@ -192,6 +193,7 @@ def main(): if newly_added: promoted += 1 processed += 1 + newly_promoted_codes.append(code) print(f" ✅ {code} {name} 评分{score} → 已加入自选({timing_signal})", flush=True) else: print(f" ⏭ {code} {name} 已在自选策略中,标记promoted", flush=True) @@ -213,16 +215,32 @@ def main(): conn.commit() print(f"\n[PROMOTE] 本次处理{processed}个,提拔{promoted}只(剩余留待下批)", flush=True) - # 推XMPP + # 推XMPP(老莫:进自选必须附完整 12 维重评全文) if promoted > 0: try: import urllib.request - body = f"🤖 候选自动提拔: {promoted}只新入自选(评分降序优中选优,每批≤{MAX_NEW_PER_RUN})" + codes = ",".join("?" * len(newly_promoted_codes)) + promoted_rows = conn.execute( + f"SELECT code, name, strategy_name, rr_ratio, full_analysis " + f"FROM holding_strategies WHERE status='active' AND code IN ({codes})", + tuple(newly_promoted_codes) + ).fetchall() if newly_promoted_codes else [] + body = f"🤖 候选自动提拔: {promoted}只新入自选(评分降序优中选优,每批≤{MAX_NEW_PER_RUN})\n" + for i, (code, name, strat, rr, fa) in enumerate(promoted_rows, 1): + nm = name or code + body += f"\n━━━ [{i}] {code} {nm} ━━━\n" + body += f"策略: {strat or 'unknown'} | RR: {rr or 'N/A'}\n" + if fa and len(str(fa)) > 50: + body += f"【12维重评】\n{fa}\n" + else: + body += "(重评报告生成中/未就绪,稍后补推)\n" + if len(body) > 6000: + body = body[:6000] + "\n…(内容过长已截断)" req = urllib.request.Request("http://127.0.0.1:5805/", data=json.dumps({"to": "hmo@yoin.fun", "body": body, "type": "chat"}).encode(), headers={"Content-Type": "application/json"}) - urllib.request.urlopen(req, timeout=5) - print("[PROMOTE] XMPP 通知已发送", flush=True) + urllib.request.urlopen(req, timeout=10) + print(f"[PROMOTE] XMPP 通知已发送({promoted}只含完整重评)", flush=True) except Exception as e: print(f"[PROMOTE] XMPP 通知失败: {e}", flush=True)