Skip to content

feat: 新增批量解析、分级失败提示、缓存等媒体解析增强能力 - #9

Merged
backrooms-yrc merged 1 commit into
backrooms-yrc:mainfrom
VirTuaL-EnTitY:main
Aug 21, 2026
Merged

feat: 新增批量解析、分级失败提示、缓存等媒体解析增强能力#9
backrooms-yrc merged 1 commit into
backrooms-yrc:mainfrom
VirTuaL-EnTitY:main

Conversation

@VirTuaL-EnTitY

Copy link
Copy Markdown
Collaborator

改动说明

本 PR 一次性落地 8 项增强,核心目标:跨群记忆「记得住重点」、群开关「分级可控」、媒体解析「更快更准更省心」。

  1. 跨群记忆 LLM 摘要:记录条数超过阈值时先调 LLM 压缩成话题摘要再注入,省 token、更像「记得住重点」,失败自动降级为原始记录。
  2. 群开关 scope 分级/开关 off media 2h 可只关某一类功能;存储 key 从 umo 升级为 umo|scope(向后兼容,旧格式自动视为全局禁用),守卫检查点分散到各功能入口。
  3. 媒体解析失败原因分级MediaParserError.kind 分类(过期/删除/反爬/超时/网络/接口/格式),失败提示精确可读,不再甩原始异常。
  4. 媒体解析结果缓存:内存 LRU(TTL 600s),命中直接返回,降低反爬/封 IP 概率。
  5. 媒体解析批量链接/解析 一条消息多链接依次解析,单次上限 5 条。
  6. 媒体解析联动跨群记忆:解析成功写入记忆(tag=media),后续可自然回溯「你刚才发的那个视频」。
  7. 群开关静默期仅提醒一次:关闭期间首次收指令回复一句提示,1 小时一次。
  8. /cc 命令总览:纳入上述新能力说明。

影响范围与兼容性GroupSwitchStore 落盘格式平滑扩展为 umo|scope 复合 key,旧格式无需迁移;其余均为新增能力,无破坏性变更。所有新配置项均提供默认值,未配置用户升级后行为与旧版一致(缓存默认开启、静默提示默认开启、摘要默认关闭)。

改动文件main.pymedia_parser.pygroup_switch_store.py_conf_schema.jsonREADME.mdCHANGELOG.md。三个核心 Python 文件已通过 py_compile 静态语法检查。

改动类型

  • ✨ 新功能
  • 📝 文档更新
  • 🐛 Bug 修复(不改变现有功能行为)
  • 💥 破坏性变更(行为/接口不兼容,需在说明中标注迁移方式)
  • 🔧 重构 / 代码风格
  • ✅ 测试补充

自测清单

  • 本地运行过相关测试(test_memory_and_switch.py 等,与本次改动相关的都跑一遍)
  • 涉及命令交互的改动已在真实平台(QQ 等)手动验证
  • 改动了配置项 / 命令用法的,已同步更新 README.md_conf_schema.json
  • 有用户可见变更的,已在 CHANGELOG.md[Unreleased] 小节追加条目
  • 新增测试文件已在 .gitignore 白名单中登记(本次未新增测试文件,N/A)
  • 未引入新的第三方依赖(本次无新增依赖)

关联 Issue

无关联 Issue(如有对应 Issue 可补 Fixes #编号)。


测试流程(建议按序手动验证)

  1. 配置面板:确认新增 6 个配置项能正常显示、保存、热重载(跨群摘要 3 项、媒体缓存 2 项、群开关提示 1 项)。
  2. scope 分级开关/开关 off media 2h → 只关媒体解析,点歌/图片仍可用;/开关列表 应显示「媒体解析」功能域及恢复时间;/开关 on media 恢复。
  3. 结果缓存:同一链接连发两次,第二次日志应出现「缓存命中」,且不重新请求平台。
  4. 失败分级:发过期短链 / 已删除链接 / 反爬拦截链接,看分类提示是否与原因对应。
  5. 批量解析:一条消息发 3 个链接,逐条回复且 ≤5 条;发 6 个应提示「已取前 5 条」。
  6. 记忆联动:开启跨群记忆后解析成功,后续对话让机器人回溯「刚才那个视频」。
  7. 静默提醒/开关 off 后发任意指令,第一次收到提示,1 小时内同群不再重复。

注意事项

  • 摘要默认关闭cross_group_summary_enable=false),开启后每次记忆变化会多一次 LLM 调用,建议配一个廉价快速模型(cross_group_summary_provider_id)。
  • 缓存默认开启media_parse_cache_enable=true),下载/播放链接本身有时效性,media_parse_cache_ttl 别设太长。
  • /开关 默认仅群管理员可操作(group_switch_admin_only=true),测试前确认自己是管理员。
  • py_compile 首次跑被 sandbox 拦了(它要往 Python 安装目录写 .pyc),我改用内置 compile() 完成等价的纯静态语法校验,三个文件均通过,无副作用文件残留。

本次提交实现了多项核心功能升级:
1. 媒体解析支持单条消息多链接批量解析(最多5条)
2. 新增解析失败原因分级提示,替换原始异常文本
3. 增加媒体解析结果缓存,减少目标平台请求频率
4. 支持跨群记忆联动,解析记录可被LLM回溯
5. 群开关支持按功能域分级控制,/开关命令新增scope参数
6. 新增跨群记忆LLM摘要功能,节省token并优化上下文
7. 群开关静默期新增单次提醒,避免用户困惑
8. 更新命令总览与配置项文档

同时重构了GroupSwitchStore支持按功能域分级禁用,优化了媒体解析模块的异常分类与缓存逻辑。
backrooms-yrc added a commit that referenced this pull request Aug 21, 2026
- AI 审查:PR 编号解析新增工件名 pr-diff-<N> 途径(收集器由 pull_request
  事件触发、天然知道编号);fork PR 的 workflow_run 载荷 pull_requests
  为空、commit 关联查询也常为空,此前静默跳过导致 fork PR 从未有 AI
  审查(PR #9 实测两路径均返回空)。解析彻底失败时 setFailed 让 run
  变红,不再绿灯空转;AI API 非 200 改为 exit 1,失败可见
- 欢迎机器人:pull_request -> pull_request_target。fork PR 的
  pull_request 事件令牌只读,createComment 403(PR #9 实测失败);
  本工作流不 checkout PR 代码、不使用 Secret,切换安全
- AI_API_KEY 未配置路径加 warning annotation
@github-actions

Copy link
Copy Markdown

🤖 AI 代码审查

改动概述

本次 PR 包含多项功能:跨群记忆 LLM 摘要(含缓存与降级)、群开关按功能域(scope)分级、媒体解析失败原因分级提示、解析结果 LRU 缓存、批量链接解析、解析联动跨群记忆、关闭期间一次性提醒,以及 /cc 命令别名扩展。涉及 main.pygroup_switch_store.py、配置 schema、README 与 CHANGELOG。

潜在风险

  1. _parse_switch_scope 可能误吞时长 token_match_scope_token 把中文标签(如「媒体解析」「跨群记忆」)也当 scope 别名,而 _parse_switch_duration 又跳过 scope 型 token——若用户输入形如 /开关 off 2h 之外的意外组合(如时长单位与别名撞词),时长解析会静默丢 token。目前别名表与时长单位无重叠,风险低,但建议在 _parse_switch_duration 抛 ValueError 的分支里覆盖 scope 误判场景的测试。

  2. /开关 on <scope> 的「全局关闭」提示逻辑顺序问题:先执行 set_enabled(umo, scope) 再检查 is_enabled(umo, scope)。若该 scope 确实被单独关闭且全局也关闭,set_enabled 会先删掉 scope 条目(状态被修改),然后提示用户「请先恢复全局」——此时 scope 条目已被误删,用户恢复全局后该域直接可用,与提示语义不符(副作用先于判断)。建议先判断再操作。

  3. 摘要缓存指纹过弱fingerprint = (条数, 首条, 末条) 在 5 分钟 TTL 内,若中间记录变化但首末条与条数恰好相同(如等量替换),会注入过期摘要。概率低,可接受,但可考虑加入简单 hash。

  4. _detect_command_scope 与框架命令匹配口径可能不一致:自实现用「首 token 精确匹配」,若用户配置了自定义命令前缀或 wake 前缀(如 @bot 解析 xxx),守卫会漏判,导致域级关闭失效(命令仍执行)。建议确认 message_str 是否已剥离 wake 内容。

  5. _switch_hint_ts 清理阈值 512 后仍可能缓慢增长:清理只删过期项,活跃群长期累积;量级小,无实际风险,仅提示。

  6. asyncio.wait 超时后 task 未 cancel:注释说明与 _segment_by_llm 一致,但超时的 LLM 调用仍会占用连接直至完成,高频场景可能堆积。建议超时后 _task.cancel()

  7. /开关 off memory 只挡记录与注入入口:memory 域 commands 为空,_detect_command_scope 永远不会命中它,守卫逻辑正确;但 /忘记 等记忆相关命令归在 _MISC_PLUGIN_COMMANDS,全局关闭时会被拦、memory 域关闭时不会——行为是否符合预期建议确认。

建议

  • 修复第 2 点的先删后判顺序问题(真实 bug)。
  • 确认第 4 点 wake 前缀场景下守卫的有效性。
  • 为 scope 解析、时长解析与旧格式兼容补充分支测试。
  • 其余为低风险项,可按需处理。

以上内容由 AI 自动生成,仅供参考,最终以人工审查为准。

@backrooms-yrc
backrooms-yrc merged commit 1d6c736 into backrooms-yrc:main Aug 21, 2026
3 of 4 checks passed
@backrooms-yrc

Copy link
Copy Markdown
Owner

已按审核意见完成修复并合并至 main(合并提交 fea35bd,版本进入 v2.2.0)。感谢贡献!

修复内容(ed3854d)

  1. /解析 批量上限提示的计数错误:此前截断后才取条数,提示恒为「检测到 5 条以上链接」,实际数量丢失;现于截断前保存原始条数
  2. /开关 on <功能域> 的先删后判问题(AI 审查机器人亦有指出):在「全局关闭 + 该域被单独关闭」时,set_enabled 会先移除该域条目(用户设置的限时禁用被静默清除),随后又提示「并未被单独关闭」(与事实相反)。现改为先判断后操作——域未被单独关闭时仅提示、零状态变更;确被单独关闭时按指令恢复并如实提示「全局仍处于关闭状态」。GroupSwitchStore 新增 has_disabled_entry() 支持该判定

补充交付(c13af14 / d29c2f3

  • test_memory_and_switch.py 新增 8 项 scope/批量回归用例(store 域级语义与复合 key/旧格式加载、域参数与时长解析互操作、守卫域检测、先判后操作回归、开关列表域标签、批量提取与上限提示计数),合计 33 项
  • README 四语言版本补齐本版本全部内容:功能域开关用法与配置、解析增强(失败分级/缓存/记忆联动)、LLM 摘要配置、/帮助 别名,并注明功能域开关不约束 LLM 工具自主调用(AI 经 llm_tool 调用图片/点歌/电击不经过命令入口,全局关闭仍拦截)的边界
  • CHANGELOG 记录 [2.2.0](含合并前修正);metadata.yaml 版本升至 v2.2.0

测试:全部 5 套测试通过(33 + 37 + 41 + 36 + 11 = 158 项),CI test 亦通过。

另:AI 审查建议第 6 条(摘要超时后 cancel task)未采纳——代码注释已说明不 cancel 是为规避 httpx 连接池 aclose 阻塞事件循环的实测问题(watchdog 实测阻塞 168~215 秒),属有意设计。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants