feat:新增历史想法队列及实时监控功能

This commit is contained in:
墨梓柒
2025-04-30 09:33:49 +08:00
parent 4b1c678456
commit fbb17e4274

View File

@@ -19,6 +19,7 @@ REFRESH_INTERVAL_MS = 200 # 刷新间隔 (毫秒) - 可以适当调长,因为
WINDOW_TITLE = "Interest Monitor (Live History)"
MAX_HISTORY_POINTS = 1000 # 图表上显示的最大历史点数 (可以增加)
MAX_STREAMS_TO_DISPLAY = 15 # 最多显示多少个聊天流的折线图 (可以增加)
MAX_QUEUE_SIZE = 30 # 新增:历史想法队列最大长度
# *** 添加 Matplotlib 中文字体配置 ***
# 尝试使用 'SimHei' 或 'Microsoft YaHei'如果找不到matplotlib 会回退到默认字体
@@ -61,6 +62,10 @@ class InterestMonitorApp:
self.single_stream_last_active = tk.StringVar(value="活跃: N/A")
self.single_stream_last_interaction = tk.StringVar(value="交互: N/A")
# 新增:历史想法队列
self.main_mind_history = deque(maxlen=MAX_QUEUE_SIZE)
self.last_main_mind_timestamp = 0 # 记录最后一条main_mind的时间戳
# --- UI 元素 ---
# --- 新增:顶部全局信息框架 ---
@@ -143,6 +148,20 @@ class InterestMonitorApp:
self.canvas_widget_single = self.canvas_single.get_tk_widget()
self.canvas_widget_single.pack(side=tk.TOP, fill=tk.BOTH, expand=1)
# --- 新增第三个选项卡:麦麦历史想法 ---
self.frame_mind_history = ttk.Frame(self.notebook, padding="5 5 5 5")
self.notebook.add(self.frame_mind_history, text="麦麦历史想法")
# 聊天框样式的文本框(只读)+ 滚动条
self.mind_text_scroll = tk.Scrollbar(self.frame_mind_history)
self.mind_text_scroll.pack(side=tk.RIGHT, fill=tk.Y)
self.mind_text = tk.Text(
self.frame_mind_history, height=25, state="disabled", wrap="word", font=("微软雅黑", 12),
yscrollcommand=self.mind_text_scroll.set
)
self.mind_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=1, padx=5, pady=5)
self.mind_text_scroll.config(command=self.mind_text.yview)
# --- 初始化和启动刷新 ---
self.update_display() # 首次加载并开始刷新循环
@@ -154,6 +173,78 @@ class InterestMonitorApp:
"""生成随机颜色用于区分线条"""
return "#{:06x}".format(random.randint(0, 0xFFFFFF))
def load_main_mind_history(self):
"""只读取包含main_mind的日志行维护历史想法队列"""
if not os.path.exists(LOG_FILE_PATH):
return
main_mind_entries = []
try:
with open(LOG_FILE_PATH, "r", encoding="utf-8") as f:
for line in f:
try:
log_entry = json.loads(line.strip())
if "main_mind" in log_entry:
ts = log_entry.get("timestamp", 0)
main_mind_entries.append((ts, log_entry))
except Exception:
continue
main_mind_entries.sort(key=lambda x: x[0])
recent_entries = main_mind_entries[-MAX_QUEUE_SIZE:]
self.main_mind_history.clear()
for ts, entry in recent_entries:
self.main_mind_history.append(entry)
if recent_entries:
self.last_main_mind_timestamp = recent_entries[-1][0]
# 首次加载时刷新
self.refresh_mind_text()
except Exception:
pass
def update_main_mind_history(self):
"""实时监控log文件发现新main_mind数据则更新队列和展示仅有新数据时刷新"""
if not os.path.exists(LOG_FILE_PATH):
return
new_entries = []
try:
with open(LOG_FILE_PATH, "r", encoding="utf-8") as f:
for line in reversed(list(f)):
try:
log_entry = json.loads(line.strip())
if "main_mind" in log_entry:
ts = log_entry.get("timestamp", 0)
if ts > self.last_main_mind_timestamp:
new_entries.append((ts, log_entry))
else:
break
except Exception:
continue
if new_entries:
for ts, entry in sorted(new_entries):
if len(self.main_mind_history) >= MAX_QUEUE_SIZE:
self.main_mind_history.popleft()
self.main_mind_history.append(entry)
self.last_main_mind_timestamp = ts
self.refresh_mind_text() # 只有有新数据时才刷新
except Exception:
pass
def refresh_mind_text(self):
"""刷新聊天框样式的历史想法展示"""
self.mind_text.config(state="normal")
self.mind_text.delete(1.0, tk.END)
for entry in self.main_mind_history:
ts = entry.get("timestamp", 0)
dt_str = datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M:%S") if ts else ""
main_mind = entry.get("main_mind", "")
mai_state = entry.get("mai_state", "")
subflow_count = entry.get("subflow_count", "")
msg = f"[{dt_str}] 状态:{mai_state} 子流:{subflow_count}\n{main_mind}\n\n"
self.mind_text.insert(tk.END, msg)
self.mind_text.see(tk.END)
self.mind_text.config(state="disabled")
def load_and_update_history(self):
"""从 history log 文件加载数据并更新历史记录"""
if not os.path.exists(LOG_FILE_PATH):
@@ -537,8 +628,14 @@ class InterestMonitorApp:
def update_display(self):
"""主更新循环"""
try:
self.load_and_update_history() # 从文件加载数据并更新内部状态
# --- 新增:首次加载历史想法 ---
if not hasattr(self, "_main_mind_loaded"):
self.load_main_mind_history()
self._main_mind_loaded = True
else:
self.update_main_mind_history() # 只有有新main_mind数据时才刷新界面
# *** 修改:分别调用两个图表的更新方法 ***
self.load_and_update_history() # 从文件加载数据并更新内部状态
self.update_all_streams_plot() # 更新所有流的图表
self.update_single_stream_plot() # 更新单个流的图表
except Exception as e: