fix: Kimi/SenseNova usage not auto-refreshed — auto-timer only collected OCG; extract _collect_kimi_usage/_collect_sensenova_usage, refresh every 30min in timer
This commit is contained in:
@@ -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)")
|
||||
|
||||
|
||||
# ════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user