dashboard-metrics.md
7.22 KB
WeChat Viewer Dashboard Metrics
数据看板指标定义文档。每个模块列出指标名称、数据来源、SQL 查询。 生成时间: 2026-07-11 | 验证: ✅ 所有 SQL 在 circle.db 上可执行
1. 聊天数据 (Chats)
数据源: WeChat SQLCipher DB (message 表) + 本地 circle.db
| # | 指标 | 数据源 | SQL / 来源 |
|---|---|---|---|
| 1.1 | 群聊数量 | WeChat DB | SELECT COUNT(DISTINCT talker) FROM message WHERE talker LIKE '%@chatroom' |
| 1.2 | 总消息数 | WeChat DB | SELECT COUNT(*) FROM message |
| 1.3 | 发言人数 | WeChat DB | SELECT COUNT(DISTINCT talker) FROM message |
| 1.4 | 分享文章数 | Local DB | SELECT COUNT(*) FROM article_shares |
| 1.5 | 图片分析数 | Local DB | SELECT COUNT(*) FROM image_analysis |
| 1.6 | 群聊摘要数 | Local DB | SELECT COUNT(*) FROM chat_summaries |
备注: 指标 1.1-1.3 需要 WeChat DB 连接 (SQLCipher),需要 root/解密。如果 WeChat DB 不可用,只展示 1.4-1.6。
2. 文章数据 (Articles)
数据源: circle.db (articles, article_shares, daily_reports)
| # | 指标 | SQL |
|---|---|---|
| 2.1 | 总文章数 | SELECT COUNT(*) FROM articles |
| 2.2 | 已摘要 | SELECT COUNT(DISTINCT article_url) FROM daily_reports WHERE report_date='summary' AND article_url IS NOT NULL |
| 2.3 | 未摘要 | 2.1 - 2.2 |
| 2.4 | 已学习 | SELECT COUNT(DISTINCT article_url) FROM daily_reports WHERE report_date='learn' AND article_url IS NOT NULL |
| 2.5 | 未学习 | 2.1 - 2.4 |
| 2.6 | 总分享次数 | SELECT COUNT(*) FROM article_shares |
3. 学习审核 (Learn)
数据源: circle.db (learn_queue, daily_reports)
| # | 指标 | SQL |
|---|---|---|
| 3.1 | 待审核 | SELECT COUNT(*) FROM learn_queue WHERE status='pending_review' |
| 3.2 | 已批准 | SELECT COUNT(*) FROM learn_queue WHERE status='approved' |
| 3.3 | 已应用 (吸收成功) | SELECT COUNT(*) FROM learn_queue WHERE status='applied' |
| 3.4 | 已拒绝 | SELECT COUNT(*) FROM learn_queue WHERE status='rejected' |
| 3.5 | 待分类摘要 | SELECT COUNT(*) FROM daily_reports dr WHERE dr.report_date='summary' AND dr.dedup_key IS NOT NULL AND dr.dedup_key NOT IN (SELECT DISTINCT lq.dedup_key FROM learn_queue lq WHERE lq.dedup_key IS NOT NULL) |
| 3.6 | 高分待审 (≥7) | SELECT COUNT(*) FROM learn_queue WHERE score >= 7 AND status='pending_review' |
| 3.7 | 已吸收 skill 数 | SELECT COUNT(*) FROM learn_queue WHERE status='applied' AND learn_type='skill' |
| 3.8 | 已吸收 memory 数 | SELECT COUNT(*) FROM learn_queue WHERE status='applied' AND learn_type='memory' |
| 3.9 | 已吸收 todo 数 | SELECT COUNT(*) FROM learn_queue WHERE status='applied' AND learn_type='todo' |
| 3.10 | 已吸收 reference 数 | SELECT COUNT(*) FROM learn_queue WHERE status='applied' AND learn_type='reference' |
4. 日报 (Reports)
数据源: circle.db (daily_reports)
| # | 指标 | SQL |
|---|---|---|
| 4.1 | 日报总数 | SELECT COUNT(*) FROM daily_reports WHERE report_date NOT IN ('summary','learn') |
| 4.2 | 文章摘要数 | SELECT COUNT(*) FROM daily_reports WHERE report_date='summary' |
| 4.3 | 学习记录数 | SELECT COUNT(*) FROM daily_reports WHERE report_date='learn' |
| 4.4 | 最近生成时间 | SELECT created_at FROM daily_reports WHERE report_date NOT IN ('summary','learn') ORDER BY id DESC LIMIT 1 |
| 4.5 | 日报图片数 | SELECT COUNT(*) FROM report_images |
5. 任务监控 (Jobs)
数据源: circle.db (hermes_jobs)
| # | 指标 | SQL |
|---|---|---|
| 5.1 | 总任务数 | SELECT COUNT(*) FROM hermes_jobs |
| 5.2 | 运行中 | SELECT COUNT(*) FROM hermes_jobs WHERE status='running' |
| 5.3 | 已完成 | SELECT COUNT(*) FROM hermes_jobs WHERE status='completed' |
| 5.4 | 失败 | SELECT COUNT(*) FROM hermes_jobs WHERE status='failed' |
| 5.5 | 最近完成时间 | SELECT completed_at FROM hermes_jobs WHERE completed_at IS NOT NULL ORDER BY id DESC LIMIT 1 |
| 5.6 | 成功率 | 5.3 / (5.3 + 5.4) × 100 (排除 running) |
6. 自动回复 (Auto Reply)
数据源: circle.db (reply_queue, reply_whitelist)
| # | 指标 | SQL |
|---|---|---|
| 6.1 | 白名单总数 | SELECT COUNT(*) FROM reply_whitelist |
| 6.2 | 白名单群 | SELECT COUNT(*) FROM reply_whitelist WHERE kind='group' |
| 6.3 | 白名单联系人 | SELECT COUNT(*) FROM reply_whitelist WHERE kind='contact' |
| 6.4 | 待审批回复 | SELECT COUNT(*) FROM reply_queue WHERE status='pending' |
| 6.5 | 已发送回复 | SELECT COUNT(*) FROM reply_queue WHERE status IN ('sent','auto_sent') |
7. AI 聊天 (Circle)
数据源: circle.db (conversations, messages)
| # | 指标 | SQL |
|---|---|---|
| 7.1 | 会话数 | SELECT COUNT(*) FROM conversations |
| 7.2 | 总消息数 | SELECT COUNT(*) FROM messages |
| 7.3 | 最近会话时间 | SELECT updated_at FROM conversations ORDER BY updated_at DESC LIMIT 1 |
8. 系统状态
| # | 指标 | 数据源 | 方式 |
|---|---|---|---|
| 8.1 | Flask 服务状态 | HTTP | 自检 (alive) |
| 8.2 | WeChat DB 连接 | WeChat DB | SELECT 1 看是否成功 |
| 8.3 | 活跃 Cron 数 | hermes cron list |
子进程调用 |
| 8.4 | 当前账号 | config.get_current_account_id() |
Python |
数据源汇总
| 数据源 | 类型 | 说明 |
|---|---|---|
circle.db (SQLite) |
本地 | 15 张表,主要数据源 |
| WeChat DB (SQLCipher) | 远程 | 聊天消息/联系人,需 root 解密 |
hermes cron list |
子进程 | Cron job 状态 |
Dashboard API 返回结构 (建议)
{
"chats": {
"groups": 12,
"messages": 45231,
"speakers": 87,
"shares": 1035,
"images_analyzed": 0,
"summaries": 0
},
"articles": {
"total": 128,
"summarized": 145,
"unsummarized": -17,
"learned": 0,
"unlearned": 128
},
"learn": {
"pending_review": 38,
"approved": 2,
"applied": 6,
"rejected": 5,
"unclassified": 107,
"high_score": 15,
"by_type": {"skill": 3, "memory": 2, "todo": 1, "reference": 0}
},
"reports": {
"daily": 5,
"summaries": 150,
"learn_records": 2,
"images": 5,
"last_generated": "2026-07-10 14:55:14"
},
"jobs": {
"total": 310,
"running": 29,
"completed": 156,
"failed": 125,
"success_rate": 55.5,
"last_completed": "2026-07-11 00:09:59"
},
"auto_reply": {
"whitelist": 1,
"pending": 26,
"sent": 1
},
"circle": {
"conversations": 1,
"messages": 2
},
"system": {
"flask": "alive",
"wechat_db": true,
"cron_jobs": 5,
"account": "e03ce81..."
}
}
注意事项
- WeChat DB 查询可能失败:SQLCipher 需要解密密钥和 root 权限。如果 WeChat DB 不可用,聊天模块指标 (1.1-1.3) 返回
null或空值。 - 已摘要数 > 总文章数:某些文章可能有多份摘要 (多次抓取)。
COUNT(DISTINCT article_url)按 URL 去重。 - Cron 状态查询:需执行
hermes cron list子进程,可能耗时 2-3 秒。Dashboard API 可考虑独立查询或缓存。 - 性能考量:大多数查询是简单 COUNT,在 circle.db 上