From bcb25d62e4df6e59f5a439e8e390d95639581de5 Mon Sep 17 00:00:00 2001 From: --git_token Date: Thu, 28 May 2026 08:10:01 +0800 Subject: [PATCH] auto backup 2026-05-28 08:10:01 --- .vala_skill_hashes | 4 +- MEMORY.md | 10 ++ data/last_wechat_sync_id | 2 +- memory/.dreams/events.jsonl | 2 + memory/.dreams/short-term-recall.json | 107 ++++++++++- memory/2026-05-27.md | 50 ++++++ .../ai_descriptions_feishu_2026-05-26.json | 17 ++ .../ai_descriptions_wechat_2026-05-26.json | 61 +++++++ .../cluster_context_2026-05-26.json | 166 ++++++++++++++++++ .../ai_summarize_feedback.cpython-312.pyc | Bin 16521 -> 16868 bytes .../detect_p0_realtime.cpython-312.pyc | Bin 0 -> 15637 bytes .../detect_p0_wechat.cpython-312.pyc | Bin 12539 -> 15083 bytes .../sync_wechat_feedback.cpython-312.pyc | Bin 13142 -> 0 bytes ...c_wechat_feedback_minutely.cpython-312.pyc | Bin 9442 -> 0 bytes scripts/detect_p0_realtime.py | 69 ++++++-- scripts/detect_p0_wechat.py | 71 +++++++- .../sync_group_to_mysql.cpython-312.pyc | Bin 31296 -> 0 bytes .../sync_group_to_sheet.cpython-312.pyc | Bin 13228 -> 0 bytes .../__pycache__/cos_upload.cpython-312.pyc | Bin 7511 -> 7547 bytes 19 files changed, 534 insertions(+), 25 deletions(-) create mode 100644 memory/2026-05-27.md create mode 100644 output/daily_feedback/ai_descriptions_feishu_2026-05-26.json create mode 100644 output/daily_feedback/ai_descriptions_wechat_2026-05-26.json create mode 100644 output/daily_feedback/cluster_context_2026-05-26.json create mode 100644 scripts/__pycache__/detect_p0_realtime.cpython-312.pyc delete mode 100644 scripts/__pycache__/sync_wechat_feedback.cpython-312.pyc delete mode 100644 scripts/__pycache__/sync_wechat_feedback_minutely.cpython-312.pyc delete mode 100644 skills/feishu-group-msg-sync/scripts/__pycache__/sync_group_to_mysql.cpython-312.pyc delete mode 100644 skills/feishu-group-msg-sync/scripts/__pycache__/sync_group_to_sheet.cpython-312.pyc diff --git a/.vala_skill_hashes b/.vala_skill_hashes index cdf422c..9d9a6f7 100644 --- a/.vala_skill_hashes +++ b/.vala_skill_hashes @@ -9,9 +9,9 @@ lark_wiki_operate_as_bot f84c308bcb69280520dadf9458177d9c4af192d60cf409528bd65e1 pua f6a38fdd39c22c81370abd6b979b58c767e41738d43a26fbbc23d1e933cdc701 smart-auto-model-switch bfb3547dcd6029622c7062b49ae7922614a366b6dfe88c7d0fae9dcd85fc2eb3 vala_git_workspace_backup.vala 4cf352bec88fe84af065ba1ffcbb06647b77df0e01860faaf0bca9fd64b968ec -tencent-cos-upload 172517ed41d06c48425cd961ec5972a48495cfd62ec588bc1c2912ddf31b3a06 user-feedback-collector c0320451bf7ea0ce3d8ceaa603ae0a7b55c373c048363a5142258a4c23f45e81 user-feedback-data-source a95eb9142f3019fd193c46f89147dc7e0bf01dfe250202565a86f8bc52f37b13 user-feedback-processor 61783a8e9f03a973c187b359a87749ad1993dc71f8364b0a853d8b3ff64c75e8 -feishu-group-msg-sync 1b581de76d419e6a33db0836125efc16ef2c972013fcae6f08c03aa7e2276445 feishu-feedback-sync 9c9ca1f0c42a289e037289cd394299b7debf7e240d3b30429899da42b601d953 +feishu-group-msg-sync 953534cc3d1cf4489060afe1cf10cad75faedd3f2d699ffa7478d178d528dc51 +tencent-cos-upload 2505dbc8c7acdaf95f2228598ae12010e09599a25df4319587c4a3109d828053 diff --git a/MEMORY.md b/MEMORY.md index 960a480..4393a94 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -49,6 +49,16 @@ **不要在 MEMORY.md 中维护静态分类映射表,所有规则变更直接修改 priority_classifier.py。** +### Python 脚本修改后需清理 __pycache__(2026-05-27) +- 修改 Python 脚本(尤其是新增/删除 import)后,旧 `.pyc` 缓存可能导致 `NameError`(模块名未定义) +- 症状:源码中有 `import subprocess`,运行时却报 `NameError: name 'subprocess' is not defined` +- 修复:`find -name "__pycache__" -type d | xargs rm -rf && find -name "*.pyc" -delete` +### P0 实时检测去重:内容语义指纹替代消息ID精确匹配(2026-05-27) +- 原方案用 `sorted(message_ids)` MD5 做去重,但同一话题每次扫描聚类结果不同,签名失效导致重复推送 +- 修复:增加内容语义去重层 — 拼接簇内前5条消息内容 + 发送人集合 + 小时窗口,用 Jaccard 相似度比较 +- 阈值:同小时 + 发送人交集 + 相似度 > 0.20;跨小时 + 发送人 ≥2 重叠 + 相似度 > 0.35 +- 影响文件:`detect_p0_wechat.py`、`detect_p0_realtime.py` + ## 经验教训 ### 微信反馈全链路(2026-05-22 刘新玉确认) diff --git a/data/last_wechat_sync_id b/data/last_wechat_sync_id index f4236d2..adb88b7 100644 --- a/data/last_wechat_sync_id +++ b/data/last_wechat_sync_id @@ -1 +1 @@ -1674 +1772 diff --git a/memory/.dreams/events.jsonl b/memory/.dreams/events.jsonl index 38e49ae..54593b0 100644 --- a/memory/.dreams/events.jsonl +++ b/memory/.dreams/events.jsonl @@ -21,3 +21,5 @@ {"type":"memory.recall.recorded","timestamp":"2026-05-25T07:11:25.527Z","query":"微信反馈 全链路 cron 采集 整理 归纳 分发","resultCount":3,"results":[{"path":"memory/2026-05-25.md","startLine":21,"endLine":42,"score":1},{"path":"memory/2026-05-25.md","startLine":38,"endLine":44,"score":1},{"path":"memory/2026-05-22.md","startLine":129,"endLine":158,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-05-26T03:40:13.634Z","query":"微信飞书问题汇总 小葵小葵群 发送汇总","resultCount":3,"results":[{"path":"memory/2026-05-25.md","startLine":21,"endLine":42,"score":1},{"path":"memory/2026-05-25.md","startLine":38,"endLine":44,"score":1},{"path":"memory/2026-05-22.md","startLine":129,"endLine":158,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-05-26T03:40:24.708Z","query":"小葵小葵群 chat_id 分发消息群","resultCount":1,"results":[{"path":"memory/2026-04-18.md","startLine":1,"endLine":5,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-27T02:15:55.251Z","query":"小葵小葵群 chat_id 反馈同步","resultCount":1,"results":[{"path":"memory/2026-04-18.md","startLine":1,"endLine":5,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-05-27T02:50:23.510Z","query":"pycache python 缓存 导入错误","resultCount":3,"results":[{"path":"memory/2026-05-27.md","startLine":22,"endLine":32,"score":1},{"path":"memory/2026-05-27.md","startLine":1,"endLine":27,"score":1},{"path":"memory/2026-04-10.md","startLine":20,"endLine":52,"score":1}]} diff --git a/memory/.dreams/short-term-recall.json b/memory/.dreams/short-term-recall.json index 94a4cb6..fc0510f 100644 --- a/memory/.dreams/short-term-recall.json +++ b/memory/.dreams/short-term-recall.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-05-26T03:40:24.708Z", + "updatedAt": "2026-05-27T02:50:23.510Z", "entries": { "memory:memory/2026-04-18.md:1:5": { "key": "memory:memory/2026-04-18.md:1:5", @@ -9,13 +9,13 @@ "endLine": 5, "source": "memory", "snippet": "# 2026-04-18 工作日志 ## 术语共识 [李若松确认] 术语「飞书反馈消息数据库」默认指代用户反馈收集技能中的飞书内部测试反馈MySQL数据表 `vala_test.lark_group_message`,存储「内容测试问题反馈」群(oc_fabff7672e62a9ced7b326ee4a286c26)的同步消息数据。", - "recallCount": 7, + "recallCount": 8, "dailyCount": 0, "groundedCount": 0, - "totalScore": 7, + "totalScore": 8, "maxScore": 1, "firstRecalledAt": "2026-04-30T03:47:21.989Z", - "lastRecalledAt": "2026-05-26T03:40:24.708Z", + "lastRecalledAt": "2026-05-27T02:15:55.251Z", "queryHashes": [ "353f9765c086", "a6b740c99377", @@ -23,14 +23,16 @@ "f865295b9ac7", "42fe8210f22c", "81f7a2647922", - "261597c52d5b" + "261597c52d5b", + "3fe44d618bf6" ], "recallDays": [ "2026-04-30", "2026-05-06", "2026-05-07", "2026-05-25", - "2026-05-26" + "2026-05-26", + "2026-05-27" ], "conceptTags": [ "vala-test.lark-group-message", @@ -980,6 +982,99 @@ "姓氏", "中文" ] + }, + "memory:memory/2026-05-27.md:22:32": { + "key": "memory:memory/2026-05-27.md:22:32", + "path": "memory/2026-05-27.md", + "startLine": 22, + "endLine": 32, + "source": "memory", + "snippet": "| 微信 | `--skip-dispatch` → 不分发 | `--apply-ai` → 替换占位符+分发 | 微信依赖 AI 归纳成功才能分发,飞书双重分发(占位符+AI)。 ### 5月26日反馈概况 - 飞书:17条消息,3个问题簇(2个有效:录音识别率低、飞船音乐不保存) - 微信:27条消息,14个问题簇(4个有效:飞船音乐、录音识别、音频无法播放、AI回复无关语句) ### 后续注意 - 删除/修改 `ai_summarize_feedback.py` 后需清理 `__pycache__`,否则缓存版本可能落后于源码", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-27T02:50:23.510Z", + "lastRecalledAt": "2026-05-27T02:50:23.510Z", + "queryHashes": [ + "b15d92b2dda8" + ], + "recallDays": [ + "2026-05-27" + ], + "conceptTags": [ + "skip-dispatch", + "apply-ai", + "删除/修改", + "ai-summarize-feedback.py", + "skip", + "dispatch", + "不分", + "apply" + ] + }, + "memory:memory/2026-05-27.md:1:27": { + "key": "memory:memory/2026-05-27.md:1:27", + "path": "memory/2026-05-27.md", + "startLine": 1, + "endLine": 27, + "source": "memory", + "snippet": "# 2026-05-27 工作日志 ## 用户反馈同步故障排查与修复 [刘新玉反馈] ### 问题 5月26日飞书/微信用户反馈定时任务出现回写失败。 ### 根因 1. **Python 缓存过期** — `ai_summarize_feedback.py` 中 `subprocess` 模块导入失败(`NameError: name 'subprocess' is not defined`),实际源码有 `import subprocess`,但 `__pycache__` 中的旧 `.pyc` 未包含此导入 2. **sync_wechat_feedback.py** — 同样因缓存问题导致 `with open(tmp_md)` 写入失败 ### 修复 - 清理了工作区内所有 `__pycache__` 和 `.pyc` 文件 - 重新执行飞书 AI 归纳回写:`sync_feishu_feedback.py --date 2026-05-26 --apply-ai` - 重新执行微信 AI 归纳回写:`sync_wechat_feedback.py --date 2026-05-26 --apply-ai` - 两个渠道均成功回写并分发到「小葵小葵」群 ### 分发架构确认 | 渠道 | 10:00/10:02 Wrapper | 10:05/10:07 AI 归纳 | |------|---------------------|---------------------| | 飞书 | `--dispatch-mode all` → 分发占位符 | `--", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-27T02:50:23.510Z", + "lastRecalledAt": "2026-05-27T02:50:23.510Z", + "queryHashes": [ + "b15d92b2dda8" + ], + "recallDays": [ + "2026-05-27" + ], + "conceptTags": [ + "5月26日飞书/微信用户反馈定时任务出现回写失败", + "ai-summarize-feedback.py", + "sync-wechat-feedback.py", + "tmp-md", + "sync-feishu-feedback.py", + "apply-ai", + "00/10", + "05/10" + ] + }, + "memory:memory/2026-04-10.md:20:52": { + "key": "memory:memory/2026-04-10.md:20:52", + "path": "memory/2026-04-10.md", + "startLine": 20, + "endLine": 52, + "source": "memory", + "snippet": "- 图片先下载到工作目录(相对路径),再用 `docs +media-insert` 插入文档 - 去掉 `set -e`,改为手动错误处理避免单条消息失败导致整个脚本退出 - 时间用 ISO 8601 格式存储和传递 ### 验证结果(第一版 → Wiki文档) - 全量同步成功:49 条消息 + 5 张图片写入 Wiki 文档 - Wiki文档:DfUqddItXoDsnNxPypncbinknxh ## 迭代:改为电子表格 + 腾讯COS **来源:** [李若松] 要求改用表格存储,媒体文件上传COS ### 方案 - 脚本改为 Python:`scripts/sync_feedback_group.py` - 记录写入飞书电子表格:`E8vFsCmPBhT4SCtNmnJchqeJnJe`,sheet_id `7bce8f` - 列:时间 | 反馈人 | 信息类型 | 信息内容(或地址) - 非文本消息(图片/视频/音频/文件)下载后上传到腾讯COS - COS桶:`static-1317843270`,区域:`ap-beijing` - COS路径结构:`vala_llm/user_feedback/{type}/{date}/{filename}` - type: image / video / audio / file - date: YYYY-MM-DD - 访问域名:`https://static.valavala.com/vala_llm/user_feedback/...` - COS凭证已存入 `secrets.md` ### 验证结", + "recallCount": 1, + "dailyCount": 0, + "groundedCount": 0, + "totalScore": 1, + "maxScore": 1, + "firstRecalledAt": "2026-05-27T02:50:23.510Z", + "lastRecalledAt": "2026-05-27T02:50:23.510Z", + "queryHashes": [ + "b15d92b2dda8" + ], + "recallDays": [ + "2026-05-27" + ], + "conceptTags": [ + "media-insert", + "scripts/sync-feedback-group.py", + "sheet-id", + "图片/视频/音频/文件", + "static-1317843270", + "ap-beijing", + "vala-llm/user-feedback", + "yyyy-mm-dd" + ] } } } diff --git a/memory/2026-05-27.md b/memory/2026-05-27.md new file mode 100644 index 0000000..6c1f2f0 --- /dev/null +++ b/memory/2026-05-27.md @@ -0,0 +1,50 @@ +# 2026-05-27 工作日志 + +## 用户反馈同步故障排查与修复 [刘新玉反馈] + +### 问题 +5月26日飞书/微信用户反馈定时任务出现回写失败。 + +### 根因 +1. **Python 缓存过期** — `ai_summarize_feedback.py` 中 `subprocess` 模块导入失败(`NameError: name 'subprocess' is not defined`),实际源码有 `import subprocess`,但 `__pycache__` 中的旧 `.pyc` 未包含此导入 +2. **sync_wechat_feedback.py** — 同样因缓存问题导致 `with open(tmp_md)` 写入失败 + +### 修复 +- 清理了工作区内所有 `__pycache__` 和 `.pyc` 文件 +- 重新执行飞书 AI 归纳回写:`sync_feishu_feedback.py --date 2026-05-26 --apply-ai` +- 重新执行微信 AI 归纳回写:`sync_wechat_feedback.py --date 2026-05-26 --apply-ai` +- 两个渠道均成功回写并分发到「小葵小葵」群 + +### 分发架构确认 +| 渠道 | 10:00/10:02 Wrapper | 10:05/10:07 AI 归纳 | +|------|---------------------|---------------------| +| 飞书 | `--dispatch-mode all` → 分发占位符 | `--apply-ai` → 替换占位符+重新分发 | +| 微信 | `--skip-dispatch` → 不分发 | `--apply-ai` → 替换占位符+分发 | + +微信依赖 AI 归纳成功才能分发,飞书双重分发(占位符+AI)。 + +### 5月26日反馈概况 +- 飞书:17条消息,3个问题簇(2个有效:录音识别率低、飞船音乐不保存) +- 微信:27条消息,14个问题簇(4个有效:飞船音乐、录音识别、音频无法播放、AI回复无关语句) + +### 后续注意 +- 删除/修改 `ai_summarize_feedback.py` 后需清理 `__pycache__`,否则缓存版本可能落后于源码 + +## P0 实时检测去重修复 [刘新玉反馈] + +### 问题 +微信 `detect_p0_wechat.py` 每分钟扫描最近120分钟消息,同一个问题因讨论线程持续生长,`sort_threads` 聚类每次产生不同消息集合,导致: +- 不同次的聚类有不同的 `cluster_signature`(基于 `sorted(message_ids)` MD5) +- 去重完全失效,同一问题被重复推送(今天2个真实问题各推了3次 = 6次) + +### 修复 +在 `detect_p0_wechat.py` 和 `detect_p0_realtime.py` 中增加**内容语义去重**: +1. 新增 `cluster_content_fingerprint()`:拼接簇内前5条有意义消息作为内容指纹 + 发送人集合 + 小时粒度时间窗口 +2. 新增 `is_duplicate_p0()`:基于内容相似度(Jaccard)+ 发送人重叠 + 时间窗口三层判断 + - 同小时 + 发送人交集 + 内容相似度 > 0.20 → 重复 + - 发送人高度重叠(≥2) + 内容相似度 > 0.35 → 跨小时重复 +3. 状态文件改为 `{"time": ..., "fp": {...}}` 格式存储指纹信息 +4. 飞书 P0 检测器同步修复 + +### 测试验证 +360分钟窗口测试:同一话题在不同扫描窗口下签名不同(c69d... vs 70a4...),但内容指纹正确识别为重复(相似度 0.462,is_duplicate=True) diff --git a/output/daily_feedback/ai_descriptions_feishu_2026-05-26.json b/output/daily_feedback/ai_descriptions_feishu_2026-05-26.json new file mode 100644 index 0000000..20ca5ca --- /dev/null +++ b/output/daily_feedback/ai_descriptions_feishu_2026-05-26.json @@ -0,0 +1,17 @@ +{ + "date": "2026-05-26", + "descriptions": [ + { + "index": 1, + "description": "在应用录音环节,背景音乐音量过相关人员致用户人声微弱,造成语音识别率低,且麦克风界面动画卡顿。" + }, + { + "index": 2, + "description": "在飞船系统中,用户更换音乐后重新进入时音乐自动恢复为默认,无法保存切换设置。" + }, + { + "index": 3, + "description": "无明确问题" + } + ] +} \ No newline at end of file diff --git a/output/daily_feedback/ai_descriptions_wechat_2026-05-26.json b/output/daily_feedback/ai_descriptions_wechat_2026-05-26.json new file mode 100644 index 0000000..f6253fa --- /dev/null +++ b/output/daily_feedback/ai_descriptions_wechat_2026-05-26.json @@ -0,0 +1,61 @@ +{ + "date": "2026-05-26", + "descriptions": [ + { + "index": 1, + "description": "无明确问题" + }, + { + "index": 2, + "description": "飞船音乐切换后,重新进出时音乐会恢复为默认歌曲,无法保存切换设置。" + }, + { + "index": 3, + "description": "无明确问题" + }, + { + "index": 4, + "description": "在移动端瓦拉英语应用中,录音识别功能存在识别率低且录音时麦克风动画卡顿的问题。" + }, + { + "index": 5, + "description": "无明确问题" + }, + { + "index": 6, + "description": "无明确问题" + }, + { + "index": 7, + "description": "无明确问题" + }, + { + "index": 8, + "description": "无明确问题" + }, + { + "index": 9, + "description": "无明确问题" + }, + { + "index": 10, + "description": "英相关人员频无法播放声音" + }, + { + "index": 11, + "description": "无明确问题" + }, + { + "index": 12, + "description": "无明确问题" + }, + { + "index": 13, + "description": "在强化练习环节中,AI语音回复出现了与当前练习内容无关的语句。" + }, + { + "index": 14, + "description": "无明确问题" + } + ] +} \ No newline at end of file diff --git a/output/daily_feedback/cluster_context_2026-05-26.json b/output/daily_feedback/cluster_context_2026-05-26.json new file mode 100644 index 0000000..438869a --- /dev/null +++ b/output/daily_feedback/cluster_context_2026-05-26.json @@ -0,0 +1,166 @@ +{ + "date": "2026-05-26", + "total_clusters": 3, + "clusters": [ + { + "index": 1, + "cluster_id": "4702315644940596587", + "location": { + "端": "未知", + "环节": "未知", + "课程": "", + "角色/组件": "" + }, + "priority": "P2", + "priority_detail": "", + "category": "其他问题", + "conclusion": "**当前问题排查结论:** 暂无结论排查中", + "messages": [ + { + "sender": "瓦拉英语-萌萌老师(早10晚7)", + "content": "麻烦帮看下吧,我的飞船-音乐切换了歌曲,再重新进出的话音乐又变成了默认的,切换歌曲不能保存吗?", + "msg_type": "text", + "media_url": "", + "time": "2026-05-26 09:28:15" + }, + { + "sender": "嘿哈", + "content": "这个目前设计就是如此,不会保存\n ↳ 回复 瓦拉英语-萌萌老师(早10晚7): 麻烦帮看下吧,我的飞船-音乐切换了歌曲,再重新进出的话音乐又变成了默认的,切换歌曲不能保存吗?", + "msg_type": "link", + "media_url": "", + "time": "2026-05-26 10:58:11" + } + ] + }, + { + "index": 2, + "cluster_id": "6332894499636566314", + "location": { + "端": "移动端", + "环节": "未知", + "课程": "", + "角色/组件": "音频" + }, + "priority": "P2", + "priority_detail": "", + "category": "声音/音频类", + "conclusion": "**当前问题排查结论:** 暂无结论排查中", + "messages": [ + { + "sender": "胡陈辰🦉", + "content": "@许悦 我们可以加个需求 ", + "msg_type": "text", + "media_url": "", + "time": "2026-05-26 12:57:57" + }, + { + "sender": "瓦拉英语-Tom老师", + "content": "老师,这种录音识别率比较低,是正常的么?辛苦帮忙看看", + "msg_type": "text", + "media_url": "", + "time": "2026-05-26 13:07:45" + }, + { + "sender": "嘿哈", + "content": "@瓦拉英语-Tom老师 这个可以咨询一下用户,是有连接音响什么的不?\n ↳ 回复 瓦拉英语-Tom老师: 老师,这种录音识别率比较低,是正常的么?辛苦帮忙看看", + "msg_type": "link", + "media_url": "", + "time": "2026-05-26 14:42:09" + }, + { + "sender": "瓦拉英语-Tom老师", + "content": "@八哥-16619720408好的\n ↳ 回复 嘿哈: @瓦拉英语-Tom老师 这个可以咨询一下用户,是有连接音响什么的不?", + "msg_type": "link", + "media_url": "", + "time": "2026-05-26 14:44:20" + }, + { + "sender": "嘿哈", + "content": "@瓦拉英语-Tom老师 这个可能需要分两步走,我获取了一下用户的音频信息确实用户的声音很小,先让用户尝试通过设置降低一点音乐音量,然后我们这边也和产品老师说一下再优化一下,录音的时候没有其他的声音https://static.valavala.com/vala_user_audio/c6125977134c_134242247464915130.wav\nhttps://static.valavala.com/vala_user_audio/71bec4fc33a2_134242247584791300.wav\nhttps://static.valavala.com/vala_user_audio/b4c7d8eff63c_134242247700853530.wav", + "msg_type": "text", + "media_url": "", + "time": "2026-05-26 14:50:07" + }, + { + "sender": "瓦拉英语-Tom老师", + "content": "[聊天记录] 雷鸣和瓦拉英语-Tom老师\n雷鸣: [视频]\n雷鸣: [视频]\n雷鸣: [图片]", + "msg_type": "link", + "media_url": "", + "time": "2026-05-26 13:07:44" + }, + { + "sender": "嘿哈", + "content": "发一下用户手机号吧", + "msg_type": "text", + "media_url": "", + "time": "2026-05-26 13:08:10" + }, + { + "sender": "瓦拉英语-Tom老师", + "content": "手机号:13617153553", + "msg_type": "text", + "media_url": "", + "time": "2026-05-26 13:08:53" + }, + { + "sender": "瓦拉英语-Tom老师", + "content": "[视频] 17秒 size:2553865", + "msg_type": "video", + "media_url": "", + "time": "2026-05-26 13:47:26" + }, + { + "sender": "Ariel", + "content": "@kevin 而且它这个麦克风的动画看起来超级卡,一秒动一帧的感觉\n ↳ 回复 瓦拉英语-Tom老师: 25984984606212559@openim:\n\n\n\tF7{~9q<@UXR%8T~JwwJa*t;mbAO^OoDmhOXYY;lupVL@-Rh_iFIHO}ld zsj?D5C)EcLYzPpB=|T%EH&dt+wtd>NFMimPg}7u{xNZHiInggBV>{?1{G-XFr|@bwmv_gSzAS!VFA3rBsTyM?o0YB(!yon&Om93lJ`e4V zCii&Z-aXls`cwJAyNdkmx)kqG5QEV|K^rJ;W7GgKxSKQP)ASKeU=4@oH z%oh4DfS0wFCg-KNDEH*YrV6vY(8gLVsY_B;IX$0Fugu33Kb@A6NqCEGQ0MPv@E0zy z)lB9VeioQy1D3@e>GPX%Wnn2%m{0~OEG4D*l=z5kKFv{uVnp?vUC_h*x(ao;m~+Uo%I2KLN0Egnf#&FwHF#8-V?&6miW;DF zS8JsqNpWg{!qkiwP18zs)QCMhoIqP>!3e{TZB9Y4jvN>deM!j1zByFGdz&gXCx z{zq)ttwGk`3}uOv<1eO;&I#Xi+}FPrJNUp*-gcTsu({=6y@nJR z35v;_B?KlpB-lj4%^0unM`Rm8yk*WsUKn2PBzMnO5SR%p1Xkkupu=Bh&=Tn;@W3^H z71M@grI_`9hfo7V_gT%`h*$Ps>mCx47oK;3xbIl2jl>oLGr<|+6cNP|b%5Xlf+)cn pfjkx{zZc)~RA_yuW zQVn7jpOli0~E49i9EVcfd8?16F~D zDxox0?&{yx@>NBv2F~mpI?)D41P|O73fyfiui6hMjluoB{TJHCWTI!Nr(;YW?R~Ys z1L~at=yVEj$62Ag*gBMGktgK_2$7-AwYH>>wtbWm4L6EmX=!6!LpUlm(U5c>~AY=X}YO-?|raG*smk*cS{$ybgANffjF2 z`G!`Um#=vD5fYIX`xdZl%ntlCn;>Sz)uJ`dt>naP`q<){V>#VQnoUQuR-6#m!pNj7 zg`K`L{7!|Vn?S;6R`ZQS6q+D0euBO|XsUVl!n@~xJGW3z5_z}h8O9j^I zJjL}qWpz-!f`JdI>GHYKy^53p>TOi{d}3WJ3=5~PA>-i2^cqTQsFv+#pdnQ0e@%0w z_Xs0m9O47wBO(o9qNtMQqx{6c)6mIWyiO@uiKi%yM_3Wrh+hZ;oGvTW52IAm&yqCo zw#=#IsWi!!8J7t$LElW9bp#XA5y{f=n2Nun#DcMWdD(B2KM|vdb%;TPfT%#MLNp_u oA(C6egOqqUUY<)P!kzNxX&#dLc^+|*%+EE%M=YO~!PQyzKR;###{d8T diff --git a/scripts/__pycache__/detect_p0_realtime.cpython-312.pyc b/scripts/__pycache__/detect_p0_realtime.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ff62242d979aceaab11e0c790c2142a69844377 GIT binary patch literal 15637 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 Rek@a6ItZGOtVkGy{|!IngZcmf diff --git a/scripts/__pycache__/sync_wechat_feedback_minutely.cpython-312.pyc b/scripts/__pycache__/sync_wechat_feedback_minutely.cpython-312.pyc deleted file mode 100644 index 02dff23fa052fa4efa4ec7b65ad79c27d9035264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9442 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 RKc(5P@1Lg#dX2L1{{!rOjbQ)) diff --git a/scripts/detect_p0_realtime.py b/scripts/detect_p0_realtime.py index ec680c2..58eea6d 100644 --- a/scripts/detect_p0_realtime.py +++ b/scripts/detect_p0_realtime.py @@ -27,7 +27,7 @@ SKILL_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "skil sys.path.insert(0, SKILL_DIR) from sync_feishu_feedback import ( - get_db_connection, query_messages, sort_threads, get_tenant_token, + get_db_connection, query_messages, sort_threads, get_tenant_token, content_similarity, DISPATCH_CHAT_ID, DISPATCH_CRED_DIR, P0_NOTIFY_USERS, MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASS, MYSQL_DB, ) @@ -40,17 +40,19 @@ CLUSTER_MIN_SIZE = 2 # 至少 2 条消息才算有效簇 def load_dispatched_state(): - """加载已推送的 P0 簇签名状态。返回 {cluster_signature: dispatch_time}""" + """加载已推送的 P0 簇状态。兼容新旧格式。""" try: with open(STATE_FILE, "r") as f: state = json.load(f) except (FileNotFoundError, json.JSONDecodeError): state = {} - - # 清理超过 24 小时的记录 cutoff = (datetime.now() - timedelta(hours=24)).isoformat() - state = {k: v for k, v in state.items() if v > cutoff} - return state + cleaned = {} + for k, v in state.items(): + ts = v if isinstance(v, str) else v.get("time", "") + if ts > cutoff: + cleaned[k] = v + return cleaned def save_dispatched_state(state): @@ -72,6 +74,47 @@ def cluster_signature(cluster_msgs): return hashlib.md5(joined.encode()).hexdigest() +def cluster_content_fingerprint(cluster_msgs): + """生成基于内容语义的簇指纹,用于跨扫描去重(不依赖消息ID集合)""" + all_contents = [] + for m in cluster_msgs: + c = str(m[3]).strip() if m[3] else "" + if c and len(c) > 8: + all_contents.append(c[:300]) + aggregated = " | ".join(all_contents[:5]) + senders = sorted(set(m[1] for m in cluster_msgs if m[1])) + times = [m[6] for m in cluster_msgs if m[6]] + hour = times[0][:13] if times else "unknown" + return { + "content": aggregated, + "senders": senders, + "hour": hour, + "msg_count": len(cluster_msgs), + } + + +def is_duplicate_p0(new_fp, dispatched_entries): + """ + 基于内容语义判断新 P0 是否与已推送 P0 重复。 + dispatched_entries: {sig: {"time": str, "fp": dict}} + """ + for entry in dispatched_entries.values(): + old_fp = entry.get("fp") + if not old_fp: + continue + same_hour = new_fp["hour"] == old_fp["hour"] + sender_overlap = len(set(new_fp["senders"]) & set(old_fp["senders"])) + if same_hour and sender_overlap >= 1: + sim = content_similarity(new_fp["content"], old_fp["content"]) + if sim > 0.20: + return True + if sender_overlap >= 2: + sim = content_similarity(new_fp["content"], old_fp["content"]) + if sim > 0.35: + return True + return False + + def is_probably_p0(cluster_msgs): """ 快速判断一个簇是否是 P0 级别问题。 @@ -229,7 +272,7 @@ def main(): # 加载已推送状态 state = load_dispatched_state() - print(f"[P0-detect] 已记录 {len(state)} 个已推送簇签名") + print(f"[P0-detect] 已记录 {len(state)} 个已推送簇") # 遍历簇,找出 P0 且未推送的 new_p0_count = 0 @@ -241,7 +284,13 @@ def main(): sig = cluster_signature(cmsgs) if sig in state: - print(f"[P0-detect] 已推送过,跳过: sig={sig[:8]}...") + print(f"[P0-detect] 已推送过(精确匹配),跳过: sig={sig[:8]}...") + continue + + # 内容语义去重 + fp = cluster_content_fingerprint(cmsgs) + if is_duplicate_p0(fp, state): + print(f"[P0-detect] 已推送过(内容匹配),跳过: senders={fp['senders'][:2]}... hour={fp['hour']}") continue print(f"[P0-detect] 🚨 发现新 P0! sig={sig[:8]}... {len(cmsgs)}条消息") @@ -249,14 +298,14 @@ def main(): if args.dry_run: alert = generate_p0_alert_text(cmsgs, info) print(f"[DRY-RUN] 将发送:\n{alert}") - state[sig] = datetime.now().isoformat() + state[sig] = {"time": datetime.now().isoformat(), "fp": fp} new_p0_count += 1 else: alert = generate_p0_alert_text(cmsgs, info) success = dispatch_p0_alert(alert) if success: print(f"[P0-detect] ✅ P0 已实时推送") - state[sig] = datetime.now().isoformat() + state[sig] = {"time": datetime.now().isoformat(), "fp": fp} new_p0_count += 1 else: print(f"[P0-detect] ❌ 推送失败") diff --git a/scripts/detect_p0_wechat.py b/scripts/detect_p0_wechat.py index b4c531e..46c2499 100755 --- a/scripts/detect_p0_wechat.py +++ b/scripts/detect_p0_wechat.py @@ -25,7 +25,7 @@ SKILL_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "skil sys.path.insert(0, SKILL_DIR) from sync_feishu_feedback import ( - sort_threads, get_tenant_token, + sort_threads, get_tenant_token, content_similarity, DISPATCH_CHAT_ID, DISPATCH_CRED_DIR, P0_NOTIFY_USERS, MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASS, MYSQL_DB, ) @@ -44,7 +44,13 @@ def load_dispatched_state(): except (FileNotFoundError, json.JSONDecodeError): state = {} cutoff = (datetime.now() - timedelta(hours=24)).isoformat() - return {k: v for k, v in state.items() if v > cutoff} + # 兼容新旧格式:新格式 value 是 {"time": ..., "fp": ...},旧格式是纯时间字符串 + cleaned = {} + for k, v in state.items(): + ts = v if isinstance(v, str) else v.get("time", "") + if ts > cutoff: + cleaned[k] = v + return cleaned def save_dispatched_state(state): @@ -60,6 +66,53 @@ def cluster_signature(cluster_msgs): return hashlib.md5(",".join(ids).encode()).hexdigest() +def cluster_content_fingerprint(cluster_msgs): + """生成基于内容语义的簇指纹,用于跨扫描去重(不依赖消息ID集合)""" + # 拼接簇内所有有意义的消息内容(跳过纯图片/文件/表情) + all_contents = [] + for m in cluster_msgs: + c = str(m[3]).strip() if m[3] else "" + if c and len(c) > 8: + all_contents.append(c[:300]) + # 取前5条聚合,保证核心问题描述稳定 + aggregated = " | ".join(all_contents[:5]) + # 提取发送人集合(排序保证一致性) + senders = sorted(set(m[1] for m in cluster_msgs if m[1])) + # 提取小时粒度的时间窗口 + times = [m[6] for m in cluster_msgs if m[6]] + hour = times[0][:13] if times else "unknown" + return { + "content": aggregated, + "senders": senders, + "hour": hour, + "msg_count": len(cluster_msgs), + } + + +def is_duplicate_p0(new_fp, dispatched_entries): + """ + 基于内容语义判断新 P0 是否与已推送 P0 重复。 + dispatched_entries: {sig: {"time": str, "fp": dict}} + """ + for entry in dispatched_entries.values(): + old_fp = entry.get("fp") + if not old_fp: + continue + same_hour = new_fp["hour"] == old_fp["hour"] + sender_overlap = len(set(new_fp["senders"]) & set(old_fp["senders"])) + # 条件1: 同一小时 + 发送人有交集 + 内容相似度 > 0.20(聚合内容稳定,宽松阈值足够区分) + if same_hour and sender_overlap >= 1: + sim = content_similarity(new_fp["content"], old_fp["content"]) + if sim > 0.20: + return True + # 条件2: 发送人高度重叠 + 内容相似度 > 0.35(跨小时场景) + if sender_overlap >= 2: + sim = content_similarity(new_fp["content"], old_fp["content"]) + if sim > 0.35: + return True + return False + + def is_probably_p0(cluster_msgs): if len(cluster_msgs) < CLUSTER_MIN_SIZE: return False, None @@ -200,7 +253,7 @@ def main(): print(f"[P0-wechat] 聚类完成:{len(clusters)} 个簇") state = load_dispatched_state() - print(f"[P0-wechat] 已记录 {len(state)} 个已推送簇签名") + print(f"[P0-wechat] 已记录 {len(state)} 个已推送簇") new_p0_count = 0 for cid in cluster_order: @@ -211,7 +264,13 @@ def main(): sig = cluster_signature(cmsgs) if sig in state: - print(f"[P0-wechat] 已推送过,跳过: sig={sig[:8]}...") + print(f"[P0-wechat] 已推送过(精确匹配),跳过: sig={sig[:8]}...") + continue + + # 内容语义去重 + fp = cluster_content_fingerprint(cmsgs) + if is_duplicate_p0(fp, state): + print(f"[P0-wechat] 已推送过(内容匹配),跳过: senders={fp['senders'][:2]}... hour={fp['hour']}") continue print(f"[P0-wechat] 🚨 发现新 P0! sig={sig[:8]}... {len(cmsgs)}条消息") @@ -219,13 +278,13 @@ def main(): if args.dry_run: alert = generate_p0_alert_text(cmsgs, info) print(f"[DRY-RUN] 将发送:\n{alert}") - state[sig] = datetime.now().isoformat() + state[sig] = {"time": datetime.now().isoformat(), "fp": fp} new_p0_count += 1 else: alert = generate_p0_alert_text(cmsgs, info) if dispatch_p0_alert(alert): print(f"[P0-wechat] ✅ P0 已实时推送") - state[sig] = datetime.now().isoformat() + state[sig] = {"time": datetime.now().isoformat(), "fp": fp} new_p0_count += 1 else: print(f"[P0-wechat] ❌ 推送失败") diff --git a/skills/feishu-group-msg-sync/scripts/__pycache__/sync_group_to_mysql.cpython-312.pyc b/skills/feishu-group-msg-sync/scripts/__pycache__/sync_group_to_mysql.cpython-312.pyc deleted file mode 100644 index 7c495a46cf997e41dbb11e514edeef1d69934472..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31296 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 Up=(6xbvgNb`vQT<%lPm0zlvC!(f|Me diff --git a/skills/tencent-cos-upload/scripts/__pycache__/cos_upload.cpython-312.pyc b/skills/tencent-cos-upload/scripts/__pycache__/cos_upload.cpython-312.pyc index 0eff2795f4ee689a35f269d9ddb8a5793b8a8c65..9bae3b2494c061a841de30a0201d4415e2e81c01 100644 GIT binary patch delta 60 zcmca^_1kJgEh}T`x^a{o>@J%z~0) OeLX!O+PsW)qc{M