| name | monitor-analyzer |
| description | Use when the user asks about training status, or when a cron alert fires. Fetches training monitoring data (including eval/matchup win rates and skill usage) from Tencent Arena API, runs anomaly detection, generates charts, keeps a per-run long-term record, and sends code-based analysis with prioritized recommendations via Feishu. |
| version | 3.0.0 |
| author | Qoobee |
| platforms | ["linux","macos","windows"] |
| metadata | {"hermes":{"tags":["kaiwu","monitoring","training","anomaly-detection"],"related_skills":["rl-advisor","repo-scanner"]}} |
Monitor Analyzer
自动抓取开悟平台训练监控数据,结合代码分析训练状态,发送图表、长期趋势与排序建议。
代码与描述分离:脚本在 scripts/,详细指标解读/正常范围/输出模板在 reference.md。
When to Use
| 场景 | 触发方式 | 动作 |
|---|
| 用户问 "看看训练状态" / "reward 怎么样" | 主动 | 完整分析(fetch + plot + report) |
| 用户给新 URL 或 token | 配置更新 | 解析参数 → 更新 config → 验证 |
| 用户说 "切换赛段" / "新训练开始了" | 配置更新 | 更新 config + 重新验证 |
cron 写入 data/alert.json | 被动 | 自动 fetch + 分析,标注 "自动触发" |
| cookie 过期(validate 失败) | 被动 | 提示用户更新 token |
Don't use for: 代码审查(用 代码审查 skill)、超参建议(用 rl-advisor skill)。
执行规则
所有步骤自动执行,不询问确认。 直接运行命令、读文件、生成分析。仅在出错(token 过期、网络故障)时才向用户报告。所有脚本在 skill 的 scripts/ 目录下运行。
执行流程
Step 1: 检查告警(被动触发)
读 data/alert.json,若存在且 status == "alert":标记 "自动触发:检测到训练异常",列出所有 alert(metric/type/detail),继续后续步骤。无告警文件则跳过。
Step 2: 抓取数据
cd scripts
python3 fetch.py --hours 6 --format structured
--format structured 输出 JSON 摘要(含 avg/std/cv/trend,便于解析)
- 用户指定范围用
--hours N;只关心某组用 --groups quick_check
- 自动写
data/latest.json,并按 task_id 追加一条摘要到 data/history/<task_id>.jsonl
抓取失败时:不要继续后续步骤,转「配置/鉴权恢复流程」。 fetch 会输出状态行 ✗ [status] ... 并用不同退出码区分(status ∈ missing_config / token_expired / network_error / api_error)。需要机器判断时加 --json 取 {"status","need","message"}。
Step 3: 生成图表
cd scripts
python3 plot.py --hours 6
输出到 /tmp/monitor_charts/:reward_trend / loss_curve / convergence / environment / eval(评估与对位胜率)/ skill(施放/命中/放空)/ longterm(当前运行长期趋势)。出错则跳过图表,用文字代替。
Step 4: 长期趋势与诊断建议
cd scripts
python3 report.py --json --since 72h
输出当前训练运行的长期趋势(按 task_id 分桶,URL 变即新运行)+ 结构化 findings(status + 排序建议)。
Step 5: 代码关联分析
读 data/latest.json 与 report 的 findings,对照 reference.md 的指标解读框架与「症状→动作」决策表分析。必须做到:
- 对照 conf.py 实际权重解释各分项贡献(勿凭印象)
- 指出异常指标对应的代码逻辑
- 给可操作建议(调哪个参数、为什么)
- 区分正常波动与真正异常(selfplay 下看胜率而非 reward_sum)
Step 6: 组装输出
按 reference.md 的飞书输出模板组织:状态结论 → 核心指标 → 评估/对位 → Reward 分项 → Loss 与稳定性 → 技能使用 → 长期趋势 → 异常 → 结论与建议 → MEDIA 图片。不用表格;图片末尾 MEDIA: 前缀逐行嵌入。
配置/鉴权恢复流程(主动检测 → 告知 → 更新 → 验证 → 继续)
当 fetch / validate 返回非 ok 状态时,主动按 status 分支处理;不要把失败当无数据糊弄过去。所有命令在 scripts/ 下运行。
判定状态(任选其一):
cd scripts
python3 fetch.py --validate --json
退出码:ok=0 / missing_config=3 / token_expired=4 / network_error=5 / api_error=6。
status == token_expired(need: token)
向用户说明并索要:"训练 token 已过期,请提供新的 kaiwu-token(浏览器 → 开悟监控页 → Cookie 里的 kaiwu-token)。"
拿到后:
cd scripts
python3 fetch.py --update-config --token "<NEW_TOKEN>" --json
python3 fetch.py --validate --json
validate 返回 ok → 回到 Step 2 继续;仍 token_expired → 告知 token 可能复制有误,请重取。
status == missing_config(need: url[, token])
向用户说明并索要:"需要本次训练的监控页面 URL(含 task_id/team_id/domain_id/exp_id),请从开悟监控页地址栏复制完整 URL。"(若同时缺 token,一并索要)
拿到后:
cd scripts
python3 fetch.py --update-config --url "<完整URL>" --json
python3 fetch.py --validate --json
- update 输出含
missing_fields:非空说明 URL 仍没带齐参数(可能只复制了片段),需让用户提供完整 URL。
- URL 变即新训练运行,history 自动开新桶(
data/history/<task_id>.jsonl)。
- validate ok → 回到 Step 2。
status == network_error
告知用户网络无法连接开悟平台,请检查网络/VPN 后重试。不要反复重试或改 token。
status == api_error
报告返回的 code 与 msg,提示可能是任务参数(task_id/exp_id 等)不匹配,请核对 URL。
赛段切换
cd scripts
python3 fetch.py --update-config --stage 全国决赛
→ "已切换。请提供新训练的 URL。"(随后走 missing_config 分支补 URL)
Cron 配置
异常检测由系统 cron 每 30 分钟运行(路径为 skill 内 scripts):
*/30 * * * * cd /path/to/Kaiwu_2026/.hermes/skills/kaiwu/monitor-analyzer/scripts && python3 check.py --json >> ../data/check.log 2>&1
- 阈值:reward 1h 降 50%、loss spike 10x、胜率 4h 停滞、eval 胜率 4h 降 30%、value_loss_tower spike 8x、skill_whiff_rate >0.5、reward_sum/policy_loss 震荡(cv)
- 异常写
data/alert.json,无异常清除;告警文件持久化(不在 /tmp)
注意事项
- 训练云端运行 168h,短期波动正常,勿过度解读小波动
- token 随训练变化,每次新训练需更新
config.local.yaml 与 data/ 含敏感/运行时数据,不提交 git
- 用户没明确问训练状态时,不要主动触发
- 分析必须对照 conf.py 实际参数值(见 reference.md),不凭印象