From 09481e3ff4dc32e200e88d10c9c847b33ca52730 Mon Sep 17 00:00:00 2001 From: --git_token Date: Thu, 4 Jun 2026 08:10:01 +0800 Subject: [PATCH] auto backup 2026-06-04 08:10:01 --- .vala_skill_hashes | 2 +- data/last_wechat_sync_id | 2 +- memory/.dreams/events.jsonl | 1 + memory/.dreams/short-term-recall.json | 14 +- .../ai_descriptions_feishu_2026-06-02.json | 25 +++ .../ai_descriptions_wechat_2026-06-02.json | 21 +++ .../cluster_context_2026-06-02.json | 100 +++++++++++ .../wechat_cluster_context_2026-06-02.json | 157 ++++++++++++++++++ scripts/ai_summarize_feedback.py | 137 ++++++++++++++- scripts/sync_feishu_feedback_wrapper.sh | 2 +- scripts/sync_wechat_feedback.py | 16 +- .../priority_classifier.cpython-312.pyc | Bin 10641 -> 10662 bytes .../sync_feishu_feedback.cpython-312.pyc | Bin 83292 -> 84637 bytes .../scripts/priority_classifier.py | 2 +- .../scripts/sync_feishu_feedback.py | 21 ++- 15 files changed, 477 insertions(+), 23 deletions(-) create mode 100644 output/daily_feedback/ai_descriptions_feishu_2026-06-02.json create mode 100644 output/daily_feedback/ai_descriptions_wechat_2026-06-02.json create mode 100644 output/daily_feedback/cluster_context_2026-06-02.json create mode 100644 output/daily_feedback/wechat_cluster_context_2026-06-02.json diff --git a/.vala_skill_hashes b/.vala_skill_hashes index 59ab1f8..3c555a7 100644 --- a/.vala_skill_hashes +++ b/.vala_skill_hashes @@ -14,4 +14,4 @@ user-feedback-data-source a95eb9142f3019fd193c46f89147dc7e0bf01dfe250202565a86f8 user-feedback-processor 61783a8e9f03a973c187b359a87749ad1993dc71f8364b0a853d8b3ff64c75e8 feishu-group-msg-sync 953534cc3d1cf4489060afe1cf10cad75faedd3f2d699ffa7478d178d528dc51 tencent-cos-upload 2505dbc8c7acdaf95f2228598ae12010e09599a25df4319587c4a3109d828053 -feishu-feedback-sync 066a9fd4da5ddb9dd2d4dc27412e593787747d87a6b4183e39354fd3f6443b4b +feishu-feedback-sync fa183bd91d2b8d1c6fae7647aa4b3536791e729a1cc8146dfa5b29d4120a8467 diff --git a/data/last_wechat_sync_id b/data/last_wechat_sync_id index 2bfb0ae..d71bdf5 100644 --- a/data/last_wechat_sync_id +++ b/data/last_wechat_sync_id @@ -1 +1 @@ -1930 +1933 diff --git a/memory/.dreams/events.jsonl b/memory/.dreams/events.jsonl index 4f22037..3869001 100644 --- a/memory/.dreams/events.jsonl +++ b/memory/.dreams/events.jsonl @@ -32,3 +32,4 @@ {"type":"memory.recall.recorded","timestamp":"2026-06-01T14:02:36.057Z","query":"毋益飞 user_id","resultCount":1,"results":[{"path":"memory/2026-05-07.md","startLine":109,"endLine":148,"score":1}]} {"type":"memory.recall.recorded","timestamp":"2026-06-02T06:49:10.085Z","query":"小编 飞书 user_id 身份","resultCount":4,"results":[{"path":"memory/2026-05-25.md","startLine":21,"endLine":42,"score":1},{"path":"memory/2026-05-26.md","startLine":1,"endLine":24,"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-06-02T06:49:17.685Z","query":"小编 群聊 身份 open_id","resultCount":1,"results":[{"path":"memory/2026-04-18.md","startLine":1,"endLine":5,"score":1}]} +{"type":"memory.recall.recorded","timestamp":"2026-06-03T02:09:30.724Z","query":"小葵小葵群 chat_id 用户反馈发送","resultCount":1,"results":[{"path":"memory/2026-04-18.md","startLine":1,"endLine":5,"score":1}]} diff --git a/memory/.dreams/short-term-recall.json b/memory/.dreams/short-term-recall.json index 48efd6c..d409f7b 100644 --- a/memory/.dreams/short-term-recall.json +++ b/memory/.dreams/short-term-recall.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-06-02T06:49:17.685Z", + "updatedAt": "2026-06-03T02:09:30.724Z", "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": 10, + "recallCount": 11, "dailyCount": 0, "groundedCount": 0, - "totalScore": 10, + "totalScore": 11, "maxScore": 1, "firstRecalledAt": "2026-04-30T03:47:21.989Z", - "lastRecalledAt": "2026-06-02T06:49:17.685Z", + "lastRecalledAt": "2026-06-03T02:09:30.724Z", "queryHashes": [ "353f9765c086", "a6b740c99377", @@ -26,7 +26,8 @@ "261597c52d5b", "3fe44d618bf6", "06538386c796", - "ce7929958572" + "ce7929958572", + "ffaa95d422fd" ], "recallDays": [ "2026-04-30", @@ -36,7 +37,8 @@ "2026-05-26", "2026-05-27", "2026-05-28", - "2026-06-02" + "2026-06-02", + "2026-06-03" ], "conceptTags": [ "vala-test.lark-group-message", diff --git a/output/daily_feedback/ai_descriptions_feishu_2026-06-02.json b/output/daily_feedback/ai_descriptions_feishu_2026-06-02.json new file mode 100644 index 0000000..b32f205 --- /dev/null +++ b/output/daily_feedback/ai_descriptions_feishu_2026-06-02.json @@ -0,0 +1,25 @@ +{ + "date": "2026-06-02", + "descriptions": [ + { + "index": 1, + "description": "关卡中题目的相关人员解析功能缺失" + }, + { + "index": 2, + "description": "端上测试包的Test中缺少新上线的“看图拼词”组件" + }, + { + "index": 3, + "description": "相关功能尚未合并至发版分支,导致无法在发版版本中进行测试。" + }, + { + "index": 4, + "description": "无明确问题" + }, + { + "index": 5, + "description": "无明确问题" + } + ] +} \ No newline at end of file diff --git a/output/daily_feedback/ai_descriptions_wechat_2026-06-02.json b/output/daily_feedback/ai_descriptions_wechat_2026-06-02.json new file mode 100644 index 0000000..eb056b8 --- /dev/null +++ b/output/daily_feedback/ai_descriptions_wechat_2026-06-02.json @@ -0,0 +1,21 @@ +{ + "date": "2026-06-02", + "descriptions": [ + { + "index": 1, + "description": "无明确问题" + }, + { + "index": 2, + "description": "京东相关人员课屏的磨耳朵功能出现相关人员" + }, + { + "index": 3, + "description": "无明确问题" + }, + { + "index": 4, + "description": "希沃学习机上查看题目解析和进入Season1第三关时频繁闪退。" + } + ] +} \ No newline at end of file diff --git a/output/daily_feedback/cluster_context_2026-06-02.json b/output/daily_feedback/cluster_context_2026-06-02.json new file mode 100644 index 0000000..6314ead --- /dev/null +++ b/output/daily_feedback/cluster_context_2026-06-02.json @@ -0,0 +1,100 @@ +{ + "date": "2026-06-02", + "total_clusters": 1, + "clusters": [ + { + "index": 1, + "_idx": 1, + "cluster_id": "7302252117666642816", + "location": { + "端": "未知", + "环节": "未知", + "课程": "", + "角色/组件": "" + }, + "priority": "P0", + "priority_detail": "", + "category": "启动/运行异常", + "conclusion": "**当前问题排查结论:** 暂无结论排查中", + "messages": [ + { + "sender": "瓦拉英语-茉茉老师(早10晚7)", + "content": "[图片] 78d95a2b44601479633367bebabeab5d", + "msg_type": "image", + "media_url": "https://static.valavala.com/vala_llm/user_feedback/wechat/image/2026-06/675ebc29ab5013c7312dc774d34511b3.jpg", + "time": "2026-06-02 19:58:29" + }, + { + "sender": "瓦拉英语-茉茉老师(早10晚7)", + "content": "又有家长反映这个不能用鼠标写", + "msg_type": "text", + "media_url": "", + "time": "2026-06-02 19:58:47" + }, + { + "sender": "瓦拉英语-茉茉老师(早10晚7)", + "content": "这个问题后面怎么解决呀,增加跳过的按钮吗", + "msg_type": "text", + "media_url": "", + "time": "2026-06-02 19:59:08" + }, + { + "sender": ".oO(王_计)Oo.", + "content": "已经解决,随下次热更新", + "msg_type": "text", + "media_url": "", + "time": "2026-06-02 19:59:54" + }, + { + "sender": "瓦拉英语-茉茉老师(早10晚7)", + "content": "好的👌", + "msg_type": "text", + "media_url": "", + "time": "2026-06-02 20:00:54" + }, + { + "sender": "瓦拉英语-花花班班(早10晚7-周末休息)", + "content": "[聊天记录] 綦小綦和瓦拉英语-花花班主任(早10晚7)\n綦小綦: [视频]\n綦小綦: 做题或者查看做题情况 都这样一会就闪退\n綦小綦: 你们这系统技术能改进一下吗\n綦小綦: 老卡呢\n綦小綦: 要不就卡顿\n瓦拉英语-花花班主任(早10晚7): 咱们是用的什么设备学习呢\n綦小綦: [图片]\n綦小綦: 我这没有上传日志啊\n綦小綦: 我用的希沃学习机\n綦小綦: 一天闪退好几次", + "msg_type": "link", + "media_url": "", + "time": "2026-06-02 20:04:20" + }, + { + "sender": "瓦拉英语-花花班班(早10晚7-周末休息)", + "content": "13464008928用户用的希沃学习机经常闪退,辛苦老师看下", + "msg_type": "text", + "media_url": "", + "time": "2026-06-02 20:04:46" + }, + { + "sender": "嘿哈", + "content": "让他进入角色后再进入设置页面点击上传日志,不要在选择角色页面进设置页\n ↳ 回复 瓦拉英语-花花班主任(早10晚7): 13464008928用户用的希沃学习机经常闪退,辛苦老师看下", + "msg_type": "link", + "media_url": "", + "time": "2026-06-02 20:06:00" + }, + { + "sender": "嘿哈", + "content": "确认一下闪退的地点,是只有查看题目解析的时候闪退么?还是说有其他路径\n ↳ 回复 瓦拉英语-花花班主任(早10晚7): 13464008928用户用的希沃学习机经常闪退,辛苦老师看下", + "msg_type": "link", + "media_url": "", + "time": "2026-06-02 20:06:23" + }, + { + "sender": "瓦拉英语-花花班班(早10晚7-周末休息)", + "content": "好的", + "msg_type": "text", + "media_url": "", + "time": "2026-06-02 20:09:58" + }, + { + "sender": "瓦拉英语-花花班班(早10晚7-周末休息)", + "content": "家长说查看题目解析,它也闪退。然后今天做的是Season1里的第三关点进去也闪退。", + "msg_type": "text", + "media_url": "", + "time": "2026-06-02 20:29:32" + } + ] + } + ] +} \ No newline at end of file diff --git a/output/daily_feedback/wechat_cluster_context_2026-06-02.json b/output/daily_feedback/wechat_cluster_context_2026-06-02.json new file mode 100644 index 0000000..828e3e7 --- /dev/null +++ b/output/daily_feedback/wechat_cluster_context_2026-06-02.json @@ -0,0 +1,157 @@ +{ + "date": "2026-06-02", + "clusters": [ + { + "index": 1, + "_idx": 1, + "cluster_id": "4437274725416708727", + "message_count": 1, + "priority": "P2", + "priority_detail": "基础优先级: P2(无法精确匹配,默认归为P2)", + "messages": [ + { + "sender": "瓦拉英语-露露班班(早10晚7)", + "content": "[图片] f76c7d140dc870f5ae2b42a6c27621c7", + "msg_type": "image", + "time": "2026-06-02 09:44:34", + "message_id": "4437274725416708727", + "quote_message_id": "" + } + ] + }, + { + "index": 2, + "_idx": 2, + "cluster_id": "8085984444640105314", + "message_count": 1, + "priority": "P0", + "priority_detail": "基础优先级: P0(匹配P0规则:crash)", + "messages": [ + { + "sender": "瓦拉英语-露露班班(早10晚7)", + "content": "京东方小课屏的磨耳朵又出现了白屏,已经引导用户在小程序上听", + "msg_type": "text", + "time": "2026-06-02 09:45:08", + "message_id": "8085984444640105314", + "quote_message_id": "" + } + ] + }, + { + "index": 3, + "_idx": 3, + "cluster_id": "6374990160361275847", + "message_count": 1, + "priority": "P2", + "priority_detail": "基础优先级: P2(无法精确匹配,默认归为P2)", + "messages": [ + { + "sender": ".oO(王_计)Oo.", + "content": "磨耳朵已经在用unity原生重新开发了。让用户再稍微等一下", + "msg_type": "text", + "time": "2026-06-02 09:46:34", + "message_id": "6374990160361275847", + "quote_message_id": "" + } + ] + }, + { + "index": 4, + "_idx": 4, + "cluster_id": "7302252117666642816", + "message_count": 11, + "priority": "P0", + "priority_detail": "基础优先级: P0(匹配P0规则:crash);出现频率: 高概率", + "messages": [ + { + "sender": "瓦拉英语-花花班班(早10晚7-周末休息)", + "content": "13464008928用户用的希沃学习机经常闪退,辛苦老师看下", + "msg_type": "text", + "time": "2026-06-02 20:04:46", + "message_id": "7302252117666642816", + "quote_message_id": "" + }, + { + "sender": "嘿哈", + "content": "让他进入角色后再进入设置页面点击上传日志,不要在选择角色页面进设置页\n ↳ 回复 瓦拉英语-花花班主任(早10晚7): 13464008928用户用的希沃学习机经常闪退,辛苦老师看下", + "msg_type": "link", + "time": "2026-06-02 20:06:00", + "message_id": "3680519818246863462", + "quote_message_id": "7302252117666642816" + }, + { + "sender": "嘿哈", + "content": "确认一下闪退的地点,是只有查看题目解析的时候闪退么?还是说有其他路径\n ↳ 回复 瓦拉英语-花花班主任(早10晚7): 13464008928用户用的希沃学习机经常闪退,辛苦老师看下", + "msg_type": "link", + "time": "2026-06-02 20:06:23", + "message_id": "5476954047159243877", + "quote_message_id": "7302252117666642816" + }, + { + "sender": "瓦拉英语-茉茉老师(早10晚7)", + "content": "[图片] 78d95a2b44601479633367bebabeab5d", + "msg_type": "image", + "time": "2026-06-02 19:58:29", + "message_id": "8392416847465848425", + "quote_message_id": "" + }, + { + "sender": "瓦拉英语-茉茉老师(早10晚7)", + "content": "又有家长反映这个不能用鼠标写", + "msg_type": "text", + "time": "2026-06-02 19:58:47", + "message_id": "6149726619633505263", + "quote_message_id": "" + }, + { + "sender": "瓦拉英语-茉茉老师(早10晚7)", + "content": "这个问题后面怎么解决呀,增加跳过的按钮吗", + "msg_type": "text", + "time": "2026-06-02 19:59:08", + "message_id": "533759990164518435", + "quote_message_id": "" + }, + { + "sender": ".oO(王_计)Oo.", + "content": "已经解决,随下次热更新", + "msg_type": "text", + "time": "2026-06-02 19:59:54", + "message_id": "9092556441259768782", + "quote_message_id": "" + }, + { + "sender": "瓦拉英语-茉茉老师(早10晚7)", + "content": "好的👌", + "msg_type": "text", + "time": "2026-06-02 20:00:54", + "message_id": "6634484585577794512", + "quote_message_id": "" + }, + { + "sender": "瓦拉英语-花花班班(早10晚7-周末休息)", + "content": "[聊天记录] 綦小綦和瓦拉英语-花花班主任(早10晚7)\n綦小綦: [视频]\n綦小綦: 做题或者查看做题情况 都这样一会就闪退\n綦小綦: 你们这系统技术能改进一下吗\n綦小綦: 老卡呢\n綦小綦: 要不就卡顿\n瓦拉英语-花花班主任(早10晚7): 咱们是用的什么设备学习呢\n綦小綦: [图片]\n綦小綦: 我这没有上传日志啊\n綦小綦: 我用的希沃学习机\n綦小綦: 一天闪退好几次", + "msg_type": "link", + "time": "2026-06-02 20:04:20", + "message_id": "5406706268715174985", + "quote_message_id": "" + }, + { + "sender": "瓦拉英语-花花班班(早10晚7-周末休息)", + "content": "好的", + "msg_type": "text", + "time": "2026-06-02 20:09:58", + "message_id": "2006689369710136562", + "quote_message_id": "" + }, + { + "sender": "瓦拉英语-花花班班(早10晚7-周末休息)", + "content": "家长说查看题目解析,它也闪退。然后今天做的是Season1里的第三关点进去也闪退。", + "msg_type": "text", + "time": "2026-06-02 20:29:32", + "message_id": "1516319709508113867", + "quote_message_id": "" + } + ] + } + ] +} \ No newline at end of file diff --git a/scripts/ai_summarize_feedback.py b/scripts/ai_summarize_feedback.py index 3ed5902..3e20147 100644 --- a/scripts/ai_summarize_feedback.py +++ b/scripts/ai_summarize_feedback.py @@ -230,6 +230,7 @@ def generate_descriptions(context_data, dry_run=False): def apply_descriptions(date_str, descriptions, channel="feishu"): """调用 sync_*_feedback.py --apply-ai 回写文档 channel: "feishu" 或 "wechat" + 返回 (doc_update_ok, summary_md) 元组。 """ sys.path.insert(0, SKILL_SCRIPT_DIR) @@ -260,6 +261,8 @@ def apply_descriptions(date_str, descriptions, channel="feishu"): capture_output=True, text=True, timeout=60, env=env ) + # 从 stdout 提取替换后的 summary_md(用于后续分发) + summary_md = "" if "AI 描述已应用" in result.stdout or "✅" in result.stdout: print(f" ✅ AI 描述已回写到知识库文档") # 回写成功后清理上下文文件,避免心跳重复处理 @@ -268,11 +271,134 @@ def apply_descriptions(date_str, descriptions, channel="feishu"): if os.path.exists(context_path): os.remove(context_path) print(f" 🗑️ 已清理上下文文件: {context_path}") - return True + return True, summary_md else: print(f" ❌ 回写失败: {result.stdout[:300]}") if result.stderr: print(f" stderr: {result.stderr[:300]}") + # 回写失败时,用 context + AI 描述自行构建 summary_md 用于分发 + summary_md = build_summary_from_context(date_str, descriptions, channel) + return False, summary_md + + +def build_summary_from_context(date_str, descriptions, channel="feishu"): + """从 cluster_context + AI 描述构建 summary markdown(用于分发到群聊)。""" + ctx_prefix = "wechat_cluster_context" if channel == "wechat" else "cluster_context" + context_path = os.path.join(CONTEXT_DIR, f"{ctx_prefix}_{date_str}.json") + if not os.path.exists(context_path): + return "" + + with open(context_path, "r", encoding="utf-8") as f: + ctx = json.load(f) + + desc_map = {d["index"]: d["description"] for d in descriptions} + + lines = ["## 今日问题归纳", ""] + + # 按优先级分组 + grouped = {"P0": [], "P1": [], "P2": [], "P3": []} + for c in ctx["clusters"]: + idx = c.get("_idx") or c.get("index", 0) + desc = desc_map.get(idx, f"[问题{idx}]") + priority = c.get("priority", "P2") + grouped[priority].append(desc) + + headers = { + "P0": "⚠️ P0级核心问题(需优先处理)", + "P1": "⚡ P1级重要问题", + "P2": "📌 P2级一般问题", + "P3": "📝 P3级低优先级", + } + + for p_level in ["P0", "P1", "P2", "P3"]: + items = grouped[p_level] + if not items: + continue + lines.append(f"**{headers[p_level]}**") + for item in items: + lines.append(f"- {item}") + lines.append("") + + return "\n".join(lines) + + +def dispatch_summary_to_group(date_str, summary_md, channel="feishu"): + """将归纳摘要发送到「小葵小葵」群聊。使用 Python 直接调飞书 API。""" + DISPATCH_CHAT_ID = "oc_4171a2188f2554522a4309f2d7c27753" + SUMMARY_PARENT_NODE = "MpBNdkCxOobSNQxeJJDcWg9ZnRI" + + if not summary_md: + print(" ⚠️ 无归纳内容可分发") + return False + + # 提取「今日问题归纳」部分 + if "## 今日问题归纳" in summary_md: + 归纳_content = summary_md.split("## 今日问题归纳\n", 1)[1] + else: + 归纳_content = summary_md + + # 过滤"无明确问题"条目 + filtered_lines = [] + for line in 归纳_content.strip().split("\n"): + stripped = line.strip() + if stripped in ("- 无明确问题", "* 无明确问题"): + continue + filtered_lines.append(line) + 归纳_content = "\n".join(filtered_lines).strip() + + has_items = any(line.strip().startswith("- ") for line in filtered_lines) + if not 归纳_content or not has_items: + print(" ⚠️ 无归纳内容可分发(已过滤无明确问题条目)") + return False + + # 获取 token + config = json.load(open("/root/.openclaw/credentials/xiaokui/config.json")) + app_id = config["apps"][0]["appId"] + app_secret = config["apps"][0]["appSecret"] + req = urllib.request.Request( + "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal", + data=json.dumps({"app_id": app_id, "app_secret": app_secret}).encode(), + headers={"Content-Type": "application/json"}, method="POST" + ) + token = json.loads(urllib.request.urlopen(req, timeout=10).read())["tenant_access_token"] + + # 构建 post 消息 + label_prefix = "" if date_str.startswith(("微信-", "飞书-")) else "飞书-" + title = f"📋 {label_prefix}{date_str} 用户反馈问题归纳" + + content_parts = [] + for line in 归纳_content.split("\n"): + content_parts.append([{"tag": "text", "text": line + "\n"}]) + + doc_url = f"https://makee-interactive.feishu.cn/wiki/{SUMMARY_PARENT_NODE}" + content_parts.append([ + {"tag": "text", "text": "\n📄 详细文档:"}, + {"tag": "a", "text": f"{label_prefix}{date_str} 用户反馈问题归纳", "href": doc_url} + ]) + + post_content = json.dumps({ + "zh_cn": {"title": title, "content": content_parts} + }, ensure_ascii=False) + + body = json.dumps({ + "receive_id": DISPATCH_CHAT_ID, + "msg_type": "post", + "content": post_content + }, ensure_ascii=False).encode() + + req2 = urllib.request.Request( + "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id", + data=body, + headers={"Authorization": f"Bearer {token}", "Content-Type": "application/json"}, + method="POST" + ) + resp = urllib.request.urlopen(req2, timeout=10) + result = json.loads(resp.read()) + if result.get("code") == 0: + print(f" ✅ 问题归纳已分发到群聊") + return True + else: + print(f" ⚠️ 分发失败: {result.get('msg', '')[:100]}") return False @@ -311,7 +437,14 @@ def main(): print(f"[DRY-RUN] 描述已保存到 {desc_path},未回写文档") return - apply_descriptions(date_str, descriptions, channel=channel) + ok, summary_md = apply_descriptions(date_str, descriptions, channel=channel) + + # AI 归纳完成后分发到群聊(飞书和微信都发) + if summary_md: + print(f"📨 分发 AI 归纳到群聊...") + dispatch_summary_to_group(date_str, summary_md, channel=channel) + else: + print(f" ⚠️ 无归纳内容,跳过分发") if __name__ == "__main__": diff --git a/scripts/sync_feishu_feedback_wrapper.sh b/scripts/sync_feishu_feedback_wrapper.sh index 8e70f91..67fa2d8 100755 --- a/scripts/sync_feishu_feedback_wrapper.sh +++ b/scripts/sync_feishu_feedback_wrapper.sh @@ -18,7 +18,7 @@ log "=== 每日全量分发开始 ===" YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) cd /root/.openclaw/workspace-xiaokui -python3 skills/feishu-feedback-sync/scripts/sync_feishu_feedback.py --date "$YESTERDAY" --steps 7 --ai-placeholders --dispatch-mode all >> "$LOG_FILE" 2>&1 +python3 skills/feishu-feedback-sync/scripts/sync_feishu_feedback.py --date "$YESTERDAY" --steps 1-6 --ai-placeholders --skip-dispatch >> "$LOG_FILE" 2>&1 log "=== 每日全量分发结束 ===" exit 0 diff --git a/scripts/sync_wechat_feedback.py b/scripts/sync_wechat_feedback.py index 2e14c12..3677a0a 100755 --- a/scripts/sync_wechat_feedback.py +++ b/scripts/sync_wechat_feedback.py @@ -79,15 +79,20 @@ def fetch_wechat_data(date_str): def gen_context_json(date_str, clusters, cluster_order): - """保存簇上下文 JSON 供 AI 使用""" + """保存簇上下文 JSON 供 AI 使用,包含 _idx 和优先级信息""" os.makedirs(CONTEXT_DIR, exist_ok=True) ctx = {"date": date_str, "clusters": []} for idx, cid in enumerate(cluster_order): cmsgs = clusters[cid] + # 计算优先级 + priority_info = fsf.compute_final_priority(cmsgs) ctx["clusters"].append({ "index": idx + 1, + "_idx": idx + 1, # 占位符编号 "cluster_id": cid, "message_count": len(cmsgs), + "priority": priority_info.get("priority", "P2"), + "priority_detail": priority_info.get("reasoning", ""), "messages": [ {"sender": m[1], "content": m[3], "msg_type": m[2], "time": m[6], "message_id": m[0], "quote_message_id": m[5]} @@ -203,16 +208,19 @@ def main(): print("❌ 无法创建/找到文档") sys.exit(1) + workspace_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) tmp_md = "tmp/wechat_ai_summary.md" - with open(tmp_md, "w", encoding="utf-8") as f: + tmp_md_abs = os.path.join(workspace_root, tmp_md) + os.makedirs(os.path.dirname(tmp_md_abs), exist_ok=True) + with open(tmp_md_abs, "w", encoding="utf-8") as f: f.write(summary_md) env = os.environ.copy() env["LARKSUITE_CLI_CONFIG_DIR"] = CRED_DIR result = subprocess.run( [CLI, "docs", "+update", "--doc", obj_token, "--as", "bot", "--mode", "overwrite", "--markdown", f"@{tmp_md}"], - env=env, capture_output=True, text=True, timeout=15) - os.unlink(tmp_md) + env=env, capture_output=True, text=True, timeout=15, cwd=workspace_root) + os.unlink(tmp_md_abs) try: resp = json.loads(result.stdout) diff --git a/skills/feishu-feedback-sync/scripts/__pycache__/priority_classifier.cpython-312.pyc b/skills/feishu-feedback-sync/scripts/__pycache__/priority_classifier.cpython-312.pyc index ed9fe966a9363194c66b808a29382cd35cb149f7..1802ac66f29be53208d96a84e3acf7fa30a27983 100644 GIT binary patch delta 80 zcmbOjyeydaG%qg~0}yN>BkwV0-7X;S<@8lA8yae!Zdv(kS98tN-i6QB?yh-0 hbMMoQ{WULlPXtjfx;6r-&99kFlo_KpE2tMT0RY%GC*A-6 delta 58 zcmZ1$JTaK}G%qg~0}vE%_?0= NqRi;F*;Kud2>`AL7_|TZ diff --git a/skills/feishu-feedback-sync/scripts/__pycache__/sync_feishu_feedback.cpython-312.pyc b/skills/feishu-feedback-sync/scripts/__pycache__/sync_feishu_feedback.cpython-312.pyc index db819fdd11ffb37ee4d543e674b26fcfa50ea63d..5b9c8c43415e00d25727a25ce20d87323ed6d827 100644 GIT binary patch delta 6415 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 delta 5588 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