From 71a5acbac5dcc724326034a911ecaf0ae7e2892a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?= Date: Tue, 3 Mar 2026 02:18:04 +0900 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96ReflectTracker=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E7=A1=AE=E4=BF=9D=E5=9C=A8=E8=BF=BD=E8=B8=AA?= =?UTF-8?q?=E6=97=B6=E8=A1=A8=E8=BE=BE=E4=B8=8D=E4=B8=BANone=EF=BC=8C?= =?UTF-8?q?=E7=AE=80=E5=8C=96=E4=BB=A3=E7=A0=81=E5=B9=B6=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/bw_learner/expression_reflect_tracker.py | 26 +++++++++++--------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/bw_learner/expression_reflect_tracker.py b/src/bw_learner/expression_reflect_tracker.py index e4173c6a..f1ff810a 100644 --- a/src/bw_learner/expression_reflect_tracker.py +++ b/src/bw_learner/expression_reflect_tracker.py @@ -1,7 +1,7 @@ import json import re import time -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, Any, Optional from json_repair import repair_json @@ -56,9 +56,13 @@ class ReflectTracker: return (bool): 如果返回True,表示追踪完成,Tracker运行结束(运行状态置为`False`);如果返回False,表示继续追踪 """ # 对于没有正在追踪的表达,直接返回False - if not self.tracking: + if not self.tracking or not self.expression: return False + # Type narrowing: expression is guaranteed non-None when tracking + assert self.expression is not None + expr = self.expression + # 检查是否超时(无论是消息数量还是时间) if time.time() - self.tracking_start_time > self.max_duration: self._reset_tracker() @@ -75,7 +79,7 @@ class ReflectTracker: # 检查消息数量是否超限 if current_msg_count > self.max_msg_count: - logger.info(f"ReflectTracker for expr {self.expression.item_id} timed out (message count).") + logger.info(f"ReflectTracker for expr {expr.item_id} timed out (message count).") self._reset_tracker() return True @@ -97,8 +101,8 @@ class ReflectTracker: # LLM 判断 try: prompt_template = prompt_manager.get_prompt("reflect_judge") - prompt_template.add_context("situation", str(self.expression.situation)) - prompt_template.add_context("style", str(self.expression.style)) + prompt_template.add_context("situation", str(expr.situation)) + prompt_template.add_context("style", str(expr.style)) prompt_template.add_context("context_block", context_block) prompt = await prompt_manager.render_prompt(prompt_template) @@ -119,7 +123,7 @@ class ReflectTracker: if judgment == "Approve": self._update_expression(checked=True, rejected=False, modified_by="ai") - logger.info(f"Expression {self.expression.item_id} approved by operator.") + logger.info(f"Expression {expr.item_id} approved by operator.") self._reset_tracker() return True @@ -128,7 +132,7 @@ class ReflectTracker: corrected_style = json_obj.get("corrected_style") has_update = bool(corrected_situation or corrected_style) - update_kwargs = {"checked": True, "modified_by": "ai"} + update_kwargs: dict[str, Any] = {"checked": True, "modified_by": "ai"} if corrected_situation: update_kwargs["situation"] = corrected_situation if corrected_style: @@ -142,18 +146,18 @@ class ReflectTracker: if has_update: logger.info( - f"Expression {self.expression.item_id} rejected and updated. " + f"Expression {expr.item_id} rejected and updated. " f"New situation: {corrected_situation}, New style: {corrected_style}" ) else: logger.info( - f"Expression {self.expression.item_id} rejected but no correction provided, marked as rejected." + f"Expression {expr.item_id} rejected but no correction provided, marked as rejected." ) self._reset_tracker() return True elif judgment == "Ignore": - logger.info(f"ReflectTracker for expr {self.expression.item_id} judged as Ignore.") + logger.info(f"ReflectTracker for expr {expr.item_id} judged as Ignore.") return False except Exception as e: @@ -162,7 +166,7 @@ class ReflectTracker: return False - def _update_expression(self, **kwargs): + def _update_expression(self, **kwargs: Any) -> None: """更新表达并持久化到数据库""" if not self.expression: return