auto backup 2026-06-04 08:10:01
This commit is contained in:
parent
fe16e7aa6e
commit
09481e3ff4
@ -14,4 +14,4 @@ user-feedback-data-source a95eb9142f3019fd193c46f89147dc7e0bf01dfe250202565a86f8
|
|||||||
user-feedback-processor 61783a8e9f03a973c187b359a87749ad1993dc71f8364b0a853d8b3ff64c75e8
|
user-feedback-processor 61783a8e9f03a973c187b359a87749ad1993dc71f8364b0a853d8b3ff64c75e8
|
||||||
feishu-group-msg-sync 953534cc3d1cf4489060afe1cf10cad75faedd3f2d699ffa7478d178d528dc51
|
feishu-group-msg-sync 953534cc3d1cf4489060afe1cf10cad75faedd3f2d699ffa7478d178d528dc51
|
||||||
tencent-cos-upload 2505dbc8c7acdaf95f2228598ae12010e09599a25df4319587c4a3109d828053
|
tencent-cos-upload 2505dbc8c7acdaf95f2228598ae12010e09599a25df4319587c4a3109d828053
|
||||||
feishu-feedback-sync 066a9fd4da5ddb9dd2d4dc27412e593787747d87a6b4183e39354fd3f6443b4b
|
feishu-feedback-sync fa183bd91d2b8d1c6fae7647aa4b3536791e729a1cc8146dfa5b29d4120a8467
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
1930
|
1933
|
||||||
|
|||||||
@ -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-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: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-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}]}
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"updatedAt": "2026-06-02T06:49:17.685Z",
|
"updatedAt": "2026-06-03T02:09:30.724Z",
|
||||||
"entries": {
|
"entries": {
|
||||||
"memory:memory/2026-04-18.md:1:5": {
|
"memory:memory/2026-04-18.md:1:5": {
|
||||||
"key": "memory:memory/2026-04-18.md:1:5",
|
"key": "memory:memory/2026-04-18.md:1:5",
|
||||||
@ -9,13 +9,13 @@
|
|||||||
"endLine": 5,
|
"endLine": 5,
|
||||||
"source": "memory",
|
"source": "memory",
|
||||||
"snippet": "# 2026-04-18 工作日志 ## 术语共识 [李若松确认] 术语「飞书反馈消息数据库」默认指代用户反馈收集技能中的飞书内部测试反馈MySQL数据表 `vala_test.lark_group_message`,存储「内容测试问题反馈」群(oc_fabff7672e62a9ced7b326ee4a286c26)的同步消息数据。",
|
"snippet": "# 2026-04-18 工作日志 ## 术语共识 [李若松确认] 术语「飞书反馈消息数据库」默认指代用户反馈收集技能中的飞书内部测试反馈MySQL数据表 `vala_test.lark_group_message`,存储「内容测试问题反馈」群(oc_fabff7672e62a9ced7b326ee4a286c26)的同步消息数据。",
|
||||||
"recallCount": 10,
|
"recallCount": 11,
|
||||||
"dailyCount": 0,
|
"dailyCount": 0,
|
||||||
"groundedCount": 0,
|
"groundedCount": 0,
|
||||||
"totalScore": 10,
|
"totalScore": 11,
|
||||||
"maxScore": 1,
|
"maxScore": 1,
|
||||||
"firstRecalledAt": "2026-04-30T03:47:21.989Z",
|
"firstRecalledAt": "2026-04-30T03:47:21.989Z",
|
||||||
"lastRecalledAt": "2026-06-02T06:49:17.685Z",
|
"lastRecalledAt": "2026-06-03T02:09:30.724Z",
|
||||||
"queryHashes": [
|
"queryHashes": [
|
||||||
"353f9765c086",
|
"353f9765c086",
|
||||||
"a6b740c99377",
|
"a6b740c99377",
|
||||||
@ -26,7 +26,8 @@
|
|||||||
"261597c52d5b",
|
"261597c52d5b",
|
||||||
"3fe44d618bf6",
|
"3fe44d618bf6",
|
||||||
"06538386c796",
|
"06538386c796",
|
||||||
"ce7929958572"
|
"ce7929958572",
|
||||||
|
"ffaa95d422fd"
|
||||||
],
|
],
|
||||||
"recallDays": [
|
"recallDays": [
|
||||||
"2026-04-30",
|
"2026-04-30",
|
||||||
@ -36,7 +37,8 @@
|
|||||||
"2026-05-26",
|
"2026-05-26",
|
||||||
"2026-05-27",
|
"2026-05-27",
|
||||||
"2026-05-28",
|
"2026-05-28",
|
||||||
"2026-06-02"
|
"2026-06-02",
|
||||||
|
"2026-06-03"
|
||||||
],
|
],
|
||||||
"conceptTags": [
|
"conceptTags": [
|
||||||
"vala-test.lark-group-message",
|
"vala-test.lark-group-message",
|
||||||
|
|||||||
25
output/daily_feedback/ai_descriptions_feishu_2026-06-02.json
Normal file
25
output/daily_feedback/ai_descriptions_feishu_2026-06-02.json
Normal file
@ -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": "无明确问题"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
21
output/daily_feedback/ai_descriptions_wechat_2026-06-02.json
Normal file
21
output/daily_feedback/ai_descriptions_wechat_2026-06-02.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"date": "2026-06-02",
|
||||||
|
"descriptions": [
|
||||||
|
{
|
||||||
|
"index": 1,
|
||||||
|
"description": "无明确问题"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 2,
|
||||||
|
"description": "京东相关人员课屏的磨耳朵功能出现相关人员"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 3,
|
||||||
|
"description": "无明确问题"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 4,
|
||||||
|
"description": "希沃学习机上查看题目解析和进入Season1第三关时频繁闪退。"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
100
output/daily_feedback/cluster_context_2026-06-02.json
Normal file
100
output/daily_feedback/cluster_context_2026-06-02.json
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
157
output/daily_feedback/wechat_cluster_context_2026-06-02.json
Normal file
157
output/daily_feedback/wechat_cluster_context_2026-06-02.json
Normal file
@ -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": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -230,6 +230,7 @@ def generate_descriptions(context_data, dry_run=False):
|
|||||||
def apply_descriptions(date_str, descriptions, channel="feishu"):
|
def apply_descriptions(date_str, descriptions, channel="feishu"):
|
||||||
"""调用 sync_*_feedback.py --apply-ai 回写文档
|
"""调用 sync_*_feedback.py --apply-ai 回写文档
|
||||||
channel: "feishu" 或 "wechat"
|
channel: "feishu" 或 "wechat"
|
||||||
|
返回 (doc_update_ok, summary_md) 元组。
|
||||||
"""
|
"""
|
||||||
sys.path.insert(0, SKILL_SCRIPT_DIR)
|
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
|
capture_output=True, text=True, timeout=60, env=env
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# 从 stdout 提取替换后的 summary_md(用于后续分发)
|
||||||
|
summary_md = ""
|
||||||
if "AI 描述已应用" in result.stdout or "✅" in result.stdout:
|
if "AI 描述已应用" in result.stdout or "✅" in result.stdout:
|
||||||
print(f" ✅ AI 描述已回写到知识库文档")
|
print(f" ✅ AI 描述已回写到知识库文档")
|
||||||
# 回写成功后清理上下文文件,避免心跳重复处理
|
# 回写成功后清理上下文文件,避免心跳重复处理
|
||||||
@ -268,11 +271,134 @@ def apply_descriptions(date_str, descriptions, channel="feishu"):
|
|||||||
if os.path.exists(context_path):
|
if os.path.exists(context_path):
|
||||||
os.remove(context_path)
|
os.remove(context_path)
|
||||||
print(f" 🗑️ 已清理上下文文件: {context_path}")
|
print(f" 🗑️ 已清理上下文文件: {context_path}")
|
||||||
return True
|
return True, summary_md
|
||||||
else:
|
else:
|
||||||
print(f" ❌ 回写失败: {result.stdout[:300]}")
|
print(f" ❌ 回写失败: {result.stdout[:300]}")
|
||||||
if result.stderr:
|
if result.stderr:
|
||||||
print(f" stderr: {result.stderr[:300]}")
|
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
|
return False
|
||||||
|
|
||||||
|
|
||||||
@ -311,7 +437,14 @@ def main():
|
|||||||
print(f"[DRY-RUN] 描述已保存到 {desc_path},未回写文档")
|
print(f"[DRY-RUN] 描述已保存到 {desc_path},未回写文档")
|
||||||
return
|
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__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@ -18,7 +18,7 @@ log "=== 每日全量分发开始 ==="
|
|||||||
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
|
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
|
||||||
|
|
||||||
cd /root/.openclaw/workspace-xiaokui
|
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 "=== 每日全量分发结束 ==="
|
log "=== 每日全量分发结束 ==="
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@ -79,15 +79,20 @@ def fetch_wechat_data(date_str):
|
|||||||
|
|
||||||
|
|
||||||
def gen_context_json(date_str, clusters, cluster_order):
|
def gen_context_json(date_str, clusters, cluster_order):
|
||||||
"""保存簇上下文 JSON 供 AI 使用"""
|
"""保存簇上下文 JSON 供 AI 使用,包含 _idx 和优先级信息"""
|
||||||
os.makedirs(CONTEXT_DIR, exist_ok=True)
|
os.makedirs(CONTEXT_DIR, exist_ok=True)
|
||||||
ctx = {"date": date_str, "clusters": []}
|
ctx = {"date": date_str, "clusters": []}
|
||||||
for idx, cid in enumerate(cluster_order):
|
for idx, cid in enumerate(cluster_order):
|
||||||
cmsgs = clusters[cid]
|
cmsgs = clusters[cid]
|
||||||
|
# 计算优先级
|
||||||
|
priority_info = fsf.compute_final_priority(cmsgs)
|
||||||
ctx["clusters"].append({
|
ctx["clusters"].append({
|
||||||
"index": idx + 1,
|
"index": idx + 1,
|
||||||
|
"_idx": idx + 1, # 占位符编号
|
||||||
"cluster_id": cid,
|
"cluster_id": cid,
|
||||||
"message_count": len(cmsgs),
|
"message_count": len(cmsgs),
|
||||||
|
"priority": priority_info.get("priority", "P2"),
|
||||||
|
"priority_detail": priority_info.get("reasoning", ""),
|
||||||
"messages": [
|
"messages": [
|
||||||
{"sender": m[1], "content": m[3], "msg_type": m[2],
|
{"sender": m[1], "content": m[3], "msg_type": m[2],
|
||||||
"time": m[6], "message_id": m[0], "quote_message_id": m[5]}
|
"time": m[6], "message_id": m[0], "quote_message_id": m[5]}
|
||||||
@ -203,16 +208,19 @@ def main():
|
|||||||
print("❌ 无法创建/找到文档")
|
print("❌ 无法创建/找到文档")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
workspace_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
tmp_md = "tmp/wechat_ai_summary.md"
|
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)
|
f.write(summary_md)
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
env["LARKSUITE_CLI_CONFIG_DIR"] = CRED_DIR
|
env["LARKSUITE_CLI_CONFIG_DIR"] = CRED_DIR
|
||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
[CLI, "docs", "+update", "--doc", obj_token, "--as", "bot",
|
[CLI, "docs", "+update", "--doc", obj_token, "--as", "bot",
|
||||||
"--mode", "overwrite", "--markdown", f"@{tmp_md}"],
|
"--mode", "overwrite", "--markdown", f"@{tmp_md}"],
|
||||||
env=env, capture_output=True, text=True, timeout=15)
|
env=env, capture_output=True, text=True, timeout=15, cwd=workspace_root)
|
||||||
os.unlink(tmp_md)
|
os.unlink(tmp_md_abs)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
resp = json.loads(result.stdout)
|
resp = json.loads(result.stdout)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@ -17,7 +17,7 @@ from typing import List, Dict, Tuple, Optional
|
|||||||
|
|
||||||
# P0 关键词:完全阻断使用、核心功能崩溃
|
# P0 关键词:完全阻断使用、核心功能崩溃
|
||||||
P0_KEYWORDS = {
|
P0_KEYWORDS = {
|
||||||
"crash": r'闪退|崩溃|卡死|无法启动|打不开|进不去|登不上|完全.*进|完全.*打|完全.*不能|无法.*进入',
|
"crash": r'闪退|崩溃|卡死|白屏|黑屏|花屏|无法启动|打不开|进不去|登不上|完全.*进|完全.*打|完全.*不能|无法.*进入',
|
||||||
"core": r'(知识巩固|跟读|录音).*(进不去|没反应|无法|不工作|崩溃)|(核心功能|主线).*(崩溃|卡死|无法推进|完全.*卡)',
|
"core": r'(知识巩固|跟读|录音).*(进不去|没反应|无法|不工作|崩溃)|(核心功能|主线).*(崩溃|卡死|无法推进|完全.*卡)',
|
||||||
"payment": r'(付费|购买|充值).*(无法|不到账|失败|不能用)|(钱|金额).*(不对|错误|问题)',
|
"payment": r'(付费|购买|充值).*(无法|不到账|失败|不能用)|(钱|金额).*(不对|错误|问题)',
|
||||||
"server": r'(服务器|全国|所有.*用户|全体).*(挂了|宕机|无法连接|登不上)',
|
"server": r'(服务器|全国|所有.*用户|全体).*(挂了|宕机|无法连接|登不上)',
|
||||||
|
|||||||
@ -1049,6 +1049,7 @@ def generate_summary(clusters, cluster_order, skip_priority=False, ai_placeholde
|
|||||||
loc = extract_location_elements(vc["msgs"])
|
loc = extract_location_elements(vc["msgs"])
|
||||||
context_data.append({
|
context_data.append({
|
||||||
"index": idx,
|
"index": idx,
|
||||||
|
"_idx": vc.get("_idx", idx), # 占位符编号,与 generate_summary 中的 placeholder_idx 一致
|
||||||
"cluster_id": vc["cluster_id"],
|
"cluster_id": vc["cluster_id"],
|
||||||
"location": loc,
|
"location": loc,
|
||||||
"priority": vc.get("priority_info", {}).get("priority", "P2"),
|
"priority": vc.get("priority_info", {}).get("priority", "P2"),
|
||||||
@ -1329,16 +1330,19 @@ def update_summary_doc_as_children(day_summaries, title_prefix="飞书-"):
|
|||||||
|
|
||||||
# 写入内容(锁内已保证obj_token唯一,不会并发写入)
|
# 写入内容(锁内已保证obj_token唯一,不会并发写入)
|
||||||
# 通过临时文件传递 markdown,避免 shell 转义问题
|
# 通过临时文件传递 markdown,避免 shell 转义问题
|
||||||
|
workspace_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
||||||
tmp_md_path = "tmp/_summary_md.txt"
|
tmp_md_path = "tmp/_summary_md.txt"
|
||||||
with open(tmp_md_path, "w", encoding="utf-8") as f:
|
tmp_md_abs = os.path.join(workspace_root, tmp_md_path)
|
||||||
|
os.makedirs(os.path.dirname(tmp_md_abs), exist_ok=True)
|
||||||
|
with open(tmp_md_abs, "w", encoding="utf-8") as f:
|
||||||
f.write(content)
|
f.write(content)
|
||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
[CLI, "docs", "+update", "--doc", obj_token, "--as", "bot",
|
[CLI, "docs", "+update", "--doc", obj_token, "--as", "bot",
|
||||||
"--mode", "overwrite",
|
"--mode", "overwrite",
|
||||||
"--markdown", f"@{tmp_md_path}"],
|
"--markdown", f"@{tmp_md_path}"],
|
||||||
env=env, capture_output=True, text=True, timeout=15
|
env=env, capture_output=True, text=True, timeout=15, cwd=workspace_root
|
||||||
)
|
)
|
||||||
os.unlink(tmp_md_path)
|
os.unlink(tmp_md_abs)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
d = json.loads(result.stdout)
|
d = json.loads(result.stdout)
|
||||||
@ -1616,9 +1620,12 @@ def main():
|
|||||||
obj_token = nodes[title]["obj_token"]
|
obj_token = nodes[title]["obj_token"]
|
||||||
print(f"📄 目标文档: {obj_token}")
|
print(f"📄 目标文档: {obj_token}")
|
||||||
|
|
||||||
# 写入临时文件(lark-cli @file 要求相对路径)
|
# 写入临时文件(lark-cli @file 要求相对路径,通过 cwd 确保在 workspace 根目录)
|
||||||
|
workspace_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
||||||
tmp_md = "tmp/ai_summary_md.txt"
|
tmp_md = "tmp/ai_summary_md.txt"
|
||||||
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)
|
f.write(summary_md)
|
||||||
|
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
@ -1626,8 +1633,8 @@ def main():
|
|||||||
result = subprocess.run(
|
result = subprocess.run(
|
||||||
[CLI, "docs", "+update", "--doc", obj_token, "--as", "bot",
|
[CLI, "docs", "+update", "--doc", obj_token, "--as", "bot",
|
||||||
"--mode", "overwrite", "--markdown", f"@{tmp_md}"],
|
"--mode", "overwrite", "--markdown", f"@{tmp_md}"],
|
||||||
env=env, capture_output=True, text=True, timeout=15)
|
env=env, capture_output=True, text=True, timeout=15, cwd=workspace_root)
|
||||||
os.unlink(tmp_md) # 清理临时文件
|
os.unlink(tmp_md_abs) # 清理临时文件
|
||||||
try:
|
try:
|
||||||
resp = json.loads(result.stdout)
|
resp = json.loads(result.stdout)
|
||||||
if resp.get("ok"):
|
if resp.get("ok"):
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user