From fd71e8ffcd3220507a014c77c9af34685df8daac Mon Sep 17 00:00:00 2001 From: hmo Date: Sat, 15 Aug 2026 12:45:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Kimi/SenseNova=20usage=20not=20auto-refr?= =?UTF-8?q?eshed=20=E2=80=94=20auto-timer=20only=20collected=20OCG;=20extr?= =?UTF-8?q?act=20=5Fcollect=5Fkimi=5Fusage/=5Fcollect=5Fsensenova=5Fusage,?= =?UTF-8?q?=20refresh=20every=2030min=20in=20timer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/scripts/dashboard.py | 113 ++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 43 deletions(-) diff --git a/gateway/scripts/dashboard.py b/gateway/scripts/dashboard.py index d0a82a7..8dac035 100644 --- a/gateway/scripts/dashboard.py +++ b/gateway/scripts/dashboard.py @@ -1462,50 +1462,17 @@ def api_usage_refresh(): if proc.returncode != 0 and proc.stderr: log.warning(f"usage_collector stderr:\n{proc.stderr[-1000:]}") - # 2. Kimi 远程采集(SSH 到 Windows) + # 2. Kimi 远程采集(SSH 到 Windows)+ scp 回 246 try: - log.info("usage: starting Kimi collector via SSH") - kimi_cmd = [ - "ssh", "-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10", - "-o", "BatchMode=yes", "hmo@192.168.1.16", - r'"C:\Users\hmo\AppData\Local\Programs\Python\Python310\python.exe" "D:\F\NewI\opencode\daily-workspace\projects\AgentsMeeting\gateway\scripts\usage_collector_kimi.py"' - ] - proc2 = subprocess.run(kimi_cmd, capture_output=True, text=True, timeout=60) - log.info(f"usage: Kimi done (rc={proc2.returncode})") - if proc2.returncode != 0 and proc2.stderr: - log.warning(f"usage_kimi stderr: {proc2.stderr[-300:]}") - - # 3. scp Kimi 结果回 246 - scp_cmd = [ - "scp", "-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10", - "hmo@192.168.1.16:D:/F/NewI/opencode/daily-workspace/projects/AgentsMeeting/gateway/temp/usage_stats_kimi.json", - str(TEMP_DIR / "usage_stats_kimi.json") - ] - proc3 = subprocess.run(scp_cmd, capture_output=True, timeout=15) - log.info(f"usage: Kimi scp done (rc={proc3.returncode})") - - # 4. SenseNova 远程采集(SSH 到 Windows,CDP 刮 console 余量) - try: - log.info("usage: starting SenseNova collector via SSH") - sn_cmd = [ - "ssh", "-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10", - "-o", "BatchMode=yes", "hmo@192.168.1.16", - r'"C:\Users\hmo\AppData\Local\Programs\Python\Python310\python.exe" "D:\F\NewI\opencode\daily-workspace\projects\AgentsMeeting\gateway\scripts\usage_collector_sensenova.py"' - ] - proc4 = subprocess.run(sn_cmd, capture_output=True, text=True, timeout=90) - log.info(f"usage: SenseNova done (rc={proc4.returncode})") - if proc4.returncode != 0 and proc4.stderr: - log.warning(f"usage_sensenova stderr: {proc4.stderr[-300:]}") - scp4 = subprocess.run([ - "scp", "-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10", - "hmo@192.168.1.16:D:/F/NewI/opencode/daily-workspace/projects/AgentsMeeting/gateway/temp/usage_stats_sensenova.json", - str(TEMP_DIR / "usage_stats_sensenova.json") - ], capture_output=True, timeout=15) - log.info(f"usage: SenseNova scp done (rc={scp4.returncode})") - except Exception as e: - log.warning(f"usage: SenseNova collection failed: {e}") + _collect_kimi_usage() except Exception as e: log.warning(f"usage: Kimi collection failed: {e}") + + # 3. SenseNova 远程采集(SSH 到 Windows,CDP 刮 console 余量) + try: + _collect_sensenova_usage() + except Exception as e: + log.warning(f"usage: SenseNova collection failed: {e}") except Exception as e: log.error(f"usage: collector crash: {e}") finally: @@ -1516,6 +1483,52 @@ def api_usage_refresh(): return jsonify({"ok": True, "message": "collection triggered (~15s), poll /api/usage shortly"}) +def _collect_kimi_usage(): + """SSH 到 Windows 跑 usage_collector_kimi.py,scp 结果回 246。 + + 被 /api/usage/refresh 和 usage auto-timer 共用,保证 Kimi 数据新鲜。 + """ + log.info("usage: starting Kimi collector via SSH") + kimi_cmd = [ + "ssh", "-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10", + "-o", "BatchMode=yes", "hmo@192.168.1.16", + r'"C:\Users\hmo\AppData\Local\Programs\Python\Python310\python.exe" "D:\F\NewI\opencode\daily-workspace\projects\AgentsMeeting\gateway\scripts\usage_collector_kimi.py"' + ] + proc2 = subprocess.run(kimi_cmd, capture_output=True, text=True, timeout=60) + log.info(f"usage: Kimi done (rc={proc2.returncode})") + if proc2.returncode != 0 and proc2.stderr: + log.warning(f"usage_kimi stderr: {proc2.stderr[-300:]}") + + # scp Kimi 结果回 246 + scp_cmd = [ + "scp", "-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10", + "hmo@192.168.1.16:D:/F/NewI/opencode/daily-workspace/projects/AgentsMeeting/gateway/temp/usage_stats_kimi.json", + str(TEMP_DIR / "usage_stats_kimi.json") + ] + proc3 = subprocess.run(scp_cmd, capture_output=True, timeout=15) + log.info(f"usage: Kimi scp done (rc={proc3.returncode})") + + +def _collect_sensenova_usage(): + """SSH 到 Windows 跑 usage_collector_sensenova.py,scp 结果回 246。""" + log.info("usage: starting SenseNova collector via SSH") + sn_cmd = [ + "ssh", "-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10", + "-o", "BatchMode=yes", "hmo@192.168.1.16", + r'"C:\Users\hmo\AppData\Local\Programs\Python\Python310\python.exe" "D:\F\NewI\opencode\daily-workspace\projects\AgentsMeeting\gateway\scripts\usage_collector_sensenova.py"' + ] + proc4 = subprocess.run(sn_cmd, capture_output=True, text=True, timeout=90) + log.info(f"usage: SenseNova done (rc={proc4.returncode})") + if proc4.returncode != 0 and proc4.stderr: + log.warning(f"usage_sensenova stderr: {proc4.stderr[-300:]}") + scp4 = subprocess.run([ + "scp", "-o", "StrictHostKeyChecking=no", "-o", "ConnectTimeout=10", + "hmo@192.168.1.16:D:/F/NewI/opencode/daily-workspace/projects/AgentsMeeting/gateway/temp/usage_stats_sensenova.json", + str(TEMP_DIR / "usage_stats_sensenova.json") + ], capture_output=True, timeout=15) + log.info(f"usage: SenseNova scp done (rc={scp4.returncode})") + + # ── Key Registry ────────────────────────────────────────────── _ACCOUNTS_FILE = _USAGE_MONITOR_DIR / "accounts.json" @@ -1625,9 +1638,11 @@ def api_keys(): _USAGE_AUTO_INTERVAL = 300 def _start_usage_auto_timer(): - """后台线程:每 5 分钟自动采集 + cookie 保活。246 自足,不依赖 Windows。""" + """后台线程:OCG 每 5 分钟自动采集;Kimi/SenseNova 每 30 分钟采集(SSH 到 Windows)。""" + _KIMI_INTERVAL_MULT = 6 # 每 6 个 OCG 周期(30min)采一次 Kimi/SenseNova def _loop(): time.sleep(15) # initial delay: let dashboard stabilize + tick = 0 while True: try: global _usage_collector_running @@ -1639,6 +1654,18 @@ def _start_usage_auto_timer(): log.info(f"usage auto-timer: rc={proc.returncode}") if proc.returncode != 0 and proc.stderr: log.warning(f"usage auto-timer stderr:\n{proc.stderr[-800:]}") + + # Kimi/SenseNova:每 30 分钟刷新一次(SSH 到 Windows + CDP,较重) + tick += 1 + if tick % _KIMI_INTERVAL_MULT == 0: + try: + _collect_kimi_usage() + except Exception as e: + log.warning(f"usage auto-timer: Kimi failed: {e}") + try: + _collect_sensenova_usage() + except Exception as e: + log.warning(f"usage auto-timer: SenseNova failed: {e}") _usage_collector_running = False except Exception as e: log.error(f"usage auto-timer error: {e}") @@ -1647,7 +1674,7 @@ def _start_usage_auto_timer(): t = threading.Thread(target=_loop, name="usage_auto_timer", daemon=True) t.start() - log.info(f"usage auto-timer started (interval={_USAGE_AUTO_INTERVAL}s)") + log.info(f"usage auto-timer started (interval={_USAGE_AUTO_INTERVAL}s, kimi every {_KIMI_INTERVAL_MULT * _USAGE_AUTO_INTERVAL}s)") # ════════════════════════════════════════════════════════════