首页
我的书签
首页
我的书签
游客
注册
登录
ai重写教程
Context Guardian 插件重构后数据重复推送与统计异常修复指南
观星频繁新会话通知原因
Piwigo集成MeiliSearch测试
不同版本的 PHP 分别安装 Redis
统一记忆与memo0实测
-
+
首页
观星频繁新会话通知原因
# 解决 Context Guardian 插件频繁推送“新会话加载”通知的问题 ## 问题现象 在容器 `889d6b423dc4` 中运行的“观星”服务频繁收到飞书推送的 **新会话加载通知**。每次执行 `/new` 命令、容器重启后首次对话或会话超时(30 分钟空闲)后再次对话,都会触发该通知,造成不必要的干扰。 ## 问题分析 ### 触发机制 Context Guardian 插件通过 `before_prompt_build` 钩子在每次新会话启动时检查是否需要加载上一轮会话的历史记录。推送通知的条件如下: 1. **当前 `sessionId` 首次出现** —— 未被记录在 `loadedSessions` 列表中。 2. **存在上一个会话的历史文件**(格式为 `previous-session-*.json`)。 3. **成功加载了历史内容**。 满足以上条件时,插件会调用飞书 API 推送通知。 ### 日志示例 ``` 2026-06-07T17:27:46 [context-guardian] 🔄 [main] 上次会话结束已 232 分钟,视为新会话开始 2026-06-07T17:27:46 [context-guardian] 📂 从 previous-session-main-2026-06-07T08-07-31.json 加载了 14/268 条上一个会话消息 (5%) 2026-06-07T17:27:46 [context-guardian] ✅ 新会话启动,已注入上一个会话最近 14/268 条 (5%) 2026-06-07T17:27:51 [notification] ✅ 飞书消息推送成功 ``` ### 频繁触发的原因 | 场景 | 原因 | |------|------| | 容器重启 | `loadedSessions` 记录被清空,所有后续会话视为新会话 | | 执行 `/new` 命令 | 生成新的 `sessionId`,该 ID 不在记录中 | | 会话超时(30 分钟空闲) | 插件认为会话已结束,再次对话时视为新会话开始 | ## 解决方案 根据需求选择以下任一方案。推荐方案一(静默加载,保留功能但去掉通知)或方案二(仅在容器重启后通知一次)。 ### 方案一:关闭新会话加载通知(静默加载) 保留自动加载历史记录的功能,但禁止推送飞书通知。 #### 步骤 1:定位插件代码文件 进入 Context Guardian 插件目录,找到负责飞书推送的模块。通常文件名为 `notification.lua` 或 `notification.py`,具体取决于插件实现语言。 ```bash # 假设插件安装在 /app/plugins/context-guardian cd /app/plugins/context-guardian grep -r "feishu\|飞书\|push" . ``` #### 步骤 2:注释或删除推送逻辑 找到类似以下代码段(以 Python 为例): ```python # notification.py 或 context_guardian.py def notify_new_session(session_id, history_path): message = f"🆕 新会话启动,已加载历史记录:{history_path}" push_to_feishu(message) ``` 将其注释掉或移除: ```python def notify_new_session(session_id, history_path): # 静默加载,不推送通知 pass ``` #### 步骤 3:重启服务 ```bash docker restart 889d6b423dc4 ``` 验证日志中不再出现 `✅ 飞书消息推送成功` 字样。 ### 方案二:仅在容器重启时推送通知 添加全局变量 `first_session_after_restart`,只有在容器启动后的第一次新会话才推送,后续 `/new` 和超时都不推送。 #### 步骤 1:在插件主文件中添加状态变量 编辑 `context_guardian.py`(或对应主文件): ```python # 全局变量,仅容器重启时重置 _first_session_flag = True ``` #### 步骤 2:修改推送条件 ```python def handle_new_session(session_id): global _first_session_flag if _first_session_flag: _first_session_flag = False # 仅在此次推送通知 push_to_feishu(f"🆕 新会话加载(容器重启后首次)") else: # 日常加载不推送 pass ``` #### 步骤 3:重启容器 ```bash docker restart 889d6b423dc4 ``` ### 方案三:增加通知冷却时间(例如 1 小时内仅推送一次) 在插件中维护一个时间戳,记录上次推送时间,若距离上次不足 3600 秒则跳过。 #### 步骤 1:引入时间记录 ```python import time _last_notify_time = 0 COOLDOWN_SECONDS = 3600 # 1 小时 ``` #### 步骤 2:在推送前检查 ```python def push_notification_if_needed(message): global _last_notify_time now = time.time() if now - _last_notify_time > COOLDOWN_SECONDS: push_to_feishu(message) _last_notify_time = now else: # 在冷却期内,日志记录但不推送 print(f"[context-guardian] 冷却期内跳过通知:{message}") ``` #### 步骤 3:重启容器 ```bash docker restart 889d6b423dc4 ``` ## 附:关键术语说明 | 术语 | 说明 | |------|------| | `sessionId` | 每次对话会话的唯一标识,使用 `/new` 命令会生成新 ID | | `loadedSessions` | 插件内存中记录的已加载会话 ID 列表 | | `previous-session-*.json` | 上一次完整会话的备份文件,用于跨会话上下文注入 | | `before_prompt_build` | 插件钩子,在构建模型输入前执行,用于注入历史消息 | ## 参考文档 - [Lua 插件开发指南](https://openresty.org/en/)(若插件使用 Lua 编写) - [飞书自定义机器人推送 API](https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot) - [Docker 容器重启命令](https://docs.docker.com/engine/reference/commandline/restart/) ## 注意事项 - 修改插件代码前建议先备份原文件:`cp context_guardian.py context_guardian.py.bak` - 如果插件通过环境变量控制行为(如 `NOTIFY_ON_NEW_SESSION=true/false`),优先修改环境配置而非直接改代码 - 方案一会导致完全丧失通知能力,若需要保留部分通知(如重要错误),请使用方案二或三 - 冷却时间可根据实际使用频率调整,建议设为 3600 秒(1 小时)至 86400 秒(24 小时)
子墨
2026年6月9日 12:33
转发
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
分享
链接
类型
密码
更新密码
有效期
Markdown文件
Word文件
PDF文档
PDF文档(打印)