From ac663550001d7dce0d38441743604e12690d3680 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 15:52:50 +0800 Subject: [PATCH 01/34] feat(batcher): add same-sender short-window message batching - New MessageBatcher service merges consecutive messages from the same sender within a configurable window into a single AI invocation, so the model sees a multi-block batch and can decide per-intent (independent request vs. correction/interruption). - Pokes always bypass; an at-bot arriving while a buffer exists is processed individually so it is not blocked; a first at-bot that opens the buffer routes the eventual batch through the mention lane. - AICoordinator refactored with handle_batched_dispatch + grouped prompt helpers; old _build_prompt preserved for backwards-compat tests. - Config [message_batcher] (enabled/window_seconds/strategy/max_window_seconds/ max_messages_per_batch/group_enabled/private_enabled/flush_on_command), hot-reload wired, defaults enabled. - Runtime API system probe and WebUI now expose live batcher state (config + pending buckets); i18n updated for zh/en. - Docs: new docs/message-batching.md, configuration.md \u00a74.10.2, usage.md \u00a71 note, README/CLAUDE/AGENTS/CHANGELOG synced. - Tests: 13 unit + 7 integration cases covering merge, mention lane, poke bypass, private merge, disabled passthrough, superadmin lane. --- AGENTS.md | 3 + CHANGELOG.md | 4 + CLAUDE.md | 7 +- README.md | 1 + config.toml.example | 28 ++ docs/configuration.md | 15 + docs/message-batching.md | 83 +++++ docs/usage.md | 2 + res/prompts/undefined.xml | 10 +- res/prompts/undefined_nagaagent.xml | 10 +- src/Undefined/api/_context.py | 1 + src/Undefined/api/routes/system.py | 4 + src/Undefined/config/__init__.py | 2 + src/Undefined/config/domain_parsers.py | 31 ++ src/Undefined/config/hot_reload.py | 27 ++ src/Undefined/config/loader.py | 6 + src/Undefined/config/models.py | 18 + src/Undefined/handlers.py | 8 + src/Undefined/main.py | 5 + src/Undefined/services/ai_coordinator.py | 400 +++++++++++++++++----- src/Undefined/services/message_batcher.py | 268 +++++++++++++++ src/Undefined/webui/static/js/i18n.js | 14 + src/Undefined/webui/static/js/runtime.js | 44 +++ tests/test_message_batcher.py | 235 +++++++++++++ tests/test_message_batcher_integration.py | 272 +++++++++++++++ 25 files changed, 1398 insertions(+), 100 deletions(-) create mode 100644 docs/message-batching.md create mode 100644 src/Undefined/services/message_batcher.py create mode 100644 tests/test_message_batcher.py create mode 100644 tests/test_message_batcher_integration.py diff --git a/AGENTS.md b/AGENTS.md index e4804849..b88020bc 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -36,6 +36,9 @@ Remote attachments are cached only up to `[attachments].remote_download_max_size ### Auto processing pipelines Automatic extraction pipelines live under `src/Undefined/skills/auto_pipeline/pipelines//` and use `config.json + handler.py`. Slash commands have higher priority; when a command is dispatched, automatic pipelines and AI auto-reply are skipped. Command inputs and command outputs should be recorded in message history so later AI turns can see the result. For non-command messages, all pipelines detect in parallel and all matches process in parallel before AI auto-reply. Outputs should go through `MessageSender`, which writes history and automatically registers local CQ media or uploaded files as session attachment UIDs. +### Same-sender short-window message batching +Consecutive messages from the same sender within `[message_batcher].window_seconds` are merged into a single AI invocation, so the AI sees the whole batch as `` blocks and decides per-intent (independent request vs. correction/interruption). Pokes always bypass; an at-bot message arriving while a buffer already exists is processed individually so it is not blocked; a first at-bot message that opens the buffer routes the eventual batch through the mention lane. History writes remain unchanged. Configure under `[message_batcher]` (`enabled`, `window_seconds`, `strategy`, `max_window_seconds`, `max_messages_per_batch`, `group_enabled`, `private_enabled`); details in [docs/message-batching.md](docs/message-batching.md). + ### User identification in prompts The system prompt now includes a rule: **recognize and address users by their QQ ID (`sender_id`)** because nicknames can change. When needing to address a user, use the latest nickname obtained via `group.get_member_info(brief=true)`. Observations recorded in cognitive memory should always include the QQ ID, e.g., “QQ号12345678(昵称张三)做了某事”. diff --git a/CHANGELOG.md b/CHANGELOG.md index 422c313e..5a1bbd16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## Unreleased + +- 新增同 sender 短时消息合并:同一发送者在 `[message_batcher].window_seconds`(默认 5s)内连续发送的多条消息会合并到同一轮 AI 调用,AI 一次性处理整批意图,避免"画猫"→"改成狗"等场景出现重复回复或行为打架。配置项见 `[message_batcher]`,支持 `extend`/`fixed` 两种策略与 `max_window_seconds`、`max_messages_per_batch` 硬顶;拍一拍永远旁路立即处理,群聊已有 buffer 时新到的 @bot 也会单独立即处理;启用合并后历史记录写入逻辑保持不变。详见 [docs/message-batching.md](docs/message-batching.md)。 + ## v3.3.3 命令推断、自动处理管线与统一附件上下文 本版本重点优化了命令系统的交互体验、AI 工具边界和消息前置处理链路。新增 GitHub 链接自动卡片生成,并将 Bilibili、arXiv、GitHub 等自动提取迁入 `skills/auto_pipeline` 热重载管线,使预处理结果能写入历史并进入后续 AI 回复上下文。同时,帮助说明与用户侧写默认改为图片输出,系统剥离独立群聊分析工具集,全面推行统一附件标签,并为远程附件加入可配置下载上限和 URL 引用降级,完善底层用户识别机制与模型高级透传配置。 diff --git a/CLAUDE.md b/CLAUDE.md index 46c67c9e..1a1b7900 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -54,7 +54,7 @@ bash scripts/install_git_hooks.sh | 目录 / 文件 | 职责 | |---|---| | `ai/` | AI 运行时核心:`client.py`(主入口)、`llm.py`(模型请求)、`prompts.py`(Prompt 构建)、`tooling.py`(工具管理)、`multimodal.py`(多模态)、`model_selector.py`(模型选择)、`summaries.py`(短期总结) | -| `services/` | 运行服务:`ai_coordinator.py`(协调器+队列投递)、`queue_manager.py`(车站-列车队列)、`command.py`(命令分发)、`model_pool.py`(多模型池)、`security.py`(安全防护) | +| `services/` | 运行服务:`ai_coordinator.py`(协调器+队列投递)、`queue_manager.py`(车站-列车队列)、`message_batcher.py`(同 sender 短时合并)、`command.py`(命令分发)、`model_pool.py`(多模型池)、`security.py`(安全防护) | | `skills/` | 热重载技能系统:`tools/`(原子工具)、`toolsets/`(按域分组工具)、`agents/`(智能体)、`commands/`(斜杠指令)、`anthropic_skills/`(SKILL.md 知识注入) | | `cognitive/` | 认知记忆:`service.py`(入口)、`vector_store.py`(ChromaDB)、`historian.py`(后台史官异步改写+侧写合并)、`job_queue.py`、`profile_storage.py` | | `memes/` | 表情包库:两阶段 AI 管线、异步处理队列、SQLite 元数据、ChromaDB 向量检索 | @@ -77,6 +77,7 @@ OneBot WebSocket → onebot.py → handlers.py → SecurityService(注入检测) → CommandDispatcher(斜杠指令,命中即结束后续处理) → skills/auto_pipeline(Bilibili / arXiv / GitHub 并行自动提取) + → MessageBatcher(同 sender 短时合并;拍一拍/buffer 内 @bot 旁路) → AICoordinator → QueueManager(按模型隔离, 4 级优先级) → AIClient → LLM API / Skills / MCP @@ -113,6 +114,10 @@ Management / Runtime 请求 → webui/app.py 或 api/app.py → routes/* 车站-列车模型(QueueManager):按模型隔离队列组,4 级优先级(超管 > 私聊 > @提及 > 普通群聊),普通队列自动修剪保留最新 2 条,非阻塞按节奏发车(默认 1Hz)。 +### 同 sender 短时消息合并(MessageBatcher) + +同一 sender 在 `[message_batcher].window_seconds` 内连续发送的多条消息会合并到同一轮 AI 调用,AI 一次性看到全部 `` 块自行识别"独立请求/修正/打断"。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也单独立即处理;首条 @bot 进入 buffer 时整批走 mention 队列。`enabled=false` 行为退化回旧版。详见 [docs/message-batching.md](docs/message-batching.md)。 + ### 存储与数据 - `data/history/` — 消息历史(`group_*.json` / `private_*.json`,默认 10000 条,可通过 `[history]` 调整,0 = 无限) diff --git a/README.md b/README.md index 08afd2ac..95cd29ea 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ - **arXiv 论文提取与搜索**:自动检测消息中的 arXiv 链接/标识并发送论文信息与 PDF;同时提供 `arxiv_paper` 发送工具和 `arxiv_search` 检索工具。 - **GitHub 仓库卡片**:自动检测 GitHub 仓库链接或 `owner/repo` 仓库 ID,获取 public 仓库信息并发送简洁图片卡片,展示头像、简介、stars、forks、issues、contributors 等概览。 - **自动处理管线**:Bilibili、arXiv、GitHub 等自动提取统一运行在 `skills/auto_pipeline` 中,斜杠命令优先级更高;命令输入/输出会写入历史,非命令消息会并行检测和处理命中管线,结果通过统一发送层写入历史并登记附件 UID 后再进入 AI 回复。远程大附件超过 `[attachments].remote_download_max_size_mb` 时只登记 URL 引用,避免无界下载和缓存膨胀。 +- **同 sender 短时消息合并**:同一发送者在 `[message_batcher].window_seconds`(默认 5s)内连续发送的多条消息会被合并到同一轮 AI 调用,AI 一次性看到全部 `` 块自行识别"独立请求/修正/打断",避免老版本"画猫→改成狗"造成的重复触发与回复打架。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理;首条 @bot 进入 buffer 时整批走 mention 队列。详见 [docs/message-batching.md](docs/message-batching.md)。 - **思维链支持**:支持开启思维链,提升复杂逻辑推理能力。 - **高并发架构**:基于 `asyncio` 全异步设计,支持多队列消息处理与工具并发执行,轻松应对高并发场景。 - **异步安全 I/O**:统一 IO 层通过线程池 + 跨平台文件锁(Linux/macOS `flock`,Windows `msvcrt`)+ 原子写入(`os.replace`)保证并发写入不损坏、且不阻塞主事件循环。 diff --git a/config.toml.example b/config.toml.example index 4ec89d53..1fff7823 100644 --- a/config.toml.example +++ b/config.toml.example @@ -753,6 +753,34 @@ repeat_cooldown_minutes = 60 # en: Enable inverted question mark (when repeat triggers on "?" messages, send "¿" instead). inverted_question_enabled = false +# zh: 同 sender 短时多消息合并器。把同一用户在短时间内连续发送的多条消息合并到同一轮 AI 触发,避免重复回复 / 行为打架。 +# en: Same-sender short-window message batcher. Merges several messages a single user sends in quick succession into one AI turn to avoid duplicate replies / conflicting actions. +[message_batcher] +# zh: 是否启用合并器(关闭后所有消息按现行流程逐条触发 AI)。 +# en: Enable the batcher (when disabled all messages trigger the AI individually as before). +enabled = true +# zh: 等待窗口(秒)。期间同一用户发的新消息合并到同一批;<= 0 等同于关闭。 +# en: Wait window in seconds. New messages from the same sender within this window are merged; <= 0 disables the feature. +window_seconds = 5.0 +# zh: 等待策略:extend(每来一条新消息重置 timer,"打字就继续等")/ fixed(首条到达起定时,期间到达的消息只合并不重置)。 +# en: Wait strategy: extend (reset timer on each new message; keeps waiting while the user types) / fixed (timer fixed at the first message; new arrivals only merge but do not reset). +strategy = "extend" +# zh: extend 模式下的硬顶(秒),防止用户一直打字导致永远不发车。 +# en: Hard cap in seconds for extend mode, prevents the timer from being reset forever. +max_window_seconds = 30.0 +# zh: 单批最多消息条数,超出立即发车;0 = 不限制。 +# en: Max messages per batch; exceeding triggers immediate dispatch. 0 = no limit. +max_messages_per_batch = 0 +# zh: 是否在群聊启用合并。 +# en: Enable batching in group chats. +group_enabled = true +# zh: 是否在私聊启用合并。 +# en: Enable batching in private chats. +private_enabled = true +# zh: 收到斜杠命令时是否顺便把当前 buffer 一起发出(默认 false:命令独立执行,buffer 继续等到时间到再发)。 +# en: When a slash command arrives, also flush the current buffer to the AI (default false: commands are executed independently and the buffer keeps waiting). +flush_on_command = false + # zh: 历史记录配置。 # en: History settings. [history] diff --git a/docs/configuration.md b/docs/configuration.md index 65675a14..23dc42f6 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -453,6 +453,21 @@ Prompt caching 补充: 外部接收的远程图片或文件默认会先下载到附件缓存再生成 UID,避免后续 URL 失效;大文件超过阈值时,UID 仍会生成,但绑定的是 URL 引用而不是缓存文件,AI 可在上下文中看到原始 `source_ref`。 +### 4.10.2 `[message_batcher]` 同 sender 短时消息合并 + +| 字段 | 默认值 | 说明 | +|---|---:|---| +| `enabled` | `true` | 总开关;关闭后行为退化为旧版的逐条独立 AI 调用 | +| `window_seconds` | `5.0` | 同 sender 合并的等待窗口(秒) | +| `strategy` | `"extend"` | `extend` = 新消息重置窗口;`fixed` = 从首条算起的固定窗口 | +| `max_window_seconds` | `30.0` | 从首条算起最长等待,硬顶 `extend` 不被无限延长 | +| `max_messages_per_batch` | `0` | 单批最多条数;达到立即发车,`0` = 不限 | +| `group_enabled` | `true` | 群聊是否启用合并 | +| `private_enabled` | `true` | 私聊是否启用合并 | +| `flush_on_command` | `true` | 命中斜杠命令时是否 flush 该 sender 的 buffer(保留字段,当前未消费) | + +启用后,同一发送者在窗口内连续发送的多条消息会合并到同一轮 AI 调用,`` 块按时间顺序排列,AI 一次性处理整批意图。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理(不打断 buffer);首条 @bot 进入 buffer 时整批发车走 `add_group_mention_request`。配置支持热更新,关停时会 `flush_all` 避免丢消息。详细行为矩阵与设计要点见 [docs/message-batching.md](message-batching.md)。 + --- ### 4.11 `[skills]` 技能系统与 Agent 介绍 diff --git a/docs/message-batching.md b/docs/message-batching.md new file mode 100644 index 00000000..7f6c77ec --- /dev/null +++ b/docs/message-batching.md @@ -0,0 +1,83 @@ +# 同 sender 短时消息合并(Message Batcher) + +> 出现场景:用户连续发送两条命令,例如先 "帮我画一只猫"、紧接着 "改成狗"。 +> 老版本会触发两次 AI 调用:第一次画完猫、第二次又因 history 出现两条都画一遍,且容易回复重复。 +> 启用本特性后,短窗口内同一发送者的多条消息会合并为同一轮 AI 调用,AI 一次性看到全部意图,识别"修正/补充/独立请求"自行决定如何回应。 + +## 设计要点 + +- **作用域**:按 `(scope, sender_id)` 分桶。`scope` 群聊为 `group:`,私聊为 `private:`。 +- **窗口策略**: + - `extend`(默认):每条新消息重置定时器,并以 `max_window_seconds` 作为硬顶。 + - `fixed`:定时器从首条算起;窗口期结束统一发车。 +- **硬顶**:`max_window_seconds` 防止极端情况下窗口被无限延长;`max_messages_per_batch` 达到立即发车(`0` = 不限)。 +- **历史记录不变**:每条消息照旧由 `handlers.py` 写入 history;batcher 只决定何时调用 AI。 +- **拍一拍永远旁路**:拍一拍触发不进入 batcher,直接立即处理。 +- **群聊 @bot 规则**: + - 当前桶**为空**且新消息 @bot → 进入 buffer,本批走 `add_group_mention_request`(提及优先级)。 + - 当前桶**非空**且新消息 @bot → 不打断现有 buffer,**单独立即处理**这条 @bot 消息。 +- **关停**:`MessageBatcher.flush_all()` 在进程退出前 flush 所有未发车的桶,避免丢消息。 + +## Prompt 行为 + +合并时构造的 `` 块按时间先后排列;当 `count >= 2` 时追加"连续消息说明": + +> 把整批 `` 视作本轮的全部输入: +> 1. 区分每条意图:【独立请求】各自回应不要遗漏(与平时一样,可多次 send_message 自然分发);【修正/否定/补充/打断】则以最后一次明确意图为准,旧的不再执行。 +> 2. 拿不准时偏向"独立请求",宁多勿漏。 +> 3. 整批在本轮一次性处理完,不要为同一意图重复输出。 + +`res/prompts/undefined.xml` 与 `res/prompts/undefined_nagaagent.xml` 的 `trigger id="4"` 也已同步更新为相同语义。 + +## 配置 + +`config.toml`: + +```toml +[message_batcher] +# 总开关 +enabled = true +# 等待窗口(秒),同一 sender 在窗口内的消息合并到同一轮 +window_seconds = 5.0 +# 策略:extend = 新消息重置窗口;fixed = 从首条算起的固定窗口 +strategy = "extend" +# 硬顶:从首条算起最多等多久 +max_window_seconds = 30.0 +# 单批最多条数(0 = 不限);达到立即发车 +max_messages_per_batch = 0 +# 群聊是否启用合并 +group_enabled = true +# 私聊是否启用合并 +private_enabled = true +# 命中斜杠命令时是否 flush 当前 sender 的 buffer(保留字段,当前未消费) +flush_on_command = true +``` + +支持热更新:修改后通过 WebUI 或 SIGHUP 重新加载配置即可生效,正在排队的桶会沿用新配置参数。 + +## 行为矩阵 + +| 场景 | 行为 | +|---|---| +| 群聊普通消息(无 @、无拍一拍)连续发 | 进入 batcher,窗口到期合并发车(普通队列) | +| 群聊首条 @bot | 进入 batcher,发车时走 `add_group_mention_request` | +| 群聊 buffer 已有 + 新条 @bot | 该 @bot 立即旁路单独处理;buffer 继续等待 | +| 群聊拍一拍 | 永远旁路,立即处理 | +| 私聊连续消息 | 进入 batcher,到期合并 | +| 私聊拍一拍 | 永远旁路,立即处理 | +| 超管消息 | 与普通用户一致进入 batcher,发车时走超管队列 | +| `enabled=false` | 全部旁路,行为退化为旧版 | + +## 与多模型池的协作 + +私聊路径在发车时调用 `model_pool.select_chat_config(...)` 选模型,逻辑保持不变;合并仅影响"何时调用 AI",不影响"用哪个模型"。 + +## 相关文件 + +- 实现:[src/Undefined/services/message_batcher.py](src/Undefined/services/message_batcher.py) +- 接入:[src/Undefined/services/ai_coordinator.py](src/Undefined/services/ai_coordinator.py) 中 `handle_auto_reply` / `handle_private_reply` / `_dispatch_grouped_request` +- 创建/注入:[src/Undefined/handlers.py](src/Undefined/handlers.py) +- 关停 flush:[src/Undefined/main.py](src/Undefined/main.py) +- 热更新:[src/Undefined/config/hot_reload.py](src/Undefined/config/hot_reload.py) +- 提示词:[res/prompts/undefined.xml](res/prompts/undefined.xml)、[res/prompts/undefined_nagaagent.xml](res/prompts/undefined_nagaagent.xml) +- 测试:[tests/test_message_batcher.py](tests/test_message_batcher.py) diff --git a/docs/usage.md b/docs/usage.md index 3f96aa61..2f55ef76 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -30,6 +30,8 @@ > **队列优先级说明**:系统底层采用四级消息队列调度模型,优先级从高到低为:超级管理员 > 私聊 > @提及 > 普通群聊。在群聊高并发场景下,管理请求和直接提及将优先得到响应。 +> **同 sender 短时合并**:默认开启。同一发送者在 5 秒(可配置)内连续发送的多条消息会合并到同一轮 AI 调用,AI 一次性看到全部消息块自行识别"独立请求/修正/补充/打断",避免重复触发与回复打架。例如先发"帮我画一只猫"再快速补一句"改成狗",Bot 只会按最终意图回应;多个独立请求也会被 AI 各自回复。配置项详见 [docs/configuration.md §4.10.2](configuration.md#4102-message_batcher-同-sender-短时消息合并) 与 [docs/message-batching.md](message-batching.md)。 + --- ## 2. 认知记忆系统 diff --git a/res/prompts/undefined.xml b/res/prompts/undefined.xml index 8c809b57..082fafbd 100644 --- a/res/prompts/undefined.xml +++ b/res/prompts/undefined.xml @@ -373,9 +373,13 @@ - 某人连续发送多条消息(消息流) - 根据上下文和时间戳判断消息是否完整,只在最后回复一次 - 绝不在中间回复一次、结尾再回复一次 + 某人在很短时间内连续发送多条消息;系统会把这一批合并到同一轮,作为多个 <message> 块按时间先后排列发给你 + + 把整批 <message> 视作本轮的全部输入: + 1) 区分每条意图:【独立请求】各自回应不要遗漏(与平时一样,可多次 send_message 自然分发);【修正/否定/补充/打断】则以最后一次明确意图为准,旧的不再执行 + 2) 拿不准时偏向“独立请求”,宁多勿漏 + 3) 整批在本轮一次性处理完,不要为同一意图重复输出,也不要“中间一波、结尾一波”重复相同回复 + diff --git a/res/prompts/undefined_nagaagent.xml b/res/prompts/undefined_nagaagent.xml index 9dbf1cf4..8d3447b4 100644 --- a/res/prompts/undefined_nagaagent.xml +++ b/res/prompts/undefined_nagaagent.xml @@ -379,9 +379,13 @@ - 某人连续发送多条消息(消息流) - 根据上下文和时间戳判断消息是否完整,只在最后回复一次 - 绝不在中间回复一次、结尾再回复一次 + 某人在很短时间内连续发送多条消息;系统会把这一批合并到同一轮,作为多个 <message> 块按时间先后排列发给你 + + 把整批 <message> 视作本轮的全部输入: + 1) 区分每条意图:【独立请求】各自回应不要遗漏(与平时一样,可多次 send_message 自然分发);【修正/否定/补充/打断】则以最后一次明确意图为准,旧的不再执行 + 2) 拿不准时偏向"独立请求",宁多勿漏 + 3) 整批在本轮一次性处理完,不要为同一意图重复输出,也不要"中间一波、结尾一波"重复相同回复 + diff --git a/src/Undefined/api/_context.py b/src/Undefined/api/_context.py index 07d8c92c..d1d776cf 100644 --- a/src/Undefined/api/_context.py +++ b/src/Undefined/api/_context.py @@ -20,3 +20,4 @@ class RuntimeAPIContext: cognitive_job_queue: Any = None meme_service: Any = None naga_store: Any = None + message_batcher: Any = None diff --git a/src/Undefined/api/routes/system.py b/src/Undefined/api/routes/system.py index 2cf3915f..f1aded25 100644 --- a/src/Undefined/api/routes/system.py +++ b/src/Undefined/api/routes/system.py @@ -60,6 +60,9 @@ async def internal_probe_handler( cognitive_queue_snapshot = ( ctx.cognitive_job_queue.snapshot() if ctx.cognitive_job_queue else {} ) + message_batcher_snapshot = ( + ctx.message_batcher.snapshot() if ctx.message_batcher else {} + ) memory_storage = getattr(ctx.ai, "memory_storage", None) memory_count = memory_storage.count() if memory_storage is not None else 0 @@ -113,6 +116,7 @@ async def internal_probe_handler( "uptime_seconds": uptime_seconds, "onebot": ctx.onebot.connection_status() if ctx.onebot is not None else {}, "queues": queue_snapshot, + "message_batcher": message_batcher_snapshot, "memory": {"count": memory_count, "virtual_user_id": _VIRTUAL_USER_ID}, "cognitive": { "enabled": bool(ctx.cognitive_service and ctx.cognitive_service.enabled), diff --git a/src/Undefined/config/__init__.py b/src/Undefined/config/__init__.py index 8ced52e3..ce2e4ca8 100644 --- a/src/Undefined/config/__init__.py +++ b/src/Undefined/config/__init__.py @@ -11,6 +11,7 @@ EmbeddingModelConfig, GrokModelConfig, MemeConfig, + MessageBatcherConfig, ModelPool, ModelPoolEntry, RerankModelConfig, @@ -31,6 +32,7 @@ "ModelPool", "ModelPoolEntry", "MemeConfig", + "MessageBatcherConfig", "get_config", "get_config_manager", "load_webui_settings", diff --git a/src/Undefined/config/domain_parsers.py b/src/Undefined/config/domain_parsers.py index 07f807b1..48ca2624 100644 --- a/src/Undefined/config/domain_parsers.py +++ b/src/Undefined/config/domain_parsers.py @@ -17,6 +17,7 @@ APIConfig, CognitiveConfig, MemeConfig, + MessageBatcherConfig, NagaConfig, ) @@ -177,6 +178,36 @@ def _parse_memes_config(data: dict[str, Any]) -> MemeConfig: ) +_VALID_BATCHER_STRATEGIES: set[str] = {"extend", "fixed"} + + +def _parse_message_batcher_config(data: dict[str, Any]) -> MessageBatcherConfig: + section_raw = data.get("message_batcher", {}) + section = section_raw if isinstance(section_raw, dict) else {} + strategy = _coerce_str(section.get("strategy"), "extend").strip().lower() + if strategy not in _VALID_BATCHER_STRATEGIES: + strategy = "extend" + window_seconds = _coerce_float(section.get("window_seconds"), 5.0) + if window_seconds < 0: + window_seconds = 0.0 + max_window_seconds = _coerce_float(section.get("max_window_seconds"), 30.0) + if max_window_seconds < window_seconds: + max_window_seconds = window_seconds + max_messages = _coerce_int(section.get("max_messages_per_batch"), 0) + if max_messages < 0: + max_messages = 0 + return MessageBatcherConfig( + enabled=_coerce_bool(section.get("enabled"), True), + window_seconds=window_seconds, + strategy=strategy, + max_window_seconds=max_window_seconds, + max_messages_per_batch=max_messages, + group_enabled=_coerce_bool(section.get("group_enabled"), True), + private_enabled=_coerce_bool(section.get("private_enabled"), True), + flush_on_command=_coerce_bool(section.get("flush_on_command"), False), + ) + + def _parse_api_config(data: dict[str, Any]) -> APIConfig: section_raw = data.get("api", {}) section = section_raw if isinstance(section_raw, dict) else {} diff --git a/src/Undefined/config/hot_reload.py b/src/Undefined/config/hot_reload.py index 1ba6dc3a..5f35a196 100644 --- a/src/Undefined/config/hot_reload.py +++ b/src/Undefined/config/hot_reload.py @@ -98,6 +98,18 @@ _ATTACHMENT_KEYS: set[str] = {"attachment_remote_download_max_size_mb"} +_MESSAGE_BATCHER_KEYS: set[str] = { + "message_batcher", + "message_batcher.enabled", + "message_batcher.window_seconds", + "message_batcher.strategy", + "message_batcher.max_window_seconds", + "message_batcher.max_messages_per_batch", + "message_batcher.group_enabled", + "message_batcher.private_enabled", + "message_batcher.flush_on_command", +} + @dataclass class HotReloadContext: @@ -143,6 +155,14 @@ def apply_config_updates( if _needs_attachment_update(changed_keys): context.ai_client.apply_attachment_config(updated) + if _needs_message_batcher_update(changed_keys): + handler = context.message_handler + if ( + handler is not None + and getattr(handler, "message_batcher", None) is not None + ): + handler.message_batcher.update_config(updated.message_batcher) + if _needs_core_ai_model_update(changed_keys): context.ai_client.apply_model_configs( chat_config=updated.chat_model, @@ -202,6 +222,13 @@ def _needs_attachment_update(changed_keys: set[str]) -> bool: return bool(changed_keys & _ATTACHMENT_KEYS) +def _needs_message_batcher_update(changed_keys: set[str]) -> bool: + return any( + key == "message_batcher" or key.startswith("message_batcher.") + for key in changed_keys + ) + + def _matches_prefixes(changed_keys: set[str], prefixes: tuple[str, ...]) -> bool: return any( key == prefix or key.startswith(f"{prefix}.") diff --git a/src/Undefined/config/loader.py b/src/Undefined/config/loader.py index d40411c9..159982d7 100644 --- a/src/Undefined/config/loader.py +++ b/src/Undefined/config/loader.py @@ -36,6 +36,7 @@ def load_dotenv( ImageGenConfig, ImageGenModelConfig, MemeConfig, + MessageBatcherConfig, NagaConfig, RerankModelConfig, SecurityModelConfig, @@ -98,6 +99,7 @@ def load_dotenv( _parse_cognitive_config, _parse_easter_egg_call_mode, _parse_memes_config, + _parse_message_batcher_config, _parse_naga_config, _update_dataclass, ) @@ -351,6 +353,8 @@ class Config: cognitive: CognitiveConfig # 表情包库 memes: MemeConfig + # 同 sender 短时多消息合并器 + message_batcher: MessageBatcherConfig # Naga 集成 naga: NagaConfig # 生图工具配置 @@ -1279,6 +1283,7 @@ def load(cls, config_path: Optional[Path] = None, strict: bool = True) -> "Confi cognitive = _parse_cognitive_config(data) memes = _parse_memes_config(data) + message_batcher = _parse_message_batcher_config(data) naga = _parse_naga_config(data) models_image_gen = _parse_image_gen_model_config(data) models_image_edit = _parse_image_edit_model_config(data) @@ -1447,6 +1452,7 @@ def load(cls, config_path: Optional[Path] = None, strict: bool = True) -> "Confi knowledge_rerank_top_k=knowledge_rerank_top_k, cognitive=cognitive, memes=memes, + message_batcher=message_batcher, naga=naga, image_gen=image_gen, models_image_gen=models_image_gen, diff --git a/src/Undefined/config/models.py b/src/Undefined/config/models.py index b2ae1cdc..66fefadc 100644 --- a/src/Undefined/config/models.py +++ b/src/Undefined/config/models.py @@ -349,6 +349,24 @@ class MemeConfig: gif_analysis_frames: int = 6 +@dataclass +class MessageBatcherConfig: + """同 sender 短时多消息合并器配置。 + + 将同一 sender 在 ``window_seconds`` 内连续发送的消息合并到同一轮 AI 触发, + 避免重复回复 / 行为打架。详见 ``services/message_batcher.py``。 + """ + + enabled: bool = True + window_seconds: float = 5.0 + strategy: str = "extend" # extend | fixed + max_window_seconds: float = 30.0 + max_messages_per_batch: int = 0 # 0 = 不限制 + group_enabled: bool = True + private_enabled: bool = True + flush_on_command: bool = False + + @dataclass class APIConfig: """主进程 OpenAPI/Runtime API 配置""" diff --git a/src/Undefined/handlers.py b/src/Undefined/handlers.py index 5b316bd4..28fb9e47 100644 --- a/src/Undefined/handlers.py +++ b/src/Undefined/handlers.py @@ -38,6 +38,7 @@ from Undefined.services.security import SecurityService from Undefined.services.command import CommandDispatcher from Undefined.services.ai_coordinator import AICoordinator +from Undefined.services.message_batcher import MessageBatcher from Undefined.services.model_pool import ModelPoolService from Undefined.skills.auto_pipeline import AutoPipelineRegistry from Undefined.utils.resources import resolve_resource_path @@ -137,6 +138,13 @@ def __init__( command_dispatcher=self.command_dispatcher, ) + # 同 sender 短时多消息合并器;coordinator 决定是否旁路 + self.message_batcher = MessageBatcher( + config.message_batcher, + flush_callback=self.ai_coordinator.handle_batched_dispatch, + ) + self.ai_coordinator.set_batcher(self.message_batcher) + self._background_tasks: set[asyncio.Task[None]] = set() self._profile_name_refresh_cache: dict[tuple[str, int], str] = {} self._bot_nickname_cache = BotNicknameCache(onebot, config.bot_qq) diff --git a/src/Undefined/main.py b/src/Undefined/main.py index 6826d0a0..69a05aa0 100644 --- a/src/Undefined/main.py +++ b/src/Undefined/main.py @@ -478,6 +478,7 @@ def _apply_config_updates( cognitive_job_queue=job_queue, meme_service=meme_service, naga_store=naga_store, + message_batcher=handler.message_batcher, ) runtime_api_server = RuntimeAPIServer( runtime_api_context, @@ -509,6 +510,10 @@ def _apply_config_updates( logger.exception("[异常] 运行期间发生未捕获的错误: %s", exc) finally: logger.info("[清理] 正在关闭机器人并释放资源...") + try: + await handler.message_batcher.flush_all() + except Exception: + logger.exception("[清理] MessageBatcher flush_all 失败") if runtime_api_server is not None: await runtime_api_server.stop() if meme_worker is not None: diff --git a/src/Undefined/services/ai_coordinator.py b/src/Undefined/services/ai_coordinator.py index 98ca1ea7..e77a1656 100644 --- a/src/Undefined/services/ai_coordinator.py +++ b/src/Undefined/services/ai_coordinator.py @@ -1,4 +1,5 @@ import logging +import time from datetime import datetime from pathlib import Path from typing import Any, Optional @@ -15,6 +16,11 @@ from Undefined.render import render_html_to_image, render_markdown_to_html from Undefined.services.model_pool import ModelPoolService from Undefined.services.queue_manager import QueueManager, QUEUE_LANE_BACKGROUND +from Undefined.services.message_batcher import ( + BufferedMessage, + MessageBatcher, + make_scope, +) from Undefined.utils.history import MessageHistoryManager from Undefined.utils.sender import MessageSender from Undefined.utils.scheduler import TaskScheduler @@ -35,6 +41,44 @@ ) +_GROUP_STRATEGY_FOOTER = """ + + 【回复策略 - 更克制,且优先表情包】 + 1. 如果用户 @ 了你或拍了拍你 → 【必须回复】 + 2. 如果消息中明确提到了你(根据上下文判断用户是否在叫你或维持对话流) → 【必须回复】 + 3. 如果问题明确涉及某个项目/代码/部署细节(用户明确点名或上下文明确指向) → 【酌情回复,必要时先查证再回答】 + 4. 其他技术问题 → 【酌情回复,直接按用户提到的对象回答,不要引入无关的项目名/工具名作背景】 + 5. 先判断这条话是不是在对你说: + - 如果明显是在和别人说话 → 【不要回复】 + - 如果你不能确定是不是在和你说话 → 【默认不回复】 + - 只有明确在和你说,或多人公开讨论且对话明显开放时,才进入下一步 + 6. 群聊里的主动参与只保留给公开、开放的技术或项目讨论: + - 只在多人公开讨论代码、AI、开发工具、项目进展、技术 bug 等,且不是别人之间定向交流时,才可以【极低频参与】 + - 默认更倾向不参与;不要长篇大论,一两句点到为止;如果别人已经在深入讨论且不需要你,保持沉默 + - 轻松互动、玩梗、吐槽本身不构成参与许可;只有在你已经决定要回复时,才优先考虑表情包表达 + 7. 对于已经决定要回复的场景(包括被@、被拍一拍、轻量答疑,以及少量符合条件的主动参与): + - 默认先尝试 memes.search_memes,再用 memes.send_meme_by_uid 单独发一条图片消息 + - 对于吐槽、附和、接梗、表达态度或情绪的回复,默认由表情包承担主要表达;只要能发表情包,就不要先发文字描述来代替它 + - 如果确实需要文字,也只补极短一句,并与表情包分开发送 + - 不要发送任何敷衍消息(如'懒得掺和'、'哦'等);不想回复就直接调用 end + - 严肃、任务型、高信息密度场景少发表情包,避免打断信息传递 + - 绝不要刷屏、绝不要每条都回 + 8. 对于本来就会回复的场景(私聊、被拍一拍、被@、轻量答疑): + - 如果表情包能自然增强语气、缓和语气或让表达更像真人,也可以配合使用 + - 但不要为了发表情包而牺牲信息传递;信息密度优先时仍以文字为主 + + 简单说:像个极度安静的群友。主动插话只留给公开、开放的技术或项目讨论;明显对别人说或拿不准时就闭嘴。已经决定要回复时,再优先用表情包而不是文字。""" + + +_PRIVATE_STRATEGY_FOOTER = """ + +【私聊消息】 +这是私聊消息,用户专门来找你说话。你可以自由选择是否回复: +- 如果想回复,先调用 send_message 工具发送回复内容,然后调用 end 结束对话 +- 如果你已经决定回复,并且表情包能让表达更像真人,也可以先用 memes.search_memes 查表情包,再用 memes.send_meme_by_uid 单独发图 +- 如果不想回复,直接调用 end 结束对话即可""" + + class AICoordinator: """AI 协调器,处理 AI 回复逻辑、Prompt 构建和队列管理""" @@ -60,6 +104,22 @@ def __init__( self.security = security self.command_dispatcher = command_dispatcher self.model_pool = ModelPoolService(ai, config, sender) + # batcher 由外部(handlers.py)创建并通过 set_batcher 注入;未注入时所有消息按单条流程直送。 + self._batcher: MessageBatcher | None = None + + def set_batcher(self, batcher: MessageBatcher | None) -> None: + """注入消息合并器;传 None 等同于禁用合并。""" + self._batcher = batcher + + @property + def batcher(self) -> MessageBatcher | None: + return self._batcher + + async def handle_batched_dispatch(self, items: list[BufferedMessage]) -> None: + """:class:`MessageBatcher` 的 flush_callback:把一批消息组装为单次请求并入队。""" + if not items: + return + await self._dispatch_grouped_request(items) async def handle_auto_reply( self, @@ -116,61 +176,47 @@ async def handle_auto_reply( ) return - prompt_prefix = ( - "(用户拍了拍你) " if is_poke else ("(用户 @ 了你) " if is_at_bot else "") + scope = make_scope(group_id=group_id) + item = BufferedMessage( + scope=scope, + sender_id=sender_id, + text=text, + message_content=list(message_content), + attachments=list(attachments or []), + sender_name=sender_name, + arrival_time=time.time(), + is_private=False, + trigger_message_id=trigger_message_id, + is_poke=is_poke, + is_at_bot=is_at_bot, + is_fake_at=is_fake_at, + group_id=group_id, + group_name=group_name, + sender_role=sender_role, + sender_title=sender_title, + sender_level=sender_level, ) - current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - location = group_name if group_name.endswith("群") else f"{group_name}群" - full_question = self._build_prompt( - prompt_prefix, - sender_name, - sender_id, - group_id, - group_name, - location, - sender_role, - sender_title, - current_time, - text, - attachments=attachments, - message_id=trigger_message_id, - level=sender_level, - ) - logger.debug( - "[自动回复] full_question_len=%s group=%s sender=%s", - len(full_question), - group_id, - sender_id, - ) + # 路由:拍一拍 → 永远旁路;否则按 batcher 启用情况与 @bot 处理规则决定 + if is_poke: + await self._dispatch_grouped_request([item]) + return - request_data = { - "type": "auto_reply", - "group_id": group_id, - "sender_id": sender_id, - "sender_name": sender_name, - "group_name": group_name, - "text": text, - "full_question": full_question, - "is_at_bot": is_at_bot, - "trigger_message_id": trigger_message_id, - } + batcher = getattr(self, "_batcher", None) + if batcher is not None and batcher.is_enabled_for(is_group=True): + if is_at_bot and batcher.has_buffer(scope, sender_id): + # 已有 buffer 时再来一条 @bot:单独立即处理,不打断现有 buffer + logger.info( + "[自动回复] batch 内 @bot 旁路立即处理: group=%s sender=%s", + group_id, + sender_id, + ) + await self._dispatch_grouped_request([item]) + return + await batcher.submit(item) + return - if sender_id == self.config.superadmin_qq: - logger.info("[AI] 投递至群聊超级管理员队列") - await self.queue_manager.add_group_superadmin_request( - request_data, model_name=self.config.chat_model.model_name - ) - elif is_at_bot: - logger.info(f"[AI] 触发原因: {'拍一拍' if is_poke else '@机器人'}") - await self.queue_manager.add_group_mention_request( - request_data, model_name=self.config.chat_model.model_name - ) - else: - logger.info("[AI] 投递至普通请求队列") - await self.queue_manager.add_group_normal_request( - request_data, model_name=self.config.chat_model.model_name - ) + await self._dispatch_grouped_request([item]) async def handle_private_reply( self, @@ -193,52 +239,30 @@ async def handle_private_reply( await self._handle_injection_response(user_id, text, is_private=True) return - prompt_prefix = "(用户拍了拍你) " if is_poke else "" - current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") - message_id_attr = "" - if trigger_message_id is not None: - message_id_attr = f' message_id="{escape_xml_attr(trigger_message_id)}"' - attachment_xml = ( - f"\n{attachment_refs_to_xml(attachments)}" if attachments else "" + scope = make_scope(user_id=user_id) + item = BufferedMessage( + scope=scope, + sender_id=user_id, + text=text, + message_content=list(message_content), + attachments=list(attachments or []), + sender_name=sender_name, + arrival_time=time.time(), + is_private=True, + trigger_message_id=trigger_message_id, + is_poke=is_poke, ) - full_question = f"""{prompt_prefix} - {escape_xml_text(text)}{attachment_xml} - - -【私聊消息】 -这是私聊消息,用户专门来找你说话。你可以自由选择是否回复: -- 如果想回复,先调用 send_message 工具发送回复内容,然后调用 end 结束对话 -- 如果你已经决定回复,并且表情包能让表达更像真人,也可以先用 memes.search_memes 查表情包,再用 memes.send_meme_by_uid 单独发图 -- 如果不想回复,直接调用 end 结束对话即可""" - request_data = { - "type": "private_reply", - "user_id": user_id, - "sender_name": sender_name, - "text": text, - "full_question": full_question, - "trigger_message_id": trigger_message_id, - } - logger.debug( - "[私聊回复] full_question_len=%s user=%s", - len(full_question), - user_id, - ) + if is_poke: + await self._dispatch_grouped_request([item]) + return - # 动态选择模型(私聊 group_id=0) - effective_config = self.model_pool.select_chat_config( - self.config.chat_model, user_id=user_id - ) - request_data["selected_model_name"] = effective_config.model_name + batcher = getattr(self, "_batcher", None) + if batcher is not None and batcher.is_enabled_for(is_group=False): + await batcher.submit(item) + return - if user_id == self.config.superadmin_qq: - await self.queue_manager.add_superadmin_request( - request_data, model_name=effective_config.model_name - ) - else: - await self.queue_manager.add_private_request( - request_data, model_name=effective_config.model_name - ) + await self._dispatch_grouped_request([item]) async def execute_reply(self, request: dict[str, Any]) -> None: """执行排队中的回复请求(由 QueueManager 分发调用) @@ -705,6 +729,196 @@ async def _handle_injection_response( tid, self.config.bot_qq, "<对注入消息的回复>", "Bot", "" ) + def _format_group_message_segment(self, item: BufferedMessage) -> str: + """格式化群聊单条 ```` 块。""" + time_str = datetime.fromtimestamp(item.arrival_time).strftime( + "%Y-%m-%d %H:%M:%S" + ) + group_name = item.group_name or "未知群聊" + location = group_name if group_name.endswith("群") else f"{group_name}群" + safe_name = escape_xml_attr(item.sender_name or "未知用户") + safe_uid = escape_xml_attr(item.sender_id) + safe_gid = escape_xml_attr(item.group_id or 0) + safe_gname = escape_xml_attr(group_name) + safe_loc = escape_xml_attr(location) + safe_role = escape_xml_attr(item.sender_role or "member") + safe_title = escape_xml_attr(item.sender_title or "") + safe_time = escape_xml_attr(time_str) + safe_text = escape_xml_text(item.text) + message_id_attr = "" + if item.trigger_message_id is not None: + message_id_attr = ( + f' message_id="{escape_xml_attr(item.trigger_message_id)}"' + ) + level_attr = ( + f' level="{escape_xml_attr(item.sender_level)}"' + if item.sender_level + else "" + ) + attachment_xml = ( + f"\n{attachment_refs_to_xml(item.attachments)}" if item.attachments else "" + ) + return ( + f'\n' + f" {safe_text}{attachment_xml}\n" + f" " + ) + + def _format_private_message_segment(self, item: BufferedMessage) -> str: + """格式化私聊单条 ```` 块。""" + time_str = datetime.fromtimestamp(item.arrival_time).strftime( + "%Y-%m-%d %H:%M:%S" + ) + safe_name = escape_xml_attr(item.sender_name or "未知用户") + safe_uid = escape_xml_attr(item.sender_id) + safe_time = escape_xml_attr(time_str) + safe_text = escape_xml_text(item.text) + message_id_attr = "" + if item.trigger_message_id is not None: + message_id_attr = ( + f' message_id="{escape_xml_attr(item.trigger_message_id)}"' + ) + attachment_xml = ( + f"\n{attachment_refs_to_xml(item.attachments)}" if item.attachments else "" + ) + return ( + f'\n' + f" {safe_text}{attachment_xml}\n" + f" " + ) + + @staticmethod + def _build_continuous_messages_note(items: list[BufferedMessage]) -> str: + """生成"连续消息说明"段。仅在 ``len(items) >= 2`` 时使用。""" + count = len(items) + first_t = items[0].arrival_time + last_t = items[-1].arrival_time + span = max(0.0, last_t - first_t) + return ( + f"\n\n 【连续消息说明】以上 {count} 条 是同一用户在约 " + f"{span:.1f} 秒内连续发送的消息(按时间先后排列),代表本轮要回应的全部输入:\n" + f" - 先识别每条的意图,分清是【独立请求】还是【对前一条的修正/否定/补充/打断】\n" + f' · 若是【多个独立的不同意图/问题】(如"先帮我查 A,再翻译 B")' + f" → 每个都要回应,不要遗漏;与平时一样,可以多次 send_message 自然分发\n" + f' · 若后发是【对前发的修正/否定/补充/打断】(如"画猫" → "改成狗")' + f" → 以最后一次明确意图为准,旧的不再执行,可简短说明已采纳更新\n" + f' · 拿不准时偏向"独立请求",宁多勿漏\n' + f" - 整批在本轮一次性处理完即可,不要为同一意图重复输出(不要" + f'"中间一波、结尾再来一波"重复相同回复)\n' + f" - history 中若出现与当前轮 相同的条目,视为同一来源,不要重复处理" + ) + + def _build_grouped_prompt(self, items: list[BufferedMessage]) -> str: + """根据 BufferedMessage 列表构造合并后的完整 prompt。""" + if not items: + return "" + is_private = items[0].is_private + # prefix:拍一拍优先;否则任一 @bot + any_poke = any(it.is_poke for it in items) + any_at_bot = any(it.is_at_bot for it in items) + if any_poke: + prefix = "(用户拍了拍你) " + elif any_at_bot: + prefix = "(用户 @ 了你) " + else: + prefix = "" + + if is_private: + segments = [self._format_private_message_segment(it) for it in items] + else: + segments = [self._format_group_message_segment(it) for it in items] + body = prefix + "\n".join(segments) + if len(items) >= 2: + body += self._build_continuous_messages_note(items) + body += _GROUP_STRATEGY_FOOTER if not is_private else _PRIVATE_STRATEGY_FOOTER + return body + + async def _dispatch_grouped_request(self, items: list[BufferedMessage]) -> None: + """根据一组 BufferedMessage 决定优先级、构造 prompt 并入队。 + + 既是单条直送路径的统一出口,也是 :class:`MessageBatcher` 的 flush_callback。 + """ + if not items: + return + first = items[0] + last = items[-1] + full_question = self._build_grouped_prompt(items) + any_poke = any(it.is_poke for it in items) + any_at_bot = any(it.is_at_bot for it in items) + + if first.is_private: + user_id = first.sender_id + request_data: dict[str, Any] = { + "type": "private_reply", + "user_id": user_id, + "sender_name": first.sender_name, + "text": last.text, + "full_question": full_question, + "trigger_message_id": last.trigger_message_id, + "batched_count": len(items), + } + effective_config = self.model_pool.select_chat_config( + self.config.chat_model, user_id=user_id + ) + request_data["selected_model_name"] = effective_config.model_name + logger.debug( + "[私聊回复] full_question_len=%s user=%s batched=%s", + len(full_question), + user_id, + len(items), + ) + if user_id == self.config.superadmin_qq: + await self.queue_manager.add_superadmin_request( + request_data, model_name=effective_config.model_name + ) + else: + await self.queue_manager.add_private_request( + request_data, model_name=effective_config.model_name + ) + return + + # 群聊 + group_id = first.group_id or 0 + sender_id = first.sender_id + request_data = { + "type": "auto_reply", + "group_id": group_id, + "sender_id": sender_id, + "sender_name": first.sender_name, + "group_name": first.group_name, + "text": last.text, + "full_question": full_question, + "is_at_bot": any_at_bot, + "trigger_message_id": last.trigger_message_id, + "batched_count": len(items), + } + logger.debug( + "[自动回复] full_question_len=%s group=%s sender=%s batched=%s", + len(full_question), + group_id, + sender_id, + len(items), + ) + if sender_id == self.config.superadmin_qq: + logger.info("[AI] 投递至群聊超级管理员队列 (batched=%s)", len(items)) + await self.queue_manager.add_group_superadmin_request( + request_data, model_name=self.config.chat_model.model_name + ) + elif any_at_bot: + trigger = "拍一拍" if any_poke else "@机器人" + logger.info("[AI] 触发原因: %s (batched=%s)", trigger, len(items)) + await self.queue_manager.add_group_mention_request( + request_data, model_name=self.config.chat_model.model_name + ) + else: + logger.info("[AI] 投递至普通请求队列 (batched=%s)", len(items)) + await self.queue_manager.add_group_normal_request( + request_data, model_name=self.config.chat_model.model_name + ) + def _build_prompt( self, prefix: str, diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py new file mode 100644 index 00000000..9a361ab4 --- /dev/null +++ b/src/Undefined/services/message_batcher.py @@ -0,0 +1,268 @@ +"""同 sender 短时多消息合并器(MessageBatcher)。 + +将同一 sender 在 ``window_seconds`` 内连续发送的消息合并到同一轮 AI 触发, +避免多次独立调用 AI 导致重复或行为打架。 + +调用约定: +- 调用方先按业务规则决定一条消息是否要进 batcher(例如拍一拍、batch 内 @bot + 立刻处理等场景应当旁路),需要合并的消息构造为 :class:`BufferedMessage` + 通过 :meth:`MessageBatcher.submit` 提交。 +- 当窗口到期或触发硬顶(条数 / ``max_window_seconds``)时,batcher 调用 + ``flush_callback(items)``,调用方负责拼装 prompt 并入队。 +- 关停时调用 :meth:`MessageBatcher.flush_all` 把所有 buckets 立刻 flush。 +""" + +from __future__ import annotations + +import asyncio +import logging +import time +from dataclasses import dataclass, field +from typing import Any, Awaitable, Callable + +from Undefined.config.models import MessageBatcherConfig + +logger = logging.getLogger(__name__) + + +@dataclass +class BufferedMessage: + """缓冲中的单条消息上下文。""" + + scope: str + sender_id: int + text: str + message_content: list[dict[str, Any]] + attachments: list[dict[str, str]] + sender_name: str + arrival_time: float + is_private: bool + trigger_message_id: int | None = None + is_poke: bool = False + is_at_bot: bool = False + is_fake_at: bool = False + # 群聊扩展字段 + group_id: int | None = None + group_name: str = "" + sender_role: str = "member" + sender_title: str = "" + sender_level: str = "" + + +FlushCallback = Callable[[list[BufferedMessage]], Awaitable[None]] + + +@dataclass +class _BatchState: + items: list[BufferedMessage] = field(default_factory=list) + first_arrival_monotonic: float = 0.0 + timer_handle: asyncio.TimerHandle | None = None + + +def make_scope(*, group_id: int | None = None, user_id: int | None = None) -> str: + """构造合并 key 的 scope 字符串。""" + if group_id and group_id > 0: + return f"group:{group_id}" + if user_id is not None: + return f"private:{user_id}" + return "unknown" + + +class MessageBatcher: + """同 sender 短时合并器。""" + + def __init__( + self, + config: MessageBatcherConfig, + flush_callback: FlushCallback, + ) -> None: + self._config = config + self._flush_callback = flush_callback + self._buckets: dict[tuple[str, int], _BatchState] = {} + self._lock = asyncio.Lock() + + def update_config(self, config: MessageBatcherConfig) -> None: + """配置热更新。""" + self._config = config + logger.info( + "[MessageBatcher] 配置已更新: enabled=%s window=%.2fs strategy=%s " + "max_window=%.2fs max_messages=%s group=%s private=%s", + config.enabled, + config.window_seconds, + config.strategy, + config.max_window_seconds, + config.max_messages_per_batch, + config.group_enabled, + config.private_enabled, + ) + + @property + def config(self) -> MessageBatcherConfig: + return self._config + + def is_enabled_for(self, *, is_group: bool) -> bool: + cfg = self._config + if not cfg.enabled or cfg.window_seconds <= 0: + return False + return cfg.group_enabled if is_group else cfg.private_enabled + + def has_buffer(self, scope: str, sender_id: int) -> bool: + return (scope, sender_id) in self._buckets + + async def submit(self, item: BufferedMessage) -> None: + """提交一条消息。 + + - 若同 (scope, sender_id) 无 buffer:开新 batch,启动 timer。 + - 若已有 buffer:追加; + - extend 策略 → 重置 timer + - fixed 策略 → 不重置 timer(仅在剩余时间窗内合并) + - 触发 ``max_messages_per_batch`` / ``max_window_seconds`` 时立即发车。 + """ + cfg = self._config + key = (item.scope, item.sender_id) + flush_items: list[BufferedMessage] | None = None + + async with self._lock: + state = self._buckets.get(key) + now_mono = time.monotonic() + if state is None: + state = _BatchState(first_arrival_monotonic=now_mono) + self._buckets[key] = state + state.items.append(item) + self._cancel_timer(state) + + elapsed = now_mono - state.first_arrival_monotonic + remaining_max = cfg.max_window_seconds - elapsed + + should_flush = False + if ( + cfg.max_messages_per_batch > 0 + and len(state.items) >= cfg.max_messages_per_batch + ): + logger.info( + "[MessageBatcher] 达到 max_messages_per_batch=%s 立即发车: " + "scope=%s sender=%s", + cfg.max_messages_per_batch, + item.scope, + item.sender_id, + ) + should_flush = True + elif remaining_max <= 0: + logger.info( + "[MessageBatcher] 已超 max_window_seconds 硬顶 立即发车: " + "scope=%s sender=%s elapsed=%.2fs", + item.scope, + item.sender_id, + elapsed, + ) + should_flush = True + + if should_flush: + flush_items = self._pop_locked(key) + else: + if cfg.strategy == "fixed": + target = state.first_arrival_monotonic + cfg.window_seconds + delay = max(0.0, target - now_mono) + else: # extend + delay = cfg.window_seconds + # 不超过 max_window 硬顶 + delay = min(delay, remaining_max) + loop = asyncio.get_running_loop() + state.timer_handle = loop.call_later( + max(0.0, delay), self._on_timer, key + ) + logger.debug( + "[MessageBatcher] 缓冲: scope=%s sender=%s count=%s " + "next_flush_in=%.2fs strategy=%s", + item.scope, + item.sender_id, + len(state.items), + delay, + cfg.strategy, + ) + + if flush_items is not None: + await self._invoke_callback(flush_items) + + def _cancel_timer(self, state: _BatchState) -> None: + if state.timer_handle is not None: + state.timer_handle.cancel() + state.timer_handle = None + + def _pop_locked(self, key: tuple[str, int]) -> list[BufferedMessage] | None: + state = self._buckets.pop(key, None) + if state is None or not state.items: + return None + self._cancel_timer(state) + return list(state.items) + + def _on_timer(self, key: tuple[str, int]) -> None: + # call_later 在事件循环里同步触发,调度到 task 里 await + asyncio.create_task(self._flush_key(key)) + + async def _flush_key(self, key: tuple[str, int]) -> None: + async with self._lock: + items = self._pop_locked(key) + if items: + await self._invoke_callback(items) + + async def _invoke_callback(self, items: list[BufferedMessage]) -> None: + if not items: + return + first = items[0] + logger.info( + "[MessageBatcher] 发车: scope=%s sender=%s count=%s", + first.scope, + first.sender_id, + len(items), + ) + try: + await self._flush_callback(items) + except Exception: # noqa: BLE001 - 必须吞掉以保证 batcher 不挂 + logger.exception( + "[MessageBatcher] flush_callback 异常: scope=%s sender=%s count=%s", + first.scope, + first.sender_id, + len(items), + ) + + async def flush_all(self) -> None: + """立即 flush 所有 buckets(用于关停)。""" + async with self._lock: + keys = list(self._buckets.keys()) + if not keys: + return + logger.info("[MessageBatcher] flush_all: pending_buckets=%s", len(keys)) + for key in keys: + await self._flush_key(key) + + def snapshot(self) -> dict[str, Any]: + """返回当前 buckets 状态的非阻塞快照(供 Runtime API / WebUI 展示)。""" + cfg = self._config + now_mono = time.monotonic() + buckets: list[dict[str, Any]] = [] + # 直接读 dict 副本;不持锁,可能瞬间不一致但够展示 + for (scope, sender_id), state in list(self._buckets.items()): + buckets.append( + { + "scope": scope, + "sender_id": sender_id, + "count": len(state.items), + "elapsed_seconds": round( + max(0.0, now_mono - state.first_arrival_monotonic), 2 + ), + } + ) + return { + "config": { + "enabled": cfg.enabled, + "window_seconds": cfg.window_seconds, + "strategy": cfg.strategy, + "max_window_seconds": cfg.max_window_seconds, + "max_messages_per_batch": cfg.max_messages_per_batch, + "group_enabled": cfg.group_enabled, + "private_enabled": cfg.private_enabled, + }, + "pending_buckets": len(buckets), + "buckets": buckets, + } diff --git a/src/Undefined/webui/static/js/i18n.js b/src/Undefined/webui/static/js/i18n.js index 1d60d0ba..1f45fa95 100644 --- a/src/Undefined/webui/static/js/i18n.js +++ b/src/Undefined/webui/static/js/i18n.js @@ -153,6 +153,13 @@ const I18N = { "probes.section_system": "系统信息", "probes.section_models": "模型配置", "probes.section_queues": "请求队列", + "probes.section_message_batcher": "消息合并器", + "probes.batcher_enabled": "启用", + "probes.batcher_window": "窗口", + "probes.batcher_strategy": "策略", + "probes.batcher_pending": "未发车桶数", + "probes.batcher_group": "群聊合并", + "probes.batcher_private": "私聊合并", "probes.section_services": "服务状态", "probes.section_skills": "技能统计", "probes.version": "版本", @@ -454,6 +461,13 @@ const I18N = { "probes.section_system": "System Info", "probes.section_models": "Model Configuration", "probes.section_queues": "Request Queues", + "probes.section_message_batcher": "Message Batcher", + "probes.batcher_enabled": "Enabled", + "probes.batcher_window": "Window", + "probes.batcher_strategy": "Strategy", + "probes.batcher_pending": "Pending Buckets", + "probes.batcher_group": "Group", + "probes.batcher_private": "Private", "probes.section_services": "Service Status", "probes.section_skills": "Skill Statistics", "probes.version": "Version", diff --git a/src/Undefined/webui/static/js/runtime.js b/src/Undefined/webui/static/js/runtime.js index c1e1282d..c56828bb 100644 --- a/src/Undefined/webui/static/js/runtime.js +++ b/src/Undefined/webui/static/js/runtime.js @@ -155,6 +155,50 @@ html += ``; } + // Message Batcher + const mb = data.message_batcher || {}; + if (mb.config) { + const cfg = mb.config || {}; + html += `
`; + html += `
${t("probes.section_message_batcher")}
`; + html += `
`; + html += probeItem( + t("probes.batcher_enabled"), + probeStatusBadge(cfg.enabled ? "ok" : "skipped"), + ); + html += probeItem( + t("probes.batcher_window"), + `${escapeHtml(String(cfg.window_seconds))}s`, + ); + html += probeItem( + t("probes.batcher_strategy"), + `${escapeHtml(cfg.strategy || "")}`, + ); + html += probeItem( + t("probes.batcher_pending"), + String(mb.pending_buckets ?? 0), + ); + html += probeItem( + t("probes.batcher_group"), + cfg.group_enabled ? "✓" : "✗", + ); + html += probeItem( + t("probes.batcher_private"), + cfg.private_enabled ? "✓" : "✗", + ); + html += `
`; + const buckets = Array.isArray(mb.buckets) ? mb.buckets : []; + if (buckets.length > 0) { + html += `
`; + for (const b of buckets.slice(0, 10)) { + const label = `${escapeHtml(String(b.scope || ""))}/${escapeHtml(String(b.sender_id || ""))}`; + html += `${label} ${b.count}×@${b.elapsed_seconds}s`; + } + html += `
`; + } + html += `
`; + } + // Memory & Cognitive const mem = data.memory || {}; const cog = data.cognitive || {}; diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py new file mode 100644 index 00000000..c89f7c1d --- /dev/null +++ b/tests/test_message_batcher.py @@ -0,0 +1,235 @@ +"""MessageBatcher 单元测试。""" + +from __future__ import annotations + +import asyncio +import time + +import pytest + +from Undefined.config.models import MessageBatcherConfig +from Undefined.services.message_batcher import ( + BufferedMessage, + MessageBatcher, + make_scope, +) + + +def _make_item( + *, + scope: str = "group:1", + sender_id: int = 100, + text: str = "hi", + is_private: bool = False, + is_poke: bool = False, + is_at_bot: bool = False, + sender_name: str = "test", +) -> BufferedMessage: + return BufferedMessage( + scope=scope, + sender_id=sender_id, + text=text, + message_content=[{"type": "text", "data": {"text": text}}], + attachments=[], + sender_name=sender_name, + arrival_time=time.time(), + is_private=is_private, + trigger_message_id=1, + is_poke=is_poke, + is_at_bot=is_at_bot, + group_id=None if is_private else 1, + ) + + +class _Recorder: + def __init__(self) -> None: + self.batches: list[list[BufferedMessage]] = [] + self.event = asyncio.Event() + + async def __call__(self, items: list[BufferedMessage]) -> None: + self.batches.append(items) + self.event.set() + + +def test_make_scope() -> None: + assert make_scope(group_id=10) == "group:10" + assert make_scope(user_id=5) == "private:5" + assert make_scope() == "unknown" + + +@pytest.mark.asyncio +async def test_consecutive_same_sender_merge() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.1, strategy="extend") + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(text="msg1")) + await batcher.submit(_make_item(text="msg2")) + await batcher.submit(_make_item(text="msg3")) + + await asyncio.wait_for(rec.event.wait(), timeout=1.0) + assert len(rec.batches) == 1 + assert [m.text for m in rec.batches[0]] == ["msg1", "msg2", "msg3"] + + +@pytest.mark.asyncio +async def test_different_senders_isolated() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.1) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(sender_id=1, text="a")) + await batcher.submit(_make_item(sender_id=2, text="b")) + + await asyncio.sleep(0.3) + assert len(rec.batches) == 2 + flat = sorted([b[0].sender_id for b in rec.batches]) + assert flat == [1, 2] + + +@pytest.mark.asyncio +async def test_max_messages_immediate_flush() -> None: + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=10.0, + max_messages_per_batch=2, + ) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(text="x")) + await batcher.submit(_make_item(text="y")) + + # 立即发车,不需要等窗口 + assert len(rec.batches) == 1 + assert len(rec.batches[0]) == 2 + + +@pytest.mark.asyncio +async def test_max_window_hard_cap() -> None: + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.05, + strategy="extend", + max_window_seconds=0.15, + ) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + # 持续提交,extend 应被 max_window 硬顶 + for _ in range(10): + await batcher.submit(_make_item(text="x")) + await asyncio.sleep(0.03) + + await asyncio.sleep(0.3) + # 至少触发过一次 flush + assert len(rec.batches) >= 1 + + +@pytest.mark.asyncio +async def test_disabled_means_caller_should_bypass() -> None: + cfg = MessageBatcherConfig(enabled=False, window_seconds=0.1) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + assert batcher.is_enabled_for(is_group=True) is False + assert batcher.is_enabled_for(is_group=False) is False + + +@pytest.mark.asyncio +async def test_group_only_disabled() -> None: + cfg = MessageBatcherConfig( + enabled=True, window_seconds=0.1, group_enabled=False, private_enabled=True + ) + batcher = MessageBatcher(cfg, lambda items: asyncio.sleep(0)) + assert batcher.is_enabled_for(is_group=True) is False + assert batcher.is_enabled_for(is_group=False) is True + + +@pytest.mark.asyncio +async def test_has_buffer() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=10.0) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + assert not batcher.has_buffer("group:1", 100) + await batcher.submit(_make_item()) + assert batcher.has_buffer("group:1", 100) + + +@pytest.mark.asyncio +async def test_flush_all_on_shutdown() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=10.0) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(sender_id=1, text="a")) + await batcher.submit(_make_item(sender_id=2, text="b")) + assert len(rec.batches) == 0 + + await batcher.flush_all() + assert len(rec.batches) == 2 + + +@pytest.mark.asyncio +async def test_extend_resets_timer() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.15, strategy="extend") + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(text="a")) + await asyncio.sleep(0.10) + await batcher.submit(_make_item(text="b")) + await asyncio.sleep(0.10) + # 这个时间点本来 a 已经超过初始 0.15s 窗口;若 extend 重置则 b 还在等 + assert len(rec.batches) == 0 + await asyncio.sleep(0.20) + assert len(rec.batches) == 1 + + +@pytest.mark.asyncio +async def test_fixed_does_not_reset_timer() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.15, strategy="fixed") + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(text="a")) + await asyncio.sleep(0.05) + await batcher.submit(_make_item(text="b")) + # fixed 策略下定时器从首条算起,大约 0.15s 后 flush + await asyncio.sleep(0.20) + assert len(rec.batches) == 1 + assert len(rec.batches[0]) == 2 + + +@pytest.mark.asyncio +async def test_update_config_runtime() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.1) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + new_cfg = MessageBatcherConfig(enabled=False, window_seconds=0.5) + batcher.update_config(new_cfg) + assert batcher.config.enabled is False + assert batcher.is_enabled_for(is_group=True) is False + + +@pytest.mark.asyncio +async def test_callback_exception_does_not_break_batcher() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.05) + + calls: list[int] = [] + + async def bad_callback(items: list[BufferedMessage]) -> None: + calls.append(len(items)) + raise RuntimeError("boom") + + batcher = MessageBatcher(cfg, bad_callback) + await batcher.submit(_make_item(text="a")) + await asyncio.sleep(0.2) + assert calls == [1] + + # 应能继续接受新消息 + await batcher.submit(_make_item(text="b")) + await asyncio.sleep(0.2) + assert calls == [1, 1] diff --git a/tests/test_message_batcher_integration.py b/tests/test_message_batcher_integration.py new file mode 100644 index 00000000..0185b07b --- /dev/null +++ b/tests/test_message_batcher_integration.py @@ -0,0 +1,272 @@ +"""MessageBatcher + AICoordinator 集成行为测试。 + +不走 handlers,直接验证: +- 同 sender 短时连续消息合并到同一队列请求; +- 队列优先级:首条 @bot 整批走 mention;buffer 已存在时新条 @bot 单独立即处理; +- 拍一拍永远旁路; +- 私聊连续合并到 add_private_request。 +""" + +from __future__ import annotations + +import asyncio +from types import SimpleNamespace +from typing import Any, cast +from unittest.mock import AsyncMock + +import pytest + +from Undefined.config.models import MessageBatcherConfig +from Undefined.services.ai_coordinator import AICoordinator +from Undefined.services.message_batcher import MessageBatcher + + +def _make_coordinator( + *, + superadmin_qq: int = 99999, + enabled: bool = True, + window_seconds: float = 0.1, + group_enabled: bool = True, + private_enabled: bool = True, +) -> tuple[Any, SimpleNamespace, MessageBatcher]: + coordinator: Any = object.__new__(AICoordinator) + queue_manager = SimpleNamespace( + add_group_superadmin_request=AsyncMock(), + add_group_mention_request=AsyncMock(), + add_group_normal_request=AsyncMock(), + add_superadmin_request=AsyncMock(), + add_private_request=AsyncMock(), + ) + coordinator.config = SimpleNamespace( + superadmin_qq=superadmin_qq, + chat_model=SimpleNamespace(model_name="chat-model"), + ) + coordinator.security = SimpleNamespace( + detect_injection=AsyncMock(return_value=False) + ) + coordinator.history_manager = SimpleNamespace( + modify_last_group_message=AsyncMock(), + modify_last_private_message=AsyncMock(), + ) + coordinator.queue_manager = queue_manager + coordinator._is_at_bot = lambda _content: False + coordinator.model_pool = SimpleNamespace( + select_chat_config=lambda chat_model, user_id: chat_model + ) + + cfg = MessageBatcherConfig( + enabled=enabled, + window_seconds=window_seconds, + group_enabled=group_enabled, + private_enabled=private_enabled, + ) + batcher = MessageBatcher(cfg, coordinator.handle_batched_dispatch) + coordinator._batcher = batcher + return coordinator, queue_manager, batcher + + +@pytest.mark.asyncio +async def test_two_group_messages_merge_into_single_request() -> None: + coordinator, qm, _ = _make_coordinator(window_seconds=0.05) + + await coordinator.handle_auto_reply( + group_id=12345, + sender_id=20001, + text="帮我画一只猫", + message_content=[], + sender_name="user", + group_name="测试群", + trigger_message_id=1, + ) + await coordinator.handle_auto_reply( + group_id=12345, + sender_id=20001, + text="改成狗", + message_content=[], + sender_name="user", + group_name="测试群", + trigger_message_id=2, + ) + + # 等窗口过期 + 调度 + await asyncio.sleep(0.25) + + cast(AsyncMock, qm.add_group_normal_request).assert_awaited_once() + cast(AsyncMock, qm.add_group_mention_request).assert_not_called() + await_args = cast(AsyncMock, qm.add_group_normal_request).await_args + assert await_args is not None + request_data = await_args.args[0] + assert request_data["batched_count"] == 2 + assert request_data["text"] == "改成狗" # last 文本 + assert "帮我画一只猫" in request_data["full_question"] + assert "改成狗" in request_data["full_question"] + assert "【连续消息说明】" in request_data["full_question"] + + +@pytest.mark.asyncio +async def test_first_at_bot_routes_batch_to_mention_lane() -> None: + coordinator, qm, _ = _make_coordinator(window_seconds=0.05) + coordinator._is_at_bot = lambda content: ( + bool(content) and any(seg.get("type") == "at" for seg in content) + ) + + at_payload = [{"type": "at", "data": {"qq": "self"}}] + await coordinator.handle_auto_reply( + group_id=1, + sender_id=2, + text="@bot 帮我画猫", + message_content=at_payload, + sender_name="u", + group_name="g", + ) + await coordinator.handle_auto_reply( + group_id=1, + sender_id=2, + text="改成狗", + message_content=[], + sender_name="u", + group_name="g", + ) + await asyncio.sleep(0.2) + + cast(AsyncMock, qm.add_group_mention_request).assert_awaited_once() + cast(AsyncMock, qm.add_group_normal_request).assert_not_called() + await_args = cast(AsyncMock, qm.add_group_mention_request).await_args + assert await_args is not None + req = await_args.args[0] + assert req["batched_count"] == 2 + assert req["is_at_bot"] is True + assert "(用户 @ 了你)" in req["full_question"] + + +@pytest.mark.asyncio +async def test_at_bot_arriving_with_buffer_bypasses_immediately() -> None: + coordinator, qm, _ = _make_coordinator(window_seconds=2.0) + is_at_calls: list[list[dict[str, Any]]] = [] + + def _is_at(content: list[dict[str, Any]]) -> bool: + is_at_calls.append(content) + return bool(content) and any(seg.get("type") == "at" for seg in content) + + coordinator._is_at_bot = _is_at + + # 1) 普通消息进 buffer + await coordinator.handle_auto_reply( + group_id=1, + sender_id=2, + text="hi", + message_content=[], + sender_name="u", + group_name="g", + ) + # 2) 立即来一条 @bot —— 应当旁路单独立即处理 + await coordinator.handle_auto_reply( + group_id=1, + sender_id=2, + text="@bot 急", + message_content=[{"type": "at", "data": {"qq": "self"}}], + sender_name="u", + group_name="g", + ) + + # @bot 已立即发车 + cast(AsyncMock, qm.add_group_mention_request).assert_awaited_once() + mention_await = cast(AsyncMock, qm.add_group_mention_request).await_args + assert mention_await is not None + mention_req = mention_await.args[0] + assert mention_req["batched_count"] == 1 + + # 普通桶仍未发车 + cast(AsyncMock, qm.add_group_normal_request).assert_not_called() + + +@pytest.mark.asyncio +async def test_poke_always_bypasses_batcher() -> None: + coordinator, qm, _ = _make_coordinator(window_seconds=2.0) + + await coordinator.handle_auto_reply( + group_id=1, + sender_id=2, + text="(拍一拍)", + message_content=[], + sender_name="u", + group_name="g", + is_poke=True, + ) + + # 拍一拍立即发车 + cast(AsyncMock, qm.add_group_mention_request).assert_awaited_once() + + +@pytest.mark.asyncio +async def test_private_consecutive_merge() -> None: + coordinator, qm, _ = _make_coordinator(window_seconds=0.05) + + await coordinator.handle_private_reply( + user_id=20001, + text="第一条", + message_content=[], + sender_name="u", + trigger_message_id=10, + ) + await coordinator.handle_private_reply( + user_id=20001, + text="第二条", + message_content=[], + sender_name="u", + trigger_message_id=11, + ) + await asyncio.sleep(0.25) + + cast(AsyncMock, qm.add_private_request).assert_awaited_once() + await_args = cast(AsyncMock, qm.add_private_request).await_args + assert await_args is not None + req = await_args.args[0] + assert req["batched_count"] == 2 + assert "第一条" in req["full_question"] + assert "第二条" in req["full_question"] + + +@pytest.mark.asyncio +async def test_disabled_batcher_passes_through_immediately() -> None: + coordinator, qm, _ = _make_coordinator(enabled=False) + + await coordinator.handle_auto_reply( + group_id=1, + sender_id=2, + text="hi", + message_content=[], + sender_name="u", + group_name="g", + ) + + cast(AsyncMock, qm.add_group_normal_request).assert_awaited_once() + + +@pytest.mark.asyncio +async def test_superadmin_batched_routes_to_superadmin_lane() -> None: + coordinator, qm, _ = _make_coordinator(superadmin_qq=10001, window_seconds=0.05) + + await coordinator.handle_auto_reply( + group_id=1, + sender_id=10001, + text="hello", + message_content=[], + sender_name="admin", + group_name="g", + ) + await coordinator.handle_auto_reply( + group_id=1, + sender_id=10001, + text="world", + message_content=[], + sender_name="admin", + group_name="g", + ) + await asyncio.sleep(0.25) + + cast(AsyncMock, qm.add_group_superadmin_request).assert_awaited_once() + await_args = cast(AsyncMock, qm.add_group_superadmin_request).await_args + assert await_args is not None + req = await_args.args[0] + assert req["batched_count"] == 2 From 0c2480117a9ad5d557ae81b70572b3a7d8bf4191 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 16:01:43 +0800 Subject: [PATCH 02/34] docs(architecture): wire MessageBatcher into system + sequence diagrams --- ARCHITECTURE.md | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 913c8eae..b6fd9840 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -45,7 +45,9 @@ graph TB end CommandDispatcher["CommandDispatcher
命令分发器
• /help /stats /lsadmin
• /addadmin /rmadmin
• /bugfix /faq
[services/command.py]"] - + + MessageBatcher["MessageBatcher
同 sender 短时合并
• 按 (scope, sender_id) 分桶
• window_seconds 内合并 N 条
• 拍一拍/buffer 内 @bot 旁路
• 首条 @bot 整批走 mention 队列
[services/message_batcher.py]"] + subgraph QueueSystem["车站-列车 队列系统 (services/)"] AICoordinator["AICoordinator
AI 协调器
• Prompt 构建
• 队列管理
• 回复执行
[ai_coordinator.py]"] QueueManager["QueueManager
队列管理器
[queue_manager.py]"] @@ -226,6 +228,8 @@ graph TB GitHubSender -->|"发送图片卡片"| OneBotClient MessageHandler -->|"3. 自动回复"| AICoordinator + AICoordinator -->|"3.1 入桶等待合并"| MessageBatcher + MessageBatcher -->|"3.2 flush 合并批次"| AICoordinator AICoordinator -->|"创建上下文"| RequestContext AICoordinator -->|"入队"| QueueManager QueueManager -->|"分发"| ModelQueues @@ -319,7 +323,7 @@ graph TB class User,Admin,OneBotServer,LLM_API external class Main,ConfigLoader,ConfigHotReload,ConfigModels,OneBotClient,Context,WebUI core - class MessageHandler,SecurityService,InjectionAgent,CommandDispatcher,AICoordinator message + class MessageHandler,SecurityService,InjectionAgent,CommandDispatcher,MessageBatcher,AICoordinator message class AIClient,PromptBuilder,ModelRequester,ToolManager,MultimodalAnalyzer,SummaryService,TokenCounter,Parsing ai class ToolRegistry,AgentRegistry,AgentToolRegistry,IntroGenerator skills class RequestContext,ContextFilter,ResourceRegistry,HistoryManager,MemoryStorage,EndSummaryStorage,CognitiveService,CognitiveJobQueue,CognitiveHistorian,CognitiveVectorStore,CognitiveProfileStorage,FAQStorage,ScheduledTaskStorage,TokenUsageStorage storage @@ -342,6 +346,7 @@ sequenceDiagram participant MH as MessageHandler participant SS as SecurityService participant CD as CommandDispatcher + participant MB as MessageBatcher participant AC as AICoordinator participant QM as QueueManager participant AI as AIClient @@ -380,7 +385,15 @@ sequenceDiagram end %% AI处理流程 MH->>AC: handle_auto_reply() - + alt 拍一拍 / buffer 内 @bot + AC->>QM: 立即按优先级入队 + else 普通消息进合并桶 + AC->>MB: submit(BufferedMessage) + MB-->>MB: 同 sender 短窗合并 (window_seconds) + MB->>AC: handle_batched_dispatch(批次) + AC->>QM: 按首条触发的优先级入队 + end + %% 上下文创建 AC->>AC: 创建 RequestContext AC->>ST: 保存历史记录 @@ -831,7 +844,7 @@ description: 从 PDF 文件中提取文本和表格,填写表单。当用户 1. **外部实体层**:用户、管理员、OneBot 协议端 (NapCat/Lagrange.Core)、大模型 API 服务商 2. **核心入口层**:main.py 启动入口、配置管理器 (config/loader.py)、热更新应用器 (config/hot_reload.py)、OneBotClient (onebot.py)、RequestContext (context.py)、Runtime API Server (api/app.py → api/routes/ 路由子模块) -3. **消息处理层**:MessageHandler (handlers.py)、SecurityService (security.py)、CommandDispatcher (services/command.py)、AICoordinator (ai_coordinator.py)、QueueManager (queue_manager.py)、自动处理管线 (skills/auto_pipeline/)、Bilibili/arXiv/GitHub 解析与发送模块 +3. **消息处理层**:MessageHandler (handlers.py)、SecurityService (security.py)、CommandDispatcher (services/command.py)、MessageBatcher (services/message_batcher.py)、AICoordinator (ai_coordinator.py)、QueueManager (queue_manager.py)、自动处理管线 (skills/auto_pipeline/)、Bilibili/arXiv/GitHub 解析与发送模块 自动提取由 `AutoPipelineRegistry` 并行检测、并行处理全部命中的管线;发送结果写入历史后继续进入 AI 自动回复。 4. **AI 核心能力层**:AIClient (client.py)、PromptBuilder (prompts.py)、ModelRequester (llm.py)、ToolManager (tooling.py)、MultimodalAnalyzer (multimodal.py)、SummaryService (summaries.py)、TokenCounter (tokens.py) 5. **存储与上下文层**:MessageHistoryManager (utils/history.py, 10000条限制)、MemoryStorage (memory.py, 置顶备忘录, 500条上限)、EndSummaryStorage、CognitiveService + JobQueue + HistorianWorker + VectorStore + ProfileStorage、MemeService + MemeWorker + MemeStore + MemeVectorStore (表情包库)、FAQStorage、ScheduledTaskStorage、TokenUsageStorage (自动归档) From e83e4281a541e1ea29e922cf846bbe4fd96cc1fc Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 16:06:00 +0800 Subject: [PATCH 03/34] fix(batcher): hold strong refs to timer flush tasks; flush_all awaits in-flight - Per asyncio docs, asyncio.create_task() return values must be kept alive or the task may be garbage-collected before completion. Add a _pending_tasks set with add_done_callback discard to keep timer-fired flush tasks alive. - flush_all now awaits any in-flight flush tasks (timer fired but callback still running) so shutdown does not drop messages. - Two regression tests added: GC-survival of timer task and flush_all blocking until slow callback finishes. --- src/Undefined/services/message_batcher.py | 28 ++++++++++++---- tests/test_message_batcher.py | 41 +++++++++++++++++++++++ 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index 9a361ab4..b2605372 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -80,6 +80,8 @@ def __init__( self._flush_callback = flush_callback self._buckets: dict[tuple[str, int], _BatchState] = {} self._lock = asyncio.Lock() + # 持有 timer 触发后创建的 flush task 强引用,避免 GC(asyncio 文档要求) + self._pending_tasks: set[asyncio.Task[None]] = set() def update_config(self, config: MessageBatcherConfig) -> None: """配置热更新。""" @@ -198,7 +200,9 @@ def _pop_locked(self, key: tuple[str, int]) -> list[BufferedMessage] | None: def _on_timer(self, key: tuple[str, int]) -> None: # call_later 在事件循环里同步触发,调度到 task 里 await - asyncio.create_task(self._flush_key(key)) + task = asyncio.create_task(self._flush_key(key)) + self._pending_tasks.add(task) + task.add_done_callback(self._pending_tasks.discard) async def _flush_key(self, key: tuple[str, int]) -> None: async with self._lock: @@ -227,14 +231,24 @@ async def _invoke_callback(self, items: list[BufferedMessage]) -> None: ) async def flush_all(self) -> None: - """立即 flush 所有 buckets(用于关停)。""" + """立即 flush 所有 buckets(用于关停)。 + + 会等待 timer 触发但尚未完成的 flush task 全部结束,避免关机漏发。 + """ async with self._lock: keys = list(self._buckets.keys()) - if not keys: - return - logger.info("[MessageBatcher] flush_all: pending_buckets=%s", len(keys)) - for key in keys: - await self._flush_key(key) + if keys: + logger.info("[MessageBatcher] flush_all: pending_buckets=%s", len(keys)) + for key in keys: + await self._flush_key(key) + # 等待 timer 已触发、callback 仍在跑的孤儿 task 收尾 + pending = [t for t in self._pending_tasks if not t.done()] + if pending: + logger.info( + "[MessageBatcher] flush_all: 等待 %s 个 in-flight flush task", + len(pending), + ) + await asyncio.gather(*pending, return_exceptions=True) def snapshot(self) -> dict[str, Any]: """返回当前 buckets 状态的非阻塞快照(供 Runtime API / WebUI 展示)。""" diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index c89f7c1d..31a58c10 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -233,3 +233,44 @@ async def bad_callback(items: list[BufferedMessage]) -> None: await batcher.submit(_make_item(text="b")) await asyncio.sleep(0.2) assert calls == [1, 1] + + +@pytest.mark.asyncio +async def test_timer_task_strong_reference_survives_gc() -> None: + """timer 触发后创建的 flush task 必须被强引用,避免被 GC 回收。 + + asyncio 文档明确警告 ``create_task`` 返回值若不被保留,可能在执行前被 GC。 + """ + import gc + + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.05, strategy="extend") + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(text="x")) + # 在 timer 触发后但 callback 未必完成时强制 GC + await asyncio.sleep(0.06) + gc.collect() + await asyncio.wait_for(rec.event.wait(), timeout=1.0) + assert len(rec.batches) == 1 + + +@pytest.mark.asyncio +async def test_flush_all_awaits_in_flight_tasks() -> None: + """flush_all 应等待 timer 触发但 callback 仍在执行的 task 收尾。""" + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.05) + finished: list[bool] = [] + started = asyncio.Event() + + async def slow_callback(items: list[BufferedMessage]) -> None: + started.set() + await asyncio.sleep(0.15) + finished.append(True) + + batcher = MessageBatcher(cfg, slow_callback) + await batcher.submit(_make_item(text="x")) + # 等 timer 触发并进入 callback + await asyncio.wait_for(started.wait(), timeout=1.0) + # callback 仍在 sleep 中调 flush_all 应阻塞直到完成 + await batcher.flush_all() + assert finished == [True] From e3f804b2d2c5207d78d3858ce63e75484ab3ca0b Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 16:24:51 +0800 Subject: [PATCH 04/34] feat(batcher): allow max_window_seconds=0 to disable hard cap When max_window_seconds is set to 0 the timer hard cap is disabled entirely, so the batcher only flushes when window_seconds elapses without new messages or when max_messages_per_batch is hit. Useful when latency does not matter and you want to merge as much as possible ("sender keeps typing, keep waiting"). - domain_parsers no longer clamps max_window_seconds up to window_seconds when it is 0; clamping only applies when both are positive. - MessageBatcher.submit treats max_window_seconds <= 0 as unlimited. - Docs (configuration.md, message-batching.md, config.toml.example) and one regression test cover the new behavior. --- config.toml.example | 4 ++-- docs/configuration.md | 2 +- docs/message-batching.md | 2 +- src/Undefined/config/domain_parsers.py | 5 ++++- src/Undefined/services/message_batcher.py | 13 ++++++++---- tests/test_message_batcher.py | 24 +++++++++++++++++++++++ 6 files changed, 41 insertions(+), 9 deletions(-) diff --git a/config.toml.example b/config.toml.example index 1fff7823..f47ea2ba 100644 --- a/config.toml.example +++ b/config.toml.example @@ -765,8 +765,8 @@ window_seconds = 5.0 # zh: 等待策略:extend(每来一条新消息重置 timer,"打字就继续等")/ fixed(首条到达起定时,期间到达的消息只合并不重置)。 # en: Wait strategy: extend (reset timer on each new message; keeps waiting while the user types) / fixed (timer fixed at the first message; new arrivals only merge but do not reset). strategy = "extend" -# zh: extend 模式下的硬顶(秒),防止用户一直打字导致永远不发车。 -# en: Hard cap in seconds for extend mode, prevents the timer from being reset forever. +# zh: extend 模式下的硬顶(秒),防止用户一直打字导致永远不发车;0 = 不限制(仅靠 window_seconds + max_messages_per_batch 触发发车)。 +# en: Hard cap in seconds for extend mode, prevents the timer from being reset forever; 0 = no limit (rely on window_seconds + max_messages_per_batch). max_window_seconds = 30.0 # zh: 单批最多消息条数,超出立即发车;0 = 不限制。 # en: Max messages per batch; exceeding triggers immediate dispatch. 0 = no limit. diff --git a/docs/configuration.md b/docs/configuration.md index 23dc42f6..4d909a49 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -460,7 +460,7 @@ Prompt caching 补充: | `enabled` | `true` | 总开关;关闭后行为退化为旧版的逐条独立 AI 调用 | | `window_seconds` | `5.0` | 同 sender 合并的等待窗口(秒) | | `strategy` | `"extend"` | `extend` = 新消息重置窗口;`fixed` = 从首条算起的固定窗口 | -| `max_window_seconds` | `30.0` | 从首条算起最长等待,硬顶 `extend` 不被无限延长 | +| `max_window_seconds` | `30.0` | 从首条算起最长等待,硬顶 `extend` 不被无限延长;`0` 表示不限制(仅靠 `window_seconds` + `max_messages_per_batch` 触发发车) | | `max_messages_per_batch` | `0` | 单批最多条数;达到立即发车,`0` = 不限 | | `group_enabled` | `true` | 群聊是否启用合并 | | `private_enabled` | `true` | 私聊是否启用合并 | diff --git a/docs/message-batching.md b/docs/message-batching.md index 7f6c77ec..50488d6f 100644 --- a/docs/message-batching.md +++ b/docs/message-batching.md @@ -10,7 +10,7 @@ - **窗口策略**: - `extend`(默认):每条新消息重置定时器,并以 `max_window_seconds` 作为硬顶。 - `fixed`:定时器从首条算起;窗口期结束统一发车。 -- **硬顶**:`max_window_seconds` 防止极端情况下窗口被无限延长;`max_messages_per_batch` 达到立即发车(`0` = 不限)。 +- **硬顶**:`max_window_seconds` 防止极端情况下窗口被无限延长(`0` = 不限制,仅靠 `window_seconds` + `max_messages_per_batch` 触发发车);`max_messages_per_batch` 达到立即发车(`0` = 不限)。 - **历史记录不变**:每条消息照旧由 `handlers.py` 写入 history;batcher 只决定何时调用 AI。 - **拍一拍永远旁路**:拍一拍触发不进入 batcher,直接立即处理。 - **群聊 @bot 规则**: diff --git a/src/Undefined/config/domain_parsers.py b/src/Undefined/config/domain_parsers.py index 48ca2624..81a1c603 100644 --- a/src/Undefined/config/domain_parsers.py +++ b/src/Undefined/config/domain_parsers.py @@ -190,8 +190,11 @@ def _parse_message_batcher_config(data: dict[str, Any]) -> MessageBatcherConfig: window_seconds = _coerce_float(section.get("window_seconds"), 5.0) if window_seconds < 0: window_seconds = 0.0 + # max_window_seconds <= 0 视为不限制(仅靠 window_seconds + max_messages_per_batch 触发) max_window_seconds = _coerce_float(section.get("max_window_seconds"), 30.0) - if max_window_seconds < window_seconds: + if max_window_seconds < 0: + max_window_seconds = 0.0 + if 0 < max_window_seconds < window_seconds: max_window_seconds = window_seconds max_messages = _coerce_int(section.get("max_messages_per_batch"), 0) if max_messages < 0: diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index b2605372..126b83cd 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -134,7 +134,11 @@ async def submit(self, item: BufferedMessage) -> None: self._cancel_timer(state) elapsed = now_mono - state.first_arrival_monotonic - remaining_max = cfg.max_window_seconds - elapsed + # max_window_seconds <= 0 表示不限硬顶 + unlimited_window = cfg.max_window_seconds <= 0 + remaining_max = ( + float("inf") if unlimited_window else cfg.max_window_seconds - elapsed + ) should_flush = False if ( @@ -149,7 +153,7 @@ async def submit(self, item: BufferedMessage) -> None: item.sender_id, ) should_flush = True - elif remaining_max <= 0: + elif not unlimited_window and remaining_max <= 0: logger.info( "[MessageBatcher] 已超 max_window_seconds 硬顶 立即发车: " "scope=%s sender=%s elapsed=%.2fs", @@ -167,8 +171,9 @@ async def submit(self, item: BufferedMessage) -> None: delay = max(0.0, target - now_mono) else: # extend delay = cfg.window_seconds - # 不超过 max_window 硬顶 - delay = min(delay, remaining_max) + # 不超过 max_window 硬顶(unlimited_window 时跳过该上界) + if not unlimited_window: + delay = min(delay, remaining_max) loop = asyncio.get_running_loop() state.timer_handle = loop.call_later( max(0.0, delay), self._on_timer, key diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index 31a58c10..c1568e3e 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -274,3 +274,27 @@ async def slow_callback(items: list[BufferedMessage]) -> None: # callback 仍在 sleep 中调 flush_all 应阻塞直到完成 await batcher.flush_all() assert finished == [True] + + +@pytest.mark.asyncio +async def test_max_window_seconds_zero_means_unlimited() -> None: + """max_window_seconds=0 表示不限制硬顶,只要 extend 持续刷新就一直等。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.05, + strategy="extend", + max_window_seconds=0.0, + ) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + # 连续 6 次提交,每次间隔 30ms(< window_seconds),如果 max_window 仍生效会被强行 flush + for i in range(6): + await batcher.submit(_make_item(text=f"m{i}")) + await asyncio.sleep(0.03) + # 此时距首条已 ~180ms(远超旧 max_window 的虚假"硬顶",但 0=不限),仍应在 buffer 中 + assert rec.batches == [] + # 停止追加,让 timer 自然到期 + await asyncio.sleep(0.1) + assert len(rec.batches) == 1 + assert len(rec.batches[0]) == 6 From 78ce050a68d10f66258c2a025127dcfde173256a Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 17:03:47 +0800 Subject: [PATCH 05/34] feat(batcher): add speculative pre-fire with cancellable in-flight LLM - Dual-timer state machine in MessageBatcher: T1=window_seconds (batch end), T2=pre_send_seconds/` and use `config.json + handler.py`. Slash commands have higher priority; when a command is dispatched, automatic pipelines and AI auto-reply are skipped. Command inputs and command outputs should be recorded in message history so later AI turns can see the result. For non-command messages, all pipelines detect in parallel and all matches process in parallel before AI auto-reply. Outputs should go through `MessageSender`, which writes history and automatically registers local CQ media or uploaded files as session attachment UIDs. ### Same-sender short-window message batching -Consecutive messages from the same sender within `[message_batcher].window_seconds` are merged into a single AI invocation, so the AI sees the whole batch as `` blocks and decides per-intent (independent request vs. correction/interruption). Pokes always bypass; an at-bot message arriving while a buffer already exists is processed individually so it is not blocked; a first at-bot message that opens the buffer routes the eventual batch through the mention lane. History writes remain unchanged. Configure under `[message_batcher]` (`enabled`, `window_seconds`, `strategy`, `max_window_seconds`, `max_messages_per_batch`, `group_enabled`, `private_enabled`); details in [docs/message-batching.md](docs/message-batching.md). +Consecutive messages from the same sender within `[message_batcher].window_seconds` are merged into a single AI invocation, so the AI sees the whole batch as `` blocks and decides per-intent (independent request vs. correction/interruption). Pokes always bypass; an at-bot message arriving while a buffer already exists is processed individually so it is not blocked; a first at-bot message that opens the buffer routes the eventual batch through the mention lane. History writes remain unchanged. Configure under `[message_batcher]` (`enabled`, `window_seconds`, `strategy`, `max_window_seconds`, `max_messages_per_batch`, `group_enabled`, `private_enabled`, `pre_send_seconds`, `allow_cancel_after_send`); details in [docs/message-batching.md](docs/message-batching.md). Optional speculative pre-fire (`0 < pre_send_seconds < window_seconds`) dispatches the current batch to the LLM early once the user has been silent for `pre_send_seconds`; new messages can cancel the in-flight call as long as it has not yet sent any reply. ### User identification in prompts The system prompt now includes a rule: **recognize and address users by their QQ ID (`sender_id`)** because nicknames can change. When needing to address a user, use the latest nickname obtained via `group.get_member_info(brief=true)`. Observations recorded in cognitive memory should always include the QQ ID, e.g., “QQ号12345678(昵称张三)做了某事”. diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a1bbd16..768a0b36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## Unreleased - 新增同 sender 短时消息合并:同一发送者在 `[message_batcher].window_seconds`(默认 5s)内连续发送的多条消息会合并到同一轮 AI 调用,AI 一次性处理整批意图,避免"画猫"→"改成狗"等场景出现重复回复或行为打架。配置项见 `[message_batcher]`,支持 `extend`/`fixed` 两种策略与 `max_window_seconds`、`max_messages_per_batch` 硬顶;拍一拍永远旁路立即处理,群聊已有 buffer 时新到的 @bot 也会单独立即处理;启用合并后历史记录写入逻辑保持不变。详见 [docs/message-batching.md](docs/message-batching.md)。 +- 消息合并新增**投机预发送(speculative pre-fire)**:双计时器状态机 `T2 = pre_send_seconds < T1 = window_seconds`,静默到 T2 先把当前 batch 提前发给 LLM 抢时间,T1 才正式结束 batch。新消息在 inflight 尚未发出任何回复时可取消该 LLM 调用并合并入下一轮;通过 `[message_batcher].allow_cancel_after_send` 控制 inflight 已发消息后是否仍允许取消(默认 false 安全)。`pre_send_seconds = 0` 退化为旧行为。 ## v3.3.3 命令推断、自动处理管线与统一附件上下文 diff --git a/CLAUDE.md b/CLAUDE.md index 1a1b7900..c9a7dd8d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -116,7 +116,7 @@ Management / Runtime 请求 → webui/app.py 或 api/app.py → routes/* ### 同 sender 短时消息合并(MessageBatcher) -同一 sender 在 `[message_batcher].window_seconds` 内连续发送的多条消息会合并到同一轮 AI 调用,AI 一次性看到全部 `` 块自行识别"独立请求/修正/打断"。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也单独立即处理;首条 @bot 进入 buffer 时整批走 mention 队列。`enabled=false` 行为退化回旧版。详见 [docs/message-batching.md](docs/message-batching.md)。 +同一 sender 在 `[message_batcher].window_seconds` 内连续发送的多条消息会合并到同一轮 AI 调用,AI 一次性看到全部 `` 块自行识别“独立请求/修正/打断”。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也单独立即处理;首条 @bot 进入 buffer 时整批走 mention 队列。可选开启投机预发送 `pre_send_seconds < window_seconds`:静默到该阈值先把 batch 提前发给 LLM 抢时间,新消息在 inflight 未发出任何消息时可取消该调用。`enabled=false` 行为退化回旧版。详见 [docs/message-batching.md](docs/message-batching.md)。 ### 存储与数据 diff --git a/README.md b/README.md index 95cd29ea..60fb5831 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ - **arXiv 论文提取与搜索**:自动检测消息中的 arXiv 链接/标识并发送论文信息与 PDF;同时提供 `arxiv_paper` 发送工具和 `arxiv_search` 检索工具。 - **GitHub 仓库卡片**:自动检测 GitHub 仓库链接或 `owner/repo` 仓库 ID,获取 public 仓库信息并发送简洁图片卡片,展示头像、简介、stars、forks、issues、contributors 等概览。 - **自动处理管线**:Bilibili、arXiv、GitHub 等自动提取统一运行在 `skills/auto_pipeline` 中,斜杠命令优先级更高;命令输入/输出会写入历史,非命令消息会并行检测和处理命中管线,结果通过统一发送层写入历史并登记附件 UID 后再进入 AI 回复。远程大附件超过 `[attachments].remote_download_max_size_mb` 时只登记 URL 引用,避免无界下载和缓存膨胀。 -- **同 sender 短时消息合并**:同一发送者在 `[message_batcher].window_seconds`(默认 5s)内连续发送的多条消息会被合并到同一轮 AI 调用,AI 一次性看到全部 `` 块自行识别"独立请求/修正/打断",避免老版本"画猫→改成狗"造成的重复触发与回复打架。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理;首条 @bot 进入 buffer 时整批走 mention 队列。详见 [docs/message-batching.md](docs/message-batching.md)。 +- **同 sender 短时消息合并**:同一发送者在 `[message_batcher].window_seconds`(默认 5s)内连续发送的多条消息会被合并到同一轮 AI 调用,AI 一次性看到全部 `` 块自行识别“独立请求/修正/打断”,避免老版本“画猫→改成狗”造成的重复触发与回复打架。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理;首条 @bot 进入 buffer 时整批走 mention 队列。可选开启投机预发送 (`pre_send_seconds`) :静默到该阈值先把 batch 提前发给 LLM 抢时间,新消息在 inflight 未发出任何消息时可取消该调用。详见 [docs/message-batching.md](docs/message-batching.md)。 - **思维链支持**:支持开启思维链,提升复杂逻辑推理能力。 - **高并发架构**:基于 `asyncio` 全异步设计,支持多队列消息处理与工具并发执行,轻松应对高并发场景。 - **异步安全 I/O**:统一 IO 层通过线程池 + 跨平台文件锁(Linux/macOS `flock`,Windows `msvcrt`)+ 原子写入(`os.replace`)保证并发写入不损坏、且不阻塞主事件循环。 diff --git a/config.toml.example b/config.toml.example index f47ea2ba..1315ad59 100644 --- a/config.toml.example +++ b/config.toml.example @@ -780,6 +780,12 @@ private_enabled = true # zh: 收到斜杠命令时是否顺便把当前 buffer 一起发出(默认 false:命令独立执行,buffer 继续等到时间到再发)。 # en: When a slash command arrives, also flush the current buffer to the AI (default false: commands are executed independently and the buffer keeps waiting). flush_on_command = false +# zh: 投机预发送阈值(秒)。0 < pre_send_seconds < window_seconds 时启用:静默到该阈值就提前把当前 batch 发给 LLM 抢时间,但 batch 不结束;T1(window_seconds)才正式结束。0 或 >= window_seconds 视为关闭。 +# en: Speculative pre-fire threshold in seconds. Enabled when 0 < pre_send_seconds < window_seconds: once the user has been silent that long, the current batch is dispatched to the LLM early to save latency, while the batch itself only ends at window_seconds. 0 or >= window_seconds disables speculation. +pre_send_seconds = 0.0 +# zh: 投机调用已经向用户发出过任何消息后,新消息到达是否仍然取消该 inflight 调用。默认 false(安全:不取消,新消息开新 batch),开启后可能造成重复发送。 +# en: Whether to cancel an in-flight speculative LLM call even when it has already sent at least one message to the user. Default false (safe: do not cancel; the new message starts a new batch). Enabling this may cause duplicate replies. +allow_cancel_after_send = false # zh: 历史记录配置。 # en: History settings. diff --git a/docs/configuration.md b/docs/configuration.md index 4d909a49..b9d9fa8b 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -465,6 +465,8 @@ Prompt caching 补充: | `group_enabled` | `true` | 群聊是否启用合并 | | `private_enabled` | `true` | 私聊是否启用合并 | | `flush_on_command` | `true` | 命中斜杠命令时是否 flush 该 sender 的 buffer(保留字段,当前未消费) | +| `pre_send_seconds` | `0.0` | 投机预发送阈值(秒)。`0 < pre_send_seconds < window_seconds` 时启用:静默到该阈值先把当前 batch 提前发给 LLM 抢时间(speculative pre-fire),但 batch 仍要等到 `window_seconds` 才正式结束;新消息在投机期间到达且 inflight 调用尚未发出消息时会取消 inflight 并把消息合并入下一轮调用。`0` 或 `>= window_seconds` 视为关闭 | +| `allow_cancel_after_send` | `false` | 投机调用已向用户发出消息后是否仍允许新消息取消该 inflight。默认 `false`(安全:不取消,新消息开新 batch);启用后可能造成重复发送 | 启用后,同一发送者在窗口内连续发送的多条消息会合并到同一轮 AI 调用,`` 块按时间顺序排列,AI 一次性处理整批意图。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理(不打断 buffer);首条 @bot 进入 buffer 时整批发车走 `add_group_mention_request`。配置支持热更新,关停时会 `flush_all` 避免丢消息。详细行为矩阵与设计要点见 [docs/message-batching.md](message-batching.md)。 diff --git a/docs/message-batching.md b/docs/message-batching.md index 50488d6f..318776f1 100644 --- a/docs/message-batching.md +++ b/docs/message-batching.md @@ -51,6 +51,11 @@ group_enabled = true private_enabled = true # 命中斜杠命令时是否 flush 当前 sender 的 buffer(保留字段,当前未消费) flush_on_command = true +# 投机预发送阈值(秒)。0 < pre_send_seconds < window_seconds 时启用 "speculative pre-fire": +# 静默到该阈值就先把当前 batch 提前发给 LLM 抢时间,但 batch 仍要等到 window_seconds 才结束 +pre_send_seconds = 0.0 +# 投机调用已经向用户发出过任何消息后,新消息到达是否仍然取消该 inflight 调用(默认 false:不取消) +allow_cancel_after_send = false ``` 支持热更新:修改后通过 WebUI 或 SIGHUP 重新加载配置即可生效,正在排队的桶会沿用新配置参数。 @@ -81,3 +86,43 @@ flush_on_command = true - 热更新:[src/Undefined/config/hot_reload.py](src/Undefined/config/hot_reload.py) - 提示词:[res/prompts/undefined.xml](res/prompts/undefined.xml)、[res/prompts/undefined_nagaagent.xml](res/prompts/undefined_nagaagent.xml) - 测试:[tests/test_message_batcher.py](tests/test_message_batcher.py) + +## 投机预发送(Speculative Pre-fire) + +> 目标:当用户处于"打字停顿"状态时,让 LLM 抢先开始处理,而不必等到完整的 `window_seconds` 静默才开始。 + +### 双计时器状态机 + +每个 `(scope, sender_id)` 桶维护两条独立的"静默计时器": + +- **T1 = `window_seconds`** —— 打字静默阈值,决定 batch 何时结束。 +- **T2 = `pre_send_seconds`** —— 投机预发送阈值,要求严格 `0 < T2 < T1`。 + 达到 T2 时把当前 batch 提前发给 LLM("speculative pre-fire"),但 batch **不结束**,T1 才正式结束。 + +桶状态: + +| Phase | 含义 | +|---|---| +| `TYPING` | 等待 T1/T2 静默 | +| `SPECULATING` | T2 已触发,inflight LLM 在跑;T1 仍未到 | +| `FINALIZING` | T1 已到,等 inflight(若有)自然结束 | + +### 新消息到来时的决策 + +- **TYPING**:append 到 items,重置 T1/T2。 +- **SPECULATING**: + - 检查 inflight 是否已经向用户发出过任何消息(来自 `RequestContext.get_resource("message_sent_this_turn")`)。 + - inflight **尚未发消息** → 调 `inflight_task.cancel()`,桶回到 `TYPING`,新消息追加进去,重置 T1/T2;inflight 协程在 `RequestContext` 里清理后退出,**不写入回复历史**。 + - inflight **已经发过消息** 且 `allow_cancel_after_send=False`(默认安全) → 不取消 inflight,**新消息开新 batch**(旧桶在 inflight 自然结束后清理)。 + - inflight **已经发过消息** 且 `allow_cancel_after_send=True` → 仍取消,可能造成重复发送,仅极端场景启用。 + +### 防竞态设计 + +- 所有桶状态变更在 `MessageBatcher._lock` 内完成;`flush_callback` 与 `task.cancel()` 在锁外发起。 +- timer 触发后由 `asyncio.create_task` 创建 flush 协程,强引用挂到 `_pending_tasks: set[Task]`,`task.add_done_callback(self._pending_tasks.discard)` 清理(asyncio 文档要求避免被 GC)。 +- `flush_all()` 在关停时遍历所有桶执行等价 T1 路径,并 `await` 所有未完成的 flush task。 +- coordinator 在 `execute_reply` 入口调用 `register_inflight(scope, sender_id, task, ctx)`,在 `finally` 调 `unregister_inflight(...)`;`asyncio.CancelledError` 被识别为 "投机抢占",仅记录信息日志且不重试。 + +### 兼容回退 + +`pre_send_seconds <= 0` 或 `>= window_seconds` 时投机模式自动关闭,行为退化为旧版"T1 静默到期才发车"。`enabled=false` 时整体退化为逐条触发。 diff --git a/src/Undefined/config/domain_parsers.py b/src/Undefined/config/domain_parsers.py index 81a1c603..abac10bb 100644 --- a/src/Undefined/config/domain_parsers.py +++ b/src/Undefined/config/domain_parsers.py @@ -199,6 +199,12 @@ def _parse_message_batcher_config(data: dict[str, Any]) -> MessageBatcherConfig: max_messages = _coerce_int(section.get("max_messages_per_batch"), 0) if max_messages < 0: max_messages = 0 + pre_send_seconds = _coerce_float(section.get("pre_send_seconds"), 0.0) + if pre_send_seconds < 0: + pre_send_seconds = 0.0 + # pre_send 必须严格小于 window 才有意义;不满足则直接关闭投机 + if pre_send_seconds >= window_seconds: + pre_send_seconds = 0.0 return MessageBatcherConfig( enabled=_coerce_bool(section.get("enabled"), True), window_seconds=window_seconds, @@ -208,6 +214,10 @@ def _parse_message_batcher_config(data: dict[str, Any]) -> MessageBatcherConfig: group_enabled=_coerce_bool(section.get("group_enabled"), True), private_enabled=_coerce_bool(section.get("private_enabled"), True), flush_on_command=_coerce_bool(section.get("flush_on_command"), False), + pre_send_seconds=pre_send_seconds, + allow_cancel_after_send=_coerce_bool( + section.get("allow_cancel_after_send"), False + ), ) diff --git a/src/Undefined/config/models.py b/src/Undefined/config/models.py index 66fefadc..4d330a96 100644 --- a/src/Undefined/config/models.py +++ b/src/Undefined/config/models.py @@ -365,6 +365,14 @@ class MessageBatcherConfig: group_enabled: bool = True private_enabled: bool = True flush_on_command: bool = False + # 投机预发送:在 window_seconds 静默达到 pre_send_seconds(< window_seconds)时, + # 提前把当前批次发给 LLM 抢时间;若 LLM 出结果前又来新消息,则取消该投机调用并重新计时。 + # 设为 0 或 >= window_seconds 时关闭投机模式(行为退化为旧版:仅 window_seconds 触发)。 + pre_send_seconds: float = 0.0 + # 投机调用已发出过消息后再来新消息时是否仍取消该调用: + # false(默认安全)— LLM 已经发出消息就不再取消,新消息开新 batch; + # true — 仍取消(可能导致重复发送,仅在极端场景启用)。 + allow_cancel_after_send: bool = False @dataclass diff --git a/src/Undefined/services/ai_coordinator.py b/src/Undefined/services/ai_coordinator.py index e77a1656..4f163c01 100644 --- a/src/Undefined/services/ai_coordinator.py +++ b/src/Undefined/services/ai_coordinator.py @@ -1,3 +1,4 @@ +import asyncio import logging import time from datetime import datetime @@ -291,6 +292,8 @@ async def _execute_auto_reply(self, request: dict[str, Any]) -> None: group_name = str(request.get("group_name") or "未知群聊") full_question = request["full_question"] trigger_message_id = request.get("trigger_message_id") + # 用于向 batcher 注册 inflight 任务(仅当本请求源自合并桶时生效) + batcher_scope: str | None = make_scope(group_id=group_id) if group_id else None # 创建请求上下文 async with RequestContext( @@ -366,27 +369,50 @@ async def send_like_cb(uid: int, times: int = 1) -> None: ) try: - await self.ai.ask( - full_question, - send_message_callback=send_msg_cb, - get_recent_messages_callback=get_recent_cb, - get_image_url_callback=self.onebot.get_image, - get_forward_msg_callback=self.onebot.get_forward_msg, - send_like_callback=send_like_cb, - sender=self.sender, - history_manager=self.history_manager, - onebot_client=self.onebot, - scheduler=self.scheduler, - extra_context={ - "render_html_to_image": render_html_to_image, - "render_markdown_to_html": render_markdown_to_html, - "group_id": group_id, - "user_id": sender_id, - "is_at_bot": bool(request.get("is_at_bot", False)), - "sender_name": sender_name, - "group_name": group_name, - }, + # 把当前 task 注册到 batcher,使其有能力在新消息到达时取消本次 LLM 调用 + batcher = getattr(self, "_batcher", None) + current_task = asyncio.current_task() + if ( + batcher is not None + and batcher_scope is not None + and current_task is not None + ): + batcher.register_inflight( + batcher_scope, sender_id, current_task, ctx + ) + try: + await self.ai.ask( + full_question, + send_message_callback=send_msg_cb, + get_recent_messages_callback=get_recent_cb, + get_image_url_callback=self.onebot.get_image, + get_forward_msg_callback=self.onebot.get_forward_msg, + send_like_callback=send_like_cb, + sender=self.sender, + history_manager=self.history_manager, + onebot_client=self.onebot, + scheduler=self.scheduler, + extra_context={ + "render_html_to_image": render_html_to_image, + "render_markdown_to_html": render_markdown_to_html, + "group_id": group_id, + "user_id": sender_id, + "is_at_bot": bool(request.get("is_at_bot", False)), + "sender_name": sender_name, + "group_name": group_name, + }, + ) + finally: + if batcher is not None and batcher_scope is not None: + batcher.unregister_inflight(batcher_scope, sender_id) + except asyncio.CancelledError: + # 投机预发送被新消息抢占取消:不写错误日志、不重试 + logger.info( + "[自动回复] 任务被取消(投机抢占): group=%s sender=%s", + group_id, + sender_id, ) + raise except Exception: logger.exception("自动回复执行出错") raise @@ -396,6 +422,7 @@ async def _execute_private_reply(self, request: dict[str, Any]) -> None: sender_name = str(request.get("sender_name") or "未知用户") full_question = request["full_question"] trigger_message_id = request.get("trigger_message_id") + batcher_scope: str | None = make_scope(user_id=user_id) # 创建请求上下文 async with RequestContext( @@ -466,26 +493,38 @@ async def send_private_cb( ) try: - result = await self.ai.ask( - full_question, - send_message_callback=send_msg_cb, - get_recent_messages_callback=get_recent_cb, - get_image_url_callback=self.onebot.get_image, - get_forward_msg_callback=self.onebot.get_forward_msg, - send_like_callback=send_like_cb, - sender=self.sender, - history_manager=self.history_manager, - onebot_client=self.onebot, - scheduler=self.scheduler, - extra_context={ - "render_html_to_image": render_html_to_image, - "render_markdown_to_html": render_markdown_to_html, - "user_id": user_id, - "is_private_chat": True, - "sender_name": sender_name, - "selected_model_name": request.get("selected_model_name"), - }, - ) + batcher = getattr(self, "_batcher", None) + current_task = asyncio.current_task() + if ( + batcher is not None + and batcher_scope is not None + and current_task is not None + ): + batcher.register_inflight(batcher_scope, user_id, current_task, ctx) + try: + result = await self.ai.ask( + full_question, + send_message_callback=send_msg_cb, + get_recent_messages_callback=get_recent_cb, + get_image_url_callback=self.onebot.get_image, + get_forward_msg_callback=self.onebot.get_forward_msg, + send_like_callback=send_like_cb, + sender=self.sender, + history_manager=self.history_manager, + onebot_client=self.onebot, + scheduler=self.scheduler, + extra_context={ + "render_html_to_image": render_html_to_image, + "render_markdown_to_html": render_markdown_to_html, + "user_id": user_id, + "is_private_chat": True, + "sender_name": sender_name, + "selected_model_name": request.get("selected_model_name"), + }, + ) + finally: + if batcher is not None and batcher_scope is not None: + batcher.unregister_inflight(batcher_scope, user_id) if result: scope_key = build_attachment_scope( user_id=user_id, @@ -508,6 +547,9 @@ async def send_private_cb( target_type="private", target_id=user_id, ) + except asyncio.CancelledError: + logger.info("[私聊回复] 任务被取消(投机抢占): user=%s", user_id) + raise except Exception: logger.exception("私聊回复执行出错") raise diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index 126b83cd..b6d8ed9e 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -1,20 +1,37 @@ """同 sender 短时多消息合并器(MessageBatcher)。 -将同一 sender 在 ``window_seconds`` 内连续发送的消息合并到同一轮 AI 触发, -避免多次独立调用 AI 导致重复或行为打架。 - -调用约定: -- 调用方先按业务规则决定一条消息是否要进 batcher(例如拍一拍、batch 内 @bot - 立刻处理等场景应当旁路),需要合并的消息构造为 :class:`BufferedMessage` - 通过 :meth:`MessageBatcher.submit` 提交。 -- 当窗口到期或触发硬顶(条数 / ``max_window_seconds``)时,batcher 调用 - ``flush_callback(items)``,调用方负责拼装 prompt 并入队。 -- 关停时调用 :meth:`MessageBatcher.flush_all` 把所有 buckets 立刻 flush。 +核心目标:把同一个 sender 在短时间内连续发出的消息合并到同一轮 AI 调用, +让模型一次看到全部 ```` 块自行决定 "独立请求 / 修正 / 打断", +避免 N 条独立 LLM 调用造成的重复回复或行为打架。 + +时序:每个 (scope, sender_id) 桶内有两条独立的"静默计时器": + +- ``T1 = window_seconds`` —— "打字静默阈值"。静默达到 T1 视为用户写完, + 这一批 batch 结束。 +- ``T2 = pre_send_seconds`` —— "投机预发送阈值",要求严格小于 T1。 + 静默到 T2 时**先把当前 batch 提前发给 LLM 抢时间**(speculative pre-fire), + 但 batch 尚未结束;T1 才决定结束。 + +新消息到来: + +- 若桶处于 ``TYPING``(尚未 pre-fire):append 后重置 T1/T2。 +- 若桶处于 ``SPECULATING``(已 pre-fire,inflight 在跑): + - 检查 inflight 是否已经 "向用户发出过任何消息" + (来自 ``RequestContext.get_resource("message_sent_this_turn")``)。 + - inflight 尚未发消息 → 调 ``inflight_task.cancel()``,桶回到 TYPING; + 新消息照常 append 到原有 items 后面,T1/T2 重置。 + - inflight 已经发过消息且 ``allow_cancel_after_send=False``(默认安全)→ + 保留旧 batch 让其自然走完,新消息开新 batch(即清空当前桶后立即重新作为首条入桶)。 + - inflight 已经发过消息但开关 = True → 仍 cancel(可能造成重复发送,仅极端场景)。 + +兼容回退:当 ``pre_send_seconds <= 0`` 或 ``>= window_seconds`` 时投机模式关闭, +退化为旧版 "T1 静默到期才发车" 的行为。 """ from __future__ import annotations import asyncio +import enum import logging import time from dataclasses import dataclass, field @@ -50,13 +67,46 @@ class BufferedMessage: FlushCallback = Callable[[list[BufferedMessage]], Awaitable[None]] +"""``flush_callback(items)``:batcher 决定 fire 时调用,调用方负责拼装 prompt 并入队执行。 + +调用约定: +- batcher 的 ``flush_callback`` **不应** 立即 await LLM 的完成, + 而是把请求扔进 QueueManager 后立即返回,真正的 LLM 任务由 coordinator 在 ``execute_reply`` + 开头调用 :meth:`MessageBatcher.register_inflight` 上报。 +- 若需要 batcher 关停时也等待 in-flight 收尾,由 :meth:`MessageBatcher.flush_all` 处理。 +""" + + +class BatchPhase(enum.Enum): + """桶状态机。""" + + TYPING = "typing" # 等待 T1/T2 静默 + SPECULATING = "speculating" # T2 已触发,inflight LLM 在跑;T1 仍未到 + FINALIZING = "finalizing" # T1 已到,等 inflight(若有)自然结束 + + +@dataclass +class _InflightInfo: + """inflight LLM 任务关联信息,由 coordinator 通过 ``register_inflight`` 上报。""" + + task: asyncio.Task[Any] + # ``RequestContext`` 引用,用于判断 ``message_sent_this_turn`` 资源 + request_context: Any = None @dataclass class _BatchState: + """单个 (scope, sender_id) 桶的状态。""" + + phase: BatchPhase = BatchPhase.TYPING items: list[BufferedMessage] = field(default_factory=list) first_arrival_monotonic: float = 0.0 - timer_handle: asyncio.TimerHandle | None = None + # T1 = window_seconds 静默 timer(决定 batch 结束) + t1_handle: asyncio.TimerHandle | None = None + # T2 = pre_send_seconds 静默 timer(决定 pre-fire);投机关闭时为 None + t2_handle: asyncio.TimerHandle | None = None + # SPECULATING 阶段记录 inflight LLM 任务 + inflight: _InflightInfo | None = None def make_scope(*, group_id: int | None = None, user_id: int | None = None) -> str: @@ -68,8 +118,29 @@ def make_scope(*, group_id: int | None = None, user_id: int | None = None) -> st return "unknown" +def _was_message_sent_this_turn(ctx: Any) -> bool: + """判断 inflight RequestContext 是否已经向用户发出过任何消息。 + + 与 ``skills/tools/end/handler.py::_was_message_sent_this_turn`` 同语义; + 这里采用宽松布尔解析。 + """ + if ctx is None: + return False + try: + value = ctx.get_resource("message_sent_this_turn", False) + except Exception: # noqa: BLE001 - ctx 可能已失效 + return False + if isinstance(value, bool): + return value + if isinstance(value, int): + return value != 0 + if isinstance(value, str): + return value.strip().lower() in {"1", "true", "yes", "y", "on"} + return False + + class MessageBatcher: - """同 sender 短时合并器。""" + """同 sender 短时合并器(含 T2 投机预发送)。""" def __init__( self, @@ -80,22 +151,27 @@ def __init__( self._flush_callback = flush_callback self._buckets: dict[tuple[str, int], _BatchState] = {} self._lock = asyncio.Lock() - # 持有 timer 触发后创建的 flush task 强引用,避免 GC(asyncio 文档要求) + # 持有 timer 触发后创建的 flush task 强引用,避免被 GC(asyncio 文档要求) self._pending_tasks: set[asyncio.Task[None]] = set() + # ------------------------------------------------------------------ public + def update_config(self, config: MessageBatcherConfig) -> None: """配置热更新。""" self._config = config logger.info( - "[MessageBatcher] 配置已更新: enabled=%s window=%.2fs strategy=%s " - "max_window=%.2fs max_messages=%s group=%s private=%s", + "[MessageBatcher] 配置已更新: enabled=%s window=%.2fs pre_send=%.2fs " + "strategy=%s max_window=%.2fs max_messages=%s group=%s private=%s " + "allow_cancel_after_send=%s", config.enabled, config.window_seconds, + config.pre_send_seconds, config.strategy, config.max_window_seconds, config.max_messages_per_batch, config.group_enabled, config.private_enabled, + config.allow_cancel_after_send, ) @property @@ -111,36 +187,108 @@ def is_enabled_for(self, *, is_group: bool) -> bool: def has_buffer(self, scope: str, sender_id: int) -> bool: return (scope, sender_id) in self._buckets + @property + def speculative_enabled(self) -> bool: + cfg = self._config + return 0 < cfg.pre_send_seconds < cfg.window_seconds + async def submit(self, item: BufferedMessage) -> None: - """提交一条消息。 + """提交一条消息进入合并桶。 - - 若同 (scope, sender_id) 无 buffer:开新 batch,启动 timer。 - - 若已有 buffer:追加; - - extend 策略 → 重置 timer - - fixed 策略 → 不重置 timer(仅在剩余时间窗内合并) - - 触发 ``max_messages_per_batch`` / ``max_window_seconds`` 时立即发车。 + 新消息到来时的处理依赖当前桶 ``phase``,详见模块 docstring。 """ cfg = self._config key = (item.scope, item.sender_id) - flush_items: list[BufferedMessage] | None = None + # 异步路径里只在锁内修改桶;invoke callback 在锁外执行 + speculative_fire_items: list[BufferedMessage] | None = None + immediate_fire_items: list[BufferedMessage] | None = None async with self._lock: state = self._buckets.get(key) now_mono = time.monotonic() + + # === 阶段 1: 决定本条消息怎么进桶 === if state is None: - state = _BatchState(first_arrival_monotonic=now_mono) + # 全新桶 + state = _BatchState( + phase=BatchPhase.TYPING, + first_arrival_monotonic=now_mono, + ) + self._buckets[key] = state + state.items.append(item) + elif state.phase is BatchPhase.SPECULATING: + # 已 pre-fire,决定是否 cancel inflight + inflight = state.inflight + already_sent = ( + _was_message_sent_this_turn(inflight.request_context) + if inflight is not None + else False + ) + allow_cancel = (not already_sent) or cfg.allow_cancel_after_send + + if inflight is not None and allow_cancel: + logger.info( + "[MessageBatcher] 投机调用被新消息抢占取消: scope=%s sender=%s " + "already_sent=%s allow_cancel_after_send=%s", + item.scope, + item.sender_id, + already_sent, + cfg.allow_cancel_after_send, + ) + inflight.task.cancel() + state.inflight = None + state.phase = BatchPhase.TYPING + # 新消息追加到现有 items 后面 + state.items.append(item) + else: + # 已发过消息且不允许取消:丢弃当前桶,新消息开新桶 + logger.info( + "[MessageBatcher] 投机调用已发出消息且不允许取消,新消息开新 batch: " + "scope=%s sender=%s", + item.scope, + item.sender_id, + ) + self._cancel_t1(state) + self._cancel_t2(state) + state.phase = BatchPhase.FINALIZING + # 旧桶让 inflight 自然结束;从 _buckets pop 以释放 key 给新 batch + self._buckets.pop(key, None) + # 新桶 + state = _BatchState( + phase=BatchPhase.TYPING, + first_arrival_monotonic=now_mono, + ) + self._buckets[key] = state + state.items.append(item) + elif state.phase is BatchPhase.FINALIZING: + # 极少见:T1 已到、inflight 未上报但 task 已不可控;当作新桶处理 + logger.warning( + "[MessageBatcher] 桶处于 FINALIZING 期间收到新消息,开新 batch: " + "scope=%s sender=%s", + item.scope, + item.sender_id, + ) + self._buckets.pop(key, None) + state = _BatchState( + phase=BatchPhase.TYPING, + first_arrival_monotonic=now_mono, + ) self._buckets[key] = state - state.items.append(item) - self._cancel_timer(state) + state.items.append(item) + else: # TYPING:直接 append + state.items.append(item) + + # === 阶段 2: 重置 T1/T2 timer === + self._cancel_t1(state) + self._cancel_t2(state) elapsed = now_mono - state.first_arrival_monotonic - # max_window_seconds <= 0 表示不限硬顶 unlimited_window = cfg.max_window_seconds <= 0 remaining_max = ( float("inf") if unlimited_window else cfg.max_window_seconds - elapsed ) - should_flush = False + # 硬顶:max_messages_per_batch 立即发车(结束 batch) if ( cfg.max_messages_per_batch > 0 and len(state.items) >= cfg.max_messages_per_batch @@ -152,7 +300,7 @@ async def submit(self, item: BufferedMessage) -> None: item.scope, item.sender_id, ) - should_flush = True + immediate_fire_items = self._pop_locked(key) elif not unlimited_window and remaining_max <= 0: logger.info( "[MessageBatcher] 已超 max_window_seconds 硬顶 立即发车: " @@ -161,73 +309,228 @@ async def submit(self, item: BufferedMessage) -> None: item.sender_id, elapsed, ) - should_flush = True - - if should_flush: - flush_items = self._pop_locked(key) + immediate_fire_items = self._pop_locked(key) else: + # T1 delay if cfg.strategy == "fixed": target = state.first_arrival_monotonic + cfg.window_seconds - delay = max(0.0, target - now_mono) + t1_delay = max(0.0, target - now_mono) else: # extend - delay = cfg.window_seconds - # 不超过 max_window 硬顶(unlimited_window 时跳过该上界) + t1_delay = cfg.window_seconds if not unlimited_window: - delay = min(delay, remaining_max) + t1_delay = min(t1_delay, remaining_max) + loop = asyncio.get_running_loop() - state.timer_handle = loop.call_later( - max(0.0, delay), self._on_timer, key - ) - logger.debug( - "[MessageBatcher] 缓冲: scope=%s sender=%s count=%s " - "next_flush_in=%.2fs strategy=%s", - item.scope, - item.sender_id, - len(state.items), - delay, - cfg.strategy, + state.t1_handle = loop.call_later( + max(0.0, t1_delay), self._on_t1_timer, key ) - if flush_items is not None: - await self._invoke_callback(flush_items) + # T2 delay(仅当投机启用,且本桶尚未 pre-fire 时设置) + if self.speculative_enabled and state.phase is BatchPhase.TYPING: + t2_delay = min(cfg.pre_send_seconds, t1_delay) + state.t2_handle = loop.call_later( + max(0.0, t2_delay), self._on_t2_timer, key + ) + logger.debug( + "[MessageBatcher] 缓冲: scope=%s sender=%s count=%s " + "t1=%.2fs t2=%.2fs strategy=%s", + item.scope, + item.sender_id, + len(state.items), + t1_delay, + t2_delay, + cfg.strategy, + ) + else: + logger.debug( + "[MessageBatcher] 缓冲: scope=%s sender=%s count=%s " + "t1=%.2fs strategy=%s phase=%s", + item.scope, + item.sender_id, + len(state.items), + t1_delay, + cfg.strategy, + state.phase.value, + ) + + # 锁外执行 callback + if immediate_fire_items is not None: + await self._invoke_callback(immediate_fire_items) + elif speculative_fire_items is not None: # 此分支当前不会触发,预留扩展 + await self._invoke_callback(speculative_fire_items) + + # ----------------------------------------------------------- inflight API + + def register_inflight( + self, + scope: str, + sender_id: int, + task: asyncio.Task[Any], + request_context: Any = None, + ) -> None: + """coordinator 在 ``execute_reply`` 开头上报 inflight LLM 任务。 - def _cancel_timer(self, state: _BatchState) -> None: - if state.timer_handle is not None: - state.timer_handle.cancel() - state.timer_handle = None + 如果桶不存在或 phase 不是 SPECULATING,则忽略(说明这次 fire 不是投机的)。 + """ + key = (scope, sender_id) + state = self._buckets.get(key) + if state is None: + return + if state.phase is not BatchPhase.SPECULATING: + return + state.inflight = _InflightInfo(task=task, request_context=request_context) + logger.debug( + "[MessageBatcher] 注册 inflight 任务: scope=%s sender=%s", + scope, + sender_id, + ) + + def unregister_inflight(self, scope: str, sender_id: int) -> None: + """coordinator 在 ``execute_reply`` 结束(含异常/取消)时上报。""" + key = (scope, sender_id) + state = self._buckets.get(key) + if state is None: + return + state.inflight = None + # 若 phase 是 SPECULATING 且 T1 已经 fire 过(FINALIZING 才 unregister), + # 此时 inflight 自然结束 → 桶已经在 _on_t1_timer 中弹出,无需再做事 + # 若仍在 SPECULATING(T1 未到):inflight 已结束但仍可能有新消息进来; + # 保持 SPECULATING,新消息会按 SPECULATING 分支处理(已发消息开新 batch / 未发追加) + logger.debug( + "[MessageBatcher] 注销 inflight 任务: scope=%s sender=%s phase=%s", + scope, + sender_id, + state.phase.value, + ) + + # ---------------------------------------------------------------- timers + + def _cancel_t1(self, state: _BatchState) -> None: + if state.t1_handle is not None: + state.t1_handle.cancel() + state.t1_handle = None + + def _cancel_t2(self, state: _BatchState) -> None: + if state.t2_handle is not None: + state.t2_handle.cancel() + state.t2_handle = None def _pop_locked(self, key: tuple[str, int]) -> list[BufferedMessage] | None: state = self._buckets.pop(key, None) if state is None or not state.items: return None - self._cancel_timer(state) + self._cancel_t1(state) + self._cancel_t2(state) return list(state.items) - def _on_timer(self, key: tuple[str, int]) -> None: - # call_later 在事件循环里同步触发,调度到 task 里 await - task = asyncio.create_task(self._flush_key(key)) + def _on_t1_timer(self, key: tuple[str, int]) -> None: + """T1 静默到期:batch 结束。""" + task = asyncio.create_task(self._handle_t1(key)) self._pending_tasks.add(task) task.add_done_callback(self._pending_tasks.discard) - async def _flush_key(self, key: tuple[str, int]) -> None: + def _on_t2_timer(self, key: tuple[str, int]) -> None: + """T2 静默到期:投机预发送(pre-fire),但 batch 不结束。""" + task = asyncio.create_task(self._handle_t2(key)) + self._pending_tasks.add(task) + task.add_done_callback(self._pending_tasks.discard) + + async def _handle_t1(self, key: tuple[str, int]) -> None: + items_to_fire: list[BufferedMessage] | None = None + wait_inflight: asyncio.Task[Any] | None = None + async with self._lock: + state = self._buckets.get(key) + if state is None: + return + self._cancel_t2(state) + if state.phase is BatchPhase.SPECULATING and state.inflight is not None: + # T1 到了但投机调用还在跑:等它完成,桶状态切到 FINALIZING + state.phase = BatchPhase.FINALIZING + wait_inflight = state.inflight.task + # 桶将在 inflight 结束后通过 unregister_inflight 路径或这里 finally 弹出 + else: + # 普通模式或 SPECULATING 但 inflight 已结束:直接 fire + items_to_fire = self._pop_locked(key) + if items_to_fire is not None: + state.phase = BatchPhase.FINALIZING + + if wait_inflight is not None: + try: + await wait_inflight + except asyncio.CancelledError: + # inflight 已被 cancel(极少同时发生),让 cancel 路径自然走 + logger.info( + "[MessageBatcher] T1 等待 inflight 时被取消: scope=%s sender=%s", + key[0], + key[1], + ) + except Exception: + logger.exception( + "[MessageBatcher] T1 等待 inflight 失败: scope=%s sender=%s", + key[0], + key[1], + ) + finally: + # 清桶 + async with self._lock: + self._buckets.pop(key, None) + return + + if items_to_fire is not None: + await self._invoke_callback(items_to_fire, speculative=False) + + async def _handle_t2(self, key: tuple[str, int]) -> None: + speculative_items: list[BufferedMessage] | None = None async with self._lock: - items = self._pop_locked(key) - if items: - await self._invoke_callback(items) + state = self._buckets.get(key) + if state is None: + return + if state.phase is not BatchPhase.TYPING: + return + if not state.items: + return + # 切到 SPECULATING,但**不**清空 items(保留以便后续 T1 也能用 / 抢占回收) + state.phase = BatchPhase.SPECULATING + self._cancel_t2(state) + speculative_items = list(state.items) + logger.info( + "[MessageBatcher] 投机预发送: scope=%s sender=%s count=%s", + key[0], + key[1], + len(speculative_items), + ) - async def _invoke_callback(self, items: list[BufferedMessage]) -> None: + if speculative_items is not None: + await self._invoke_callback(speculative_items, speculative=True) + + async def _invoke_callback( + self, + items: list[BufferedMessage], + *, + speculative: bool = False, + ) -> None: if not items: return first = items[0] logger.info( - "[MessageBatcher] 发车: scope=%s sender=%s count=%s", + "[MessageBatcher] 发车: scope=%s sender=%s count=%s speculative=%s", first.scope, first.sender_id, len(items), + speculative, ) try: await self._flush_callback(items) - except Exception: # noqa: BLE001 - 必须吞掉以保证 batcher 不挂 + except asyncio.CancelledError: + # 投机被新消息取消是预期行为 + logger.info( + "[MessageBatcher] flush_callback 被取消(投机抢占): " + "scope=%s sender=%s speculative=%s", + first.scope, + first.sender_id, + speculative, + ) + except Exception: logger.exception( "[MessageBatcher] flush_callback 异常: scope=%s sender=%s count=%s", first.scope, @@ -235,18 +538,20 @@ async def _invoke_callback(self, items: list[BufferedMessage]) -> None: len(items), ) + # ------------------------------------------------------------ shutdown + async def flush_all(self) -> None: """立即 flush 所有 buckets(用于关停)。 - 会等待 timer 触发但尚未完成的 flush task 全部结束,避免关机漏发。 + 关停时直接对所有桶执行 T1 等价路径并等 inflight 收尾。 """ async with self._lock: keys = list(self._buckets.keys()) if keys: logger.info("[MessageBatcher] flush_all: pending_buckets=%s", len(keys)) for key in keys: - await self._flush_key(key) - # 等待 timer 已触发、callback 仍在跑的孤儿 task 收尾 + await self._handle_t1(key) + # 等 timer 已触发但回调仍在跑的 task pending = [t for t in self._pending_tasks if not t.done()] if pending: logger.info( @@ -255,12 +560,13 @@ async def flush_all(self) -> None: ) await asyncio.gather(*pending, return_exceptions=True) + # ------------------------------------------------------------- snapshot + def snapshot(self) -> dict[str, Any]: """返回当前 buckets 状态的非阻塞快照(供 Runtime API / WebUI 展示)。""" cfg = self._config now_mono = time.monotonic() buckets: list[dict[str, Any]] = [] - # 直接读 dict 副本;不持锁,可能瞬间不一致但够展示 for (scope, sender_id), state in list(self._buckets.items()): buckets.append( { @@ -270,17 +576,22 @@ def snapshot(self) -> dict[str, Any]: "elapsed_seconds": round( max(0.0, now_mono - state.first_arrival_monotonic), 2 ), + "phase": state.phase.value, + "has_inflight": state.inflight is not None, } ) return { "config": { "enabled": cfg.enabled, "window_seconds": cfg.window_seconds, + "pre_send_seconds": cfg.pre_send_seconds, + "speculative_enabled": self.speculative_enabled, "strategy": cfg.strategy, "max_window_seconds": cfg.max_window_seconds, "max_messages_per_batch": cfg.max_messages_per_batch, "group_enabled": cfg.group_enabled, "private_enabled": cfg.private_enabled, + "allow_cancel_after_send": cfg.allow_cancel_after_send, }, "pending_buckets": len(buckets), "buckets": buckets, diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index c1568e3e..b363242b 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -298,3 +298,141 @@ async def test_max_window_seconds_zero_means_unlimited() -> None: await asyncio.sleep(0.1) assert len(rec.batches) == 1 assert len(rec.batches[0]) == 6 + + +# --------------------------------------------------------------------------- +# 投机预发送(speculative pre-fire)测试 +# --------------------------------------------------------------------------- + + +class _FakeRequestContext: + """模拟 RequestContext,仅暴露 get_resource。""" + + def __init__(self) -> None: + self._resources: dict[str, object] = {} + + def set_resource(self, key: str, value: object) -> None: + self._resources[key] = value + + def get_resource(self, key: str, default: object = None) -> object: + return self._resources.get(key, default) + + +@pytest.mark.asyncio +async def test_speculative_prefire_fires_at_t2_but_batch_continues() -> None: + """T2 < T1:T2 到期先发车,items 不弹出;T1 之前再来消息会取消投机。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.3, + pre_send_seconds=0.1, + strategy="extend", + ) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(text="m1")) + # 等待 T2 触发(~100ms)但远未到 T1(300ms) + await asyncio.sleep(0.18) + assert len(rec.batches) == 1, "T2 应已 pre-fire" + # 桶仍存在 + assert batcher.has_buffer("group:1", 100) + + +@pytest.mark.asyncio +async def test_speculative_cancelled_when_new_message_and_no_send() -> None: + """投机调用尚未发出消息时,新消息到达应取消 inflight 并把它合进新一轮。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.3, + pre_send_seconds=0.05, + strategy="extend", + ) + + cancelled = asyncio.Event() + fake_ctx = _FakeRequestContext() # 默认 message_sent_this_turn=False + + async def slow_flush(items: list[BufferedMessage]) -> None: + try: + await asyncio.sleep(2.0) + except asyncio.CancelledError: + cancelled.set() + raise + + batcher = MessageBatcher(cfg, slow_flush) + + await batcher.submit(_make_item(text="m1")) + # 等待 T2 触发 + await asyncio.sleep(0.1) + # 模拟 coordinator 上报 inflight + inflight_task = next(iter(batcher._pending_tasks)) + batcher.register_inflight("group:1", 100, inflight_task, fake_ctx) + # 第二条消息到达,应取消 inflight + await batcher.submit(_make_item(text="m2")) + await asyncio.wait_for(cancelled.wait(), timeout=1.0) + + +@pytest.mark.asyncio +async def test_speculative_not_cancelled_when_already_sent_default() -> None: + """已经发过消息时默认不取消 inflight,新消息开新 batch。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.3, + pre_send_seconds=0.05, + strategy="extend", + allow_cancel_after_send=False, + ) + + fake_ctx = _FakeRequestContext() + fake_ctx.set_resource("message_sent_this_turn", True) + + finished = asyncio.Event() + + async def flush(items: list[BufferedMessage]) -> None: + try: + await asyncio.sleep(0.1) + finally: + finished.set() + + batcher = MessageBatcher(cfg, flush) + + await batcher.submit(_make_item(text="m1")) + await asyncio.sleep(0.08) + inflight_task = next(iter(batcher._pending_tasks)) + batcher.register_inflight("group:1", 100, inflight_task, fake_ctx) + # 新消息到达:投机已发过消息,inflight 不应被 cancel + await batcher.submit(_make_item(text="m2")) + # 等 inflight 自然完成 + await asyncio.wait_for(finished.wait(), timeout=1.0) + assert not inflight_task.cancelled() + + +@pytest.mark.asyncio +async def test_speculative_disabled_when_pre_send_zero() -> None: + """pre_send_seconds=0 时投机关闭,仅 T1 静默到期发车。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.1, + pre_send_seconds=0.0, + ) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + assert not batcher.speculative_enabled + + await batcher.submit(_make_item(text="m1")) + await asyncio.sleep(0.05) + assert rec.batches == [] + await asyncio.sleep(0.1) + assert len(rec.batches) == 1 + + +@pytest.mark.asyncio +async def test_snapshot_includes_phase() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.5, pre_send_seconds=0.05) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + await batcher.submit(_make_item(text="m1")) + snap = batcher.snapshot() + assert snap["pending_buckets"] == 1 + assert snap["buckets"][0]["phase"] in {"typing", "speculating"} + assert "speculative_enabled" in snap["config"] + assert snap["config"]["speculative_enabled"] is True From dfc6978354c64247a35d162b0296b0e77ec1a062 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 18:59:04 +0800 Subject: [PATCH 06/34] docs(batcher): expose speculative state in API/WebUI and tighten README - openapi.md adds the message_batcher snapshot field with phase / has_inflight / speculative_enabled / pre_send_seconds details. - webui-guide.md notes the batcher panel now shows speculative state and per-bucket phase. - WebUI runtime panel renders speculative_enabled, pre_send_seconds and per-bucket phase + inflight indicator; i18n keys added for both zh-CN and en. - README batcher bullet shortened to a benefit-led one-liner with link. - config.toml.example already ships pre_send_seconds = 0.0 (off by default) with bilingual comments. --- README.md | 2 +- docs/openapi.md | 1 + docs/webui-guide.md | 2 +- src/Undefined/webui/static/js/i18n.js | 6 ++++++ src/Undefined/webui/static/js/runtime.js | 16 +++++++++++++++- 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 60fb5831..cbca2248 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ - **arXiv 论文提取与搜索**:自动检测消息中的 arXiv 链接/标识并发送论文信息与 PDF;同时提供 `arxiv_paper` 发送工具和 `arxiv_search` 检索工具。 - **GitHub 仓库卡片**:自动检测 GitHub 仓库链接或 `owner/repo` 仓库 ID,获取 public 仓库信息并发送简洁图片卡片,展示头像、简介、stars、forks、issues、contributors 等概览。 - **自动处理管线**:Bilibili、arXiv、GitHub 等自动提取统一运行在 `skills/auto_pipeline` 中,斜杠命令优先级更高;命令输入/输出会写入历史,非命令消息会并行检测和处理命中管线,结果通过统一发送层写入历史并登记附件 UID 后再进入 AI 回复。远程大附件超过 `[attachments].remote_download_max_size_mb` 时只登记 URL 引用,避免无界下载和缓存膨胀。 -- **同 sender 短时消息合并**:同一发送者在 `[message_batcher].window_seconds`(默认 5s)内连续发送的多条消息会被合并到同一轮 AI 调用,AI 一次性看到全部 `` 块自行识别“独立请求/修正/打断”,避免老版本“画猫→改成狗”造成的重复触发与回复打架。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理;首条 @bot 进入 buffer 时整批走 mention 队列。可选开启投机预发送 (`pre_send_seconds`) :静默到该阈值先把 batch 提前发给 LLM 抢时间,新消息在 inflight 未发出任何消息时可取消该调用。详见 [docs/message-batching.md](docs/message-batching.md)。 +- **同 sender 短时消息合并**:连续发的多条消息会合并到同一轮 AI 调用,AI 一次看到全部意图自行识别"独立请求/修正/打断";告别"画猫→改成狗"的重复触发与回复打架。可选投机预发送让用户停顿时 LLM 提前开跑、新消息可在未发出回复前取消,进一步压低响应延迟。详见 [docs/message-batching.md](docs/message-batching.md)。 - **思维链支持**:支持开启思维链,提升复杂逻辑推理能力。 - **高并发架构**:基于 `asyncio` 全异步设计,支持多队列消息处理与工具并发执行,轻松应对高并发场景。 - **异步安全 I/O**:统一 IO 层通过线程池 + 跨平台文件锁(Linux/macOS `flock`,Windows `msvcrt`)+ 原子写入(`os.replace`)保证并发写入不损坏、且不阻塞主事件循环。 diff --git a/docs/openapi.md b/docs/openapi.md index 836f979e..cddb782b 100644 --- a/docs/openapi.md +++ b/docs/openapi.md @@ -102,6 +102,7 @@ curl http://127.0.0.1:8788/openapi.json | `uptime_seconds` | `float` | 进程运行时长(秒) | | `onebot` | `object` | OneBot 连接状态(`connected`、`running`、`ws_url` 等) | | `queues` | `object` | 请求队列快照(`processor_count`、`inflight_count`、`totals` 按优先级分布;lane 包含 `superadmin`、`group_superadmin`、`private`、`group_mention`、`group_normal`、`background`,`retry` 表示各 lane 中待执行的 LLM 重试请求数) | +| `message_batcher` | `object` | 消息合并器快照(`config` 含 `enabled`/`window_seconds`/`pre_send_seconds`/`speculative_enabled`/`strategy`/`max_window_seconds`/`max_messages_per_batch`/`group_enabled`/`private_enabled`/`allow_cancel_after_send`;`pending_buckets` 当前缓冲桶数;`buckets[]` 列出每个桶的 `scope`/`sender_id`/`count`/`elapsed_seconds`/`phase`(`typing`/`speculating`/`finalizing`)/`has_inflight`) | | `memory` | `object` | 长期记忆(`count`:条数) | | `cognitive` | `object` | 认知服务(`enabled`、`queue`) | | `api` | `object` | Runtime API 配置(`enabled`、`host`、`port`、`openapi_enabled`) | diff --git a/docs/webui-guide.md b/docs/webui-guide.md index 9a77ff1d..be78b57b 100644 --- a/docs/webui-guide.md +++ b/docs/webui-guide.md @@ -79,7 +79,7 @@ WebUI 共有 8 个主要页签(Tab),下面逐一介绍。 三类探针帮助排查问题: -- **内部探针**:版本号、Python 版本、平台、运行时间、OneBot 连接状态及 WebSocket 地址。 +- **内部探针**:版本号、Python 版本、平台、运行时间、OneBot 连接状态及 WebSocket 地址;同时展示请求队列、消息合并器(含投机预发送状态、当前缓冲桶 phase 与 inflight 标记)、长期记忆 / 认知服务等运行态指标。 - **外部探针**:Runtime API 的可用端点和能力列表。 - **引导探针**:检查 `config.toml` 是否存在、TOML 语法是否合法、配置值是否有效,并给出修复建议。 diff --git a/src/Undefined/webui/static/js/i18n.js b/src/Undefined/webui/static/js/i18n.js index 1f45fa95..4c887c3e 100644 --- a/src/Undefined/webui/static/js/i18n.js +++ b/src/Undefined/webui/static/js/i18n.js @@ -160,6 +160,9 @@ const I18N = { "probes.batcher_pending": "未发车桶数", "probes.batcher_group": "群聊合并", "probes.batcher_private": "私聊合并", + "probes.batcher_speculative": "投机预发送", + "probes.batcher_pre_send": "预发阈值", + "probes.batcher_phase": "状态", "probes.section_services": "服务状态", "probes.section_skills": "技能统计", "probes.version": "版本", @@ -468,6 +471,9 @@ const I18N = { "probes.batcher_pending": "Pending Buckets", "probes.batcher_group": "Group", "probes.batcher_private": "Private", + "probes.batcher_speculative": "Speculative Pre-fire", + "probes.batcher_pre_send": "Pre-fire Threshold", + "probes.batcher_phase": "Phase", "probes.section_services": "Service Status", "probes.section_skills": "Skill Statistics", "probes.version": "Version", diff --git a/src/Undefined/webui/static/js/runtime.js b/src/Undefined/webui/static/js/runtime.js index c56828bb..ebeb02ad 100644 --- a/src/Undefined/webui/static/js/runtime.js +++ b/src/Undefined/webui/static/js/runtime.js @@ -186,13 +186,27 @@ t("probes.batcher_private"), cfg.private_enabled ? "✓" : "✗", ); + html += probeItem( + t("probes.batcher_speculative"), + probeStatusBadge(cfg.speculative_enabled ? "ok" : "skipped"), + ); + if (cfg.speculative_enabled) { + html += probeItem( + t("probes.batcher_pre_send"), + `${escapeHtml(String(cfg.pre_send_seconds))}s`, + ); + } html += ``; const buckets = Array.isArray(mb.buckets) ? mb.buckets : []; if (buckets.length > 0) { html += `
`; for (const b of buckets.slice(0, 10)) { const label = `${escapeHtml(String(b.scope || ""))}/${escapeHtml(String(b.sender_id || ""))}`; - html += `${label} ${b.count}×@${b.elapsed_seconds}s`; + const phase = b.phase + ? ` ${escapeHtml(String(b.phase))}` + : ""; + const inflight = b.has_inflight ? " ⚡" : ""; + html += `${label} ${b.count}×@${b.elapsed_seconds}s${phase}${inflight}`; } html += `
`; } From d707a518fbe6050ca05eb6246ff2c25b32749f8e Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 19:08:24 +0800 Subject: [PATCH 07/34] fix(batcher): avoid clobbering new bucket when T1 finalizing path completes When T1 fires while a speculative LLM call is still in flight, the bucket transitions to FINALIZING and _handle_t1 awaits the in-flight task. If a new message arrives during that await, submit() takes the FINALIZING branch which pops the bucket and installs a brand new bucket under the same key. The previous _handle_t1 finally clause unconditionally self._buckets.pop(key, None), which would delete the new bucket. Capture the finalizing _BatchState reference and only pop the key when self._buckets[key] is still that exact object. Add a regression test covering the race. --- src/Undefined/services/message_batcher.py | 12 +++++-- tests/test_message_batcher.py | 44 +++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index b6d8ed9e..3f8b14f7 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -438,6 +438,7 @@ def _on_t2_timer(self, key: tuple[str, int]) -> None: async def _handle_t1(self, key: tuple[str, int]) -> None: items_to_fire: list[BufferedMessage] | None = None wait_inflight: asyncio.Task[Any] | None = None + finalizing_state: _BatchState | None = None async with self._lock: state = self._buckets.get(key) if state is None: @@ -447,7 +448,8 @@ async def _handle_t1(self, key: tuple[str, int]) -> None: # T1 到了但投机调用还在跑:等它完成,桶状态切到 FINALIZING state.phase = BatchPhase.FINALIZING wait_inflight = state.inflight.task - # 桶将在 inflight 结束后通过 unregister_inflight 路径或这里 finally 弹出 + finalizing_state = state + # 桶将在 inflight 结束后清理 else: # 普通模式或 SPECULATING 但 inflight 已结束:直接 fire items_to_fire = self._pop_locked(key) @@ -471,9 +473,13 @@ async def _handle_t1(self, key: tuple[str, int]) -> None: key[1], ) finally: - # 清桶 + # 仅当桶仍是 finalizing_state(同一对象)时才 pop; + # 否则 submit 已经在 SPECULATING/FINALIZING 分支把旧桶 pop 并建立新桶, + # 不能误删新桶。 async with self._lock: - self._buckets.pop(key, None) + current = self._buckets.get(key) + if current is finalizing_state: + self._buckets.pop(key, None) return if items_to_fire is not None: diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index b363242b..0e1efbb2 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -436,3 +436,47 @@ async def test_snapshot_includes_phase() -> None: assert snap["buckets"][0]["phase"] in {"typing", "speculating"} assert "speculative_enabled" in snap["config"] assert snap["config"]["speculative_enabled"] is True + + +@pytest.mark.asyncio +async def test_t1_finalizing_does_not_clobber_new_bucket() -> None: + """T1 await inflight 时新消息走 FINALIZING 分支建新桶,finally 不能误删新桶。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.1, + pre_send_seconds=0.04, + strategy="extend", + ) + + fake_ctx = ( + _FakeRequestContext() + ) # message_sent_this_turn 默认 False,inflight 可被取消 + # 但本测试要让 T1 fire,inflight 仍未结束 → FINALIZING 分支 + + release_inflight = asyncio.Event() + inflight_started = asyncio.Event() + + async def flush(items: list[BufferedMessage]) -> None: + inflight_started.set() + try: + await release_inflight.wait() + except asyncio.CancelledError: + release_inflight.set() + raise + + batcher = MessageBatcher(cfg, flush) + + await batcher.submit(_make_item(text="m1")) + await asyncio.wait_for(inflight_started.wait(), timeout=0.5) + inflight_task = next(iter(batcher._pending_tasks)) + batcher.register_inflight("group:1", 100, inflight_task, fake_ctx) + # 等到 T1 触发,桶切到 FINALIZING 等 inflight + await asyncio.sleep(0.12) + # 此刻新消息进入 FINALIZING 分支,开新桶 + await batcher.submit(_make_item(text="m2")) + assert batcher.has_buffer("group:1", 100) + # 释放 inflight,让 _handle_t1 finally 运行 + release_inflight.set() + await asyncio.sleep(0.05) + # 新桶不该被旧 _handle_t1 finally 清掉 + assert batcher.has_buffer("group:1", 100), "新桶被旧 _handle_t1 finally 误删" From 6c3d7c5a42478c1dfbdf1b765f14ba6e84aa5bf7 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 19:17:26 +0800 Subject: [PATCH 08/34] fix(batcher): cancel speculative flush task when inflight not yet registered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is a race window between T2 firing (which spawns flush_callback to enqueue a request through QueueManager) and coordinator entering execute_reply and calling register_inflight. If a new message arrives inside that window, state.inflight is None so the previous logic fell through to the safe "already-sent → start new batch" branch, even though the LLM call had not actually sent anything yet. Track the speculative flush task on the bucket state and cancel it as a fallback when inflight has not been registered. This recovers the expected merge behavior in the common case where T2 just fired and the queue dispatch is still in progress. Add a regression test. --- src/Undefined/services/message_batcher.py | 35 +++++++++++++++++++++-- tests/test_message_batcher.py | 31 ++++++++++++++++++++ 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index 3f8b14f7..76f00f8f 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -105,8 +105,10 @@ class _BatchState: t1_handle: asyncio.TimerHandle | None = None # T2 = pre_send_seconds 静默 timer(决定 pre-fire);投机关闭时为 None t2_handle: asyncio.TimerHandle | None = None - # SPECULATING 阶段记录 inflight LLM 任务 + # SPECULATING 阶段记录 inflight LLM 任务(由 coordinator 通过 register_inflight 注入) inflight: _InflightInfo | None = None + # T2 fire 时由 batcher 创建的 flush task;inflight 还未上报前用于兜底取消 + speculative_flush_task: asyncio.Task[None] | None = None def make_scope(*, group_id: int | None = None, user_id: int | None = None) -> str: @@ -240,6 +242,23 @@ async def submit(self, item: BufferedMessage) -> None: state.phase = BatchPhase.TYPING # 新消息追加到现有 items 后面 state.items.append(item) + elif inflight is None and state.speculative_flush_task is not None: + # inflight 尚未注册(coordinator 还没进入 execute_reply): + # 退而求其次,cancel batcher 自己创建的 flush task。 + # 该 task cancel 后 _flush_callback 入队的请求若已发出, + # coordinator 那侧的真正 LLM task 可能已存在但未注册—— + # 我们无法精确取消它;但绝大多数情况下 flush_callback 还在 + # 走"组装 request + 入队"阶段,cancel 即可阻止入队。 + logger.info( + "[MessageBatcher] inflight 未注册,cancel 投机 flush task: " + "scope=%s sender=%s", + item.scope, + item.sender_id, + ) + state.speculative_flush_task.cancel() + state.speculative_flush_task = None + state.phase = BatchPhase.TYPING + state.items.append(item) else: # 已发过消息且不允许取消:丢弃当前桶,新消息开新桶 logger.info( @@ -498,6 +517,8 @@ async def _handle_t2(self, key: tuple[str, int]) -> None: # 切到 SPECULATING,但**不**清空 items(保留以便后续 T1 也能用 / 抢占回收) state.phase = BatchPhase.SPECULATING self._cancel_t2(state) + # 记录"承担投机职责"的当前 task,便于 inflight 注册前被新消息抢占取消 + state.speculative_flush_task = asyncio.current_task() speculative_items = list(state.items) logger.info( "[MessageBatcher] 投机预发送: scope=%s sender=%s count=%s", @@ -507,7 +528,17 @@ async def _handle_t2(self, key: tuple[str, int]) -> None: ) if speculative_items is not None: - await self._invoke_callback(speculative_items, speculative=True) + try: + await self._invoke_callback(speculative_items, speculative=True) + finally: + # 清掉自身引用,避免 state 残留指向已结束 task + async with self._lock: + state2 = self._buckets.get(key) + if ( + state2 is not None + and state2.speculative_flush_task is asyncio.current_task() + ): + state2.speculative_flush_task = None async def _invoke_callback( self, diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index 0e1efbb2..bc72f67a 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -480,3 +480,34 @@ async def flush(items: list[BufferedMessage]) -> None: await asyncio.sleep(0.05) # 新桶不该被旧 _handle_t1 finally 清掉 assert batcher.has_buffer("group:1", 100), "新桶被旧 _handle_t1 finally 误删" + + +@pytest.mark.asyncio +async def test_speculative_cancelled_before_inflight_registered() -> None: + """T2 fire 后 inflight 还没 register 就被新消息抢占:应取消 flush task。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.5, + pre_send_seconds=0.05, + strategy="extend", + ) + + callback_started = asyncio.Event() + callback_cancelled = asyncio.Event() + + async def slow_flush(items: list[BufferedMessage]) -> None: + callback_started.set() + try: + await asyncio.sleep(2.0) + except asyncio.CancelledError: + callback_cancelled.set() + raise + + batcher = MessageBatcher(cfg, slow_flush) + + await batcher.submit(_make_item(text="m1")) + # 等 T2 触发并 callback 启动,但**不**调 register_inflight + await asyncio.wait_for(callback_started.wait(), timeout=0.5) + # 新消息:inflight 是 None,应走"cancel flush task"分支 + await batcher.submit(_make_item(text="m2")) + await asyncio.wait_for(callback_cancelled.wait(), timeout=1.0) From a69c75a9f38747ba8fe9956d0e95e6358361dc82 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 19:34:01 +0800 Subject: [PATCH 09/34] fix(batcher): harden speculative prefire races --- ARCHITECTURE.md | 15 ++- docs/message-batching.md | 8 +- docs/openapi.md | 2 +- src/Undefined/services/ai_coordinator.py | 22 +++- src/Undefined/services/message_batcher.py | 143 ++++++++++++++++++---- tests/test_message_batcher.py | 100 +++++++++++++++ tests/test_message_batcher_integration.py | 22 +++- 7 files changed, 276 insertions(+), 36 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index b6fd9840..0562adb1 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -46,7 +46,7 @@ graph TB CommandDispatcher["CommandDispatcher
命令分发器
• /help /stats /lsadmin
• /addadmin /rmadmin
• /bugfix /faq
[services/command.py]"] - MessageBatcher["MessageBatcher
同 sender 短时合并
• 按 (scope, sender_id) 分桶
• window_seconds 内合并 N 条
• 拍一拍/buffer 内 @bot 旁路
• 首条 @bot 整批走 mention 队列
[services/message_batcher.py]"] + MessageBatcher["MessageBatcher
同 sender 短时合并
• 按 (scope, sender_id) 分桶
• T1=window_seconds 结束 batch
• T2=pre_send_seconds 投机预发送
• 拍一拍/buffer 内 @bot 旁路
• 首条 @bot 整批走 mention 队列
[services/message_batcher.py]"] subgraph QueueSystem["车站-列车 队列系统 (services/)"] AICoordinator["AICoordinator
AI 协调器
• Prompt 构建
• 队列管理
• 回复执行
[ai_coordinator.py]"] @@ -389,9 +389,16 @@ sequenceDiagram AC->>QM: 立即按优先级入队 else 普通消息进合并桶 AC->>MB: submit(BufferedMessage) - MB-->>MB: 同 sender 短窗合并 (window_seconds) - MB->>AC: handle_batched_dispatch(批次) - AC->>QM: 按首条触发的优先级入队 + MB-->>MB: TYPING: 重置 T1/T2 静默计时 + opt T2=pre_send_seconds 到期 + MB->>AC: handle_batched_dispatch(投机批次 + BatchDispatchToken) + AC->>QM: 提前入队抢时间 + end + MB-->>MB: T1=window_seconds 到期结束 batch + opt 未启用投机或尚未预发送 + MB->>AC: handle_batched_dispatch(最终批次) + AC->>QM: 按首条触发的优先级入队 + end end %% 上下文创建 diff --git a/docs/message-batching.md b/docs/message-batching.md index 318776f1..05554cce 100644 --- a/docs/message-batching.md +++ b/docs/message-batching.md @@ -104,7 +104,7 @@ allow_cancel_after_send = false | Phase | 含义 | |---|---| | `TYPING` | 等待 T1/T2 静默 | -| `SPECULATING` | T2 已触发,inflight LLM 在跑;T1 仍未到 | +| `SPECULATING` | T2 已触发,请求已入队或 inflight LLM 在跑;T1 仍未到 | | `FINALIZING` | T1 已到,等 inflight(若有)自然结束 | ### 新消息到来时的决策 @@ -113,13 +113,17 @@ allow_cancel_after_send = false - **SPECULATING**: - 检查 inflight 是否已经向用户发出过任何消息(来自 `RequestContext.get_resource("message_sent_this_turn")`)。 - inflight **尚未发消息** → 调 `inflight_task.cancel()`,桶回到 `TYPING`,新消息追加进去,重置 T1/T2;inflight 协程在 `RequestContext` 里清理后退出,**不写入回复历史**。 + - T2 已经把请求入队但 coordinator 还没注册 inflight → 取消旧 `BatchDispatchToken`;旧请求即使稍后被队列取出,也会在 `execute_reply` 入口跳过,新消息继续合并进重新计时的 batch。 - inflight **已经发过消息** 且 `allow_cancel_after_send=False`(默认安全) → 不取消 inflight,**新消息开新 batch**(旧桶在 inflight 自然结束后清理)。 - inflight **已经发过消息** 且 `allow_cancel_after_send=True` → 仍取消,可能造成重复发送,仅极端场景启用。 ### 防竞态设计 -- 所有桶状态变更在 `MessageBatcher._lock` 内完成;`flush_callback` 与 `task.cancel()` 在锁外发起。 +- 所有桶状态变更在 `MessageBatcher._lock` 内完成;LLM/队列等待不会发生在锁内。 - timer 触发后由 `asyncio.create_task` 创建 flush 协程,强引用挂到 `_pending_tasks: set[Task]`,`task.add_done_callback(self._pending_tasks.discard)` 清理(asyncio 文档要求避免被 GC)。 +- T2 预发送会给队列请求附带 `BatchDispatchToken`。新消息抢占时先取消旧 token;若旧请求已入队但尚未执行,`AICoordinator.execute_reply()` 会直接跳过,避免队列拥堵窗口里的陈旧回复。 +- T1 到期时如果 batch 已经被 T2 投机发出,只负责结束 bucket/等待已知 inflight,不会再次调用 `flush_callback`,避免同一批消息重复入队。 +- `unregister_inflight(scope, sender_id, task)` 会校验 task 身份;旧任务的 `finally` 不会误清理新一轮已注册的 inflight。 - `flush_all()` 在关停时遍历所有桶执行等价 T1 路径,并 `await` 所有未完成的 flush task。 - coordinator 在 `execute_reply` 入口调用 `register_inflight(scope, sender_id, task, ctx)`,在 `finally` 调 `unregister_inflight(...)`;`asyncio.CancelledError` 被识别为 "投机抢占",仅记录信息日志且不重试。 diff --git a/docs/openapi.md b/docs/openapi.md index cddb782b..11fdefe9 100644 --- a/docs/openapi.md +++ b/docs/openapi.md @@ -102,7 +102,7 @@ curl http://127.0.0.1:8788/openapi.json | `uptime_seconds` | `float` | 进程运行时长(秒) | | `onebot` | `object` | OneBot 连接状态(`connected`、`running`、`ws_url` 等) | | `queues` | `object` | 请求队列快照(`processor_count`、`inflight_count`、`totals` 按优先级分布;lane 包含 `superadmin`、`group_superadmin`、`private`、`group_mention`、`group_normal`、`background`,`retry` 表示各 lane 中待执行的 LLM 重试请求数) | -| `message_batcher` | `object` | 消息合并器快照(`config` 含 `enabled`/`window_seconds`/`pre_send_seconds`/`speculative_enabled`/`strategy`/`max_window_seconds`/`max_messages_per_batch`/`group_enabled`/`private_enabled`/`allow_cancel_after_send`;`pending_buckets` 当前缓冲桶数;`buckets[]` 列出每个桶的 `scope`/`sender_id`/`count`/`elapsed_seconds`/`phase`(`typing`/`speculating`/`finalizing`)/`has_inflight`) | +| `message_batcher` | `object` | 消息合并器快照(`config` 含 `enabled`/`window_seconds`/`pre_send_seconds`/`speculative_enabled`/`strategy`/`max_window_seconds`/`max_messages_per_batch`/`group_enabled`/`private_enabled`/`allow_cancel_after_send`;`pending_buckets` 当前缓冲桶数;`buckets[]` 列出每个桶的 `scope`/`sender_id`/`count`/`elapsed_seconds`/`phase`(`typing`/`speculating`/`finalizing`)/`has_inflight`/`has_speculative_dispatch`) | | `memory` | `object` | 长期记忆(`count`:条数) | | `cognitive` | `object` | 认知服务(`enabled`、`queue`) | | `api` | `object` | Runtime API 配置(`enabled`、`host`、`port`、`openapi_enabled`) | diff --git a/src/Undefined/services/ai_coordinator.py b/src/Undefined/services/ai_coordinator.py index 4f163c01..00f474d7 100644 --- a/src/Undefined/services/ai_coordinator.py +++ b/src/Undefined/services/ai_coordinator.py @@ -274,6 +274,16 @@ async def execute_reply(self, request: dict[str, Any]) -> None: """执行回复请求(由 QueueManager 调用)""" req_type = request.get("type", "unknown") logger.debug("[执行请求] type=%s keys=%s", req_type, list(request.keys())) + batch_token = request.get("_message_batcher_token") + if bool(getattr(batch_token, "cancelled", False)): + logger.info( + "[MessageBatcher] 跳过已取消的投机请求: type=%s scope=%s sender=%s batch=%s", + req_type, + getattr(batch_token, "scope", ""), + getattr(batch_token, "sender_id", ""), + getattr(batch_token, "batch_id", ""), + ) + return if req_type == "auto_reply": await self._execute_auto_reply(request) elif req_type == "private_reply": @@ -404,7 +414,9 @@ async def send_like_cb(uid: int, times: int = 1) -> None: ) finally: if batcher is not None and batcher_scope is not None: - batcher.unregister_inflight(batcher_scope, sender_id) + batcher.unregister_inflight( + batcher_scope, sender_id, current_task + ) except asyncio.CancelledError: # 投机预发送被新消息抢占取消:不写错误日志、不重试 logger.info( @@ -524,7 +536,9 @@ async def send_private_cb( ) finally: if batcher is not None and batcher_scope is not None: - batcher.unregister_inflight(batcher_scope, user_id) + batcher.unregister_inflight( + batcher_scope, user_id, current_task + ) if result: scope_key = build_attachment_scope( user_id=user_id, @@ -902,6 +916,8 @@ async def _dispatch_grouped_request(self, items: list[BufferedMessage]) -> None: "trigger_message_id": last.trigger_message_id, "batched_count": len(items), } + if first.batch_token is not None: + request_data["_message_batcher_token"] = first.batch_token effective_config = self.model_pool.select_chat_config( self.config.chat_model, user_id=user_id ) @@ -937,6 +953,8 @@ async def _dispatch_grouped_request(self, items: list[BufferedMessage]) -> None: "trigger_message_id": last.trigger_message_id, "batched_count": len(items), } + if first.batch_token is not None: + request_data["_message_batcher_token"] = first.batch_token logger.debug( "[自动回复] full_question_len=%s group=%s sender=%s batched=%s", len(full_question), diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index 76f00f8f..95c780a2 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -15,7 +15,7 @@ 新消息到来: - 若桶处于 ``TYPING``(尚未 pre-fire):append 后重置 T1/T2。 -- 若桶处于 ``SPECULATING``(已 pre-fire,inflight 在跑): +- 若桶处于 ``SPECULATING``(已 pre-fire,请求已入队或 inflight 在跑): - 检查 inflight 是否已经 "向用户发出过任何消息" (来自 ``RequestContext.get_resource("message_sent_this_turn")``)。 - inflight 尚未发消息 → 调 ``inflight_task.cancel()``,桶回到 TYPING; @@ -42,6 +42,20 @@ logger = logging.getLogger(__name__) +@dataclass +class BatchDispatchToken: + """一次 batch 发车的身份令牌,用于取消已入队但尚未执行的投机请求。""" + + scope: str + sender_id: int + batch_id: int + speculative: bool = False + cancelled: bool = False + + def cancel(self) -> None: + self.cancelled = True + + @dataclass class BufferedMessage: """缓冲中的单条消息上下文。""" @@ -64,6 +78,7 @@ class BufferedMessage: sender_role: str = "member" sender_title: str = "" sender_level: str = "" + batch_token: BatchDispatchToken | None = None FlushCallback = Callable[[list[BufferedMessage]], Awaitable[None]] @@ -81,7 +96,7 @@ class BatchPhase(enum.Enum): """桶状态机。""" TYPING = "typing" # 等待 T1/T2 静默 - SPECULATING = "speculating" # T2 已触发,inflight LLM 在跑;T1 仍未到 + SPECULATING = "speculating" # T2 已触发,请求已入队或 inflight 在跑;T1 仍未到 FINALIZING = "finalizing" # T1 已到,等 inflight(若有)自然结束 @@ -109,6 +124,9 @@ class _BatchState: inflight: _InflightInfo | None = None # T2 fire 时由 batcher 创建的 flush task;inflight 还未上报前用于兜底取消 speculative_flush_task: asyncio.Task[None] | None = None + # 当前 batch 的身份令牌;T2 入队后若又来新消息,可将旧 token 标记取消, + # coordinator 在真正执行前会跳过它。 + dispatch_token: BatchDispatchToken | None = None def make_scope(*, group_id: int | None = None, user_id: int | None = None) -> str: @@ -155,6 +173,7 @@ def __init__( self._lock = asyncio.Lock() # 持有 timer 触发后创建的 flush task 强引用,避免被 GC(asyncio 文档要求) self._pending_tasks: set[asyncio.Task[None]] = set() + self._next_batch_id = 0 # ------------------------------------------------------------------ public @@ -202,7 +221,6 @@ async def submit(self, item: BufferedMessage) -> None: cfg = self._config key = (item.scope, item.sender_id) # 异步路径里只在锁内修改桶;invoke callback 在锁外执行 - speculative_fire_items: list[BufferedMessage] | None = None immediate_fire_items: list[BufferedMessage] | None = None async with self._lock: @@ -215,6 +233,7 @@ async def submit(self, item: BufferedMessage) -> None: state = _BatchState( phase=BatchPhase.TYPING, first_arrival_monotonic=now_mono, + dispatch_token=self._new_token(item.scope, item.sender_id), ) self._buckets[key] = state state.items.append(item) @@ -237,28 +256,32 @@ async def submit(self, item: BufferedMessage) -> None: already_sent, cfg.allow_cancel_after_send, ) + if state.dispatch_token is not None: + state.dispatch_token.cancel() inflight.task.cancel() state.inflight = None state.phase = BatchPhase.TYPING # 新消息追加到现有 items 后面 state.items.append(item) - elif inflight is None and state.speculative_flush_task is not None: + self._retokenize_locked(state, item.scope, item.sender_id) + elif inflight is None: # inflight 尚未注册(coordinator 还没进入 execute_reply): - # 退而求其次,cancel batcher 自己创建的 flush task。 - # 该 task cancel 后 _flush_callback 入队的请求若已发出, - # coordinator 那侧的真正 LLM task 可能已存在但未注册—— - # 我们无法精确取消它;但绝大多数情况下 flush_callback 还在 - # 走"组装 request + 入队"阶段,cancel 即可阻止入队。 + # 1) 若 flush task 仍在跑,先 cancel; + # 2) 若它已经把请求入队,则取消旧 token,execute_reply 入口会跳过旧请求。 logger.info( - "[MessageBatcher] inflight 未注册,cancel 投机 flush task: " + "[MessageBatcher] inflight 未注册,取消投机 token/flush task: " "scope=%s sender=%s", item.scope, item.sender_id, ) - state.speculative_flush_task.cancel() - state.speculative_flush_task = None + if state.dispatch_token is not None: + state.dispatch_token.cancel() + if state.speculative_flush_task is not None: + state.speculative_flush_task.cancel() + state.speculative_flush_task = None state.phase = BatchPhase.TYPING state.items.append(item) + self._retokenize_locked(state, item.scope, item.sender_id) else: # 已发过消息且不允许取消:丢弃当前桶,新消息开新桶 logger.info( @@ -276,6 +299,7 @@ async def submit(self, item: BufferedMessage) -> None: state = _BatchState( phase=BatchPhase.TYPING, first_arrival_monotonic=now_mono, + dispatch_token=self._new_token(item.scope, item.sender_id), ) self._buckets[key] = state state.items.append(item) @@ -291,12 +315,15 @@ async def submit(self, item: BufferedMessage) -> None: state = _BatchState( phase=BatchPhase.TYPING, first_arrival_monotonic=now_mono, + dispatch_token=self._new_token(item.scope, item.sender_id), ) self._buckets[key] = state state.items.append(item) else: # TYPING:直接 append state.items.append(item) + self._bind_items_to_token_locked(state) + # === 阶段 2: 重置 T1/T2 timer === self._cancel_t1(state) self._cancel_t2(state) @@ -345,8 +372,12 @@ async def submit(self, item: BufferedMessage) -> None: ) # T2 delay(仅当投机启用,且本桶尚未 pre-fire 时设置) - if self.speculative_enabled and state.phase is BatchPhase.TYPING: - t2_delay = min(cfg.pre_send_seconds, t1_delay) + if ( + self.speculative_enabled + and state.phase is BatchPhase.TYPING + and cfg.pre_send_seconds < t1_delay + ): + t2_delay = cfg.pre_send_seconds state.t2_handle = loop.call_later( max(0.0, t2_delay), self._on_t2_timer, key ) @@ -375,8 +406,6 @@ async def submit(self, item: BufferedMessage) -> None: # 锁外执行 callback if immediate_fire_items is not None: await self._invoke_callback(immediate_fire_items) - elif speculative_fire_items is not None: # 此分支当前不会触发,预留扩展 - await self._invoke_callback(speculative_fire_items) # ----------------------------------------------------------- inflight API @@ -404,12 +433,29 @@ def register_inflight( sender_id, ) - def unregister_inflight(self, scope: str, sender_id: int) -> None: + def unregister_inflight( + self, + scope: str, + sender_id: int, + task: asyncio.Task[Any] | None = None, + ) -> None: """coordinator 在 ``execute_reply`` 结束(含异常/取消)时上报。""" key = (scope, sender_id) state = self._buckets.get(key) if state is None: return + if ( + task is not None + and state.inflight is not None + and state.inflight.task is not task + ): + logger.debug( + "[MessageBatcher] 忽略过期 inflight 注销: scope=%s sender=%s phase=%s", + scope, + sender_id, + state.phase.value, + ) + return state.inflight = None # 若 phase 是 SPECULATING 且 T1 已经 fire 过(FINALIZING 才 unregister), # 此时 inflight 自然结束 → 桶已经在 _on_t1_timer 中弹出,无需再做事 @@ -434,6 +480,27 @@ def _cancel_t2(self, state: _BatchState) -> None: state.t2_handle.cancel() state.t2_handle = None + def _new_token(self, scope: str, sender_id: int) -> BatchDispatchToken: + self._next_batch_id += 1 + return BatchDispatchToken( + scope=scope, + sender_id=sender_id, + batch_id=self._next_batch_id, + ) + + def _retokenize_locked( + self, state: _BatchState, scope: str, sender_id: int + ) -> None: + state.dispatch_token = self._new_token(scope, sender_id) + self._bind_items_to_token_locked(state) + + @staticmethod + def _bind_items_to_token_locked(state: _BatchState) -> None: + if state.dispatch_token is None: + return + for buffered in state.items: + buffered.batch_token = state.dispatch_token + def _pop_locked(self, key: tuple[str, int]) -> list[BufferedMessage] | None: state = self._buckets.pop(key, None) if state is None or not state.items: @@ -457,37 +524,52 @@ def _on_t2_timer(self, key: tuple[str, int]) -> None: async def _handle_t1(self, key: tuple[str, int]) -> None: items_to_fire: list[BufferedMessage] | None = None wait_inflight: asyncio.Task[Any] | None = None + wait_prefire: asyncio.Task[None] | None = None finalizing_state: _BatchState | None = None async with self._lock: state = self._buckets.get(key) if state is None: return self._cancel_t2(state) - if state.phase is BatchPhase.SPECULATING and state.inflight is not None: - # T1 到了但投机调用还在跑:等它完成,桶状态切到 FINALIZING + if state.phase is BatchPhase.SPECULATING: + # T1 到了,投机请求已经发出/入队;这里只结束 batch,不能再次发车。 state.phase = BatchPhase.FINALIZING - wait_inflight = state.inflight.task finalizing_state = state - # 桶将在 inflight 结束后清理 + if state.inflight is not None: + wait_inflight = state.inflight.task + elif ( + state.speculative_flush_task is not None + and not state.speculative_flush_task.done() + ): + wait_prefire = state.speculative_flush_task + else: + self._buckets.pop(key, None) + logger.debug( + "[MessageBatcher] T1 结束已投机 batch,不重复发车: " + "scope=%s sender=%s", + key[0], + key[1], + ) else: # 普通模式或 SPECULATING 但 inflight 已结束:直接 fire items_to_fire = self._pop_locked(key) if items_to_fire is not None: state.phase = BatchPhase.FINALIZING - if wait_inflight is not None: + wait_task: asyncio.Task[Any] | None = wait_inflight or wait_prefire + if wait_task is not None: try: - await wait_inflight + await wait_task except asyncio.CancelledError: - # inflight 已被 cancel(极少同时发生),让 cancel 路径自然走 + # inflight/prefire 已被 cancel(极少同时发生),让 cancel 路径自然走 logger.info( - "[MessageBatcher] T1 等待 inflight 时被取消: scope=%s sender=%s", + "[MessageBatcher] T1 等待投机任务时被取消: scope=%s sender=%s", key[0], key[1], ) except Exception: logger.exception( - "[MessageBatcher] T1 等待 inflight 失败: scope=%s sender=%s", + "[MessageBatcher] T1 等待投机任务失败: scope=%s sender=%s", key[0], key[1], ) @@ -517,6 +599,10 @@ async def _handle_t2(self, key: tuple[str, int]) -> None: # 切到 SPECULATING,但**不**清空 items(保留以便后续 T1 也能用 / 抢占回收) state.phase = BatchPhase.SPECULATING self._cancel_t2(state) + if state.dispatch_token is None: + state.dispatch_token = self._new_token(key[0], key[1]) + self._bind_items_to_token_locked(state) + state.dispatch_token.speculative = True # 记录"承担投机职责"的当前 task,便于 inflight 注册前被新消息抢占取消 state.speculative_flush_task = asyncio.current_task() speculative_items = list(state.items) @@ -615,6 +701,11 @@ def snapshot(self) -> dict[str, Any]: ), "phase": state.phase.value, "has_inflight": state.inflight is not None, + "has_speculative_dispatch": ( + state.dispatch_token is not None + and state.dispatch_token.speculative + and not state.dispatch_token.cancelled + ), } ) return { diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index bc72f67a..6070be3e 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -9,6 +9,7 @@ from Undefined.config.models import MessageBatcherConfig from Undefined.services.message_batcher import ( + BatchDispatchToken, BufferedMessage, MessageBatcher, make_scope, @@ -338,6 +339,26 @@ async def test_speculative_prefire_fires_at_t2_but_batch_continues() -> None: assert batcher.has_buffer("group:1", 100) +@pytest.mark.asyncio +async def test_t1_after_speculative_prefire_does_not_dispatch_twice() -> None: + """T2 已经投机发车后,T1 只结束 batch,不能再次调用 callback。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.12, + pre_send_seconds=0.03, + strategy="extend", + ) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(text="m1")) + await asyncio.wait_for(rec.event.wait(), timeout=0.5) + await asyncio.sleep(0.18) + + assert len(rec.batches) == 1 + assert not batcher.has_buffer("group:1", 100) + + @pytest.mark.asyncio async def test_speculative_cancelled_when_new_message_and_no_send() -> None: """投机调用尚未发出消息时,新消息到达应取消 inflight 并把它合进新一轮。""" @@ -511,3 +532,82 @@ async def slow_flush(items: list[BufferedMessage]) -> None: # 新消息:inflight 是 None,应走"cancel flush task"分支 await batcher.submit(_make_item(text="m2")) await asyncio.wait_for(callback_cancelled.wait(), timeout=1.0) + + +@pytest.mark.asyncio +async def test_speculative_queued_token_cancelled_before_inflight_registered() -> None: + """T2 callback 已完成入队但 inflight 未注册时,新消息应取消旧 token。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.5, + pre_send_seconds=0.05, + strategy="extend", + ) + + callbacks = 0 + first_callback_done = asyncio.Event() + second_callback_done = asyncio.Event() + seen_tokens: list[BatchDispatchToken | None] = [] + + async def enqueue_only(items: list[BufferedMessage]) -> None: + nonlocal callbacks + callbacks += 1 + seen_tokens.append(items[0].batch_token) + if callbacks == 1: + first_callback_done.set() + elif callbacks == 2: + second_callback_done.set() + + batcher = MessageBatcher(cfg, enqueue_only) + + await batcher.submit(_make_item(text="m1")) + await asyncio.wait_for(first_callback_done.wait(), timeout=0.5) + old_token = seen_tokens[0] + assert old_token is not None + assert old_token.speculative is True + assert old_token.cancelled is False + + await batcher.submit(_make_item(text="m2")) + assert old_token.cancelled is True + + await asyncio.wait_for(second_callback_done.wait(), timeout=0.5) + new_token = seen_tokens[1] + assert new_token is not None + assert new_token is not old_token + assert new_token.cancelled is False + + +@pytest.mark.asyncio +async def test_stale_unregister_does_not_clear_new_inflight() -> None: + """旧 inflight 的 finally 不能把新一轮已注册的 inflight 清掉。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.4, + pre_send_seconds=0.05, + strategy="extend", + ) + + async def enqueue_only(items: list[BufferedMessage]) -> None: + return None + + batcher = MessageBatcher(cfg, enqueue_only) + fake_ctx = _FakeRequestContext() + old_task = asyncio.create_task(asyncio.sleep(10.0)) + new_task = asyncio.create_task(asyncio.sleep(10.0)) + + try: + await batcher.submit(_make_item(text="m1")) + await asyncio.sleep(0.08) + batcher.register_inflight("group:1", 100, old_task, fake_ctx) + + await batcher.submit(_make_item(text="m2")) + await asyncio.sleep(0.08) + batcher.register_inflight("group:1", 100, new_task, fake_ctx) + + batcher.unregister_inflight("group:1", 100, old_task) + snap = batcher.snapshot() + assert snap["buckets"][0]["has_inflight"] is True + finally: + old_task.cancel() + new_task.cancel() + await asyncio.gather(old_task, new_task, return_exceptions=True) diff --git a/tests/test_message_batcher_integration.py b/tests/test_message_batcher_integration.py index 0185b07b..547ebc94 100644 --- a/tests/test_message_batcher_integration.py +++ b/tests/test_message_batcher_integration.py @@ -18,7 +18,7 @@ from Undefined.config.models import MessageBatcherConfig from Undefined.services.ai_coordinator import AICoordinator -from Undefined.services.message_batcher import MessageBatcher +from Undefined.services.message_batcher import BatchDispatchToken, MessageBatcher def _make_coordinator( @@ -270,3 +270,23 @@ async def test_superadmin_batched_routes_to_superadmin_lane() -> None: assert await_args is not None req = await_args.args[0] assert req["batched_count"] == 2 + + +@pytest.mark.asyncio +async def test_execute_reply_skips_cancelled_batch_token() -> None: + coordinator: Any = object.__new__(AICoordinator) + execute_auto = AsyncMock() + coordinator._execute_auto_reply = execute_auto + token = BatchDispatchToken( + scope="group:1", + sender_id=2, + batch_id=1, + speculative=True, + cancelled=True, + ) + + await coordinator.execute_reply( + {"type": "auto_reply", "_message_batcher_token": token} + ) + + execute_auto.assert_not_called() From df83fc908aafccc1f8c5056eabe07be88f24bacc Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 19:45:09 +0800 Subject: [PATCH 10/34] fix(batcher): retry failed speculative prefire --- docs/message-batching.md | 8 ++-- src/Undefined/services/ai_coordinator.py | 20 +++++++-- src/Undefined/services/message_batcher.py | 45 ++++++++++++------- tests/test_message_batcher.py | 53 +++++++++++++++++++++++ 4 files changed, 103 insertions(+), 23 deletions(-) diff --git a/docs/message-batching.md b/docs/message-batching.md index 05554cce..d41ceb2d 100644 --- a/docs/message-batching.md +++ b/docs/message-batching.md @@ -115,16 +115,18 @@ allow_cancel_after_send = false - inflight **尚未发消息** → 调 `inflight_task.cancel()`,桶回到 `TYPING`,新消息追加进去,重置 T1/T2;inflight 协程在 `RequestContext` 里清理后退出,**不写入回复历史**。 - T2 已经把请求入队但 coordinator 还没注册 inflight → 取消旧 `BatchDispatchToken`;旧请求即使稍后被队列取出,也会在 `execute_reply` 入口跳过,新消息继续合并进重新计时的 batch。 - inflight **已经发过消息** 且 `allow_cancel_after_send=False`(默认安全) → 不取消 inflight,**新消息开新 batch**(旧桶在 inflight 自然结束后清理)。 - - inflight **已经发过消息** 且 `allow_cancel_after_send=True` → 仍取消,可能造成重复发送,仅极端场景启用。 +- **FINALIZING**:旧 batch 已到 T1,若此时又来新消息,直接开新桶,不阻塞旧 inflight 收尾。 +- `allow_cancel_after_send=True` 会在 inflight 已发过消息后仍取消,可能造成半截回复、重复回复或上下文撕裂,仅极端场景启用。 ### 防竞态设计 - 所有桶状态变更在 `MessageBatcher._lock` 内完成;LLM/队列等待不会发生在锁内。 - timer 触发后由 `asyncio.create_task` 创建 flush 协程,强引用挂到 `_pending_tasks: set[Task]`,`task.add_done_callback(self._pending_tasks.discard)` 清理(asyncio 文档要求避免被 GC)。 - T2 预发送会给队列请求附带 `BatchDispatchToken`。新消息抢占时先取消旧 token;若旧请求已入队但尚未执行,`AICoordinator.execute_reply()` 会直接跳过,避免队列拥堵窗口里的陈旧回复。 +- T2 的 `flush_callback` 若异常或被取消,桶会从 `SPECULATING` 回滚到 `TYPING` 并换新 token,保留原 items 等 T1 正常重试,避免静默丢消息。 - T1 到期时如果 batch 已经被 T2 投机发出,只负责结束 bucket/等待已知 inflight,不会再次调用 `flush_callback`,避免同一批消息重复入队。 -- `unregister_inflight(scope, sender_id, task)` 会校验 task 身份;旧任务的 `finally` 不会误清理新一轮已注册的 inflight。 -- `flush_all()` 在关停时遍历所有桶执行等价 T1 路径,并 `await` 所有未完成的 flush task。 +- `unregister_inflight(scope, sender_id, task)` 必须携带 task 身份并校验;旧任务的 `finally` 不会误清理新一轮已注册的 inflight。 +- `flush_all()` 在关停时循环遍历所有桶执行等价 T1 路径,并 `await` 所有未完成的 flush task;若收尾过程中又出现新桶,会继续清空直到没有 pending bucket。 - coordinator 在 `execute_reply` 入口调用 `register_inflight(scope, sender_id, task, ctx)`,在 `finally` 调 `unregister_inflight(...)`;`asyncio.CancelledError` 被识别为 "投机抢占",仅记录信息日志且不重试。 ### 兼容回退 diff --git a/src/Undefined/services/ai_coordinator.py b/src/Undefined/services/ai_coordinator.py index 00f474d7..8d2b389b 100644 --- a/src/Undefined/services/ai_coordinator.py +++ b/src/Undefined/services/ai_coordinator.py @@ -382,6 +382,7 @@ async def send_like_cb(uid: int, times: int = 1) -> None: # 把当前 task 注册到 batcher,使其有能力在新消息到达时取消本次 LLM 调用 batcher = getattr(self, "_batcher", None) current_task = asyncio.current_task() + registered_task: asyncio.Task[Any] | None = None if ( batcher is not None and batcher_scope is not None @@ -390,6 +391,7 @@ async def send_like_cb(uid: int, times: int = 1) -> None: batcher.register_inflight( batcher_scope, sender_id, current_task, ctx ) + registered_task = current_task try: await self.ai.ask( full_question, @@ -413,9 +415,13 @@ async def send_like_cb(uid: int, times: int = 1) -> None: }, ) finally: - if batcher is not None and batcher_scope is not None: + if ( + batcher is not None + and batcher_scope is not None + and registered_task is not None + ): batcher.unregister_inflight( - batcher_scope, sender_id, current_task + batcher_scope, sender_id, registered_task ) except asyncio.CancelledError: # 投机预发送被新消息抢占取消:不写错误日志、不重试 @@ -507,12 +513,14 @@ async def send_private_cb( try: batcher = getattr(self, "_batcher", None) current_task = asyncio.current_task() + registered_task: asyncio.Task[Any] | None = None if ( batcher is not None and batcher_scope is not None and current_task is not None ): batcher.register_inflight(batcher_scope, user_id, current_task, ctx) + registered_task = current_task try: result = await self.ai.ask( full_question, @@ -535,9 +543,13 @@ async def send_private_cb( }, ) finally: - if batcher is not None and batcher_scope is not None: + if ( + batcher is not None + and batcher_scope is not None + and registered_task is not None + ): batcher.unregister_inflight( - batcher_scope, user_id, current_task + batcher_scope, user_id, registered_task ) if result: scope_key = build_attachment_scope( diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index 95c780a2..5a6ec368 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -434,21 +434,14 @@ def register_inflight( ) def unregister_inflight( - self, - scope: str, - sender_id: int, - task: asyncio.Task[Any] | None = None, + self, scope: str, sender_id: int, task: asyncio.Task[Any] ) -> None: """coordinator 在 ``execute_reply`` 结束(含异常/取消)时上报。""" key = (scope, sender_id) state = self._buckets.get(key) if state is None: return - if ( - task is not None - and state.inflight is not None - and state.inflight.task is not task - ): + if state.inflight is not None and state.inflight.task is not task: logger.debug( "[MessageBatcher] 忽略过期 inflight 注销: scope=%s sender=%s phase=%s", scope, @@ -614,10 +607,14 @@ async def _handle_t2(self, key: tuple[str, int]) -> None: ) if speculative_items is not None: + success = False try: - await self._invoke_callback(speculative_items, speculative=True) + success = await self._invoke_callback( + speculative_items, speculative=True + ) finally: - # 清掉自身引用,避免 state 残留指向已结束 task + # 清掉自身引用,避免 state 残留指向已结束 task;若投机 callback + # 异常/取消且桶仍是本次 SPECULATING,则回滚为 TYPING,等待 T1 正常重试。 async with self._lock: state2 = self._buckets.get(key) if ( @@ -625,15 +622,26 @@ async def _handle_t2(self, key: tuple[str, int]) -> None: and state2.speculative_flush_task is asyncio.current_task() ): state2.speculative_flush_task = None + if state2.phase is BatchPhase.SPECULATING and not success: + if state2.dispatch_token is not None: + state2.dispatch_token.cancel() + state2.phase = BatchPhase.TYPING + self._retokenize_locked(state2, key[0], key[1]) + logger.warning( + "[MessageBatcher] 投机预发送失败,回滚等待 T1 重试: " + "scope=%s sender=%s", + key[0], + key[1], + ) async def _invoke_callback( self, items: list[BufferedMessage], *, speculative: bool = False, - ) -> None: + ) -> bool: if not items: - return + return True first = items[0] logger.info( "[MessageBatcher] 发车: scope=%s sender=%s count=%s speculative=%s", @@ -644,6 +652,7 @@ async def _invoke_callback( ) try: await self._flush_callback(items) + return True except asyncio.CancelledError: # 投机被新消息取消是预期行为 logger.info( @@ -653,6 +662,7 @@ async def _invoke_callback( first.sender_id, speculative, ) + return False except Exception: logger.exception( "[MessageBatcher] flush_callback 异常: scope=%s sender=%s count=%s", @@ -660,6 +670,7 @@ async def _invoke_callback( first.sender_id, len(items), ) + return False # ------------------------------------------------------------ shutdown @@ -668,9 +679,11 @@ async def flush_all(self) -> None: 关停时直接对所有桶执行 T1 等价路径并等 inflight 收尾。 """ - async with self._lock: - keys = list(self._buckets.keys()) - if keys: + while True: + async with self._lock: + keys = list(self._buckets.keys()) + if not keys: + break logger.info("[MessageBatcher] flush_all: pending_buckets=%s", len(keys)) for key in keys: await self._handle_t1(key) diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index 6070be3e..77d1f53c 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -534,6 +534,35 @@ async def slow_flush(items: list[BufferedMessage]) -> None: await asyncio.wait_for(callback_cancelled.wait(), timeout=1.0) +@pytest.mark.asyncio +async def test_speculative_callback_failure_rolls_back_for_t1_retry() -> None: + """T2 callback 失败不能丢消息;应回到 TYPING,等 T1 再发一次。""" + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.12, + pre_send_seconds=0.03, + strategy="extend", + ) + + calls = 0 + recovered = asyncio.Event() + + async def flaky_flush(items: list[BufferedMessage]) -> None: + nonlocal calls + calls += 1 + if calls == 1: + raise RuntimeError("temporary enqueue failure") + recovered.set() + + batcher = MessageBatcher(cfg, flaky_flush) + + await batcher.submit(_make_item(text="m1")) + await asyncio.wait_for(recovered.wait(), timeout=0.5) + + assert calls == 2 + assert not batcher.has_buffer("group:1", 100) + + @pytest.mark.asyncio async def test_speculative_queued_token_cancelled_before_inflight_registered() -> None: """T2 callback 已完成入队但 inflight 未注册时,新消息应取消旧 token。""" @@ -611,3 +640,27 @@ async def enqueue_only(items: list[BufferedMessage]) -> None: old_task.cancel() new_task.cancel() await asyncio.gather(old_task, new_task, return_exceptions=True) + + +@pytest.mark.asyncio +async def test_flush_all_loops_until_concurrent_bucket_is_flushed() -> None: + """flush_all 快照后若 callback 又创建新桶,也应继续清空。""" + cfg = MessageBatcherConfig(enabled=True, window_seconds=10.0) + batches: list[list[str]] = [] + injected = False + batcher: MessageBatcher + + async def callback(items: list[BufferedMessage]) -> None: + nonlocal injected + batches.append([item.text for item in items]) + if not injected: + injected = True + await batcher.submit(_make_item(sender_id=101, text="late")) + + batcher = MessageBatcher(cfg, callback) + + await batcher.submit(_make_item(sender_id=100, text="first")) + await batcher.flush_all() + + assert batches == [["first"], ["late"]] + assert batcher.snapshot()["pending_buckets"] == 0 From 71f9c4a9c8f3aedaccddaba330c6fa2877ba7332 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 20:04:53 +0800 Subject: [PATCH 11/34] fix(batcher): drain queued batches on shutdown --- ARCHITECTURE.md | 1 + docs/configuration.md | 2 +- docs/message-batching.md | 5 +- docs/openapi.md | 2 +- src/Undefined/handlers.py | 4 +- src/Undefined/main.py | 4 +- src/Undefined/services/message_batcher.py | 309 +++++++++++----------- src/Undefined/services/queue_manager.py | 36 +++ tests/test_message_batcher.py | 20 ++ tests/test_message_batcher_integration.py | 32 +++ tests/test_queue_manager.py | 40 +++ 11 files changed, 300 insertions(+), 155 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 0562adb1..28145320 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -867,6 +867,7 @@ description: 从 PDF 文件中提取文本和表格,填写表单。当用户 * **非阻塞发车**:实现了可配置节奏的非阻塞调度循环(默认 **1Hz**)。列车按节奏出发,带走一个请求到后台异步处理。 * **高可用性**:即使前一个请求仍在处理(如耗时的网络搜索),新的请求也会按时被分发,不会造成队列堵塞。 * **优先级管理**:支持四级优先级(超级管理员 > 私聊 > 群聊@ > 群聊普通),确保重要消息优先响应。 +* **关停收敛**:`MessageHandler.close()` 会先 flush `MessageBatcher`,再调用 `QueueManager.drain()` 等待已入队请求和在途请求自然完成,最后才停止队列处理器,避免缓冲消息只入队未执行。 ### 6个智能体 Agent diff --git a/docs/configuration.md b/docs/configuration.md index b9d9fa8b..cec91b52 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -468,7 +468,7 @@ Prompt caching 补充: | `pre_send_seconds` | `0.0` | 投机预发送阈值(秒)。`0 < pre_send_seconds < window_seconds` 时启用:静默到该阈值先把当前 batch 提前发给 LLM 抢时间(speculative pre-fire),但 batch 仍要等到 `window_seconds` 才正式结束;新消息在投机期间到达且 inflight 调用尚未发出消息时会取消 inflight 并把消息合并入下一轮调用。`0` 或 `>= window_seconds` 视为关闭 | | `allow_cancel_after_send` | `false` | 投机调用已向用户发出消息后是否仍允许新消息取消该 inflight。默认 `false`(安全:不取消,新消息开新 batch);启用后可能造成重复发送 | -启用后,同一发送者在窗口内连续发送的多条消息会合并到同一轮 AI 调用,`` 块按时间顺序排列,AI 一次性处理整批意图。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理(不打断 buffer);首条 @bot 进入 buffer 时整批发车走 `add_group_mention_request`。配置支持热更新,关停时会 `flush_all` 避免丢消息。详细行为矩阵与设计要点见 [docs/message-batching.md](message-batching.md)。 +启用后,同一发送者在窗口内连续发送的多条消息会合并到同一轮 AI 调用,`` 块按时间顺序排列,AI 一次性处理整批意图。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理(不打断 buffer);首条 @bot 进入 buffer 时整批发车走 `add_group_mention_request`。配置支持热更新,关停时会 `flush_all` 并等待队列 drain,避免缓冲消息只入队未执行。详细行为矩阵与设计要点见 [docs/message-batching.md](message-batching.md)。 --- diff --git a/docs/message-batching.md b/docs/message-batching.md index d41ceb2d..759201a5 100644 --- a/docs/message-batching.md +++ b/docs/message-batching.md @@ -16,7 +16,7 @@ - **群聊 @bot 规则**: - 当前桶**为空**且新消息 @bot → 进入 buffer,本批走 `add_group_mention_request`(提及优先级)。 - 当前桶**非空**且新消息 @bot → 不打断现有 buffer,**单独立即处理**这条 @bot 消息。 -- **关停**:`MessageBatcher.flush_all()` 在进程退出前 flush 所有未发车的桶,避免丢消息。 +- **关停**:`MessageBatcher.flush_all()` 在进程退出前 flush 所有未发车的桶,并进入 shutdown 模式;之后新消息不再进入缓冲桶,而是立即直送,避免关停期间出现无限等待或漏桶。`MessageHandler.close()` 会在停止队列前等待队列 drain 完成。 ## Prompt 行为 @@ -126,7 +126,8 @@ allow_cancel_after_send = false - T2 的 `flush_callback` 若异常或被取消,桶会从 `SPECULATING` 回滚到 `TYPING` 并换新 token,保留原 items 等 T1 正常重试,避免静默丢消息。 - T1 到期时如果 batch 已经被 T2 投机发出,只负责结束 bucket/等待已知 inflight,不会再次调用 `flush_callback`,避免同一批消息重复入队。 - `unregister_inflight(scope, sender_id, task)` 必须携带 task 身份并校验;旧任务的 `finally` 不会误清理新一轮已注册的 inflight。 -- `flush_all()` 在关停时循环遍历所有桶执行等价 T1 路径,并 `await` 所有未完成的 flush task;若收尾过程中又出现新桶,会继续清空直到没有 pending bucket。 +- `flush_all()` 在关停时设置 shutdown 标记,循环遍历所有桶执行等价 T1 路径,并 `await` 所有未完成的 flush task;若收尾过程中又出现新桶,会继续清空直到没有 pending bucket。shutdown 之后的新消息直接发车,不再开缓冲桶。 +- `MessageHandler.close()` 的顺序是:停止自动管线热重载 → `message_batcher.flush_all()` → `queue_manager.drain()` 等待已入队/在途回复自然收敛 → `queue_manager.stop()` → flush 历史落盘。 - coordinator 在 `execute_reply` 入口调用 `register_inflight(scope, sender_id, task, ctx)`,在 `finally` 调 `unregister_inflight(...)`;`asyncio.CancelledError` 被识别为 "投机抢占",仅记录信息日志且不重试。 ### 兼容回退 diff --git a/docs/openapi.md b/docs/openapi.md index 11fdefe9..9ab36645 100644 --- a/docs/openapi.md +++ b/docs/openapi.md @@ -102,7 +102,7 @@ curl http://127.0.0.1:8788/openapi.json | `uptime_seconds` | `float` | 进程运行时长(秒) | | `onebot` | `object` | OneBot 连接状态(`connected`、`running`、`ws_url` 等) | | `queues` | `object` | 请求队列快照(`processor_count`、`inflight_count`、`totals` 按优先级分布;lane 包含 `superadmin`、`group_superadmin`、`private`、`group_mention`、`group_normal`、`background`,`retry` 表示各 lane 中待执行的 LLM 重试请求数) | -| `message_batcher` | `object` | 消息合并器快照(`config` 含 `enabled`/`window_seconds`/`pre_send_seconds`/`speculative_enabled`/`strategy`/`max_window_seconds`/`max_messages_per_batch`/`group_enabled`/`private_enabled`/`allow_cancel_after_send`;`pending_buckets` 当前缓冲桶数;`buckets[]` 列出每个桶的 `scope`/`sender_id`/`count`/`elapsed_seconds`/`phase`(`typing`/`speculating`/`finalizing`)/`has_inflight`/`has_speculative_dispatch`) | +| `message_batcher` | `object` | 消息合并器快照(`config` 含 `enabled`/`window_seconds`/`pre_send_seconds`/`speculative_enabled`/`strategy`/`max_window_seconds`/`max_messages_per_batch`/`group_enabled`/`private_enabled`/`allow_cancel_after_send`/`shutdown`;`pending_buckets` 当前缓冲桶数;`buckets[]` 列出每个桶的 `scope`/`sender_id`/`count`/`elapsed_seconds`/`phase`(`typing`/`speculating`/`finalizing`)/`has_inflight`/`has_speculative_dispatch`) | | `memory` | `object` | 长期记忆(`count`:条数) | | `cognitive` | `object` | 认知服务(`enabled`、`queue`) | | `api` | `object` | Runtime API 配置(`enabled`、`host`、`port`、`openapi_enabled`) | diff --git a/src/Undefined/handlers.py b/src/Undefined/handlers.py index 28fb9e47..7c91d072 100644 --- a/src/Undefined/handlers.py +++ b/src/Undefined/handlers.py @@ -1373,7 +1373,9 @@ async def close(self) -> None: *list(self._background_tasks), return_exceptions=True, ) - await self.history_manager.flush_pending_saves() await self.auto_pipeline_registry.stop_hot_reload() + await self.message_batcher.flush_all() + await self.ai_coordinator.queue_manager.drain() await self.ai_coordinator.queue_manager.stop() + await self.history_manager.flush_pending_saves() logger.info("消息处理器已关闭") diff --git a/src/Undefined/main.py b/src/Undefined/main.py index 69a05aa0..edcfc291 100644 --- a/src/Undefined/main.py +++ b/src/Undefined/main.py @@ -511,9 +511,9 @@ def _apply_config_updates( finally: logger.info("[清理] 正在关闭机器人并释放资源...") try: - await handler.message_batcher.flush_all() + await handler.close() except Exception: - logger.exception("[清理] MessageBatcher flush_all 失败") + logger.exception("[清理] MessageHandler close 失败") if runtime_api_server is not None: await runtime_api_server.stop() if meme_worker is not None: diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index 5a6ec368..5d028151 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -174,6 +174,7 @@ def __init__( # 持有 timer 触发后创建的 flush task 强引用,避免被 GC(asyncio 文档要求) self._pending_tasks: set[asyncio.Task[None]] = set() self._next_batch_id = 0 + self._shutdown = False # ------------------------------------------------------------------ public @@ -224,78 +225,102 @@ async def submit(self, item: BufferedMessage) -> None: immediate_fire_items: list[BufferedMessage] | None = None async with self._lock: - state = self._buckets.get(key) - now_mono = time.monotonic() - - # === 阶段 1: 决定本条消息怎么进桶 === - if state is None: - # 全新桶 - state = _BatchState( - phase=BatchPhase.TYPING, - first_arrival_monotonic=now_mono, - dispatch_token=self._new_token(item.scope, item.sender_id), - ) - self._buckets[key] = state - state.items.append(item) - elif state.phase is BatchPhase.SPECULATING: - # 已 pre-fire,决定是否 cancel inflight - inflight = state.inflight - already_sent = ( - _was_message_sent_this_turn(inflight.request_context) - if inflight is not None - else False + if self._shutdown: + logger.info( + "[MessageBatcher] 已进入关停模式,新消息立即发车: scope=%s sender=%s", + item.scope, + item.sender_id, ) - allow_cancel = (not already_sent) or cfg.allow_cancel_after_send + immediate_fire_items = [item] + else: + now_mono = time.monotonic() + state = self._buckets.get(key) - if inflight is not None and allow_cancel: - logger.info( - "[MessageBatcher] 投机调用被新消息抢占取消: scope=%s sender=%s " - "already_sent=%s allow_cancel_after_send=%s", - item.scope, - item.sender_id, - already_sent, - cfg.allow_cancel_after_send, + # === 阶段 1: 决定本条消息怎么进桶 === + if state is None: + # 全新桶 + state = _BatchState( + phase=BatchPhase.TYPING, + first_arrival_monotonic=now_mono, + dispatch_token=self._new_token(item.scope, item.sender_id), ) - if state.dispatch_token is not None: - state.dispatch_token.cancel() - inflight.task.cancel() - state.inflight = None - state.phase = BatchPhase.TYPING - # 新消息追加到现有 items 后面 + self._buckets[key] = state state.items.append(item) - self._retokenize_locked(state, item.scope, item.sender_id) - elif inflight is None: - # inflight 尚未注册(coordinator 还没进入 execute_reply): - # 1) 若 flush task 仍在跑,先 cancel; - # 2) 若它已经把请求入队,则取消旧 token,execute_reply 入口会跳过旧请求。 - logger.info( - "[MessageBatcher] inflight 未注册,取消投机 token/flush task: " - "scope=%s sender=%s", - item.scope, - item.sender_id, + elif state.phase is BatchPhase.SPECULATING: + # 已 pre-fire,决定是否 cancel inflight + inflight = state.inflight + already_sent = ( + _was_message_sent_this_turn(inflight.request_context) + if inflight is not None + else False ) - if state.dispatch_token is not None: - state.dispatch_token.cancel() - if state.speculative_flush_task is not None: - state.speculative_flush_task.cancel() - state.speculative_flush_task = None - state.phase = BatchPhase.TYPING - state.items.append(item) - self._retokenize_locked(state, item.scope, item.sender_id) - else: - # 已发过消息且不允许取消:丢弃当前桶,新消息开新桶 - logger.info( - "[MessageBatcher] 投机调用已发出消息且不允许取消,新消息开新 batch: " + allow_cancel = (not already_sent) or cfg.allow_cancel_after_send + + if inflight is not None and allow_cancel: + logger.info( + "[MessageBatcher] 投机调用被新消息抢占取消: scope=%s sender=%s " + "already_sent=%s allow_cancel_after_send=%s", + item.scope, + item.sender_id, + already_sent, + cfg.allow_cancel_after_send, + ) + if state.dispatch_token is not None: + state.dispatch_token.cancel() + inflight.task.cancel() + state.inflight = None + state.phase = BatchPhase.TYPING + # 新消息追加到现有 items 后面 + state.items.append(item) + self._retokenize_locked(state, item.scope, item.sender_id) + elif inflight is None: + # inflight 尚未注册(coordinator 还没进入 execute_reply): + # 1) 若 flush task 仍在跑,先 cancel; + # 2) 若它已经把请求入队,则取消旧 token,execute_reply 入口会跳过旧请求。 + logger.info( + "[MessageBatcher] inflight 未注册,取消投机 token/flush task: " + "scope=%s sender=%s", + item.scope, + item.sender_id, + ) + if state.dispatch_token is not None: + state.dispatch_token.cancel() + if state.speculative_flush_task is not None: + state.speculative_flush_task.cancel() + state.speculative_flush_task = None + state.phase = BatchPhase.TYPING + state.items.append(item) + self._retokenize_locked(state, item.scope, item.sender_id) + else: + # 已发过消息且不允许取消:丢弃当前桶,新消息开新桶 + logger.info( + "[MessageBatcher] 投机调用已发出消息且不允许取消,新消息开新 batch: " + "scope=%s sender=%s", + item.scope, + item.sender_id, + ) + self._cancel_t1(state) + self._cancel_t2(state) + state.phase = BatchPhase.FINALIZING + # 旧桶让 inflight 自然结束;从 _buckets pop 以释放 key 给新 batch + self._buckets.pop(key, None) + # 新桶 + state = _BatchState( + phase=BatchPhase.TYPING, + first_arrival_monotonic=now_mono, + dispatch_token=self._new_token(item.scope, item.sender_id), + ) + self._buckets[key] = state + state.items.append(item) + elif state.phase is BatchPhase.FINALIZING: + # 极少见:T1 已到、inflight 未上报但 task 已不可控;当作新桶处理 + logger.warning( + "[MessageBatcher] 桶处于 FINALIZING 期间收到新消息,开新 batch: " "scope=%s sender=%s", item.scope, item.sender_id, ) - self._cancel_t1(state) - self._cancel_t2(state) - state.phase = BatchPhase.FINALIZING - # 旧桶让 inflight 自然结束;从 _buckets pop 以释放 key 给新 batch self._buckets.pop(key, None) - # 新桶 state = _BatchState( phase=BatchPhase.TYPING, first_arrival_monotonic=now_mono, @@ -303,106 +328,92 @@ async def submit(self, item: BufferedMessage) -> None: ) self._buckets[key] = state state.items.append(item) - elif state.phase is BatchPhase.FINALIZING: - # 极少见:T1 已到、inflight 未上报但 task 已不可控;当作新桶处理 - logger.warning( - "[MessageBatcher] 桶处于 FINALIZING 期间收到新消息,开新 batch: " - "scope=%s sender=%s", - item.scope, - item.sender_id, - ) - self._buckets.pop(key, None) - state = _BatchState( - phase=BatchPhase.TYPING, - first_arrival_monotonic=now_mono, - dispatch_token=self._new_token(item.scope, item.sender_id), - ) - self._buckets[key] = state - state.items.append(item) - else: # TYPING:直接 append - state.items.append(item) - - self._bind_items_to_token_locked(state) + else: # TYPING:直接 append + state.items.append(item) - # === 阶段 2: 重置 T1/T2 timer === - self._cancel_t1(state) - self._cancel_t2(state) + self._bind_items_to_token_locked(state) - elapsed = now_mono - state.first_arrival_monotonic - unlimited_window = cfg.max_window_seconds <= 0 - remaining_max = ( - float("inf") if unlimited_window else cfg.max_window_seconds - elapsed - ) + # === 阶段 2: 重置 T1/T2 timer === + self._cancel_t1(state) + self._cancel_t2(state) - # 硬顶:max_messages_per_batch 立即发车(结束 batch) - if ( - cfg.max_messages_per_batch > 0 - and len(state.items) >= cfg.max_messages_per_batch - ): - logger.info( - "[MessageBatcher] 达到 max_messages_per_batch=%s 立即发车: " - "scope=%s sender=%s", - cfg.max_messages_per_batch, - item.scope, - item.sender_id, - ) - immediate_fire_items = self._pop_locked(key) - elif not unlimited_window and remaining_max <= 0: - logger.info( - "[MessageBatcher] 已超 max_window_seconds 硬顶 立即发车: " - "scope=%s sender=%s elapsed=%.2fs", - item.scope, - item.sender_id, - elapsed, - ) - immediate_fire_items = self._pop_locked(key) - else: - # T1 delay - if cfg.strategy == "fixed": - target = state.first_arrival_monotonic + cfg.window_seconds - t1_delay = max(0.0, target - now_mono) - else: # extend - t1_delay = cfg.window_seconds - if not unlimited_window: - t1_delay = min(t1_delay, remaining_max) - - loop = asyncio.get_running_loop() - state.t1_handle = loop.call_later( - max(0.0, t1_delay), self._on_t1_timer, key + elapsed = now_mono - state.first_arrival_monotonic + unlimited_window = cfg.max_window_seconds <= 0 + remaining_max = ( + float("inf") + if unlimited_window + else cfg.max_window_seconds - elapsed ) - # T2 delay(仅当投机启用,且本桶尚未 pre-fire 时设置) + # 硬顶:max_messages_per_batch 立即发车(结束 batch) if ( - self.speculative_enabled - and state.phase is BatchPhase.TYPING - and cfg.pre_send_seconds < t1_delay + cfg.max_messages_per_batch > 0 + and len(state.items) >= cfg.max_messages_per_batch ): - t2_delay = cfg.pre_send_seconds - state.t2_handle = loop.call_later( - max(0.0, t2_delay), self._on_t2_timer, key - ) - logger.debug( - "[MessageBatcher] 缓冲: scope=%s sender=%s count=%s " - "t1=%.2fs t2=%.2fs strategy=%s", + logger.info( + "[MessageBatcher] 达到 max_messages_per_batch=%s 立即发车: " + "scope=%s sender=%s", + cfg.max_messages_per_batch, item.scope, item.sender_id, - len(state.items), - t1_delay, - t2_delay, - cfg.strategy, ) - else: - logger.debug( - "[MessageBatcher] 缓冲: scope=%s sender=%s count=%s " - "t1=%.2fs strategy=%s phase=%s", + immediate_fire_items = self._pop_locked(key) + elif not unlimited_window and remaining_max <= 0: + logger.info( + "[MessageBatcher] 已超 max_window_seconds 硬顶 立即发车: " + "scope=%s sender=%s elapsed=%.2fs", item.scope, item.sender_id, - len(state.items), - t1_delay, - cfg.strategy, - state.phase.value, + elapsed, + ) + immediate_fire_items = self._pop_locked(key) + else: + # T1 delay + if cfg.strategy == "fixed": + target = state.first_arrival_monotonic + cfg.window_seconds + t1_delay = max(0.0, target - now_mono) + else: # extend + t1_delay = cfg.window_seconds + if not unlimited_window: + t1_delay = min(t1_delay, remaining_max) + + loop = asyncio.get_running_loop() + state.t1_handle = loop.call_later( + max(0.0, t1_delay), self._on_t1_timer, key ) + # T2 delay(仅当投机启用,且本桶尚未 pre-fire 时设置) + if ( + self.speculative_enabled + and state.phase is BatchPhase.TYPING + and cfg.pre_send_seconds < t1_delay + ): + t2_delay = cfg.pre_send_seconds + state.t2_handle = loop.call_later( + max(0.0, t2_delay), self._on_t2_timer, key + ) + logger.debug( + "[MessageBatcher] 缓冲: scope=%s sender=%s count=%s " + "t1=%.2fs t2=%.2fs strategy=%s", + item.scope, + item.sender_id, + len(state.items), + t1_delay, + t2_delay, + cfg.strategy, + ) + else: + logger.debug( + "[MessageBatcher] 缓冲: scope=%s sender=%s count=%s " + "t1=%.2fs strategy=%s phase=%s", + item.scope, + item.sender_id, + len(state.items), + t1_delay, + cfg.strategy, + state.phase.value, + ) + # 锁外执行 callback if immediate_fire_items is not None: await self._invoke_callback(immediate_fire_items) @@ -681,6 +692,7 @@ async def flush_all(self) -> None: """ while True: async with self._lock: + self._shutdown = True keys = list(self._buckets.keys()) if not keys: break @@ -733,6 +745,7 @@ def snapshot(self) -> dict[str, Any]: "group_enabled": cfg.group_enabled, "private_enabled": cfg.private_enabled, "allow_cancel_after_send": cfg.allow_cancel_after_send, + "shutdown": self._shutdown, }, "pending_buckets": len(buckets), "buckets": buckets, diff --git a/src/Undefined/services/queue_manager.py b/src/Undefined/services/queue_manager.py index 058fc12c..18a908e2 100644 --- a/src/Undefined/services/queue_manager.py +++ b/src/Undefined/services/queue_manager.py @@ -164,6 +164,8 @@ def __init__( self._model_queues: dict[str, ModelQueue] = {} self._processor_tasks: dict[str, asyncio.Task[None]] = {} self._inflight_tasks: set[asyncio.Task[None]] = set() + self._work_changed = asyncio.Event() + self._work_changed.set() self._next_dispatch_at: dict[str, float] = {} self._request_handler: ( Callable[[dict[str, Any]], Coroutine[Any, Any, None]] | None @@ -255,6 +257,37 @@ async def stop(self) -> None: logger.info("[队列服务] 所有队列处理任务已停止") + def _pending_request_count(self) -> int: + return sum( + lane_queue.qsize() + for queue in self._model_queues.values() + for lane_queue in queue.lane_queues().values() + ) + + def _active_inflight_count(self) -> int: + return sum(1 for task in self._inflight_tasks if not task.done()) + + async def drain(self) -> None: + """等待已入队请求和在途请求自然收敛,不取消处理器。""" + logger.info( + "[队列服务] 开始等待队列收敛: pending=%s inflight=%s", + self._pending_request_count(), + self._active_inflight_count(), + ) + while True: + pending = self._pending_request_count() + inflight = self._active_inflight_count() + if pending == 0 and inflight == 0: + logger.info("[队列服务] 队列已收敛") + return + self._work_changed.clear() + pending = self._pending_request_count() + inflight = self._active_inflight_count() + if pending == 0 and inflight == 0: + logger.info("[队列服务] 队列已收敛") + return + await self._work_changed.wait() + def _track_inflight_task(self, task: asyncio.Task[None]) -> None: """追踪在途任务,并在完成时自动移除。""" @@ -262,6 +295,7 @@ def _track_inflight_task(self, task: asyncio.Task[None]) -> None: def _cleanup(done_task: asyncio.Task[None]) -> None: self._inflight_tasks.discard(done_task) + self._work_changed.set() task.add_done_callback(_cleanup) @@ -373,6 +407,7 @@ async def _enqueue_lane_request( await lane_queue.put_second(request) else: await lane_queue.put(request) + self._work_changed.set() logger.info( "[队列入队][%s] %s: size=%s %s", model_name, @@ -540,6 +575,7 @@ async def _process_model_loop(self, model_name: str) -> None: ] if request is not None: + self._work_changed.set() request_type = request.get("type", "unknown") retry_count = int(request.get("_retry_count", 0) or 0) retry_suffix = ( diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index 77d1f53c..55d5f309 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -664,3 +664,23 @@ async def callback(items: list[BufferedMessage]) -> None: assert batches == [["first"], ["late"]] assert batcher.snapshot()["pending_buckets"] == 0 + + +@pytest.mark.asyncio +async def test_submit_after_flush_all_dispatches_immediately() -> None: + """进入关停模式后新消息不再建桶,避免 flush_all 与 submit 互相追逐。""" + cfg = MessageBatcherConfig(enabled=True, window_seconds=10.0) + rec = _Recorder() + batcher = MessageBatcher(cfg, rec) + + await batcher.submit(_make_item(text="before-shutdown")) + await batcher.flush_all() + await batcher.submit(_make_item(text="after-shutdown")) + + assert [[item.text for item in batch] for batch in rec.batches] == [ + ["before-shutdown"], + ["after-shutdown"], + ] + snap = batcher.snapshot() + assert snap["pending_buckets"] == 0 + assert snap["config"]["shutdown"] is True diff --git a/tests/test_message_batcher_integration.py b/tests/test_message_batcher_integration.py index 547ebc94..752407d5 100644 --- a/tests/test_message_batcher_integration.py +++ b/tests/test_message_batcher_integration.py @@ -17,6 +17,7 @@ import pytest from Undefined.config.models import MessageBatcherConfig +from Undefined.handlers import MessageHandler from Undefined.services.ai_coordinator import AICoordinator from Undefined.services.message_batcher import BatchDispatchToken, MessageBatcher @@ -290,3 +291,34 @@ async def test_execute_reply_skips_cancelled_batch_token() -> None: ) execute_auto.assert_not_called() + + +@pytest.mark.asyncio +async def test_message_handler_close_flushes_batcher_then_drains_queue() -> None: + handler: Any = object.__new__(MessageHandler) + order: list[str] = [] + handler._background_tasks = set() + handler.message_batcher = SimpleNamespace( + flush_all=AsyncMock(side_effect=lambda: order.append("flush_batcher")) + ) + queue_manager = SimpleNamespace( + drain=AsyncMock(side_effect=lambda: order.append("drain_queue")), + stop=AsyncMock(side_effect=lambda: order.append("stop_queue")), + ) + handler.ai_coordinator = SimpleNamespace(queue_manager=queue_manager) + handler.history_manager = SimpleNamespace( + flush_pending_saves=AsyncMock(side_effect=lambda: order.append("flush_history")) + ) + handler.auto_pipeline_registry = SimpleNamespace( + stop_hot_reload=AsyncMock(side_effect=lambda: order.append("stop_pipeline")) + ) + + await handler.close() + + assert order == [ + "stop_pipeline", + "flush_batcher", + "drain_queue", + "stop_queue", + "flush_history", + ] diff --git a/tests/test_queue_manager.py b/tests/test_queue_manager.py index 62baac67..c5b398c5 100644 --- a/tests/test_queue_manager.py +++ b/tests/test_queue_manager.py @@ -146,6 +146,46 @@ async def _handler(request: dict[str, Any]) -> None: await queue_manager.stop() +@pytest.mark.asyncio +async def test_drain_waits_for_pending_and_inflight_requests() -> None: + queue_manager = QueueManager(ai_request_interval=0.0) + first_started = asyncio.Event() + release_first = asyncio.Event() + handled: list[str] = [] + + async def _handler(request: dict[str, Any]) -> None: + request_id = str(request["request_id"]) + handled.append(request_id) + if request_id == "first": + first_started.set() + await release_first.wait() + + queue_manager.start(_handler) + await queue_manager.add_private_request( + {"type": "private_reply", "request_id": "first"}, + model_name="chat-model", + ) + await queue_manager.add_private_request( + {"type": "private_reply", "request_id": "second"}, + model_name="chat-model", + ) + + drain_task = asyncio.create_task(queue_manager.drain()) + try: + await asyncio.wait_for(first_started.wait(), timeout=1.0) + assert not drain_task.done() + release_first.set() + await asyncio.wait_for(drain_task, timeout=1.0) + finally: + release_first.set() + if not drain_task.done(): + drain_task.cancel() + await asyncio.gather(drain_task, return_exceptions=True) + await queue_manager.stop() + + assert handled == ["first", "second"] + + @pytest.mark.asyncio async def test_non_llm_request_failure_is_not_retried_and_snapshot_counts_retry() -> ( None From a5d7c4d86c5d9ea0374df4ec5fa120769db01659 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 20:59:31 +0800 Subject: [PATCH 12/34] fix(ai): defer meme search after text replies --- docs/memes.md | 2 +- res/prompts/undefined.xml | 19 ++++---- res/prompts/undefined_nagaagent.xml | 19 ++++---- src/Undefined/ai/client.py | 48 +++++++++++++++++-- src/Undefined/services/ai_coordinator.py | 30 ++++++------ .../agents/entertainment_agent/prompt.md | 4 +- tests/test_ai_client_tool_guard.py | 28 +++++++++++ tests/test_ai_coordinator_queue_routing.py | 5 +- tests/test_system_prompt_constraints.py | 4 +- 9 files changed, 116 insertions(+), 43 deletions(-) create mode 100644 tests/test_ai_client_tool_guard.py diff --git a/docs/memes.md b/docs/memes.md index a01b6fc1..a4d8f671 100644 --- a/docs/memes.md +++ b/docs/memes.md @@ -28,7 +28,7 @@ Undefined 平台自 3.3.0 版本起内置了强大的**全局表情包库**功 存储与索引完成后,AI Agent 会通过内置的 `memes.*` 系列工具使用表情包: - **`memes.search_memes`**:支持关键词检索(基于 SQLite)、语义检索(基于 ChromaDB 向量相似度)与混合检索(Hybrid)。AI 可借此根据当前对话的语境快速寻找最有梗的静态图或 GIF。 - **发送机制**:使用统一的图片 `uid` 进行索引。系统不仅提供了 `memes.send_meme_by_uid` 让 AI 一键发送表情包,还支持 AI 输出 `` 统一资源标签指令进行图文混排。 -- **回复顺序**:如果表情包本身就能完成表达,AI 可以直接搜索并发送表情包;如果同一轮既需要文字发言又想补表情包,提示词要求先发送必要文字,再把 `memes.search_memes` / `memes.send_meme_by_uid` 放到后续轮次,避免表情包检索拖慢首条回复体验。 +- **回复顺序**:只有当本轮明确是纯表情包 / 纯反应图回复时,AI 才应先搜索并发送表情包。凡是需要文字承接、解释、答疑、推进任务或确认操作的场景,都必须先发送必要文字;如果仍想补表情包,再把 `memes.search_memes` / `memes.send_meme_by_uid` 放到后续轮次,避免表情包检索拖慢首条回复体验。 ## 目录结构与配置 diff --git a/res/prompts/undefined.xml b/res/prompts/undefined.xml index 082fafbd..a0fdddf3 100644 --- a/res/prompts/undefined.xml +++ b/res/prompts/undefined.xml @@ -146,14 +146,15 @@ - + **图文混排规则:** - - 如果你已经决定要回复,并且只靠表情包就能完成表达,默认先尝试表情包,而不是先写文字 - - 如果本轮既需要文字发言又想配表情包,先调用 `send_message` 发出必要文字;`memes.search_memes` 和 `memes.send_meme_by_uid` 放到后续响应轮次再做,因为表情包检索可能拖慢首条回复体验 + - 只有当本轮回复目标明确是“纯表情包/纯反应图”(用户直接要求发表情包,或只需要一个无文字反应且不承担信息传递)时,才允许第一轮先调用 `memes.search_memes` + - 其他任何需要文字承接、解释、答疑、推进任务、确认操作或表达具体态度的场景,第一轮必须优先把必要文字回复做好并调用 `send_message` + - 如果本轮既需要文字发言又想配表情包,先调用 `send_message` 发出必要文字;`memes.search_memes` 和 `memes.send_meme_by_uid` 只能放到后续响应轮次再做,因为表情包检索可能拖慢首条回复体验 + - 当不确定是不是纯表情包场景,按非纯表情包处理:先文字,后检索或不检索;不要为了“增强语气”在首轮抢先调用 `memes.search_memes` - 如果要发送独立表情包,先用 `memes.search_memes` 找到合适的图片 `uid`,再用 `memes.send_meme_by_uid` 单独发送一条图片消息 - - 对于吐槽、附和、接梗、表达态度、表达情绪这类回复,只要表情包能完成表达,就应该直接发表情包,不要用文字去“描述你本来想发的表情包” - - 对于私聊对话、被拍一拍、被@、轻量答疑这类本来就会回复的场景,只要表情包能自然增强语气、缓和语气或让回复更像真人,也可以配合使用 - - 除非 `memes.search_memes` 没找到合适结果,或表情包会干扰信息传递,否则不要把本来适合发图的反应先写成一句话来代替发图 + - 对于吐槽、附和、接梗、表达态度、表达情绪这类回复,只有在它们确实属于纯表情包回复时才先发表情包;否则先用文字自然回应,表情包最多作为后置补充 + - 对于私聊对话、被拍一拍、被@、轻量答疑这类本来就会回复的场景,如果文字本身有用,先发文字;表情包只作为后续可选增强,不能阻塞首条文字回复 - 表情包相关规则只决定“怎么回复”,不单独构成“该不该回复”的参与许可;是否回复仍以前面的回复触发逻辑为准 - 默认不要把表情包和正文写进同一条消息;需要补一句解释时,优先分成两条消息发送;如果文字本身是必要回复,先发文字,再延后检索和发送表情包 - 推荐使用统一标签 `` 引用任何附件(图片或文件),系统根据 UID 前缀自动处理: @@ -630,11 +631,11 @@ 图片处理 先判断是否需要参与:只有当图片与当前对话强相关、且回答必须依赖图片内容时才分析 - 表情包先理解意思;它不只适用于轻松闲聊。只要你已经决定要回复,并且表情包能让表达更像真人,就可以考虑使用,包括私聊对话、被拍一拍、被@、轻量答疑与轻松互动场景 + 表情包先理解意思;它不只适用于轻松闲聊。但只有明确纯表情包回复才先检索表情包;凡是需要文字承接、答疑、解释或推进任务的场景,都先发送必要文字,表情包最多放到后续轮次作为可选补充 只有在需要分析图片内容时才调用 file_analysis_agent(如报错截图/界面/文档/图片问题) 当消息中出现“[图片: xxx]”占位符时,xxx 即为 file_id 或 URL,可直接作为 file_source 调用 file_analysis_agent 未调用 file_analysis_agent 时,不要猜测图片内容;可以说明“我看不到图片内容,需要先分析” - 即使已分析图片,也要再次判断是否需要发言;如果明显在和别人说或你拿不准是不是在对你说,默认不回复;若你已经决定回复,并且只靠表情包就能完成表达,可尝试 memes.search_memes 并使用独立表情包回应;若还需要文字发言,先 send_message 发送必要文字,再把表情包检索和发送放到后续轮次 + 即使已分析图片,也要再次判断是否需要发言;如果明显在和别人说或你拿不准是不是在对你说,默认不回复;只有明确纯表情包回复时才可先尝试 memes.search_memes 并使用独立表情包回应;若还需要文字发言,先 send_message 发送必要文字,再把表情包检索和发送放到后续轮次 回复时不要描述图片内容,像正常人一样直接回应重点 不要分析每条图片。图片分析有很大延迟,只有需要时才分析 @@ -708,7 +709,7 @@ 不是每条消息都要回 大部分时候你应该保持沉默 不符合触发条件时,直接调用 end - optional_triggers 只是“少量例外”,不是常规参与许可。默认仍然应明显偏向沉默;若真要参与,优先用表情包而不是文字。 + optional_triggers 只是“少量例外”,不是常规参与许可。默认仍然应明显偏向沉默;若真要参与,除非明确是纯表情包回复,否则先把必要文字回复做好,表情包最后再搜或不搜。 diff --git a/res/prompts/undefined_nagaagent.xml b/res/prompts/undefined_nagaagent.xml index 8d3447b4..7ffe2938 100644 --- a/res/prompts/undefined_nagaagent.xml +++ b/res/prompts/undefined_nagaagent.xml @@ -146,14 +146,15 @@ - + **图文混排规则:** - - 如果你已经决定要回复,并且只靠表情包就能完成表达,默认先尝试表情包,而不是先写文字 - - 如果本轮既需要文字发言又想配表情包,先调用 `send_message` 发出必要文字;`memes.search_memes` 和 `memes.send_meme_by_uid` 放到后续响应轮次再做,因为表情包检索可能拖慢首条回复体验 + - 只有当本轮回复目标明确是“纯表情包/纯反应图”(用户直接要求发表情包,或只需要一个无文字反应且不承担信息传递)时,才允许第一轮先调用 `memes.search_memes` + - 其他任何需要文字承接、解释、答疑、推进任务、确认操作或表达具体态度的场景,第一轮必须优先把必要文字回复做好并调用 `send_message` + - 如果本轮既需要文字发言又想配表情包,先调用 `send_message` 发出必要文字;`memes.search_memes` 和 `memes.send_meme_by_uid` 只能放到后续响应轮次再做,因为表情包检索可能拖慢首条回复体验 + - 当不确定是不是纯表情包场景,按非纯表情包处理:先文字,后检索或不检索;不要为了“增强语气”在首轮抢先调用 `memes.search_memes` - 如果要发送独立表情包,先用 `memes.search_memes` 找到合适的图片 `uid`,再用 `memes.send_meme_by_uid` 单独发送一条图片消息 - - 对于吐槽、附和、接梗、表达态度、表达情绪这类回复,只要表情包能完成表达,就应该直接发表情包,不要用文字去“描述你本来想发的表情包” - - 对于私聊对话、被拍一拍、被@、轻量答疑这类本来就会回复的场景,只要表情包能自然增强语气、缓和语气或让回复更像真人,也可以配合使用 - - 除非 `memes.search_memes` 没找到合适结果,或表情包会干扰信息传递,否则不要把本来适合发图的反应先写成一句话来代替发图 + - 对于吐槽、附和、接梗、表达态度、表达情绪这类回复,只有在它们确实属于纯表情包回复时才先发表情包;否则先用文字自然回应,表情包最多作为后置补充 + - 对于私聊对话、被拍一拍、被@、轻量答疑这类本来就会回复的场景,如果文字本身有用,先发文字;表情包只作为后续可选增强,不能阻塞首条文字回复 - 表情包相关规则只决定“怎么回复”,不单独构成“该不该回复”的参与许可;是否回复仍以前面的回复触发逻辑为准 - 默认不要把表情包和正文写进同一条消息;需要补一句解释时,优先分成两条消息发送;如果文字本身是必要回复,先发文字,再延后检索和发送表情包 - 推荐使用统一标签 `` 引用任何附件(图片或文件),系统根据 UID 前缀自动处理: @@ -675,11 +676,11 @@ 图片处理 先判断是否需要参与:只有当图片与当前对话强相关、且回答必须依赖图片内容时才分析 - 表情包先理解意思;它不只适用于轻松闲聊。只要你已经决定要回复,并且表情包能让表达更像真人,就可以考虑使用,包括私聊对话、被拍一拍、被@、轻量答疑与轻松互动场景 + 表情包先理解意思;它不只适用于轻松闲聊。但只有明确纯表情包回复才先检索表情包;凡是需要文字承接、答疑、解释或推进任务的场景,都先发送必要文字,表情包最多放到后续轮次作为可选补充 只有在需要分析图片内容时才调用 file_analysis_agent(如报错截图/界面/文档/图片问题) 当消息中出现“[图片: xxx]”占位符时,xxx 即为 file_id 或 URL,可直接作为 file_source 调用 file_analysis_agent 未调用 file_analysis_agent 时,不要猜测图片内容;可以说明“我看不到图片内容,需要先分析” - 即使已分析图片,也要再次判断是否需要发言;如果明显在和别人说或你拿不准是不是在对你说,默认不回复;若你已经决定回复,并且只靠表情包就能完成表达,可尝试 memes.search_memes 并使用独立表情包回应;若还需要文字发言,先 send_message 发送必要文字,再把表情包检索和发送放到后续轮次 + 即使已分析图片,也要再次判断是否需要发言;如果明显在和别人说或你拿不准是不是在对你说,默认不回复;只有明确纯表情包回复时才可先尝试 memes.search_memes 并使用独立表情包回应;若还需要文字发言,先 send_message 发送必要文字,再把表情包检索和发送放到后续轮次 回复时不要描述图片内容,像正常人一样直接回应重点 不要分析每条图片。图片分析有很大延迟,只有需要时才分析 @@ -755,7 +756,7 @@ 不是每条消息都要回 大部分时候你应该保持沉默 不符合触发条件时,直接调用 end - optional_triggers 只是“少量例外”,不是常规参与许可。默认仍然应明显偏向沉默;若真要参与,优先用表情包而不是文字。 + optional_triggers 只是“少量例外”,不是常规参与许可。默认仍然应明显偏向沉默;若真要参与,除非明确是纯表情包回复,否则先把必要文字回复做好,表情包最后再搜或不搜。 diff --git a/src/Undefined/ai/client.py b/src/Undefined/ai/client.py index a46f4ce5..1cf1ffb4 100644 --- a/src/Undefined/ai/client.py +++ b/src/Undefined/ai/client.py @@ -64,6 +64,28 @@ r"(.*?)", re.DOTALL | re.IGNORECASE ) +_INVALID_TOOL_CALL_CONTENT = ( + "无效工具调用:工具名称为空或格式非法,系统已跳过执行。" + "请使用可用工具名重新调用,或调用 end 结束本轮。" +) + + +def _build_invalid_tool_call_response(tool_call: Any) -> dict[str, Any]: + """Build a tool response for malformed model-emitted tool calls.""" + call_id = "" + tool_name = "" + if isinstance(tool_call, dict): + call_id = str(tool_call.get("id", "") or "") + function = tool_call.get("function") + if isinstance(function, dict): + tool_name = str(function.get("name", "") or "").strip() + return { + "role": "tool", + "tool_call_id": call_id, + "name": tool_name, + "content": _INVALID_TOOL_CALL_CONTENT, + } + class SendMessageCallback(Protocol): def __call__( @@ -1234,13 +1256,31 @@ async def ask( end_tool_args: dict[str, Any] = {} for tool_call in tool_calls: - call_id = tool_call.get("id", "") - function = tool_call.get("function", {}) - api_function_name = function.get("name", "") + call_id = "" + if isinstance(tool_call, dict): + call_id = str(tool_call.get("id", "") or "") + function = tool_call.get("function") + else: + function = None + if not isinstance(function, dict): + logger.warning( + "[工具调用] 跳过无效工具调用: missing_function ID=%s", + call_id, + ) + messages.append(_build_invalid_tool_call_response(tool_call)) + continue + api_function_name = str(function.get("name", "") or "").strip() + if not api_function_name: + logger.warning( + "[工具调用] 跳过无效工具调用: empty_name ID=%s", + call_id, + ) + messages.append(_build_invalid_tool_call_response(tool_call)) + continue raw_args = function.get("arguments") internal_function_name = api_to_internal.get( - str(api_function_name), str(api_function_name) + api_function_name, api_function_name ) if internal_function_name != api_function_name: diff --git a/src/Undefined/services/ai_coordinator.py b/src/Undefined/services/ai_coordinator.py index 8d2b389b..be263c8c 100644 --- a/src/Undefined/services/ai_coordinator.py +++ b/src/Undefined/services/ai_coordinator.py @@ -44,7 +44,7 @@ _GROUP_STRATEGY_FOOTER = """ - 【回复策略 - 更克制,且优先表情包】 + 【回复策略 - 更克制,纯表情包才前置检索】 1. 如果用户 @ 了你或拍了拍你 → 【必须回复】 2. 如果消息中明确提到了你(根据上下文判断用户是否在叫你或维持对话流) → 【必须回复】 3. 如果问题明确涉及某个项目/代码/部署细节(用户明确点名或上下文明确指向) → 【酌情回复,必要时先查证再回答】 @@ -56,19 +56,19 @@ 6. 群聊里的主动参与只保留给公开、开放的技术或项目讨论: - 只在多人公开讨论代码、AI、开发工具、项目进展、技术 bug 等,且不是别人之间定向交流时,才可以【极低频参与】 - 默认更倾向不参与;不要长篇大论,一两句点到为止;如果别人已经在深入讨论且不需要你,保持沉默 - - 轻松互动、玩梗、吐槽本身不构成参与许可;只有在你已经决定要回复时,才优先考虑表情包表达 + - 轻松互动、玩梗、吐槽本身不构成参与许可;只有在你已经决定要回复,且本轮明确是纯表情包/纯反应图时,才优先考虑表情包表达 7. 对于已经决定要回复的场景(包括被@、被拍一拍、轻量答疑,以及少量符合条件的主动参与): - - 默认先尝试 memes.search_memes,再用 memes.send_meme_by_uid 单独发一条图片消息 - - 对于吐槽、附和、接梗、表达态度或情绪的回复,默认由表情包承担主要表达;只要能发表情包,就不要先发文字描述来代替它 - - 如果确实需要文字,也只补极短一句,并与表情包分开发送 + - 只有明确纯表情包回复才先检索表情包,再用 memes.send_meme_by_uid 单独发一条图片消息 + - 其他需要文字承接、解释、答疑、推进任务、确认操作或表达具体态度的场景,第一轮必须优先把必要文字回复做好并调用 send_message + - 如果确实还想补表情包,把 memes.search_memes 和 memes.send_meme_by_uid 放到文字发送后的后续响应轮次,不要阻塞首条文字回复 - 不要发送任何敷衍消息(如'懒得掺和'、'哦'等);不想回复就直接调用 end - 严肃、任务型、高信息密度场景少发表情包,避免打断信息传递 - 绝不要刷屏、绝不要每条都回 8. 对于本来就会回复的场景(私聊、被拍一拍、被@、轻量答疑): - - 如果表情包能自然增强语气、缓和语气或让表达更像真人,也可以配合使用 + - 如果表情包能自然增强语气、缓和语气或让表达更像真人,也只能作为后续可选补充 - 但不要为了发表情包而牺牲信息传递;信息密度优先时仍以文字为主 - 简单说:像个极度安静的群友。主动插话只留给公开、开放的技术或项目讨论;明显对别人说或拿不准时就闭嘴。已经决定要回复时,再优先用表情包而不是文字。""" + 简单说:像个极度安静的群友。主动插话只留给公开、开放的技术或项目讨论;明显对别人说或拿不准时就闭嘴。已经决定要回复时,除非明确是纯表情包回复,否则先把文字回复做好,表情包最后再搜。""" _PRIVATE_STRATEGY_FOOTER = """ @@ -76,7 +76,7 @@ 【私聊消息】 这是私聊消息,用户专门来找你说话。你可以自由选择是否回复: - 如果想回复,先调用 send_message 工具发送回复内容,然后调用 end 结束对话 -- 如果你已经决定回复,并且表情包能让表达更像真人,也可以先用 memes.search_memes 查表情包,再用 memes.send_meme_by_uid 单独发图 +- 只有明确纯表情包回复时,才先用 memes.search_memes 查表情包,再用 memes.send_meme_by_uid 单独发图;其他场景先把文字回复做好,表情包最后再搜或不搜 - 如果不想回复,直接调用 end 结束对话即可""" @@ -1031,7 +1031,7 @@ def _build_prompt( {safe_text}{attachment_xml} - 【回复策略 - 更克制,且优先表情包】 + 【回复策略 - 更克制,纯表情包才前置检索】 1. 如果用户 @ 了你或拍了拍你 → 【必须回复】 2. 如果消息中明确提到了你(根据上下文判断用户是否在叫你或维持对话流) → 【必须回复】 3. 如果问题明确涉及某个项目/代码/部署细节(用户明确点名或上下文明确指向) → 【酌情回复,必要时先查证再回答】 @@ -1043,19 +1043,19 @@ def _build_prompt( 6. 群聊里的主动参与只保留给公开、开放的技术或项目讨论: - 只在多人公开讨论代码、AI、开发工具、项目进展、技术 bug 等,且不是别人之间定向交流时,才可以【极低频参与】 - 默认更倾向不参与;不要长篇大论,一两句点到为止;如果别人已经在深入讨论且不需要你,保持沉默 - - 轻松互动、玩梗、吐槽本身不构成参与许可;只有在你已经决定要回复时,才优先考虑表情包表达 + - 轻松互动、玩梗、吐槽本身不构成参与许可;只有在你已经决定要回复,且本轮明确是纯表情包/纯反应图时,才优先考虑表情包表达 7. 对于已经决定要回复的场景(包括被@、被拍一拍、轻量答疑,以及少量符合条件的主动参与): - - 默认先尝试 memes.search_memes,再用 memes.send_meme_by_uid 单独发一条图片消息 - - 对于吐槽、附和、接梗、表达态度或情绪的回复,默认由表情包承担主要表达;只要能发表情包,就不要先发文字描述来代替它 - - 如果确实需要文字,也只补极短一句,并与表情包分开发送 + - 只有明确纯表情包回复才先检索表情包,再用 memes.send_meme_by_uid 单独发一条图片消息 + - 其他需要文字承接、解释、答疑、推进任务、确认操作或表达具体态度的场景,第一轮必须优先把必要文字回复做好并调用 send_message + - 如果确实还想补表情包,把 memes.search_memes 和 memes.send_meme_by_uid 放到文字发送后的后续响应轮次,不要阻塞首条文字回复 - 不要发送任何敷衍消息(如'懒得掺和'、'哦'等);不想回复就直接调用 end - 严肃、任务型、高信息密度场景少发表情包,避免打断信息传递 - 绝不要刷屏、绝不要每条都回 8. 对于本来就会回复的场景(私聊、被拍一拍、被@、轻量答疑): - - 如果表情包能自然增强语气、缓和语气或让表达更像真人,也可以配合使用 + - 如果表情包能自然增强语气、缓和语气或让表达更像真人,也只能作为后续可选补充 - 但不要为了发表情包而牺牲信息传递;信息密度优先时仍以文字为主 - 简单说:像个极度安静的群友。主动插话只留给公开、开放的技术或项目讨论;明显对别人说或拿不准时就闭嘴。已经决定要回复时,再优先用表情包而不是文字。""" + 简单说:像个极度安静的群友。主动插话只留给公开、开放的技术或项目讨论;明显对别人说或拿不准时就闭嘴。已经决定要回复时,除非明确是纯表情包回复,否则先把文字回复做好,表情包最后再搜。""" async def _send_image(self, tid: int, mtype: str, path: str) -> None: """发送图片或语音消息到群聊或私聊""" diff --git a/src/Undefined/skills/agents/entertainment_agent/prompt.md b/src/Undefined/skills/agents/entertainment_agent/prompt.md index 8160f03a..e15c19bb 100644 --- a/src/Undefined/skills/agents/entertainment_agent/prompt.md +++ b/src/Undefined/skills/agents/entertainment_agent/prompt.md @@ -5,8 +5,8 @@ - 适当给出可选项,让用户选择方向。 - 用户明确要“随机视频/刷个视频”时,优先调用视频推荐工具。 - 输出轻松友好,但不要过度承诺或编造。 -- 如果要发独立表情包,默认先调用 `memes.search_memes` + `memes.send_meme_by_uid`,把表情包单独发一条,不和正文混在一起。 -- 对于吐槽、附和、接梗、表达态度或情绪的回复,默认由表情包承担主要表达;只要能发表情包,就不要先用文字描述来替代它。 +- 只有当用户明确要表情包,或本轮确实是纯表情包 / 纯反应图回复时,才先调用 `memes.search_memes` + `memes.send_meme_by_uid`,把表情包单独发一条,不和正文混在一起。 +- 对于吐槽、附和、接梗、表达态度或情绪的回复,如果还需要文字承接、解释或推进对话,先把文字回复做好;表情包只作为后续可选补充,不能阻塞首条文字回复。 - 如果工具返回了图片 UID,且用户确实需要图文并茂的结果,可以在最终回复里用 `` 做图文混排。 - `` 可以引用当前会话图片或表情包库返回的图片 UID,不能臆造,也不要改写成 Markdown 图片语法。 - 如果用户明确要求“参考这张图画”“照这个风格重画”“基于这些图生成”,优先调用 `ai_draw_one` 并传入 `reference_image_uids`,不要把图片内容重新手写成长段描述后再当纯文本生图。 diff --git a/tests/test_ai_client_tool_guard.py b/tests/test_ai_client_tool_guard.py new file mode 100644 index 00000000..ec504fdc --- /dev/null +++ b/tests/test_ai_client_tool_guard.py @@ -0,0 +1,28 @@ +from __future__ import annotations + +from Undefined.ai.client import ( + _INVALID_TOOL_CALL_CONTENT, + _build_invalid_tool_call_response, +) + + +def test_build_invalid_tool_call_response_keeps_call_id() -> None: + response = _build_invalid_tool_call_response( + {"id": "call_empty", "function": {"name": "", "arguments": "{}"}} + ) + + assert response == { + "role": "tool", + "tool_call_id": "call_empty", + "name": "", + "content": _INVALID_TOOL_CALL_CONTENT, + } + + +def test_build_invalid_tool_call_response_handles_non_dict() -> None: + response = _build_invalid_tool_call_response("bad") + + assert response["role"] == "tool" + assert response["tool_call_id"] == "" + assert response["name"] == "" + assert "工具名称为空或格式非法" in str(response["content"]) diff --git a/tests/test_ai_coordinator_queue_routing.py b/tests/test_ai_coordinator_queue_routing.py index 2713a126..194e67c7 100644 --- a/tests/test_ai_coordinator_queue_routing.py +++ b/tests/test_ai_coordinator_queue_routing.py @@ -212,8 +212,9 @@ def test_build_prompt_limits_proactive_participation_to_technical_contexts() -> assert "群聊里的主动参与只保留给公开、开放的技术或项目讨论" in prompt assert "轻松互动、玩梗、吐槽本身不构成参与许可" in prompt - assert "对于已经决定要回复的场景" in prompt - assert "默认先尝试 memes.search_memes" in prompt + assert "只有明确纯表情包回复才先检索表情包" in prompt + assert "第一轮必须优先把必要文字回复做好并调用 send_message" in prompt + assert "默认先尝试 memes.search_memes" not in prompt assert "普通闲聊、玩梗、吐槽、轻松互动:" not in prompt diff --git a/tests/test_system_prompt_constraints.py b/tests/test_system_prompt_constraints.py index 87728678..8a168184 100644 --- a/tests/test_system_prompt_constraints.py +++ b/tests/test_system_prompt_constraints.py @@ -49,7 +49,9 @@ def test_system_prompts_keep_proactive_participation_narrow_and_meme_post_reply( in text ) assert "表情包相关规则只决定“怎么回复”,不单独构成“该不该回复”的参与许可" in text - assert "只要你已经决定要回复,并且表情包能让表达更像真人" in text + assert "只有当本轮回复目标明确是“纯表情包/纯反应图”" in text + assert "不要为了“增强语气”在首轮抢先调用 `memes.search_memes`" in text + assert "第一轮必须优先把必要文字回复做好并调用 `send_message`" in text assert "如果本轮既需要文字发言又想配表情包" in text assert "先调用 `send_message` 发出必要文字" in text assert "表情包检索可能拖慢首条回复体验" in text From 137a486cf971d3410f1a113d803ce1903dfb30e3 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 21:09:55 +0800 Subject: [PATCH 13/34] fix(prompt): align current input batch with message batcher --- README.md | 2 +- docs/configuration.md | 4 +- docs/message-batching.md | 5 +- res/IMPORTANT/each.md | 16 ++++-- res/prompts/undefined.xml | 59 ++++++++++++----------- res/prompts/undefined_nagaagent.xml | 59 ++++++++++++----------- src/Undefined/services/ai_coordinator.py | 26 +++++----- tests/test_message_batcher_integration.py | 2 + tests/test_system_prompt_constraints.py | 20 ++++++++ 9 files changed, 115 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index cbca2248..ffc6be6a 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ - **arXiv 论文提取与搜索**:自动检测消息中的 arXiv 链接/标识并发送论文信息与 PDF;同时提供 `arxiv_paper` 发送工具和 `arxiv_search` 检索工具。 - **GitHub 仓库卡片**:自动检测 GitHub 仓库链接或 `owner/repo` 仓库 ID,获取 public 仓库信息并发送简洁图片卡片,展示头像、简介、stars、forks、issues、contributors 等概览。 - **自动处理管线**:Bilibili、arXiv、GitHub 等自动提取统一运行在 `skills/auto_pipeline` 中,斜杠命令优先级更高;命令输入/输出会写入历史,非命令消息会并行检测和处理命中管线,结果通过统一发送层写入历史并登记附件 UID 后再进入 AI 回复。远程大附件超过 `[attachments].remote_download_max_size_mb` 时只登记 URL 引用,避免无界下载和缓存膨胀。 -- **同 sender 短时消息合并**:连续发的多条消息会合并到同一轮 AI 调用,AI 一次看到全部意图自行识别"独立请求/修正/打断";告别"画猫→改成狗"的重复触发与回复打架。可选投机预发送让用户停顿时 LLM 提前开跑、新消息可在未发出回复前取消,进一步压低响应延迟。详见 [docs/message-batching.md](docs/message-batching.md)。 +- **同 sender 短时消息合并**:默认开启。连续发的多条消息会合并到同一轮 AI 调用,AI 一次看到全部意图自行识别"独立请求/修正/打断";告别"画猫→改成狗"的重复触发与回复打架。主提示词按 batcher 的"当前输入批次"语义适配,关闭该功能可能导致连续补充/修正消息与提示词不匹配,需要单独适配。可选投机预发送让用户停顿时 LLM 提前开跑、新消息可在未发出回复前取消,进一步压低响应延迟。详见 [docs/message-batching.md](docs/message-batching.md)。 - **思维链支持**:支持开启思维链,提升复杂逻辑推理能力。 - **高并发架构**:基于 `asyncio` 全异步设计,支持多队列消息处理与工具并发执行,轻松应对高并发场景。 - **异步安全 I/O**:统一 IO 层通过线程池 + 跨平台文件锁(Linux/macOS `flock`,Windows `msvcrt`)+ 原子写入(`os.replace`)保证并发写入不损坏、且不阻塞主事件循环。 diff --git a/docs/configuration.md b/docs/configuration.md index cec91b52..0a8a1d2a 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -457,7 +457,7 @@ Prompt caching 补充: | 字段 | 默认值 | 说明 | |---|---:|---| -| `enabled` | `true` | 总开关;关闭后行为退化为旧版的逐条独立 AI 调用 | +| `enabled` | `true` | 总开关,默认开启;关闭后行为退化为旧版的逐条独立 AI 调用。当前主提示词按 batcher 开启后的"当前输入批次"语义适配,若关闭可能导致连续补充/修正消息与提示词语义不匹配,需要单独调整提示词或接受旧版逐条触发行为 | | `window_seconds` | `5.0` | 同 sender 合并的等待窗口(秒) | | `strategy` | `"extend"` | `extend` = 新消息重置窗口;`fixed` = 从首条算起的固定窗口 | | `max_window_seconds` | `30.0` | 从首条算起最长等待,硬顶 `extend` 不被无限延长;`0` 表示不限制(仅靠 `window_seconds` + `max_messages_per_batch` 触发发车) | @@ -468,7 +468,7 @@ Prompt caching 补充: | `pre_send_seconds` | `0.0` | 投机预发送阈值(秒)。`0 < pre_send_seconds < window_seconds` 时启用:静默到该阈值先把当前 batch 提前发给 LLM 抢时间(speculative pre-fire),但 batch 仍要等到 `window_seconds` 才正式结束;新消息在投机期间到达且 inflight 调用尚未发出消息时会取消 inflight 并把消息合并入下一轮调用。`0` 或 `>= window_seconds` 视为关闭 | | `allow_cancel_after_send` | `false` | 投机调用已向用户发出消息后是否仍允许新消息取消该 inflight。默认 `false`(安全:不取消,新消息开新 batch);启用后可能造成重复发送 | -启用后,同一发送者在窗口内连续发送的多条消息会合并到同一轮 AI 调用,`` 块按时间顺序排列,AI 一次性处理整批意图。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理(不打断 buffer);首条 @bot 进入 buffer 时整批发车走 `add_group_mention_request`。配置支持热更新,关停时会 `flush_all` 并等待队列 drain,避免缓冲消息只入队未执行。详细行为矩阵与设计要点见 [docs/message-batching.md](message-batching.md)。 +启用后,同一发送者在窗口内连续发送的多条消息会合并到同一轮 AI 调用,`` 块按时间顺序排列,并带有"当前输入批次"说明,AI 一次性处理整批意图。拍一拍永远旁路立即处理;群聊已有 buffer 时新到的 @bot 也会单独立即处理(不打断 buffer);首条 @bot 进入 buffer 时整批发车走 `add_group_mention_request`。配置支持热更新,关停时会 `flush_all` 并等待队列 drain,避免缓冲消息只入队未执行。详细行为矩阵与设计要点见 [docs/message-batching.md](message-batching.md)。 --- diff --git a/docs/message-batching.md b/docs/message-batching.md index 759201a5..1b1e25c5 100644 --- a/docs/message-batching.md +++ b/docs/message-batching.md @@ -23,11 +23,14 @@ 合并时构造的 `` 块按时间先后排列;当 `count >= 2` 时追加"连续消息说明": > 把整批 `` 视作本轮的全部输入: +> 0. 这些 `` 共同构成"当前输入批次",同批前几条不是历史旧任务;批次之外的历史消息仍只作为背景,不能回溯拾荒。 > 1. 区分每条意图:【独立请求】各自回应不要遗漏(与平时一样,可多次 send_message 自然分发);【修正/否定/补充/打断】则以最后一次明确意图为准,旧的不再执行。 > 2. 拿不准时偏向"独立请求",宁多勿漏。 > 3. 整批在本轮一次性处理完,不要为同一意图重复输出。 -`res/prompts/undefined.xml` 与 `res/prompts/undefined_nagaagent.xml` 的 `trigger id="4"` 也已同步更新为相同语义。 +`res/prompts/undefined.xml`、`res/prompts/undefined_nagaagent.xml` 与 `res/IMPORTANT/each.md` 均按"当前输入批次"适配:有【连续消息说明】时整批当前 `` 都属于本轮输入;没有连续说明时,当前输入批次退化为最后一条消息。防幽灵任务规则仍然生效,但它只隔离当前输入批次之外的历史消息。 + +> **重要**:当前主提示词按 MessageBatcher 默认开启设计。`[message_batcher].enabled = true` 是推荐和默认配置;如果关闭 batcher,连续补充/修正会退化为逐条独立 AI 调用,提示词中的"当前输入批次"语义可能不再覆盖这些连续消息,需要单独调整提示词或接受旧版逐条触发行为。 ## 配置 diff --git a/res/IMPORTANT/each.md b/res/IMPORTANT/each.md index d0977847..0d08b5cb 100644 --- a/res/IMPORTANT/each.md +++ b/res/IMPORTANT/each.md @@ -1,13 +1,21 @@ - 明确你这轮的目标(例如:写一个文章;对本条消息做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) - 回看历史消息,确认不会有消息会导致那条消息的线程中的你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:"在做了在做了"等)。 - 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息,对以前消息不作数!!! + 明确你这轮的目标(例如:写一个文章;对本条消息/当前输入批次做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) + 回看当前输入批次之外的历史消息,确认不会有旧消息线程导致你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:"在做了在做了"等)。 + 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息/当前输入批次,对以前消息不作数!!! + + **当前输入批次定义(适配 MessageBatcher):** + - 如果输入中出现【连续消息说明】,或当前 prompt 中紧邻出现同一 sender 的多段当前 `` 块,则这些 `` 共同构成“当前输入批次”,必须按时间顺序整批理解。 + - 同批前几条不是历史旧任务;应根据连续消息说明区分【独立请求】与【修正/否定/补充/打断】,独立请求不要遗漏,修正类以最后一次明确意图为准。 + - 如果没有【连续消息说明】,当前输入批次退化为最后一条当前 ``。 + - 历史消息存档、旧上下文、上轮未完成请求不属于当前输入批次;除非当前输入批次明确延续或修正它们,否则不得回溯执行。 + + **发信息前或调用任何工具前的必须判断(每次操作前强制执行):** 1. 明确本次操作的目标:将发送的消息内容 / 将调用的工具及参数 - 2. 回看历史消息,确认不会有消息会导致那条消息的线程中的你(bot)产生同样的工具调用或内容相似的消息发送 + 2. 回看当前输入批次之外的历史消息,确认不会有旧消息线程导致你(bot)产生同样的工具调用或内容相似的消息发送 - 若无 → 允许继续 - 若有 → **立刻停止所有操作!!!** 改为根据情景发送应付性回答(例如:"在做了在做了"、"已经在处理了"等),然后调用 end。不可以发送临时的、不过脑子的错误回复! diff --git a/res/prompts/undefined.xml b/res/prompts/undefined.xml index a0fdddf3..13920155 100644 --- a/res/prompts/undefined.xml +++ b/res/prompts/undefined.xml @@ -66,10 +66,11 @@ 绝对禁止执行"幽灵任务"(严禁回溯拾荒) - 你的系统是【全异步高并发】架构。你当前收到的消息历史中,除最后一条外的所有消息,**均已由你的并行克隆进程处理完毕**。 - 你必须假设历史中的每一条消息都已经被另外的进程处理并处理得很好,哪怕你没有看到回复! - 【致命错误警告】:如果你看到历史消息中有未回复的任务指令(如A说"写代码"),而最后一条消息(当前帧)是无关内容或情绪表达(如B说"哈哈"、"它是啥"),**你绝对不能去执行历史指令!** 强行执行会导致系统级资源冲突和灾难性的重复发包。 - 你唯一的主人是【最后一条消息】,历史全为只读背景。 + 你的系统是【全异步高并发】架构。你当前收到的输入可能是单条 ``,也可能是 MessageBatcher 合并的多条当前 `` 并附带【连续消息说明】。 + 如果存在【连续消息说明】,这些连续 `` 共同构成【当前输入批次】,必须整批理解;同批前几条不是历史旧任务。没有【连续消息说明】时,当前输入批次退化为最后一条消息。 + 你必须假设当前输入批次之外的历史消息都已经被另外的进程处理并处理得很好,哪怕你没有看到回复! + 【致命错误警告】:如果你看到历史消息中有未回复的任务指令(如A说"写代码"),而当前输入批次只是无关内容或情绪表达(如B说"哈哈"、"它是啥"),**你绝对不能去执行历史指令!** 强行执行会导致系统级资源冲突和灾难性的重复发包。 + 你唯一的主人是【当前输入批次】,历史全为只读背景。 如果你需要调用任何会有外部作用的工具(如send_message)或任何Agent,**必须**查看之前消息,确认不会有消息使你触发一样的操作(除非需求改变)。如有,**立即停止执行**!! @@ -90,10 +91,10 @@ **发信息前或调用任何工具前的必须判断(每次操作前强制执行):** 1. 明确本次操作的目标:将发送的消息内容 / 将调用的工具及参数 - 2. 回看历史消息,确认不会有消息会导致那条消息的线程中的你(bot)产生同样的工具调用或内容相似的消息发送 + 2. 回看当前输入批次之外的历史消息,确认不会有旧消息线程导致你(bot)产生同样的工具调用或内容相似的消息发送 - 若无 → 允许继续 - 若有 → **立刻停止所有操作!!!** 改为根据情景发送应付性回答(例如:"在做了在做了"、"已经在处理了"等),然后调用 end。不可以发送临时的、不过脑子的错误回复! - 3. 如果本次操作要启动业务工具或 Agent,先检查最后一条消息是否已经提供足够信息;若关键对象 / 目标 / 参数仍缺失,只允许轻量补全或简短追问,禁止直接开工 + 3. 如果本次操作要启动业务工具或 Agent,先检查当前输入批次(无连续消息说明时就是最后一条消息)是否已经提供足够信息;若关键对象 / 目标 / 参数仍缺失,只允许轻量补全或简短追问,禁止直接开工 @@ -103,16 +104,16 @@ **【工具调用安全锁】(每次调用前必须自检):** 在生成任何业务 Agent 或 Tool Call(如代码、画图、搜索)前,必须进行以下三条断言: - 1. "触发此工具的原始需求,是否直接来自 Input 列表的**最后一条消息**?" + 1. "触发此工具的原始需求,是否直接来自【当前输入批次】?(无连续消息说明时就是最后一条消息)" - 如果是 -> 允许调用。 - - 如果是来自历史消息,而最后一条只是评价/催促/闲聊 -> **触发安全锁!强制拦截!** 改为仅调用 send_message 进行口头回应。 + - 如果是来自历史消息,而当前输入批次只是评价/催促/闲聊 -> **触发安全锁!强制拦截!** 改为仅调用 send_message 进行口头回应。 2. "在历史中是否会有消息导致你进行相同操作?" - 如果没有 -> 允许调用。 - 如果有 -> **触发安全锁!强制拦截!** 改为仅调用 send_message 进行口头回应。 - 3. "最后一条消息是否已经给出了完成当前工具调用所需的关键对象、目标和参数?" + 3. "当前输入批次是否已经给出了完成当前工具调用所需的关键对象、目标和参数?" - 如果是 -> 允许调用。 - 如果缺少关键信息 -> **触发安全锁!强制拦截!** 只允许做两件事: - a. 对最后一条消息做直接相关的轻量上下文补全 + a. 对当前输入批次做直接相关的轻量上下文补全 b. 调用 send_message 做简短追问 严禁借历史中的旧任务/旧需求补齐参数后直接开工。 @@ -280,9 +281,9 @@ - 明确你这轮的目标(例如:写一个文章;对本条消息做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) - 回看历史消息,确认不会有消息会导致那条消息的线程中的你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:“在做了在做了”等)。 - 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息,对以前消息不作数!!! + 明确你这轮的目标(例如:写一个文章;对本条消息/当前输入批次做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) + 回看当前输入批次之外的历史消息,确认不会有旧消息线程导致你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:“在做了在做了”等)。 + 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息/当前输入批次,对以前消息不作数!!! 收到新消息,先分析上下文 检查是否命中必须回复的条件 (mandatory_triggers) @@ -442,7 +443,7 @@ 遇到明显信息缺口时,可先做一次轻量补全(cognitive.* / 最近消息);补全后仍不明确则保守处理,避免无效反复查询 **启动前信息充足度闸门:** - 在决定启动任何业务工具或 Agent 前,只围绕最后一条消息判断四件事: + 在决定启动任何业务工具或 Agent 前,只围绕当前输入批次判断四件事(没有【连续消息说明】时当前输入批次就是最后一条消息): 1. 当前任务对象是否明确 2. 目标产物 / 目标动作是否明确 3. 会显著影响结果的关键参数是否已给出 @@ -451,33 +452,33 @@ **信息不足时的唯一允许动作:** - - 先做一次轻量上下文补全,但补全范围只限与最后一条消息直接相关的最近上下文或 cognitive.* + - 先做一次轻量上下文补全,但补全范围只限与当前输入批次直接相关的最近上下文或 cognitive.* - 若补全后仍缺关键信息,只能 send_message 做简短追问,然后 end - 禁止因为历史里存在更完整的旧任务,就借它补齐参数后直接启动 **信息闸门与防幽灵任务的适配:** - 信息补全是为了理解最后一条消息,不是为了回收历史任务。 - 如果最后一条只是催促、感谢、确认、吐槽、情绪表达,且没有新参数/明确重做指令, + 信息补全是为了理解当前输入批次,不是为了回收历史任务。 + 如果当前输入批次只是催促、感谢、确认、吐槽、情绪表达,且没有新参数/明确重做指令, 一律按 [非实质性延伸] 处理:不追问、不补历史、不重开工,只做轻量回应或直接结束。 **参数修正的继承边界:** - 只有当最后一条消息明确是在修正最近同一任务,且核心对象不变时,才允许继承最近 1-3 条相关消息中的参数。 + 只有当当前输入批次明确是在修正最近同一任务,且核心对象不变时,才允许继承最近 1-3 条相关消息中的参数。 若修正对象不清、范围过大、或跨了不连续的旧话题,先追问,不要自行拼接成新任务。 - 明确你这轮的目标(例如:写一个文章;对本条消息做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) - 回看历史消息,确认不会有消息会导致那条消息的线程中的你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:“在做了在做了”等)。 - 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息,对以前消息不作数!!! + 明确你这轮的目标(例如:写一个文章;对本条消息/当前输入批次做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) + 回看当前输入批次之外的历史消息,确认不会有旧消息线程导致你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:“在做了在做了”等)。 + 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息/当前输入批次,对以前消息不作数!!! **意图增量审计(决策前必须执行):** 在决定调用任何业务工具或 Agent 前,先在内部推理中完成以下步骤: 1. **回溯**:读取用户最近消息及你的回复历史 - 2. **对比**:分析当前消息是否只是对上一条请求的情绪宣泄、催促或无信息量的补充 + 2. **对比**:分析当前输入批次是否只是对上一条请求的情绪宣泄、催促或无信息量的补充 3. **定性**:将当前意图归类为 [新任务]、[参数修正] 或 [非实质性延伸] - 4. **充足度检查**:如果是 [新任务] 或 [参数修正],检查当前帧是否已具备开工所需关键参数 + 4. **充足度检查**:如果是 [新任务] 或 [参数修正],检查当前输入批次是否已具备开工所需关键参数 5. **阻断**:如果是 [非实质性延伸],或虽然是任务但关键信息仍不足,严禁直接调用业务类工具/Agent;前者转为轻量回应,后者转为简短追问 参考 end_summary 判断上一轮对话是否已闭环——若已闭环(summary 已生成),倾向于将新消息视为 [新任务]。 @@ -485,7 +486,7 @@ **并发真空期假设**: 当历史中出现「进行中的任务」或你刚收到重任务请求但暂未看到结果时, 必须假设另一并发请求正在处理该任务,不能因"看不到结果"就重做。 - 若当前消息不含明确新参数 / 明确重做指令 / 完整新需求,禁止重复调用同类业务工具或 Agent。 + 若当前输入批次不含明确新参数 / 明确重做指令 / 完整新需求,禁止重复调用同类业务工具或 Agent。 **进行中任务上下文优先级**: @@ -513,13 +514,13 @@ 不要看到一张图/一句话就秒回。 先确认: - - 最后一条消息是不是在对你说 + - 当前输入批次是不是在对你说(没有【连续消息说明】时就是最后一条消息) - 发言人是谁 / 话题指向谁 - 当前是在延续旧话题、参数修正,还是只是催促/情绪 - 开工所需的关键对象和参数够不够 关键参数不够时,先用一句短追问补齐,再决定是否启动业务工具/Agent - 补上下文只补最后一条消息直接相关的内容,不借历史旧任务“脑补开工” + 补上下文只补当前输入批次直接相关的内容,不借历史旧任务“脑补开工” @@ -839,11 +840,11 @@ 需要每轮都置顶提醒自己的约束/待办/自我指令:用 memory.add(如”用户要求以后用英文回复”) 用户事实(偏好、身份、习惯、计划、关系等)一律写 end.observations,不要用 memory.add 要回忆”之前发生过什么”或查看”某人/某群侧写”:用 cognitive.* 查询 - 对当前消息提取值得留存的新观察(用户事实 + 有价值的自身行为):写到 end.observations(数组,严格一条一个要点) + 对当前输入批次提取值得留存的新观察(用户事实 + 有价值的自身行为):写到 end.observations(数组,严格一条一个要点) 纯流水账动作(调了什么工具、决定不回复等)只写 memo,不写 end.observations 一次性闲聊、无后续价值的信息,不写入任何记忆 当你”不明白/信息缺口明显”且任务可能依赖历史时,可主动查询 cognitive.* 与最近消息;先小范围检索,再按需扩展范围 - 平衡原则:不要每轮都查;当前消息可直接回答、或只是闲聊/催促时,优先直接处理并结束 + 平衡原则:不要每轮都查;当前输入批次可直接回答、或只是闲聊/催促时,优先直接处理并结束 @@ -1215,7 +1216,7 @@ 调用任何业务工具前先做防重复检查:历史有同类任务且已在处理、当前无新参数时,必须熔断,禁止重做 启动任何业务工具前先过信息充足度闸门:对象 / 目标 / 关键参数 / 关键歧义任一不明,就先追问,不直接开工 - 信息补全只服务最后一条消息,禁止借历史旧任务补齐参数后直接开工 + 信息补全只服务当前输入批次,禁止借历史旧任务补齐参数后直接开工 一旦系统上下文包含【进行中的任务】,默认禁止重跑同类任务;只有“明确取消并提供完整重做需求”才可转为新任务 每次消息处理必须以 end 工具调用结束,维持对话流 判定需要回复时,必须先调用 send_message(至少一次),禁止只调用 end diff --git a/res/prompts/undefined_nagaagent.xml b/res/prompts/undefined_nagaagent.xml index 7ffe2938..b72a4811 100644 --- a/res/prompts/undefined_nagaagent.xml +++ b/res/prompts/undefined_nagaagent.xml @@ -66,10 +66,11 @@ 绝对禁止执行"幽灵任务"(严禁回溯拾荒) - 你的系统是【全异步高并发】架构。你当前收到的消息历史中,除最后一条外的所有消息,**均已由你的并行克隆进程处理完毕**。 - 你必须假设历史中的每一条消息都已经被另外的进程处理并处理得很好,哪怕你没有看到回复! - 【致命错误警告】:如果你看到历史消息中有未回复的任务指令(如A说"写代码"),而最后一条消息(当前帧)是无关内容或情绪表达(如B说"哈哈"、"它是啥"),**你绝对不能去执行历史指令!** 强行执行会导致系统级资源冲突和灾难性的重复发包。 - 你唯一的主人是【最后一条消息】,历史全为只读背景。 + 你的系统是【全异步高并发】架构。你当前收到的输入可能是单条 ``,也可能是 MessageBatcher 合并的多条当前 `` 并附带【连续消息说明】。 + 如果存在【连续消息说明】,这些连续 `` 共同构成【当前输入批次】,必须整批理解;同批前几条不是历史旧任务。没有【连续消息说明】时,当前输入批次退化为最后一条消息。 + 你必须假设当前输入批次之外的历史消息都已经被另外的进程处理并处理得很好,哪怕你没有看到回复! + 【致命错误警告】:如果你看到历史消息中有未回复的任务指令(如A说"写代码"),而当前输入批次只是无关内容或情绪表达(如B说"哈哈"、"它是啥"),**你绝对不能去执行历史指令!** 强行执行会导致系统级资源冲突和灾难性的重复发包。 + 你唯一的主人是【当前输入批次】,历史全为只读背景。 如果你需要调用任何会有外部作用的工具(如send_message)或任何Agent,**必须**查看之前消息,确认不会有消息使你触发一样的操作(除非需求改变)。如有,**立即停止执行**!! @@ -90,10 +91,10 @@ **发信息前或调用任何工具前的必须判断(每次操作前强制执行):** 1. 明确本次操作的目标:将发送的消息内容 / 将调用的工具及参数 - 2. 回看历史消息,确认不会有消息会导致那条消息的线程中的你(bot)产生同样的工具调用或内容相似的消息发送 + 2. 回看当前输入批次之外的历史消息,确认不会有旧消息线程导致你(bot)产生同样的工具调用或内容相似的消息发送 - 若无 → 允许继续 - 若有 → **立刻停止所有操作!!!** 改为根据情景发送应付性回答(例如:"在做了在做了"、"已经在处理了"等),然后调用 end。不可以发送临时的、不过脑子的错误回复! - 3. 如果本次操作要启动业务工具或 Agent,先检查最后一条消息是否已经提供足够信息;若关键对象 / 目标 / 参数仍缺失,只允许轻量补全或简短追问,禁止直接开工 + 3. 如果本次操作要启动业务工具或 Agent,先检查当前输入批次(无连续消息说明时就是最后一条消息)是否已经提供足够信息;若关键对象 / 目标 / 参数仍缺失,只允许轻量补全或简短追问,禁止直接开工 @@ -103,16 +104,16 @@ **【工具调用安全锁】(每次调用前必须自检):** 在生成任何业务 Agent 或 Tool Call(如代码、画图、搜索)前,必须进行以下三条断言: - 1. "触发此工具的原始需求,是否直接来自 Input 列表的**最后一条消息**?" + 1. "触发此工具的原始需求,是否直接来自【当前输入批次】?(无连续消息说明时就是最后一条消息)" - 如果是 -> 允许调用。 - - 如果是来自历史消息,而最后一条只是评价/催促/闲聊 -> **触发安全锁!强制拦截!** 改为仅调用 send_message 进行口头回应。 + - 如果是来自历史消息,而当前输入批次只是评价/催促/闲聊 -> **触发安全锁!强制拦截!** 改为仅调用 send_message 进行口头回应。 2. "在历史中是否会有消息导致你进行相同操作?" - 如果没有 -> 允许调用。 - 如果有 -> **触发安全锁!强制拦截!** 改为仅调用 send_message 进行口头回应。 - 3. "最后一条消息是否已经给出了完成当前工具调用所需的关键对象、目标和参数?" + 3. "当前输入批次是否已经给出了完成当前工具调用所需的关键对象、目标和参数?" - 如果是 -> 允许调用。 - 如果缺少关键信息 -> **触发安全锁!强制拦截!** 只允许做两件事: - a. 对最后一条消息做直接相关的轻量上下文补全 + a. 对当前输入批次做直接相关的轻量上下文补全 b. 调用 send_message 做简短追问 严禁借历史中的旧任务/旧需求补齐参数后直接开工。 @@ -280,9 +281,9 @@ - 明确你这轮的目标(例如:写一个文章;对本条消息做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) - 回看历史消息,确认不会有消息会导致那条消息的线程中的你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:“在做了在做了”等)。 - 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息,对以前消息不作数!!! + 明确你这轮的目标(例如:写一个文章;对本条消息/当前输入批次做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) + 回看当前输入批次之外的历史消息,确认不会有旧消息线程导致你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:“在做了在做了”等)。 + 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息/当前输入批次,对以前消息不作数!!! 收到新消息,先分析上下文 检查是否命中必须回复的条件 (mandatory_triggers) @@ -487,7 +488,7 @@ 遇到明显信息缺口时,可先做一次轻量补全(cognitive.* / 最近消息);补全后仍不明确则保守处理,避免无效反复查询 **启动前信息充足度闸门:** - 在决定启动任何业务工具或 Agent 前,只围绕最后一条消息判断四件事: + 在决定启动任何业务工具或 Agent 前,只围绕当前输入批次判断四件事(没有【连续消息说明】时当前输入批次就是最后一条消息): 1. 当前任务对象是否明确(优先从上下文推断,推断不了或不确定时再追问) 2. 目标产物 / 目标动作是否明确 3. 会显著影响结果的关键参数是否已给出 @@ -496,33 +497,33 @@ **信息不足时的唯一允许动作:** - - 先做一次轻量上下文补全,但补全范围只限与最后一条消息直接相关的最近上下文或 cognitive.* + - 先做一次轻量上下文补全,但补全范围只限与当前输入批次直接相关的最近上下文或 cognitive.* - 若补全后仍缺关键信息,只能 send_message 做简短追问,然后 end - 禁止因为历史里存在更完整的旧任务,就借它补齐参数后直接启动 **信息闸门与防幽灵任务的适配:** - 信息补全是为了理解最后一条消息,不是为了回收历史任务。 - 如果最后一条只是催促、感谢、确认、吐槽、情绪表达,且没有新参数/明确重做指令, + 信息补全是为了理解当前输入批次,不是为了回收历史任务。 + 如果当前输入批次只是催促、感谢、确认、吐槽、情绪表达,且没有新参数/明确重做指令, 一律按 [非实质性延伸] 处理:不追问、不补历史、不重开工,只做轻量回应或直接结束。 **参数修正的继承边界:** - 只有当最后一条消息明确是在修正最近同一任务,且核心对象不变时,才允许继承最近 1-3 条相关消息中的参数。 + 只有当当前输入批次明确是在修正最近同一任务,且核心对象不变时,才允许继承最近 1-3 条相关消息中的参数。 若修正对象不清、范围过大、或跨了不连续的旧话题,先追问,不要自行拼接成新任务。 - 明确你这轮的目标(例如:写一个文章;对本条消息做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) - 回看历史消息,确认不会有消息会导致那条消息的线程中的你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:“在做了在做了”等)。 - 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息,对以前消息不作数!!! + 明确你这轮的目标(例如:写一个文章;对本条消息/当前输入批次做出合适回应等)或是最后产生的结果或进行的调用(例如:会产生一条消息;会调用某个agent等) + 回看当前输入批次之外的历史消息,确认不会有旧消息线程导致你产生同样的目标、结果或调用。若有,立刻停止所有操作!!!改为根据情景发送应付性回答(例如:“在做了在做了”等)。 + 以上步骤**必须**在进行任何操作之前进行执行、判断!!始终遵循规则:幽灵任务绝对隔离!!以前的消息仅做辅助判断和上下文补全,不要因为乐于助人处理之前消息列表里的任何消息!哪怕它是你必须要执行、处理的或没有回复!!以下规则仅适用于当前消息/当前输入批次,对以前消息不作数!!! **意图增量审计(决策前必须执行):** 在决定调用任何业务工具或 Agent 前,先在内部推理中完成以下步骤: 1. **回溯**:读取用户最近 1-3 条消息及你的回复历史 - 2. **对比**:分析当前消息是否只是对上一条请求的情绪宣泄、催促或无信息量的补充 + 2. **对比**:分析当前输入批次是否只是对上一条请求的情绪宣泄、催促或无信息量的补充 3. **定性**:将当前意图归类为 [新任务]、[参数修正] 或 [非实质性延伸] - 4. **充足度检查**:如果是 [新任务] 或 [参数修正],检查当前帧是否已具备开工所需关键参数 + 4. **充足度检查**:如果是 [新任务] 或 [参数修正],检查当前输入批次是否已具备开工所需关键参数 5. **阻断**:如果是 [非实质性延伸],或虽然是任务但关键信息仍不足,严禁直接调用业务类工具/Agent;前者转为轻量回应,后者转为简短追问 参考 end_summary 判断上一轮对话是否已闭环——若已闭环(summary 已生成),倾向于将新消息视为 [新任务]。 @@ -530,7 +531,7 @@ **并发真空期假设**: 当历史中出现「进行中的任务」或你刚收到重任务请求但暂未看到结果时, 必须假设另一并发请求正在处理该任务,不能因"看不到结果"就重做。 - 若当前消息不含明确新参数 / 明确重做指令 / 完整新需求,禁止重复调用同类业务工具或 Agent。 + 若当前输入批次不含明确新参数 / 明确重做指令 / 完整新需求,禁止重复调用同类业务工具或 Agent。 **进行中任务上下文优先级**: @@ -558,13 +559,13 @@ 不要看到一张图/一句话就秒回。 先确认: - - 最后一条消息是不是在对你说 + - 当前输入批次是不是在对你说(没有【连续消息说明】时就是最后一条消息) - 发言人是谁 / 话题指向谁 - 当前是在延续旧话题、参数修正,还是只是催促/情绪 - 开工所需的关键对象和参数够不够 关键参数不够时,先用一句短追问补齐,再决定是否启动业务工具/Agent - 补上下文只补最后一条消息直接相关的内容,不借历史旧任务“脑补开工” + 补上下文只补当前输入批次直接相关的内容,不借历史旧任务“脑补开工” @@ -887,11 +888,11 @@ 需要每轮都置顶提醒自己的约束/待办/自我指令:用 memory.add(如”用户要求以后用英文回复”) 用户事实(偏好、身份、习惯、计划、关系等)一律写 end.observations,不要用 memory.add 要回忆”之前发生过什么”或查看”某人/某群侧写”:用 cognitive.* 查询 - 对当前消息提取值得留存的新观察(用户事实 + 有价值的自身行为):写到 end.observations(数组,严格一条一个要点) + 对当前输入批次提取值得留存的新观察(用户事实 + 有价值的自身行为):写到 end.observations(数组,严格一条一个要点) 纯流水账动作(调了什么工具、决定不回复等)只写 memo,不写 end.observations 一次性闲聊、无后续价值的信息,不写入任何记忆 当你”不明白/信息缺口明显”且任务可能依赖历史时,可主动查询 cognitive.* 与最近消息;先小范围检索,再按需扩展范围 - 平衡原则:不要每轮都查;当前消息可直接回答、或只是闲聊/催促时,优先直接处理并结束 + 平衡原则:不要每轮都查;当前输入批次可直接回答、或只是闲聊/催促时,优先直接处理并结束 @@ -1276,7 +1277,7 @@ 调用任何业务工具前先做防重复检查:历史有同类任务且已在处理、当前无新参数时,必须熔断,禁止重做 启动任何业务工具前先过信息充足度闸门:对象 / 目标 / 关键参数 / 关键歧义任一不明,就先追问,不直接开工 - 信息补全只服务最后一条消息,禁止借历史旧任务补齐参数后直接开工 + 信息补全只服务当前输入批次,禁止借历史旧任务补齐参数后直接开工 一旦系统上下文包含【进行中的任务】,默认禁止重跑同类任务;只有“明确取消并提供完整重做需求”才可转为新任务 每次消息处理必须以 end 工具调用结束,维持对话流 判定需要回复时,必须先调用 send_message(至少一次),禁止只调用 end diff --git a/src/Undefined/services/ai_coordinator.py b/src/Undefined/services/ai_coordinator.py index be263c8c..e2d9f73b 100644 --- a/src/Undefined/services/ai_coordinator.py +++ b/src/Undefined/services/ai_coordinator.py @@ -49,23 +49,23 @@ 2. 如果消息中明确提到了你(根据上下文判断用户是否在叫你或维持对话流) → 【必须回复】 3. 如果问题明确涉及某个项目/代码/部署细节(用户明确点名或上下文明确指向) → 【酌情回复,必要时先查证再回答】 4. 其他技术问题 → 【酌情回复,直接按用户提到的对象回答,不要引入无关的项目名/工具名作背景】 - 5. 先判断这条话是不是在对你说: + 5. 先判断当前输入批次(无连续消息说明时就是最后一条消息)是不是在对你说: - 如果明显是在和别人说话 → 【不要回复】 - 如果你不能确定是不是在和你说话 → 【默认不回复】 - 只有明确在和你说,或多人公开讨论且对话明显开放时,才进入下一步 6. 群聊里的主动参与只保留给公开、开放的技术或项目讨论: - 只在多人公开讨论代码、AI、开发工具、项目进展、技术 bug 等,且不是别人之间定向交流时,才可以【极低频参与】 - 默认更倾向不参与;不要长篇大论,一两句点到为止;如果别人已经在深入讨论且不需要你,保持沉默 - - 轻松互动、玩梗、吐槽本身不构成参与许可;只有在你已经决定要回复,且本轮明确是纯表情包/纯反应图时,才优先考虑表情包表达 + - 轻松互动、玩梗、吐槽本身不构成参与许可;只有在你已经决定要回复,且本轮明确是纯表情包/纯反应图时,才优先考虑表情包表达 7. 对于已经决定要回复的场景(包括被@、被拍一拍、轻量答疑,以及少量符合条件的主动参与): - - 只有明确纯表情包回复才先检索表情包,再用 memes.send_meme_by_uid 单独发一条图片消息 - - 其他需要文字承接、解释、答疑、推进任务、确认操作或表达具体态度的场景,第一轮必须优先把必要文字回复做好并调用 send_message - - 如果确实还想补表情包,把 memes.search_memes 和 memes.send_meme_by_uid 放到文字发送后的后续响应轮次,不要阻塞首条文字回复 + - 只有明确纯表情包回复才先检索表情包,再用 memes.send_meme_by_uid 单独发一条图片消息 + - 其他需要文字承接、解释、答疑、推进任务、确认操作或表达具体态度的场景,第一轮必须优先把必要文字回复做好并调用 send_message + - 如果确实还想补表情包,把 memes.search_memes 和 memes.send_meme_by_uid 放到文字发送后的后续响应轮次,不要阻塞首条文字回复 - 不要发送任何敷衍消息(如'懒得掺和'、'哦'等);不想回复就直接调用 end - 严肃、任务型、高信息密度场景少发表情包,避免打断信息传递 - 绝不要刷屏、绝不要每条都回 8. 对于本来就会回复的场景(私聊、被拍一拍、被@、轻量答疑): - - 如果表情包能自然增强语气、缓和语气或让表达更像真人,也只能作为后续可选补充 + - 如果表情包能自然增强语气、缓和语气或让表达更像真人,也只能作为后续可选补充 - 但不要为了发表情包而牺牲信息传递;信息密度优先时仍以文字为主 简单说:像个极度安静的群友。主动插话只留给公开、开放的技术或项目讨论;明显对别人说或拿不准时就闭嘴。已经决定要回复时,除非明确是纯表情包回复,否则先把文字回复做好,表情包最后再搜。""" @@ -868,6 +868,8 @@ def _build_continuous_messages_note(items: list[BufferedMessage]) -> str: return ( f"\n\n 【连续消息说明】以上 {count} 条 是同一用户在约 " f"{span:.1f} 秒内连续发送的消息(按时间先后排列),代表本轮要回应的全部输入:\n" + f" - 这些 共同构成【当前输入批次】,不要把同批前几条误判为历史旧任务;" + f"批次之外的历史消息仍只作为背景,不能回溯拾荒\n" f" - 先识别每条的意图,分清是【独立请求】还是【对前一条的修正/否定/补充/打断】\n" f' · 若是【多个独立的不同意图/问题】(如"先帮我查 A,再翻译 B")' f" → 每个都要回应,不要遗漏;与平时一样,可以多次 send_message 自然分发\n" @@ -1036,23 +1038,23 @@ def _build_prompt( 2. 如果消息中明确提到了你(根据上下文判断用户是否在叫你或维持对话流) → 【必须回复】 3. 如果问题明确涉及某个项目/代码/部署细节(用户明确点名或上下文明确指向) → 【酌情回复,必要时先查证再回答】 4. 其他技术问题 → 【酌情回复,直接按用户提到的对象回答,不要引入无关的项目名/工具名作背景】 - 5. 先判断这条话是不是在对你说: + 5. 先判断当前输入批次(无连续消息说明时就是最后一条消息)是不是在对你说: - 如果明显是在和别人说话 → 【不要回复】 - 如果你不能确定是不是在和你说话 → 【默认不回复】 - 只有明确在和你说,或多人公开讨论且对话明显开放时,才进入下一步 6. 群聊里的主动参与只保留给公开、开放的技术或项目讨论: - 只在多人公开讨论代码、AI、开发工具、项目进展、技术 bug 等,且不是别人之间定向交流时,才可以【极低频参与】 - 默认更倾向不参与;不要长篇大论,一两句点到为止;如果别人已经在深入讨论且不需要你,保持沉默 - - 轻松互动、玩梗、吐槽本身不构成参与许可;只有在你已经决定要回复,且本轮明确是纯表情包/纯反应图时,才优先考虑表情包表达 + - 轻松互动、玩梗、吐槽本身不构成参与许可;只有在你已经决定要回复,且本轮明确是纯表情包/纯反应图时,才优先考虑表情包表达 7. 对于已经决定要回复的场景(包括被@、被拍一拍、轻量答疑,以及少量符合条件的主动参与): - - 只有明确纯表情包回复才先检索表情包,再用 memes.send_meme_by_uid 单独发一条图片消息 - - 其他需要文字承接、解释、答疑、推进任务、确认操作或表达具体态度的场景,第一轮必须优先把必要文字回复做好并调用 send_message - - 如果确实还想补表情包,把 memes.search_memes 和 memes.send_meme_by_uid 放到文字发送后的后续响应轮次,不要阻塞首条文字回复 + - 只有明确纯表情包回复才先检索表情包,再用 memes.send_meme_by_uid 单独发一条图片消息 + - 其他需要文字承接、解释、答疑、推进任务、确认操作或表达具体态度的场景,第一轮必须优先把必要文字回复做好并调用 send_message + - 如果确实还想补表情包,把 memes.search_memes 和 memes.send_meme_by_uid 放到文字发送后的后续响应轮次,不要阻塞首条文字回复 - 不要发送任何敷衍消息(如'懒得掺和'、'哦'等);不想回复就直接调用 end - 严肃、任务型、高信息密度场景少发表情包,避免打断信息传递 - 绝不要刷屏、绝不要每条都回 8. 对于本来就会回复的场景(私聊、被拍一拍、被@、轻量答疑): - - 如果表情包能自然增强语气、缓和语气或让表达更像真人,也只能作为后续可选补充 + - 如果表情包能自然增强语气、缓和语气或让表达更像真人,也只能作为后续可选补充 - 但不要为了发表情包而牺牲信息传递;信息密度优先时仍以文字为主 简单说:像个极度安静的群友。主动插话只留给公开、开放的技术或项目讨论;明显对别人说或拿不准时就闭嘴。已经决定要回复时,除非明确是纯表情包回复,否则先把文字回复做好,表情包最后再搜。""" diff --git a/tests/test_message_batcher_integration.py b/tests/test_message_batcher_integration.py index 752407d5..b73459e6 100644 --- a/tests/test_message_batcher_integration.py +++ b/tests/test_message_batcher_integration.py @@ -102,6 +102,8 @@ async def test_two_group_messages_merge_into_single_request() -> None: assert "帮我画一只猫" in request_data["full_question"] assert "改成狗" in request_data["full_question"] assert "【连续消息说明】" in request_data["full_question"] + assert "共同构成【当前输入批次】" in request_data["full_question"] + assert "不要把同批前几条误判为历史旧任务" in request_data["full_question"] @pytest.mark.asyncio diff --git a/tests/test_system_prompt_constraints.py b/tests/test_system_prompt_constraints.py index 8a168184..a5d295a1 100644 --- a/tests/test_system_prompt_constraints.py +++ b/tests/test_system_prompt_constraints.py @@ -38,6 +38,26 @@ def test_naga_prompt_requires_scope_before_naga_analysis() -> None: ) +@pytest.mark.parametrize("path", PROMPT_PATHS) +def test_system_prompts_define_batched_current_input(path: Path) -> None: + text = path.read_text(encoding="utf-8") + + assert "MessageBatcher 合并的多条当前 ``" in text + assert "共同构成【当前输入批次】" in text + assert "同批前几条不是历史旧任务" in text + assert "你唯一的主人是【当前输入批次】" in text + assert "你唯一的主人是【最后一条消息】" not in text + assert "只围绕最后一条消息判断四件事" not in text + + +def test_each_rules_define_batched_current_input() -> None: + text = Path("res/IMPORTANT/each.md").read_text(encoding="utf-8") + + assert "当前输入批次定义(适配 MessageBatcher)" in text + assert "同批前几条不是历史旧任务" in text + assert "当前输入批次之外的历史消息" in text + + @pytest.mark.parametrize("path", PROMPT_PATHS) def test_system_prompts_keep_proactive_participation_narrow_and_meme_post_reply( path: Path, From 665a4738b2b9a894e87c3e1369a74de77c26218a Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 21:54:28 +0800 Subject: [PATCH 14/34] feat(probes): include all skill directories in stats --- README.md | 2 +- docs/openapi.md | 6 +- docs/webui-guide.md | 2 +- src/Undefined/api/_context.py | 1 + src/Undefined/api/_helpers.py | 5 +- src/Undefined/api/_openapi.py | 2 +- src/Undefined/api/routes/system.py | 159 +++++++++++++++++++++-- src/Undefined/main.py | 1 + src/Undefined/webui/static/js/i18n.js | 10 +- src/Undefined/webui/static/js/runtime.js | 32 ++--- tests/test_runtime_api_probes.py | 120 +++++++++++++++++ 11 files changed, 308 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index ffc6be6a..95f67cea 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ 详见 [认知记忆文档](docs/cognitive-memory.md)。 - **Management-first WebUI**:继续保留 `uv run Undefined-webui` 一键入口;即使 `config.toml` 缺失或未配完,也能先进入管理态补配置、看日志、校验并启动 Bot。 - **远程管理 + 多端客户端**:浏览器版 WebUI 与新的跨平台控制台共享同一管理面,支持远程管理,并覆盖 `Windows / macOS / Linux / Android` 发布链路。 -- **Management API + Runtime API 分层**:配置、日志、Bot 启停和管理探针由 Management API 提供;主进程 Runtime API 则专注探针、记忆只读查询、认知侧写检索和 WebUI AI Chat。详见 [docs/management-api.md](docs/management-api.md) 与 [docs/openapi.md](docs/openapi.md)。 +- **Management API + Runtime API 分层**:配置、日志、Bot 启停和管理探针由 Management API 提供;主进程 Runtime API 则专注探针、记忆只读查询、认知侧写检索和 WebUI AI Chat;内部探针的技能统计覆盖可调用工具、工具集、Agent、自动处理管线、斜杠命令与 Anthropic Skills。详见 [docs/management-api.md](docs/management-api.md) 与 [docs/openapi.md](docs/openapi.md)。 - **多模型池**:支持配置多个 AI 模型,可轮询、随机选择或用户指定;支持多模型并发比较,选择最佳结果继续对话。详见 [多模型功能文档](docs/multi-model.md)。 - **本地知识库**:将纯文本文件向量化存入 ChromaDB,AI 可通过关键词搜索或语义搜索查询领域知识;支持增量嵌入与自动扫描。详见 [知识库文档](docs/knowledge.md)。 - **全局表情包库**:收到图片后可异步判定是否为表情包,通过两阶段 LLM 管线生成纯文本描述与标签,支持关键词检索、语义检索和混合检索,并可直接按统一图片 `uid` 发送或插入 ``。详见 [表情包库说明](docs/memes.md)。 diff --git a/docs/openapi.md b/docs/openapi.md index 9ab36645..4be8bca7 100644 --- a/docs/openapi.md +++ b/docs/openapi.md @@ -106,10 +106,10 @@ curl http://127.0.0.1:8788/openapi.json | `memory` | `object` | 长期记忆(`count`:条数) | | `cognitive` | `object` | 认知服务(`enabled`、`queue`) | | `api` | `object` | Runtime API 配置(`enabled`、`host`、`port`、`openapi_enabled`) | -| `skills` | `object` | 技能统计,包含 `tools`、`agents`、`anthropic_skills` 三个子对象 | +| `skills` | `object` | 技能统计,包含 `tools`、`toolsets`、`agents`、`auto_pipelines`、`commands`、`anthropic_skills` 子对象 | | `models` | `object` | 模型配置;聊天类模型包含 `model_name`、脱敏 `api_url`、`api_mode`、`thinking_enabled`、`thinking_tool_call_compat`、`responses_tool_choice_compat`、`responses_force_stateless_replay`、`prompt_cache_enabled`、`reasoning_enabled`、`reasoning_effort` | -`skills` 子对象结构: +`skills` 下各分类均提供轻量摘要:`tools` 是当前可调用工具总表,`toolsets` 单独拆出 `skills/toolsets/` 下的工具集工具,`agents` 对应 `skills/agents/`,`auto_pipelines` 对应 `skills/auto_pipeline/`,`commands` 对应 `skills/commands/`,`anthropic_skills` 对应全局 Anthropic Skills。常规注册表子对象结构: ```json { @@ -121,6 +121,8 @@ curl http://127.0.0.1:8788/openapi.json } ``` +`toolsets` 额外包含 `categories[]`,用于按工具集类别汇总;`commands` 额外包含 `aliases` 与 `subcommands` 总数;`auto_pipelines` 额外包含 `hot_reload`,用于观察自动管线热重载 watcher 是否正在运行。 + `models` 子对象结构(URL 经脱敏处理,仅保留 scheme + host;embedding/rerank 仅返回 `model_name` 与 `api_url`): ```json diff --git a/docs/webui-guide.md b/docs/webui-guide.md index be78b57b..abc5bb39 100644 --- a/docs/webui-guide.md +++ b/docs/webui-guide.md @@ -79,7 +79,7 @@ WebUI 共有 8 个主要页签(Tab),下面逐一介绍。 三类探针帮助排查问题: -- **内部探针**:版本号、Python 版本、平台、运行时间、OneBot 连接状态及 WebSocket 地址;同时展示请求队列、消息合并器(含投机预发送状态、当前缓冲桶 phase 与 inflight 标记)、长期记忆 / 认知服务等运行态指标。 +- **内部探针**:版本号、Python 版本、平台、运行时间、OneBot 连接状态及 WebSocket 地址;同时展示请求队列、消息合并器(含投机预发送状态、当前缓冲桶 phase 与 inflight 标记)、长期记忆 / 认知服务、技能统计(可调用工具、工具集、Agent、自动管线、斜杠命令、Anthropic Skills)等运行态指标。 - **外部探针**:Runtime API 的可用端点和能力列表。 - **引导探针**:检查 `config.toml` 是否存在、TOML 语法是否合法、配置值是否有效,并给出修复建议。 diff --git a/src/Undefined/api/_context.py b/src/Undefined/api/_context.py index d1d776cf..86232250 100644 --- a/src/Undefined/api/_context.py +++ b/src/Undefined/api/_context.py @@ -21,3 +21,4 @@ class RuntimeAPIContext: meme_service: Any = None naga_store: Any = None message_batcher: Any = None + auto_pipeline_registry: Any = None diff --git a/src/Undefined/api/_helpers.py b/src/Undefined/api/_helpers.py index 40dcfb00..0ae579a5 100644 --- a/src/Undefined/api/_helpers.py +++ b/src/Undefined/api/_helpers.py @@ -287,9 +287,10 @@ def _registry_summary(registry: Any) -> dict[str, Any]: summary_items: list[dict[str, Any]] = [] for name, item in items.items(): st = stats.get(name) + loaded = getattr(item, "loaded", True) entry: dict[str, Any] = { "name": name, - "loaded": getattr(item, "loaded", False), + "loaded": bool(loaded), } if st is not None: entry["calls"] = getattr(st, "count", 0) @@ -298,7 +299,7 @@ def _registry_summary(registry: Any) -> dict[str, Any]: summary_items.append(entry) return { "count": len(items), - "loaded": sum(1 for i in items.values() if getattr(i, "loaded", False)), + "loaded": sum(1 for item in items.values() if getattr(item, "loaded", True)), "items": summary_items, } diff --git a/src/Undefined/api/_openapi.py b/src/Undefined/api/_openapi.py index 1076256b..46b47546 100644 --- a/src/Undefined/api/_openapi.py +++ b/src/Undefined/api/_openapi.py @@ -39,7 +39,7 @@ def _build_openapi_spec(ctx: RuntimeAPIContext, request: web.Request) -> dict[st "Returns system info (version, Python, platform, uptime), " "OneBot connection status, request queue snapshot, " "memory count, cognitive service status, API config, " - "skill statistics (tools/agents/anthropic_skills with call counts), " + "skill statistics (tools/toolsets/agents/auto_pipelines/commands/anthropic_skills), " "and model configuration (names, masked URLs, thinking flags)." ), } diff --git a/src/Undefined/api/routes/system.py b/src/Undefined/api/routes/system.py index f1aded25..651fc2e4 100644 --- a/src/Undefined/api/routes/system.py +++ b/src/Undefined/api/routes/system.py @@ -35,6 +35,144 @@ _PROCESS_START_TIME = time.time() +def _toolsets_summary(tool_registry: Any) -> dict[str, Any]: + """从主工具注册表拆出 skills/toolsets 的独立摘要。""" + if tool_registry is None: + return {"count": 0, "loaded": 0, "categories": [], "items": []} + + items: dict[str, Any] = getattr(tool_registry, "_items", {}) + stats: dict[str, Any] = {} + get_stats = getattr(tool_registry, "get_stats", None) + if callable(get_stats): + stats = get_stats() + + category_totals: dict[str, dict[str, int]] = {} + summary_items: list[dict[str, Any]] = [] + for name, item in sorted(items.items()): + if "." not in name: + continue + category = name.split(".", 1)[0] + loaded = bool(getattr(item, "loaded", True)) + category_info = category_totals.setdefault( + category, + {"count": 0, "loaded": 0}, + ) + category_info["count"] += 1 + if loaded: + category_info["loaded"] += 1 + + st = stats.get(name) + entry: dict[str, Any] = { + "name": name, + "category": category, + "loaded": loaded, + } + if st is not None: + entry["calls"] = getattr(st, "count", 0) + entry["success"] = getattr(st, "success", 0) + entry["failure"] = getattr(st, "failure", 0) + summary_items.append(entry) + + categories = [ + {"name": name, **counts} for name, counts in sorted(category_totals.items()) + ] + return { + "count": len(summary_items), + "loaded": sum(1 for item in summary_items if item["loaded"]), + "categories": categories, + "items": summary_items, + } + + +async def _auto_pipeline_summary(registry: Any) -> dict[str, Any]: + """生成 skills/auto_pipeline 的探针摘要。""" + if registry is None: + return {"count": 0, "loaded": 0, "items": [], "hot_reload": False} + + items: dict[str, Any] + lock = getattr(registry, "_items_lock", None) + if lock is not None: + async with lock: + items = dict(getattr(registry, "_items", {})) + else: + items = dict(getattr(registry, "_items", {})) + + summary_items = [ + { + "name": name, + "loaded": True, + "order": getattr(item, "order", 0), + "description": getattr(item, "description", ""), + } + for name, item in sorted( + items.items(), key=lambda pair: (getattr(pair[1], "order", 0), pair[0]) + ) + ] + return { + "count": len(summary_items), + "loaded": len(summary_items), + "items": summary_items, + "hot_reload": getattr(registry, "_watch_task", None) is not None, + } + + +def _commands_summary(command_dispatcher: Any) -> dict[str, Any]: + """生成 skills/commands 的探针摘要。""" + command_registry = getattr(command_dispatcher, "command_registry", None) + if command_registry is None: + return { + "count": 0, + "loaded": 0, + "aliases": 0, + "subcommands": 0, + "items": [], + } + + list_commands = getattr(command_registry, "list_commands", None) + if not callable(list_commands): + return { + "count": 0, + "loaded": 0, + "aliases": 0, + "subcommands": 0, + "items": [], + } + + try: + commands = list_commands(include_hidden=True) + except TypeError: + commands = list_commands() + + summary_items: list[dict[str, Any]] = [] + alias_count = 0 + subcommand_count = 0 + for command in commands: + aliases = list(getattr(command, "aliases", []) or []) + subcommands = getattr(command, "subcommands", {}) or {} + alias_count += len(aliases) + subcommand_count += len(subcommands) + summary_items.append( + { + "name": getattr(command, "name", ""), + "loaded": True, + "handler_loaded": getattr(command, "handler", None) is not None, + "aliases": aliases, + "subcommands": len(subcommands), + "permission": getattr(command, "permission", "public"), + "allow_in_private": bool(getattr(command, "allow_in_private", False)), + "show_in_help": bool(getattr(command, "show_in_help", True)), + } + ) + + return { + "count": len(summary_items), + "loaded": len(summary_items), + "aliases": alias_count, + "subcommands": subcommand_count, + "items": summary_items, + } + + async def openapi_handler(ctx: RuntimeAPIContext, request: web.Request) -> Response: cfg = ctx.config_getter() if not bool(getattr(cfg.api, "openapi_enabled", True)): @@ -68,14 +206,19 @@ async def internal_probe_handler( # Skills 统计 ai = ctx.ai - skills_info: dict[str, Any] = {} - if ai is not None: - tool_reg = getattr(ai, "tool_registry", None) - agent_reg = getattr(ai, "agent_registry", None) - anthropic_reg = getattr(ai, "anthropic_skill_registry", None) - skills_info["tools"] = _registry_summary(tool_reg) - skills_info["agents"] = _registry_summary(agent_reg) - skills_info["anthropic_skills"] = _registry_summary(anthropic_reg) + tool_reg = getattr(ai, "tool_registry", None) if ai is not None else None + agent_reg = getattr(ai, "agent_registry", None) if ai is not None else None + anthropic_reg = ( + getattr(ai, "anthropic_skill_registry", None) if ai is not None else None + ) + skills_info: dict[str, Any] = { + "tools": _registry_summary(tool_reg), + "toolsets": _toolsets_summary(tool_reg), + "agents": _registry_summary(agent_reg), + "auto_pipelines": await _auto_pipeline_summary(ctx.auto_pipeline_registry), + "commands": _commands_summary(ctx.command_dispatcher), + "anthropic_skills": _registry_summary(anthropic_reg), + } # 模型配置(脱敏) models_info: dict[str, Any] = {} diff --git a/src/Undefined/main.py b/src/Undefined/main.py index edcfc291..32eb16a3 100644 --- a/src/Undefined/main.py +++ b/src/Undefined/main.py @@ -479,6 +479,7 @@ def _apply_config_updates( meme_service=meme_service, naga_store=naga_store, message_batcher=handler.message_batcher, + auto_pipeline_registry=handler.auto_pipeline_registry, ) runtime_api_server = RuntimeAPIServer( runtime_api_context, diff --git a/src/Undefined/webui/static/js/i18n.js b/src/Undefined/webui/static/js/i18n.js index 4c887c3e..6072922f 100644 --- a/src/Undefined/webui/static/js/i18n.js +++ b/src/Undefined/webui/static/js/i18n.js @@ -175,8 +175,11 @@ const I18N = { "probes.memory_count": "记忆条数", "probes.cognitive": "认知服务", "probes.api_listen": "监听地址", - "probes.tools": "基础工具", + "probes.tools": "可调用工具", + "probes.toolsets": "工具集", "probes.agents": "智能体", + "probes.auto_pipelines": "自动管线", + "probes.commands": "斜杠命令", "probes.all_ok": "所有外部端点均正常", "probes.some_failed": "部分外部端点异常", "memory.title": "记忆检索", @@ -486,8 +489,11 @@ const I18N = { "probes.memory_count": "Memory Count", "probes.cognitive": "Cognitive", "probes.api_listen": "Listen Addr", - "probes.tools": "Tools", + "probes.tools": "Callable Tools", + "probes.toolsets": "Toolsets", "probes.agents": "Agents", + "probes.auto_pipelines": "Auto Pipelines", + "probes.commands": "Slash Commands", "probes.all_ok": "All external endpoints are healthy", "probes.some_failed": "Some external endpoints are unhealthy", "memory.title": "Memory Hub", diff --git a/src/Undefined/webui/static/js/runtime.js b/src/Undefined/webui/static/js/runtime.js index ebeb02ad..c9cfc207 100644 --- a/src/Undefined/webui/static/js/runtime.js +++ b/src/Undefined/webui/static/js/runtime.js @@ -238,29 +238,31 @@ // Skills const sk = data.skills || {}; - if (sk.tools || sk.agents || sk.anthropic_skills) { + const skillRegs = [ + { key: "tools", label: t("probes.tools") }, + { key: "toolsets", label: t("probes.toolsets") }, + { key: "agents", label: t("probes.agents") }, + { key: "auto_pipelines", label: t("probes.auto_pipelines") }, + { key: "commands", label: t("probes.commands") }, + { key: "anthropic_skills", label: "Anthropic Skills" }, + ]; + if (skillRegs.some((reg) => sk[reg.key])) { html += `
`; html += `
${t("probes.section_skills")}
`; html += `
`; - if (sk.tools) - html += probeItem( - t("probes.tools"), - `${sk.tools.loaded ?? 0} / ${sk.tools.count ?? 0}`, - ); - if (sk.agents) + for (const regMeta of skillRegs) { + const reg = sk[regMeta.key]; + if (!reg) continue; html += probeItem( - t("probes.agents"), - `${sk.agents.loaded ?? 0} / ${sk.agents.count ?? 0}`, - ); - if (sk.anthropic_skills) - html += probeItem( - "Anthropic Skills", - `${sk.anthropic_skills.loaded ?? 0} / ${sk.anthropic_skills.count ?? 0}`, + regMeta.label, + `${reg.loaded ?? 0} / ${reg.count ?? 0}`, ); + } html += `
`; // Show active skills (ones with calls > 0) const activeItems = []; - for (const reg of [sk.tools, sk.agents, sk.anthropic_skills]) { + for (const { key } of skillRegs) { + const reg = sk[key]; if (reg && reg.items) { for (const item of reg.items) { if (item.calls > 0) activeItems.push(item); diff --git a/tests/test_runtime_api_probes.py b/tests/test_runtime_api_probes.py index fa32206b..01faa2f7 100644 --- a/tests/test_runtime_api_probes.py +++ b/tests/test_runtime_api_probes.py @@ -1,5 +1,6 @@ from __future__ import annotations +import asyncio import json from types import SimpleNamespace from typing import Any, cast @@ -146,6 +147,125 @@ async def test_runtime_internal_probe_includes_group_superadmin_queue_snapshot() assert payload["queues"]["totals"]["group_superadmin"] == 3 +@pytest.mark.asyncio +async def test_runtime_internal_probe_includes_all_skill_directory_summaries() -> None: + class FakeCommandRegistry: + def __init__(self, commands: list[Any]) -> None: + self._commands = commands + + def list_commands(self, *, include_hidden: bool = False) -> list[Any]: + if include_hidden: + return self._commands + return [command for command in self._commands if command.show_in_help] + + tool_registry = SimpleNamespace( + _items={ + "get_current_time": SimpleNamespace(loaded=False), + "messages.send_message": SimpleNamespace(loaded=True), + }, + get_stats=lambda: { + "messages.send_message": SimpleNamespace(count=3, success=2, failure=1) + }, + ) + agent_registry = SimpleNamespace( + _items={"web_agent": SimpleNamespace(loaded=False)}, + get_stats=lambda: {}, + ) + anthropic_registry = SimpleNamespace( + _items={"code-review": SimpleNamespace()}, + get_stats=lambda: {}, + ) + auto_pipeline_registry = SimpleNamespace( + _items_lock=asyncio.Lock(), + _items={ + "github": SimpleNamespace(order=30, description="GitHub repo cards"), + "arxiv": SimpleNamespace(order=10, description="arXiv papers"), + }, + _watch_task=None, + ) + command_dispatcher = SimpleNamespace( + command_registry=FakeCommandRegistry( + [ + SimpleNamespace( + name="help", + handler=None, + aliases=[], + subcommands={}, + permission="public", + allow_in_private=True, + show_in_help=True, + ), + SimpleNamespace( + name="faq", + handler=object(), + aliases=["f"], + subcommands={"ls": object(), "view": object()}, + permission="public", + allow_in_private=False, + show_in_help=True, + ), + ] + ) + ) + context = RuntimeAPIContext( + config_getter=lambda: SimpleNamespace( + api=SimpleNamespace( + enabled=True, + host="127.0.0.1", + port=8788, + auth_key="changeme", + openapi_enabled=True, + ), + chat_model=SimpleNamespace( + model_name="gpt-5.4", + api_url="https://api.example.com/v1", + api_mode="responses", + thinking_enabled=False, + thinking_tool_call_compat=True, + responses_tool_choice_compat=False, + responses_force_stateless_replay=False, + reasoning_enabled=True, + reasoning_effort="high", + ), + ), + onebot=SimpleNamespace(connection_status=lambda: {}), + ai=SimpleNamespace( + memory_storage=None, + tool_registry=tool_registry, + agent_registry=agent_registry, + anthropic_skill_registry=anthropic_registry, + ), + command_dispatcher=command_dispatcher, + queue_manager=SimpleNamespace(snapshot=lambda: {}), + history_manager=SimpleNamespace(), + auto_pipeline_registry=auto_pipeline_registry, + ) + server = RuntimeAPIServer(context, host="127.0.0.1", port=8788) + + request = cast(web.Request, cast(Any, SimpleNamespace())) + response = await server._internal_probe_handler(request) + response_text = response.text + assert response_text is not None + payload = json.loads(response_text) + + skills = payload["skills"] + assert skills["tools"]["count"] == 2 + assert skills["toolsets"]["count"] == 1 + assert skills["toolsets"]["categories"] == [ + {"name": "messages", "count": 1, "loaded": 1} + ] + assert skills["agents"]["count"] == 1 + assert skills["auto_pipelines"]["count"] == 2 + assert [item["name"] for item in skills["auto_pipelines"]["items"]] == [ + "arxiv", + "github", + ] + assert skills["commands"]["count"] == 2 + assert skills["commands"]["aliases"] == 1 + assert skills["commands"]["subcommands"] == 2 + assert skills["anthropic_skills"]["loaded"] == 1 + + @pytest.mark.asyncio async def test_runtime_external_probe_skips_naga_model_when_integration_disabled( monkeypatch: pytest.MonkeyPatch, From d6e1c43dbb6a5449a3f78c68ba3233ac41855f91 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 22:13:22 +0800 Subject: [PATCH 15/34] fix(memory): include batched input in end records --- docs/cognitive-memory.md | 12 ++--- docs/message-batching.md | 2 + res/prompts/historian_profile_merge.md | 2 +- res/prompts/historian_rewrite.md | 6 +-- res/prompts/undefined.xml | 4 +- res/prompts/undefined_nagaagent.xml | 4 +- src/Undefined/skills/tools/end/README.md | 4 +- src/Undefined/skills/tools/end/config.json | 6 +-- src/Undefined/skills/tools/end/handler.py | 60 +++++++++++++++++++--- tests/test_end_tool.py | 40 +++++++++++++++ tests/test_system_prompt_constraints.py | 34 ++++++++++++ 11 files changed, 150 insertions(+), 24 deletions(-) diff --git a/docs/cognitive-memory.md b/docs/cognitive-memory.md index 7e19c656..258b0527 100644 --- a/docs/cognitive-memory.md +++ b/docs/cognitive-memory.md @@ -4,8 +4,8 @@ 认知记忆系统是 Undefined 的三层分层记忆架构,模拟人类记忆机制: -- **短期记忆**(`end.memo`):每轮对话结束自动记录便签备忘,最近 N 条始终注入,保持短期连续性,零配置开箱即用。 -- **认知记忆**(`end.observations` + `cognitive.*`):核心层,AI 在每轮对话中主动观察并提取用户/群聊事实及有价值的自身行为(`observations`),经后台史官异步改写为绝对化事件并存入 ChromaDB 向量库,支持语义检索;当对话中出现新信息(偏好、身份、习惯等)时,史官自动合并更新 Markdown 侧写文件,下次对话时注入 prompt。 +- **短期记忆**(`end.memo`):每轮对话结束自动记录便签备忘,最近 N 条始终注入,保持短期连续性,零配置开箱即用。若本轮由 MessageBatcher 合并多条消息,memo 应概括整个当前输入批次的处理结果。 +- **认知记忆**(`end.observations` + `cognitive.*`):核心层,AI 在每轮对话中主动观察当前输入批次,提取用户/群聊事实及有价值的自身行为(`observations`),经后台史官异步改写为绝对化事件并存入 ChromaDB 向量库,支持语义检索;当对话中出现新信息(偏好、身份、习惯等)时,史官自动合并更新 Markdown 侧写文件,下次对话时注入 prompt。 - **置顶备忘录**(`memory.*`):AI 自身的置顶提醒(自我约束、待办事项,如"用户要求以后用英文回复"),每轮固定注入,支持增删改查。注意:用户事实(偏好、身份、习惯等)不应写入此层,一律通过 `end.observations` 写入认知记忆。 与旧 `end_summaries` 的区别: @@ -63,8 +63,8 @@ AI 调用 `end` 工具结束对话时,只做一次文件落盘(p95 < 5ms) `end` 字段语义: -- `memo`:本轮便签纸,留给短期记忆看的简短备注(纯流水账动作写这里),可空。 -- `observations`:本轮值得长期留存的观察列表(0..N 条),包括用户/群聊事实和有价值的自身行为(帮谁解决了什么),严格一条一个要点;每条会独立改写与入库。 +- `memo`:本轮便签纸,留给短期记忆看的简短备注(纯流水账动作写这里),可空。当前输入批次包含多条连续消息时,memo 应概括整批处理结果。 +- `observations`:本轮值得长期留存的观察列表(0..N 条),包括用户/群聊事实和有价值的自身行为(帮谁解决了什么),严格一条一个要点;每条会独立改写与入库。当前输入批次包含多条连续消息时,必须覆盖整批消息中值得留存的信息,不能只记录最后一条。 - 两字段都为空时,仅结束会话,不写认知队列。 ### 后台史官流水线 @@ -75,7 +75,7 @@ pending/{job_id}.json ▼ dequeue(原子 os.replace) processing/{job_id}.json │ - ▼ LLM 绝对化改写(消灭代词/相对时间/相对地点;结合“当前消息原文 + 最近消息参考”做实体消歧) + ▼ LLM 绝对化改写(消灭代词/相对时间/相对地点;结合“当前输入批次原文 + 最近消息参考”做实体消歧) │ ▼ 正则闸门检查 │ 通过 → is_absolute=true @@ -98,7 +98,7 @@ processing/{job_id}.json `end` 入队时,系统会额外附带两类“仅供史官推理”的参考内容: -- `source_message`:触发本轮的当前消息原文(优先提取 ``)。 +- `source_message`:触发本轮的当前输入批次原文(优先提取 ``;连续消息会按时间顺序列出多条)。 - `recent_messages`:同会话最近若干条历史消息摘要(含时间、昵称、QQ号、文本片段)。 用途: diff --git a/docs/message-batching.md b/docs/message-batching.md index 1b1e25c5..80aa1b8b 100644 --- a/docs/message-batching.md +++ b/docs/message-batching.md @@ -30,6 +30,8 @@ `res/prompts/undefined.xml`、`res/prompts/undefined_nagaagent.xml` 与 `res/IMPORTANT/each.md` 均按"当前输入批次"适配:有【连续消息说明】时整批当前 `` 都属于本轮输入;没有连续说明时,当前输入批次退化为最后一条消息。防幽灵任务规则仍然生效,但它只隔离当前输入批次之外的历史消息。 +`end.memo` / `end.observations` 也按同一语义适配:当前输入批次包含多条连续消息时,短期 memo 要概括整批处理结果,认知 observations 要覆盖整批消息中值得留存的信息;后台史官收到的 `source_message` 会按时间顺序列出本批所有 ``,不会只取最后一条。 + > **重要**:当前主提示词按 MessageBatcher 默认开启设计。`[message_batcher].enabled = true` 是推荐和默认配置;如果关闭 batcher,连续补充/修正会退化为逐条独立 AI 调用,提示词中的"当前输入批次"语义可能不再覆盖这些连续消息,需要单独调整提示词或接受旧版逐条触发行为。 ## 配置 diff --git a/res/prompts/historian_profile_merge.md b/res/prompts/historian_profile_merge.md index c0716f3f..0dd8d394 100644 --- a/res/prompts/historian_profile_merge.md +++ b/res/prompts/historian_profile_merge.md @@ -30,7 +30,7 @@ - sender_name: {sender_name} - message_ids: {message_ids} - memo: {memo} -- 当前消息原文: {source_message} +- 当前输入批次原文: {source_message} - 最近消息参考: {recent_messages} diff --git a/res/prompts/historian_rewrite.md b/res/prompts/historian_rewrite.md index ac706d29..4b718171 100644 --- a/res/prompts/historian_rewrite.md +++ b/res/prompts/historian_rewrite.md @@ -6,9 +6,9 @@ 3. 消灭所有相对地点(这里、那边),替换为具体地点 4. 保持简洁,一两句话概括 5. `memo` 可能为空;为空时以 `observations` 和上下文为主 -6. `observations` 代表当前消息提取到的一条新记忆(可能是多条中的一条),优先保证可追溯性 +6. `observations` 代表当前输入批次提取到的一条新记忆(可能是多条中的一条);若本轮包含 MessageBatcher 合并的多条消息,必须结合整批消息保证可追溯性 7. 若原文已显式出现实体标识(如 `昵称(数字ID)`、`用户123456`、`QQ:123456`),必须保留该数字ID;禁止擅自替换成 `sender_id` 或其他ID -8. 可参考”当前消息原文”和”最近消息参考”做实体消歧;当 `observations` 与参考上下文冲突时,以可验证且更具体的信息为准 +8. 可参考”当前输入批次原文”和”最近消息参考”做实体消歧;当 `observations` 与参考上下文冲突时,以可验证且更具体的信息为准 9. 当 `force=true` 且命中的“相对表达”属于专有名词本体(如用户名“你是谁”、片名《后天》、书名/歌名等)时,不得改写该专有名词,可保留原词直接提交;但实体 ID 一律不得漂移 称呼规则: @@ -32,7 +32,7 @@ memo: {memo} observations: {observations} -当前消息原文(触发本轮): +当前输入批次原文(触发本轮;连续消息会按时间顺序列出多条): {source_message} 最近消息参考(XML 格式,与主对话一致,消息间以 `---` 分隔,用于消歧,不要求逐字复述): diff --git a/res/prompts/undefined.xml b/res/prompts/undefined.xml index 13920155..98723599 100644 --- a/res/prompts/undefined.xml +++ b/res/prompts/undefined.xml @@ -203,6 +203,7 @@ 调用 end 时提供: - memo:本轮记事本(建议短句,留给短期记忆看的便签纸;可空) - observations:字符串数组,本轮值得长期留存的观察(写入认知记忆,不是 memory.add) + - 若存在【连续消息说明】或多段当前 ``,memo / observations 必须覆盖整个【当前输入批次】;不要只根据最后一条消息记录,也不要把同批前几条当作历史旧消息忽略。 observations 应该记录两类内容: 1. **用户/群聊事实**:偏好、计划、状态变化、人际关系、观点立场、承诺约定、人物事实(身份/职业/技能/习惯等)、群聊事实(群主题/常驻成员/群规/氛围等) 2. **有价值的自身行为**:你为用户做了什么重要的事(帮谁解决了什么问题、给了什么建议、承诺了什么后续行动等)——这些可以帮助未来回忆”上次帮TA做了什么” @@ -829,7 +830,7 @@ **B层:认知记忆(cognitive.* + end.observations)** - 用途:回忆历史事件、读取用户/群侧写、做语义检索 - - 注入:系统会围绕当前消息自动检索相关内容并按需注入;可能为空(不命中就不注入) + - 注入:系统会围绕当前输入批次自动检索相关内容并按需注入;可能为空(不命中就不注入) - 写入:主要通过 `end.observations`(必要时配合 `memo`)异步入库 - 查询:可主动调用 `cognitive.search_events` / `cognitive.get_profile` / `cognitive.search_profiles` - 注意:认知记忆不是手动记事本,通常不需要你直接”新增一条 cognitive 记忆” @@ -841,6 +842,7 @@ 用户事实(偏好、身份、习惯、计划、关系等)一律写 end.observations,不要用 memory.add 要回忆”之前发生过什么”或查看”某人/某群侧写”:用 cognitive.* 查询 对当前输入批次提取值得留存的新观察(用户事实 + 有价值的自身行为):写到 end.observations(数组,严格一条一个要点) + 当前输入批次若包含多条连续消息,end.observations 必须覆盖整批消息中值得留存的信息;禁止只记录最后一条。 纯流水账动作(调了什么工具、决定不回复等)只写 memo,不写 end.observations 一次性闲聊、无后续价值的信息,不写入任何记忆 当你”不明白/信息缺口明显”且任务可能依赖历史时,可主动查询 cognitive.* 与最近消息;先小范围检索,再按需扩展范围 diff --git a/res/prompts/undefined_nagaagent.xml b/res/prompts/undefined_nagaagent.xml index b72a4811..4a40de20 100644 --- a/res/prompts/undefined_nagaagent.xml +++ b/res/prompts/undefined_nagaagent.xml @@ -202,6 +202,7 @@ 调用 end 时提供: - memo:本轮记事本(建议短句,留给短期记忆看的便签纸;可空) - observations:字符串数组,本轮值得长期留存的观察(写入认知记忆,不是 memory.add) + - 若存在【连续消息说明】或多段当前 ``,memo / observations 必须覆盖整个【当前输入批次】;不要只根据最后一条消息记录,也不要把同批前几条当作历史旧消息忽略。 observations 应该记录两类内容: 1. **用户/群聊事实**:偏好、计划、状态变化、人际关系、观点立场、承诺约定、人物事实(身份/职业/技能/习惯等)、群聊事实(群主题/常驻成员/群规/氛围等) 2. **有价值的自身行为**:你为用户做了什么重要的事(帮谁解决了什么问题、给了什么建议、承诺了什么后续行动等)——这些可以帮助未来回忆”上次帮TA做了什么” @@ -877,7 +878,7 @@ **B层:认知记忆(cognitive.* + end.observations)** - 用途:回忆历史事件、读取用户/群侧写、做语义检索 - - 注入:系统会围绕当前消息自动检索相关内容并按需注入;可能为空(不命中就不注入) + - 注入:系统会围绕当前输入批次自动检索相关内容并按需注入;可能为空(不命中就不注入) - 写入:主要通过 `end.observations`(必要时配合 `memo`)异步入库 - 查询:可主动调用 `cognitive.search_events` / `cognitive.get_profile` / `cognitive.search_profiles` - 注意:认知记忆不是手动记事本,通常不需要你直接”新增一条 cognitive 记忆” @@ -889,6 +890,7 @@ 用户事实(偏好、身份、习惯、计划、关系等)一律写 end.observations,不要用 memory.add 要回忆”之前发生过什么”或查看”某人/某群侧写”:用 cognitive.* 查询 对当前输入批次提取值得留存的新观察(用户事实 + 有价值的自身行为):写到 end.observations(数组,严格一条一个要点) + 当前输入批次若包含多条连续消息,end.observations 必须覆盖整批消息中值得留存的信息;禁止只记录最后一条。 纯流水账动作(调了什么工具、决定不回复等)只写 memo,不写 end.observations 一次性闲聊、无后续价值的信息,不写入任何记忆 当你”不明白/信息缺口明显”且任务可能依赖历史时,可主动查询 cognitive.* 与最近消息;先小范围检索,再按需扩展范围 diff --git a/src/Undefined/skills/tools/end/README.md b/src/Undefined/skills/tools/end/README.md index 1c41c4e2..b761a026 100644 --- a/src/Undefined/skills/tools/end/README.md +++ b/src/Undefined/skills/tools/end/README.md @@ -3,8 +3,8 @@ 用于结束对话,通常在完成回复后调用一次。 关键信息: -- `memo`(可选):本轮便签纸,留给短期记忆看的简短备注(纯流水账动作写这里,如调用工具、决定不回复等) -- `observations`(可选):字符串数组,本轮值得长期留存的观察(严格一条一个要点,可多条)——包括用户/群聊事实和有价值的自身行为(帮谁解决了什么问题);纯流水账写 memo 而非此处 +- `memo`(可选):本轮便签纸,留给短期记忆看的简短备注(纯流水账动作写这里,如调用工具、决定不回复等)。若当前输入批次包含多条消息,应概括整批处理结果。 +- `observations`(可选):字符串数组,本轮值得长期留存的观察(严格一条一个要点,可多条)——包括用户/群聊事实和有价值的自身行为(帮谁解决了什么问题);纯流水账写 memo 而非此处。若当前输入批次包含 MessageBatcher 合并的多条消息,必须覆盖整批消息内容,不能只记录最后一条。 - `force`(可选):`true` 时可跳过"本轮未发送消息"的结束检查;同时在认知史官绝对化正则闸门失败时允许强制入库 - 两者都可为空;为空时仅结束会话,不写认知队列 - 向后兼容:旧参数名 `action_summary`/`new_info` 仍可使用,会自动映射到 `memo`/`observations` diff --git a/src/Undefined/skills/tools/end/config.json b/src/Undefined/skills/tools/end/config.json index 0ee7192a..f3670d05 100644 --- a/src/Undefined/skills/tools/end/config.json +++ b/src/Undefined/skills/tools/end/config.json @@ -2,18 +2,18 @@ "type": "function", "function": { "name": "end", - "description": "结束当前对话。memo 是本轮便签纸(短句);observations 提取本轮值得长期留存的观察——包括用户/群聊事实和有回忆价值的自身行为(帮谁解决了什么),纯流水账动作写 memo。", + "description": "结束当前对话。memo 是本轮便签纸(短句);observations 从当前输入批次提取本轮值得长期留存的观察——包括用户/群聊事实和有回忆价值的自身行为(帮谁解决了什么),纯流水账动作写 memo。若当前输入批次包含 MessageBatcher 合并的多条消息,记忆记录必须覆盖整批,不要只看最后一条。", "parameters": { "type": "object", "properties": { "memo": { "type": "string", - "description": "本轮行动备忘(可空,建议短句)" + "description": "本轮行动备忘(可空,建议短句)。若当前输入批次包含多条消息,memo 应概括整批处理结果。" }, "observations": { "type": "array", "items": {"type": "string"}, - "description": "从当前消息提取认知观察列表——记录用户/群聊事实(偏好、计划、状态、关系、观点、人物事实、群聊事实)以及有回忆价值的自身行为(帮谁解决了什么问题、给了什么建议)。每条一个要点,宁多勿漏。纯流水账动作(调了什么工具、决定不回复)写 memo 而非此处。格式:具体、绝对化,写明谁/何时/何地。" + "description": "从当前输入批次提取认知观察列表;存在【连续消息说明】或多段当前 时,必须覆盖整批消息内容,不能只记录最后一条。记录用户/群聊事实(偏好、计划、状态、关系、观点、人物事实、群聊事实)以及有回忆价值的自身行为(帮谁解决了什么问题、给了什么建议)。每条一个要点,宁多勿漏。纯流水账动作(调了什么工具、决定不回复)写 memo 而非此处。格式:具体、绝对化,写明谁/何时/何地。" }, "summary": { "type": "string", diff --git a/src/Undefined/skills/tools/end/handler.py b/src/Undefined/skills/tools/end/handler.py index 42a98831..f185c276 100644 --- a/src/Undefined/skills/tools/end/handler.py +++ b/src/Undefined/skills/tools/end/handler.py @@ -1,6 +1,7 @@ from __future__ import annotations from collections import deque +import html from typing import Any, Dict import logging import re @@ -20,10 +21,11 @@ _TRUE_BOOL_TOKENS = {"1", "true", "yes", "y", "on"} _FALSE_BOOL_TOKENS = {"0", "false", "no", "n", "off", ""} -_CONTENT_TAG_RE = re.compile( - r"]*>\s*(?P.*?)\s*", +_MESSAGE_TAG_RE = re.compile( + r"[^>]*)>\s*(?P.*?).*?", re.DOTALL | re.IGNORECASE, ) +_MESSAGE_ATTR_RE = re.compile(r'(?P[\w:-]+)="(?P[^"]*)"') _DEFAULT_HISTORIAN_TEXT_LEN = 800 _DEFAULT_HISTORIAN_LINES = 12 _DEFAULT_HISTORIAN_LINE_LEN = 240 @@ -127,13 +129,57 @@ def _resolve_historian_limits(context: Dict[str, Any]) -> tuple[int, int]: return max_source_len, recent_k -def _extract_current_content_from_question(question: str, *, max_len: int) -> str: +def _parse_message_attrs(attrs_text: str) -> dict[str, str]: + return { + match.group("name"): html.unescape(match.group("value")) + for match in _MESSAGE_ATTR_RE.finditer(attrs_text) + } + + +def _format_source_message_line( + index: int, + attrs: dict[str, str], + content: str, + *, + content_max_len: int, +) -> str: + label_parts = [] + for key in ( + "message_id", + "sender", + "sender_id", + "group_id", + "group_name", + "location", + "time", + ): + value = attrs.get(key) + if value: + label_parts.append(f"{key}={value}") + label = " ".join(label_parts) or "message" + return f"[{index}] {label}: {_clip_text(content, content_max_len)}" + + +def _extract_current_input_batch_from_question(question: str, *, max_len: int) -> str: text = str(question or "").strip() if not text: return "" - matched = _CONTENT_TAG_RE.search(text) - if matched: - return _clip_text(matched.group("content"), max_len) + matches = list(_MESSAGE_TAG_RE.finditer(text)) + if matches: + if len(matches) == 1: + return _clip_text(html.unescape(matches[0].group("content")), max_len) + + content_max_len = max(32, max_len // max(len(matches), 1)) + lines = [ + _format_source_message_line( + index, + _parse_message_attrs(match.group("attrs")), + html.unescape(match.group("content")), + content_max_len=content_max_len, + ) + for index, match in enumerate(matches, start=1) + ] + return _clip_text("\n".join(lines), max_len) return _clip_text(text, max_len) @@ -189,7 +235,7 @@ def _build_historian_recent_messages( def _inject_historian_reference_context(context: Dict[str, Any]) -> None: max_source_len, recent_k = _resolve_historian_limits(context) current_question = str(context.get("current_question") or "").strip() - source_message = _extract_current_content_from_question( + source_message = _extract_current_input_batch_from_question( current_question, max_len=max_source_len ) if source_message: diff --git a/tests/test_end_tool.py b/tests/test_end_tool.py index 4b65584a..1e9d2e23 100644 --- a/tests/test_end_tool.py +++ b/tests/test_end_tool.py @@ -158,6 +158,46 @@ async def test_end_enriches_historian_reference_context() -> None: assert cognitive_service.last_force is True +@pytest.mark.asyncio +async def test_end_historian_source_message_includes_batched_messages() -> None: + cognitive_service = _FakeCognitiveService() + context: dict[str, Any] = { + "request_id": "req-historian-batch", + "request_type": "group", + "group_id": "1082837821", + "user_id": "120218451", + "sender_id": "120218451", + "cognitive_service": cognitive_service, + "current_question": ( + '' + "我周三要发版" + '' + "补充:是后端服务发版" + "\n\n 【连续消息说明】以上 2 条 共同构成【当前输入批次】" + ), + } + + result = await execute( + {"observations": ["洛泫周三要进行后端服务发版"], "force": True}, + context, + ) + + assert result == "对话已结束" + source = str(context.get("historian_source_message", "")) + assert "[1]" in source + assert "[2]" in source + assert "message_id=101" in source + assert "message_id=102" in source + assert "我周三要发版" in source + assert "补充:是后端服务发版" in source + assert cognitive_service.last_context is not None + assert cognitive_service.last_context.get("historian_source_message") == source + + class _ManyHistoryManager: def get_recent( self, chat_id: str, msg_type: str, start: int, end: int diff --git a/tests/test_system_prompt_constraints.py b/tests/test_system_prompt_constraints.py index a5d295a1..eba10955 100644 --- a/tests/test_system_prompt_constraints.py +++ b/tests/test_system_prompt_constraints.py @@ -1,3 +1,4 @@ +import json from pathlib import Path import pytest @@ -58,6 +59,39 @@ def test_each_rules_define_batched_current_input() -> None: assert "当前输入批次之外的历史消息" in text +@pytest.mark.parametrize("path", PROMPT_PATHS) +def test_system_prompts_tell_end_to_record_whole_current_input_batch( + path: Path, +) -> None: + text = path.read_text(encoding="utf-8") + + assert "memo / observations 必须覆盖整个【当前输入批次】" in text + assert "不要只根据最后一条消息记录" in text + assert "end.observations 必须覆盖整批消息中值得留存的信息" in text + assert "系统会围绕当前输入批次自动检索相关内容" in text + + +def test_end_tool_schema_mentions_current_input_batch() -> None: + schema = json.loads( + Path("src/Undefined/skills/tools/end/config.json").read_text(encoding="utf-8") + ) + function = schema["function"] + observations = function["parameters"]["properties"]["observations"] + + assert "当前输入批次" in function["description"] + assert "必须覆盖整批消息内容" in observations["description"] + assert "不能只记录最后一条" in observations["description"] + + +def test_historian_prompts_reference_current_input_batch_source() -> None: + rewrite = Path("res/prompts/historian_rewrite.md").read_text(encoding="utf-8") + merge = Path("res/prompts/historian_profile_merge.md").read_text(encoding="utf-8") + + assert "当前输入批次提取到的一条新记忆" in rewrite + assert "当前输入批次原文(触发本轮;连续消息会按时间顺序列出多条)" in rewrite + assert "当前输入批次原文" in merge + + @pytest.mark.parametrize("path", PROMPT_PATHS) def test_system_prompts_keep_proactive_participation_narrow_and_meme_post_reply( path: Path, From 1f09ea4638f63490ff8843976637221772771e46 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 22:20:44 +0800 Subject: [PATCH 16/34] refactor(end): remove legacy summary parameters --- res/prompts/undefined.xml | 8 ++-- res/prompts/undefined_nagaagent.xml | 8 ++-- src/Undefined/skills/tools/end/README.md | 1 - src/Undefined/skills/tools/end/config.json | 4 -- src/Undefined/skills/tools/end/handler.py | 26 +++-------- tests/test_end_tool.py | 51 ++++++++++------------ tests/test_system_prompt_constraints.py | 9 +++- 7 files changed, 46 insertions(+), 61 deletions(-) diff --git a/res/prompts/undefined.xml b/res/prompts/undefined.xml index 98723599..91aaeca0 100644 --- a/res/prompts/undefined.xml +++ b/res/prompts/undefined.xml @@ -180,20 +180,20 @@ 如果决定不回复,也要调用 end。 - **end_summary 填写原则(避免噪音污染短期记忆):** + **end.memo 填写原则(避免噪音污染短期记忆):** - **核心原则**:只记录对未来有价值的信息,避免无意义的流水账 - **禁止记录无意义内容**:不要写"我决定不回复"、"保持沉默"、"没有触发条件"等 - - **简洁有价值**:summary 应该是对未来有帮助的信息 + - **简洁有价值**:memo 应该是对未来有帮助的信息 - **memo 要短**:优先一句短句,避免长段复盘 - **何时应该填写 summary:** + **何时应该填写 memo:** - 执行了实质性操作(发送消息、调用工具、查询信息等) - 记录了重要承诺或待办事项 - 发现了需要后续跟进的问题 - **观察到重要上下文**:即使不回复,但发现了值得记住的情况(如用户状态、话题变化、潜在需求等) - **有要告诉之后的自己的信息**:任何对未来处理有帮助的观察或判断 - **何时不应该填写 summary:** + **何时不应该填写 memo:** - 决定不回复且没有任何值得记录的信息 - 只是简单回复了一句话,没有后续价值 - 纯粹的闲聊或表情回应,没有特殊上下文 diff --git a/res/prompts/undefined_nagaagent.xml b/res/prompts/undefined_nagaagent.xml index 4a40de20..9723ea80 100644 --- a/res/prompts/undefined_nagaagent.xml +++ b/res/prompts/undefined_nagaagent.xml @@ -180,20 +180,20 @@ 如果决定不回复,也要调用 end。 - **end_summary 填写原则(避免噪音污染短期记忆):** + **end.memo 填写原则(避免噪音污染短期记忆):** - **核心原则**:只记录对未来有价值的信息,避免无意义的流水账 - **禁止记录无意义内容**:不要写"我决定不回复"、"保持沉默"、"没有触发条件"等 - - **简洁有价值**:summary 应该是对未来有帮助的信息 + - **简洁有价值**:memo 应该是对未来有帮助的信息 - **memo 要短**:优先一句短句,避免长段复盘 - **何时应该填写 summary:** + **何时应该填写 memo:** - 执行了实质性操作(发送消息、调用工具、查询信息等) - 记录了重要承诺或待办事项 - 发现了需要后续跟进的问题 - **观察到重要上下文**:即使不回复,但发现了值得记住的情况(如用户状态、话题变化、潜在需求等) - **有要告诉之后的自己的信息**:任何对未来处理有帮助的观察或判断 - **何时不应该填写 summary:** + **何时不应该填写 memo:** - 决定不回复且没有任何值得记录的信息 - 只是简单回复了一句话,没有后续价值 - 纯粹的闲聊或表情回应,没有特殊上下文 diff --git a/src/Undefined/skills/tools/end/README.md b/src/Undefined/skills/tools/end/README.md index b761a026..1a85d70a 100644 --- a/src/Undefined/skills/tools/end/README.md +++ b/src/Undefined/skills/tools/end/README.md @@ -7,7 +7,6 @@ - `observations`(可选):字符串数组,本轮值得长期留存的观察(严格一条一个要点,可多条)——包括用户/群聊事实和有价值的自身行为(帮谁解决了什么问题);纯流水账写 memo 而非此处。若当前输入批次包含 MessageBatcher 合并的多条消息,必须覆盖整批消息内容,不能只记录最后一条。 - `force`(可选):`true` 时可跳过"本轮未发送消息"的结束检查;同时在认知史官绝对化正则闸门失败时允许强制入库 - 两者都可为空;为空时仅结束会话,不写认知队列 -- 向后兼容:旧参数名 `action_summary`/`new_info` 仍可使用,会自动映射到 `memo`/`observations` 目录结构: - `config.json`:工具定义 diff --git a/src/Undefined/skills/tools/end/config.json b/src/Undefined/skills/tools/end/config.json index f3670d05..bb782b8f 100644 --- a/src/Undefined/skills/tools/end/config.json +++ b/src/Undefined/skills/tools/end/config.json @@ -15,10 +15,6 @@ "items": {"type": "string"}, "description": "从当前输入批次提取认知观察列表;存在【连续消息说明】或多段当前 时,必须覆盖整批消息内容,不能只记录最后一条。记录用户/群聊事实(偏好、计划、状态、关系、观点、人物事实、群聊事实)以及有回忆价值的自身行为(帮谁解决了什么问题、给了什么建议)。每条一个要点,宁多勿漏。纯流水账动作(调了什么工具、决定不回复)写 memo 而非此处。格式:具体、绝对化,写明谁/何时/何地。" }, - "summary": { - "type": "string", - "description": "[过渡兼容] 旧版摘要字段,优先使用 memo。尽量不要填写。" - }, "perspective": { "type": "string", "description": "可选记录视角(如 group/sender),用于多史官并行场景区分记录。" diff --git a/src/Undefined/skills/tools/end/handler.py b/src/Undefined/skills/tools/end/handler.py index f185c276..60ea0e9a 100644 --- a/src/Undefined/skills/tools/end/handler.py +++ b/src/Undefined/skills/tools/end/handler.py @@ -275,17 +275,9 @@ def _build_location(context: Dict[str, Any]) -> EndSummaryLocation | None: async def execute(args: Dict[str, Any], context: Dict[str, Any]) -> str: - # memo 优先新名,fallback 旧名 action_summary 和 summary - memo_raw = ( - args.get("memo") - if "memo" in args - else (args.get("action_summary") or args.get("summary", "")) - ) + memo_raw = args.get("memo", "") memo = memo_raw.strip() if isinstance(memo_raw, str) else "" - # observations 优先新名,fallback 旧名 new_info - observations_raw = ( - args.get("observations") if "observations" in args else args.get("new_info", []) - ) + observations_raw = args.get("observations", []) if isinstance(observations_raw, str): observations = [observations_raw.strip()] if observations_raw.strip() else [] elif isinstance(observations_raw, list): @@ -296,8 +288,6 @@ async def execute(args: Dict[str, Any], context: Dict[str, Any]) -> str: observations = [] perspective_raw = args.get("perspective", "") perspective = perspective_raw.strip() if isinstance(perspective_raw, str) else "" - # 兼容旧版 summary 字段 - summary = memo force_raw = args.get("force", False) force, force_recognized = _parse_force_flag(force_raw) if "force" in args and not force_recognized: @@ -309,7 +299,7 @@ async def execute(args: Dict[str, Any], context: Dict[str, Any]) -> str: ) # memo 非空且本轮未发送消息时拒绝(force=true 可跳过) - if summary and not force and not _was_message_sent_this_turn(context): + if memo and not force and not _was_message_sent_this_turn(context): logger.warning( "[end工具] 拒绝执行:本轮未发送消息,request_id=%s", context.get("request_id", "-"), @@ -321,21 +311,19 @@ async def execute(args: Dict[str, Any], context: Dict[str, Any]) -> str: "若你获取到了新信息,应填写 observations 字段以保存这些信息,而不是放在 memo 里。" ) - if summary: + if memo: location = _build_location(context) record: EndSummaryRecord | None = None end_summary_storage = context.get("end_summary_storage") if isinstance(end_summary_storage, EndSummaryStorage): - record = await end_summary_storage.append_summary( - summary, location=location - ) + record = await end_summary_storage.append_summary(memo, location=location) elif end_summary_storage is not None: logger.warning( "[end工具] end_summary_storage 类型异常: %s", type(end_summary_storage) ) if record is None: - record = EndSummaryStorage.make_record(summary, location=location) + record = EndSummaryStorage.make_record(memo, location=location) end_summaries = context.get("end_summaries") if end_summaries is not None: @@ -349,7 +337,7 @@ async def execute(args: Dict[str, Any], context: Dict[str, Any]) -> str: "[end工具] end_summaries 类型异常: %s", type(end_summaries) ) - logger.info("保存end记录: %s...", summary[:50]) + logger.info("保存end记录: %s...", memo[:50]) else: logger.info("[end工具] memo 为空,跳过 end 摘要写入") diff --git a/tests/test_end_tool.py b/tests/test_end_tool.py index 1e9d2e23..92be8277 100644 --- a/tests/test_end_tool.py +++ b/tests/test_end_tool.py @@ -60,34 +60,6 @@ async def test_end_accepts_message_sent_flag_from_request_context_string_true() assert context["conversation_ended"] is True -@pytest.mark.asyncio -async def test_end_backward_compat_action_summary_param() -> None: - """向后兼容:旧参数名 action_summary 仍能正常工作。""" - context: dict[str, Any] = {"request_id": "req-compat-summary"} - - result = await execute( - {"action_summary": "已发送消息", "force": True}, - context, - ) - - assert result == "对话已结束" - assert context["conversation_ended"] is True - - -@pytest.mark.asyncio -async def test_end_backward_compat_new_info_param() -> None: - """向后兼容:旧参数名 new_info 仍能正常工作。""" - context: dict[str, Any] = {"request_id": "req-compat-new-info"} - - result = await execute( - {"new_info": ["一条旧格式信息"], "force": True}, - context, - ) - - assert result == "对话已结束" - assert context["conversation_ended"] is True - - class _FakeHistoryManager: def get_recent( self, chat_id: str, msg_type: str, start: int, end: int @@ -122,6 +94,29 @@ async def enqueue_job( return "job-test" +@pytest.mark.asyncio +async def test_end_ignores_removed_legacy_param_names() -> None: + cognitive_service = _FakeCognitiveService() + context: dict[str, Any] = { + "request_id": "req-removed-compat", + "cognitive_service": cognitive_service, + } + + result = await execute( + { + "action_summary": "旧字段不应写入 memo", + "summary": "旧摘要字段不应写入 memo", + "new_info": ["旧字段不应写入 observations"], + "force": True, + }, + context, + ) + + assert result == "对话已结束" + assert context["conversation_ended"] is True + assert cognitive_service.last_context is None + + @pytest.mark.asyncio async def test_end_enriches_historian_reference_context() -> None: cognitive_service = _FakeCognitiveService() diff --git a/tests/test_system_prompt_constraints.py b/tests/test_system_prompt_constraints.py index eba10955..85e0b456 100644 --- a/tests/test_system_prompt_constraints.py +++ b/tests/test_system_prompt_constraints.py @@ -69,6 +69,9 @@ def test_system_prompts_tell_end_to_record_whole_current_input_batch( assert "不要只根据最后一条消息记录" in text assert "end.observations 必须覆盖整批消息中值得留存的信息" in text assert "系统会围绕当前输入批次自动检索相关内容" in text + assert "何时应该填写 memo" in text + assert "何时应该填写 summary" not in text + assert "summary 应该是对未来有帮助的信息" not in text def test_end_tool_schema_mentions_current_input_batch() -> None: @@ -76,11 +79,15 @@ def test_end_tool_schema_mentions_current_input_batch() -> None: Path("src/Undefined/skills/tools/end/config.json").read_text(encoding="utf-8") ) function = schema["function"] - observations = function["parameters"]["properties"]["observations"] + properties = function["parameters"]["properties"] + observations = properties["observations"] assert "当前输入批次" in function["description"] assert "必须覆盖整批消息内容" in observations["description"] assert "不能只记录最后一条" in observations["description"] + assert "summary" not in properties + assert "action_summary" not in properties + assert "new_info" not in properties def test_historian_prompts_reference_current_input_batch_source() -> None: From c32ec65644de8cfd973e9103d8996bee1ea86ba0 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 22:30:11 +0800 Subject: [PATCH 17/34] docs(changelog): add v3.4.0 release notes --- CHANGELOG.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 768a0b36..f273c1b8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,19 @@ -## Unreleased +## v3.4.0 消息合并、当前输入批次与运行态可观测性 -- 新增同 sender 短时消息合并:同一发送者在 `[message_batcher].window_seconds`(默认 5s)内连续发送的多条消息会合并到同一轮 AI 调用,AI 一次性处理整批意图,避免"画猫"→"改成狗"等场景出现重复回复或行为打架。配置项见 `[message_batcher]`,支持 `extend`/`fixed` 两种策略与 `max_window_seconds`、`max_messages_per_batch` 硬顶;拍一拍永远旁路立即处理,群聊已有 buffer 时新到的 @bot 也会单独立即处理;启用合并后历史记录写入逻辑保持不变。详见 [docs/message-batching.md](docs/message-batching.md)。 -- 消息合并新增**投机预发送(speculative pre-fire)**:双计时器状态机 `T2 = pre_send_seconds < T1 = window_seconds`,静默到 T2 先把当前 batch 提前发给 LLM 抢时间,T1 才正式结束 batch。新消息在 inflight 尚未发出任何回复时可取消该 LLM 调用并合并入下一轮;通过 `[message_batcher].allow_cancel_after_send` 控制 inflight 已发消息后是否仍允许取消(默认 false 安全)。`pre_send_seconds = 0` 退化为旧行为。 +本版本围绕“用户连续发消息时只形成一个清晰输入批次”重构了主对话入口、提示词边界和记忆写入语义。默认启用同 sender 短时消息合并,AI 会在同一轮里按时间顺序看到整批 ``,自行区分独立请求、补充、修正与打断;配套加入可取消的投机预发送以降低停顿后的首响延迟,并系统性补齐异步竞态、shutdown drain、Runtime 探针和文档测试。提示词、防幽灵任务、认知记忆和 `end` 工具统一改为围绕“当前输入批次”工作,减少连续补充被误判为历史旧任务或只记录最后一条消息的情况。 + +- 新增同 sender 短时消息合并器:默认开启,可分别控制群聊/私聊合并窗口、最大批次大小与硬上限;同一 sender 的短时间连续消息会合并为一轮 AI 请求,AI 一次理解完整意图,避免“先触发旧请求、再触发修正请求”的重复回复和工具打架。 +- 引入投机预发送:在用户停顿但静默窗口未完全结束时可提前启动 LLM,请求在真正发出回复前仍可被后续新消息取消;`max_window_seconds=0` 现表示不设硬上限,适合只依赖静默窗口收束的配置。 +- 强化批处理异步安全:为 T1/T2 定时任务持有强引用,使用 token 取消尚未登记 in-flight 的投机请求;T2 失败会回滚等待 T1 重试,旧任务完成不会清掉新桶,shutdown 时会先 flush batcher、等待队列 drain 和在途任务收敛,再停止队列与历史落盘。 +- 统一“当前输入批次”提示词语义:主提示词、NagaAgent 提示词与 `each.md` 均明确把【连续消息说明】下的多段 `` 视为同一轮输入;防幽灵任务仍隔离批次之外的历史消息,但不会把同批前几条误判为旧任务。 +- 适配记忆记录链路:`end.memo` / `end.observations` 必须覆盖整个当前输入批次,后台史官收到的 `source_message` 会按时间顺序列出本批全部消息;同时移除 `end` 的旧参数兼容,只保留 `memo`、`observations`、`perspective` 与 `force`。 +- 优化表情包调用策略:提示词要求“文字 + 表情包”场景先发送必要文字,再在后续轮次检索和发送表情包;只有纯表情包/纯反应图回复才允许首轮直接搜索,避免表情包检索拖慢正经文字回复。 +- 加强 AI 工具调用鲁棒性:AI 客户端会拦截空函数名或缺失函数名的 tool call,返回结构化工具错误而不是继续执行空工具,避免日志出现“准备调用: (ID=)”和“未找到项目: ”一类无效调用。 +- 扩展 Runtime 内部探针:新增消息合并器状态快照(配置、pending buckets、phase、in-flight、投机状态),并把技能统计扩展到可调用工具、工具集、Agent、自动处理管线、斜杠命令和 Anthropic Skills,WebUI 探针页同步展示这些运行态指标。 +- 补齐配置、架构与使用文档:新增 [docs/message-batching.md](docs/message-batching.md),同步更新 README、配置文档、OpenAPI、WebUI 指南与架构图,明确 batcher 默认开启以及关闭后提示词语义可能退回逐条触发的风险。 +- 提升回归覆盖:新增消息合并器状态机、投机取消、shutdown drain、队列收敛、当前输入批次提示词、`end` 记忆记录、空工具调用守卫和 Runtime 探针统计等测试,总测试用例提升至 1620+ 项。 + +--- ## v3.3.3 命令推断、自动处理管线与统一附件上下文 From 05e27fb6f7fbeb90881f8051f5a66020af7f5721 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 22:32:38 +0800 Subject: [PATCH 18/34] docs(changelog): clarify v3.4.0 notes --- CHANGELOG.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f273c1b8..ec0dd13f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,17 @@ -## v3.4.0 消息合并、当前输入批次与运行态可观测性 - -本版本围绕“用户连续发消息时只形成一个清晰输入批次”重构了主对话入口、提示词边界和记忆写入语义。默认启用同 sender 短时消息合并,AI 会在同一轮里按时间顺序看到整批 ``,自行区分独立请求、补充、修正与打断;配套加入可取消的投机预发送以降低停顿后的首响延迟,并系统性补齐异步竞态、shutdown drain、Runtime 探针和文档测试。提示词、防幽灵任务、认知记忆和 `end` 工具统一改为围绕“当前输入批次”工作,减少连续补充被误判为历史旧任务或只记录最后一条消息的情况。 - -- 新增同 sender 短时消息合并器:默认开启,可分别控制群聊/私聊合并窗口、最大批次大小与硬上限;同一 sender 的短时间连续消息会合并为一轮 AI 请求,AI 一次理解完整意图,避免“先触发旧请求、再触发修正请求”的重复回复和工具打架。 -- 引入投机预发送:在用户停顿但静默窗口未完全结束时可提前启动 LLM,请求在真正发出回复前仍可被后续新消息取消;`max_window_seconds=0` 现表示不设硬上限,适合只依赖静默窗口收束的配置。 -- 强化批处理异步安全:为 T1/T2 定时任务持有强引用,使用 token 取消尚未登记 in-flight 的投机请求;T2 失败会回滚等待 T1 重试,旧任务完成不会清掉新桶,shutdown 时会先 flush batcher、等待队列 drain 和在途任务收敛,再停止队列与历史落盘。 -- 统一“当前输入批次”提示词语义:主提示词、NagaAgent 提示词与 `each.md` 均明确把【连续消息说明】下的多段 `` 视为同一轮输入;防幽灵任务仍隔离批次之外的历史消息,但不会把同批前几条误判为旧任务。 -- 适配记忆记录链路:`end.memo` / `end.observations` 必须覆盖整个当前输入批次,后台史官收到的 `source_message` 会按时间顺序列出本批全部消息;同时移除 `end` 的旧参数兼容,只保留 `memo`、`observations`、`perspective` 与 `force`。 -- 优化表情包调用策略:提示词要求“文字 + 表情包”场景先发送必要文字,再在后续轮次检索和发送表情包;只有纯表情包/纯反应图回复才允许首轮直接搜索,避免表情包检索拖慢正经文字回复。 -- 加强 AI 工具调用鲁棒性:AI 客户端会拦截空函数名或缺失函数名的 tool call,返回结构化工具错误而不是继续执行空工具,避免日志出现“准备调用: (ID=)”和“未找到项目: ”一类无效调用。 -- 扩展 Runtime 内部探针:新增消息合并器状态快照(配置、pending buckets、phase、in-flight、投机状态),并把技能统计扩展到可调用工具、工具集、Agent、自动处理管线、斜杠命令和 Anthropic Skills,WebUI 探针页同步展示这些运行态指标。 -- 补齐配置、架构与使用文档:新增 [docs/message-batching.md](docs/message-batching.md),同步更新 README、配置文档、OpenAPI、WebUI 指南与架构图,明确 batcher 默认开启以及关闭后提示词语义可能退回逐条触发的风险。 -- 提升回归覆盖:新增消息合并器状态机、投机取消、shutdown drain、队列收敛、当前输入批次提示词、`end` 记忆记录、空工具调用守卫和 Runtime 探针统计等测试,总测试用例提升至 1620+ 项。 +## v3.4.0 连续消息合并与当前输入批次 + +本版本主要解决“用户一口气连发几条消息时,机器人过早开工或只理解最后一句”的问题。现在同一个 sender 在短时间内连续发送的消息会默认合并成一个当前输入批次,AI 会一次看到整批内容,再判断哪些是独立请求、哪些是补充或修正。围绕这个变化,提示词、防幽灵任务、记忆记录、Runtime 探针和关闭流程都做了同步适配,让连续对话更自然,也让异常和运行状态更容易排查。 + +- 新增并默认启用同 sender 短时消息合并。连续消息会合并为一轮 AI 请求,适合“先说需求、再补充限制”“上一句说错了马上修正”等场景,减少重复回复、重复工具调用和互相打架的结果。 +- 加入可取消的提前处理机制。用户停顿到一定时间后,系统可以先让 LLM 开始生成以降低等待感;如果真正回复发出前又来了新消息,这次处理会被取消并合并到新批次里。 +- 加强消息合并的异步稳定性。定时器、投机请求、失败重试、旧任务收尾和关机 flush 都做了竞态保护;退出时会先把缓冲消息发完,并等待队列和在途回复自然收敛。 +- 统一当前输入批次语义。主提示词、NagaAgent 提示词和 `each.md` 都明确:有【连续消息说明】时,多段 `` 都属于本轮输入;批次之外的历史消息仍只作背景,不会被误当成本轮要执行的旧任务。 +- 让记忆记录覆盖整批消息。`end.memo` 和 `end.observations` 现在要求记录整个当前输入批次中值得留存的信息,后台史官也会收到本批全部消息;同时移除了 `end` 的旧参数兼容,只保留 `memo`、`observations`、`perspective` 和 `force`。 +- 优化表情包回复顺序。需要文字说明时会先发必要文字,再把表情包检索和发送放到后续轮次;只有纯表情包/纯反应图回复才会一上来搜索表情包。 +- 提升工具调用容错。AI 客户端会拦截空函数名或缺失函数名的 tool call,返回明确的工具错误,不再继续执行空工具并刷出“未找到项目”类日志。 +- 扩展 Runtime 探针和 WebUI 展示。内部探针现在能看到消息合并器状态,也能统计可调用工具、工具集、Agent、自动处理管线、斜杠命令和 Anthropic Skills。 +- 补齐配置、架构和使用文档。新增 [docs/message-batching.md](docs/message-batching.md),并同步更新 README、配置文档、OpenAPI、WebUI 指南和架构图,说明默认开启、可调参数以及关闭后可能带来的提示词语义差异。 +- 补强测试覆盖。新增消息合并、投机取消、shutdown drain、当前输入批次提示词、`end` 记忆记录、空工具调用守卫和 Runtime 探针统计等回归测试,总测试用例提升至 1620+ 项。 --- From 2fed91fadb76a794500dab88f39c297cd2b438a5 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 22:34:43 +0800 Subject: [PATCH 19/34] docs(changelog): remove file link from v3.4.0 notes --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec0dd13f..a827d416 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ - 优化表情包回复顺序。需要文字说明时会先发必要文字,再把表情包检索和发送放到后续轮次;只有纯表情包/纯反应图回复才会一上来搜索表情包。 - 提升工具调用容错。AI 客户端会拦截空函数名或缺失函数名的 tool call,返回明确的工具错误,不再继续执行空工具并刷出“未找到项目”类日志。 - 扩展 Runtime 探针和 WebUI 展示。内部探针现在能看到消息合并器状态,也能统计可调用工具、工具集、Agent、自动处理管线、斜杠命令和 Anthropic Skills。 -- 补齐配置、架构和使用文档。新增 [docs/message-batching.md](docs/message-batching.md),并同步更新 README、配置文档、OpenAPI、WebUI 指南和架构图,说明默认开启、可调参数以及关闭后可能带来的提示词语义差异。 +- 补齐配置、架构和使用文档。新增消息合并专题文档,并同步更新 README、配置文档、OpenAPI、WebUI 指南和架构图,说明默认开启、可调参数以及关闭后可能带来的提示词语义差异。 - 补强测试覆盖。新增消息合并、投机取消、shutdown drain、当前输入批次提示词、`end` 记忆记录、空工具调用守卫和 Runtime 探针统计等回归测试,总测试用例提升至 1620+ 项。 --- From 21bda6c9257385df5f7fb7c2353bd0667db135d7 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 22:45:30 +0800 Subject: [PATCH 20/34] ci(release): build notes from changelog --- .github/workflows/release.yml | 79 +-------- CHANGELOG.md | 1 + docs/build.md | 21 +-- docs/development.md | 3 +- scripts/README.md | 22 +++ scripts/release_notes.py | 273 +++++++++++++++++++++++++++++ tests/test_release_notes_script.py | 163 +++++++++++++++++ 7 files changed, 470 insertions(+), 92 deletions(-) create mode 100644 scripts/release_notes.py create mode 100644 tests/test_release_notes_script.py diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b2481699..d19deeb2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,46 +38,10 @@ jobs: - name: Install Python dependencies run: uv sync --group ci -p ${{ env.PYTHON_VERSION }} - - name: Validate release tag matches package version + - name: Validate release tag, build versions, and changelog env: TAG_NAME: ${{ github.ref_name }} - run: | - uv run python - <<'PY' - import os - import pathlib - import re - import sys - import tomllib - - tag_name = os.environ["TAG_NAME"] - expected_version = tag_name.removeprefix("v") - - pyproject = tomllib.loads(pathlib.Path("pyproject.toml").read_text(encoding="utf-8")) - project_version = str(pyproject["project"]["version"]).strip() - - init_text = pathlib.Path("src/Undefined/__init__.py").read_text(encoding="utf-8") - match = re.search(r'__version__\s*=\s*"([^"]+)"', init_text) - if match is None: - raise SystemExit("Could not find __version__ in src/Undefined/__init__.py") - init_version = match.group(1).strip() - - errors: list[str] = [] - if project_version != init_version: - errors.append( - f"Version mismatch: pyproject.toml={project_version}, src/Undefined/__init__.py={init_version}" - ) - if project_version != expected_version: - errors.append( - f"Tag/version mismatch: tag={tag_name}, expected package version={expected_version}, actual={project_version}" - ) - - if errors: - raise SystemExit("\n".join(errors)) - - print( - f"Validated release version {project_version} from tag {tag_name}, pyproject.toml, and src/Undefined/__init__.py" - ) - PY + run: uv run python scripts/release_notes.py validate --tag "$TAG_NAME" - name: Cache Ruff uses: actions/cache@v4 @@ -572,9 +536,6 @@ jobs: with: fetch-depth: 0 - - name: Fetch tags - run: git fetch --tags --force - - name: Download build artifacts uses: actions/download-artifact@v4 with: @@ -583,39 +544,7 @@ jobs: - name: Build release notes shell: bash - run: | - TAG_NAME="${{ github.ref_name }}" - TAG_TYPE=$(git cat-file -t "$TAG_NAME") - TAG_CONTENT="" - if [ "$TAG_TYPE" = "tag" ]; then - TAG_CONTENT=$(git tag -l --format='%(contents)' "$TAG_NAME") - TAG_CONTENT=$(echo "$TAG_CONTENT" | sed '/-----BEGIN PGP SIGNATURE-----/,/-----END PGP SIGNATURE-----/d') - fi - PREV_TAG=$(git describe --tags --abbrev=0 "${TAG_NAME}^" 2>/dev/null || git rev-list --max-parents=0 HEAD) - if [ -n "$TAG_CONTENT" ]; then - echo "$TAG_CONTENT" > tag_message.txt - printf '\n---\n\n' >> tag_message.txt - else - : > tag_message.txt - fi - cat >> tag_message.txt <<'NOTES' - ## 📝 Detailed Changes - NOTES - FEAT_COMMITS=$(git log ${PREV_TAG}..${TAG_NAME} --grep='^feat' --pretty=format:'* %s (%h)' 2>/dev/null || true) - if [ -n "$FEAT_COMMITS" ]; then - echo -e "\n### 🚀 Features" >> tag_message.txt - echo "$FEAT_COMMITS" >> tag_message.txt - fi - FIX_COMMITS=$(git log ${PREV_TAG}..${TAG_NAME} --grep='^fix' --pretty=format:'* %s (%h)' 2>/dev/null || true) - if [ -n "$FIX_COMMITS" ]; then - echo -e "\n### 🐛 Bug Fixes" >> tag_message.txt - echo "$FIX_COMMITS" >> tag_message.txt - fi - OTHER_COMMITS=$(git log ${PREV_TAG}..${TAG_NAME} --grep='^feat\|^fix' --invert-grep --pretty=format:'* %s (%h)' 2>/dev/null || true) - if [ -n "$OTHER_COMMITS" ]; then - echo -e "\n### 🛠 Maintenance & Others" >> tag_message.txt - echo "$OTHER_COMMITS" >> tag_message.txt - fi + run: python3 scripts/release_notes.py notes --tag "${{ github.ref_name }}" --output release_notes.md - name: Create GitHub release env: @@ -623,7 +552,7 @@ jobs: run: | gh release create ${{ github.ref_name }} release-downloads/* \ --title "Undefined ${{ github.ref_name }}" \ - --notes-file tag_message.txt + --notes-file release_notes.md publish-pypi: name: Publish Python package to PyPI diff --git a/CHANGELOG.md b/CHANGELOG.md index a827d416..2f13d1ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - 优化表情包回复顺序。需要文字说明时会先发必要文字,再把表情包检索和发送放到后续轮次;只有纯表情包/纯反应图回复才会一上来搜索表情包。 - 提升工具调用容错。AI 客户端会拦截空函数名或缺失函数名的 tool call,返回明确的工具错误,不再继续执行空工具并刷出“未找到项目”类日志。 - 扩展 Runtime 探针和 WebUI 展示。内部探针现在能看到消息合并器状态,也能统计可调用工具、工具集、Agent、自动处理管线、斜杠命令和 Anthropic Skills。 +- 调整发布说明来源。GitHub Release notes 现在从 `CHANGELOG.md` 最新版本条目生成,发版前会校验 tag、各构建清单和最新 changelog 版本一致,避免 tag 注释与正式版本说明不一致。 - 补齐配置、架构和使用文档。新增消息合并专题文档,并同步更新 README、配置文档、OpenAPI、WebUI 指南和架构图,说明默认开启、可调参数以及关闭后可能带来的提示词语义差异。 - 补强测试覆盖。新增消息合并、投机取消、shutdown drain、当前输入批次提示词、`end` 记忆记录、空工具调用守卫和 Runtime 探针统计等回归测试,总测试用例提升至 1620+ 项。 diff --git a/docs/build.md b/docs/build.md index 229c5b94..2a0d903e 100644 --- a/docs/build.md +++ b/docs/build.md @@ -278,22 +278,11 @@ npm install 工作流主要阶段: -1. `verify-python` - - `ruff` - - `mypy` - - `pytest` - - `uv build` -2. `build-tauri-desktop` - - Linux:`.AppImage` + `.deb` - - Windows:`.exe` + `.msi` - - macOS x64:`.dmg` - - macOS arm64:`.dmg` -3. `build-tauri-android` - - Android 通用 `.apk` -4. `publish-release` - - 汇总所有产物并上传 GitHub Release -5. `publish-pypi` - - 发布 Python 包到 PyPI +1. `verify-python`:校验 tag、构建版本和 `CHANGELOG.md` 最新版本一致,并执行 `ruff`、`mypy`、`pytest`、`uv build`。 +2. `build-tauri-desktop`:构建 Linux `.AppImage` / `.deb`、Windows `.exe` / `.msi`、macOS x64 `.dmg` 和 macOS arm64 `.dmg`。 +3. `build-tauri-android`:构建 Android 通用 `.apk`。 +4. `publish-release`:汇总所有产物并上传 GitHub Release;Release notes 从 `CHANGELOG.md` 最新版本条目生成,不读取 tag 注释。 +5. `publish-pypi`:发布 Python 包到 PyPI。 ## 8. Release 产物矩阵 diff --git a/docs/development.md b/docs/development.md index 522c1f65..a79211ac 100644 --- a/docs/development.md +++ b/docs/development.md @@ -46,7 +46,8 @@ src/Undefined/ - 仓库根目录的 `CHANGELOG.md` 是正式版本历史的唯一事实来源。 - `src/Undefined/changelog.py` 负责解析和校验这份文档,供 `/changelog` 命令和 `changelog_query` tool 共用。 -- 新增或调整版本条目时,不要只改 tag 注释;应同步维护 `CHANGELOG.md`,确保运行时查询和仓库文档一致。 +- 新增或调整版本条目时,不要只改 tag 注释;应同步维护 `CHANGELOG.md`,确保运行时查询、仓库文档和 GitHub Release 说明一致。 +- 发布流水线会校验构建版本、tag 版本和 `CHANGELOG.md` 最新版本一致,并从最新 changelog 条目生成 Release notes。 ### callable.json 共享授权机制 diff --git a/scripts/README.md b/scripts/README.md index cae7f2dc..9d9686c5 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -59,3 +59,25 @@ uv run python scripts/reembed_cognitive.py -v - 运行期间不要同时启动机器人,避免 ChromaDB 写入冲突 - 大量记录时注意 API 限速,可通过 `--batch-size` 降低并发 - 建议先用 `--dry-run` 确认记录数量和配置正确性 + +### release_notes.py — 发布版本校验与 Release notes 生成 + +Release workflow 使用这个脚本在构建前校验版本一致性,并在发布阶段从 `CHANGELOG.md` 最新版本条目生成 GitHub Release 说明。 + +```bash +# 校验 tag、构建版本和 CHANGELOG 最新版本一致 +uv run python scripts/release_notes.py validate --tag v3.4.0 + +# 从 CHANGELOG 最新条目生成 Release notes +python3 scripts/release_notes.py notes --tag v3.4.0 --output release_notes.md +``` + +**校验范围**: + +- `pyproject.toml` +- `src/Undefined/__init__.py` +- `apps/undefined-console/package.json` +- `apps/undefined-console/package-lock.json` +- `apps/undefined-console/src-tauri/Cargo.toml` +- `apps/undefined-console/src-tauri/tauri.conf.json` +- `CHANGELOG.md` 最新版本条目 diff --git a/scripts/release_notes.py b/scripts/release_notes.py new file mode 100644 index 00000000..f572788c --- /dev/null +++ b/scripts/release_notes.py @@ -0,0 +1,273 @@ +#!/usr/bin/env python3 +"""Validate release versions and render GitHub release notes from CHANGELOG.md.""" + +from __future__ import annotations + +import argparse +from dataclasses import dataclass +import json +from pathlib import Path +import re +import sys +import tomllib +from typing import Any, cast + + +_PROJECT_ROOT = Path(__file__).resolve().parent.parent +_SRC_DIR = _PROJECT_ROOT / "src" +if str(_SRC_DIR) not in sys.path: + sys.path.insert(0, str(_SRC_DIR)) + +from Undefined.changelog import ( # noqa: E402 + ChangelogEntry, + normalize_version, + parse_changelog_text, +) + + +class ReleaseValidationError(ValueError): + """Raised when release metadata is inconsistent.""" + + +@dataclass(frozen=True, slots=True) +class VersionSource: + name: str + version: str + + +@dataclass(frozen=True, slots=True) +class ReleaseValidationResult: + version: str + changelog_version: str + tag_version: str | None + sources: tuple[VersionSource, ...] + + +def _read_required_text(path: Path) -> str: + if not path.is_file(): + raise ReleaseValidationError(f"Missing required file: {path}") + return path.read_text(encoding="utf-8") + + +def _require_non_empty_string(value: object, label: str) -> str: + if not isinstance(value, str) or not value.strip(): + raise ReleaseValidationError(f"Missing required version value: {label}") + return value.strip() + + +def _read_pyproject_version(project_root: Path) -> str: + path = project_root / "pyproject.toml" + data = tomllib.loads(_read_required_text(path)) + project = data.get("project") + if not isinstance(project, dict): + raise ReleaseValidationError("pyproject.toml is missing [project]") + return _require_non_empty_string( + project.get("version"), "pyproject.toml project.version" + ) + + +def _read_init_version(project_root: Path) -> str: + path = project_root / "src" / "Undefined" / "__init__.py" + text = _read_required_text(path) + match = re.search(r'__version__\s*=\s*"([^"]+)"', text) + if match is None: + raise ReleaseValidationError( + "Could not find __version__ in src/Undefined/__init__.py" + ) + return match.group(1).strip() + + +def _read_json_file(path: Path) -> dict[str, Any]: + return cast(dict[str, Any], json.loads(_read_required_text(path))) + + +def _read_json_version(project_root: Path, relative_path: str) -> str: + path = project_root / relative_path + data = _read_json_file(path) + return _require_non_empty_string(data.get("version"), f"{relative_path} version") + + +def _read_package_lock_root_version(project_root: Path) -> str: + relative_path = "apps/undefined-console/package-lock.json" + data = _read_json_file(project_root / relative_path) + packages = data.get("packages") + if not isinstance(packages, dict): + raise ReleaseValidationError(f"{relative_path} is missing packages") + root_package = packages.get("") + if not isinstance(root_package, dict): + raise ReleaseValidationError(f'{relative_path} is missing packages[""]') + return _require_non_empty_string( + root_package.get("version"), f'{relative_path} packages[""].version' + ) + + +def _read_cargo_version(project_root: Path) -> str: + relative_path = "apps/undefined-console/src-tauri/Cargo.toml" + path = project_root / relative_path + data = tomllib.loads(_read_required_text(path)) + package = data.get("package") + if not isinstance(package, dict): + raise ReleaseValidationError(f"{relative_path} is missing [package]") + return _require_non_empty_string( + package.get("version"), f"{relative_path} package.version" + ) + + +def read_build_version_sources( + project_root: Path = _PROJECT_ROOT, +) -> tuple[VersionSource, ...]: + root = project_root.resolve() + return ( + VersionSource("pyproject.toml", _read_pyproject_version(root)), + VersionSource("src/Undefined/__init__.py", _read_init_version(root)), + VersionSource( + "apps/undefined-console/package.json", + _read_json_version(root, "apps/undefined-console/package.json"), + ), + VersionSource( + 'apps/undefined-console/package-lock.json packages[""]', + _read_package_lock_root_version(root), + ), + VersionSource( + "apps/undefined-console/src-tauri/Cargo.toml", _read_cargo_version(root) + ), + VersionSource( + "apps/undefined-console/src-tauri/tauri.conf.json", + _read_json_version( + root, "apps/undefined-console/src-tauri/tauri.conf.json" + ), + ), + ) + + +def read_latest_changelog_entry(project_root: Path = _PROJECT_ROOT) -> ChangelogEntry: + path = project_root.resolve() / "CHANGELOG.md" + entries = parse_changelog_text(_read_required_text(path)) + return entries[0] + + +def validate_release_versions( + *, + tag_name: str | None, + project_root: Path = _PROJECT_ROOT, +) -> ReleaseValidationResult: + sources = read_build_version_sources(project_root) + base_version = sources[0].version + changelog_entry = read_latest_changelog_entry(project_root) + changelog_version = changelog_entry.version.removeprefix("v") + tag_version = normalize_version(tag_name).removeprefix("v") if tag_name else None + + errors: list[str] = [] + for source in sources[1:]: + if source.version != base_version: + errors.append( + f"Version mismatch: pyproject.toml={base_version}, {source.name}={source.version}" + ) + if changelog_version != base_version: + errors.append( + "Version mismatch: " + f"pyproject.toml={base_version}, CHANGELOG.md latest={changelog_entry.version}" + ) + if tag_version is not None and tag_version != base_version: + errors.append( + f"Tag/version mismatch: tag={tag_name}, expected build version={tag_version}, actual={base_version}" + ) + + if errors: + raise ReleaseValidationError("\n".join(errors)) + + return ReleaseValidationResult( + version=base_version, + changelog_version=changelog_entry.version, + tag_version=tag_version, + sources=sources, + ) + + +def render_release_notes(entry: ChangelogEntry) -> str: + lines = [f"## {entry.version} {entry.title}", ""] + lines.extend(entry.summary.splitlines()) + lines.extend(["", "### 变更内容", ""]) + lines.extend(f"- {change}" for change in entry.changes) + return "\n".join(lines).rstrip() + "\n" + + +def write_release_notes( + *, + output_path: Path, + tag_name: str | None, + project_root: Path = _PROJECT_ROOT, +) -> ChangelogEntry: + validate_release_versions(tag_name=tag_name, project_root=project_root) + entry = read_latest_changelog_entry(project_root) + output_path.parent.mkdir(parents=True, exist_ok=True) + output_path.write_text(render_release_notes(entry), encoding="utf-8") + return entry + + +def _build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description="Release metadata helper") + parser.add_argument( + "--project-root", + type=Path, + default=_PROJECT_ROOT, + help="Repository root, defaults to the parent of scripts/", + ) + subparsers = parser.add_subparsers(dest="command", required=True) + + validate_parser = subparsers.add_parser( + "validate", + help="validate release tag, build versions, and CHANGELOG latest version", + ) + validate_parser.add_argument( + "--tag", required=True, help="Release tag, such as v3.4.0" + ) + + notes_parser = subparsers.add_parser( + "notes", help="write GitHub release notes from CHANGELOG.md latest version" + ) + notes_parser.add_argument( + "--tag", required=True, help="Release tag, such as v3.4.0" + ) + notes_parser.add_argument( + "--output", type=Path, required=True, help="Output markdown file" + ) + + return parser + + +def main(argv: list[str] | None = None) -> int: + parser = _build_parser() + args = parser.parse_args(argv) + project_root = cast(Path, args.project_root).resolve() + + try: + if args.command == "validate": + result = validate_release_versions( + tag_name=cast(str, args.tag), project_root=project_root + ) + source_names = ", ".join(source.name for source in result.sources) + print( + "Validated release version " + f"{result.version} from tag v{result.tag_version}, {source_names}, " + f"and CHANGELOG.md latest {result.changelog_version}" + ) + return 0 + if args.command == "notes": + entry = write_release_notes( + output_path=cast(Path, args.output), + tag_name=cast(str, args.tag), + project_root=project_root, + ) + print(f"Wrote release notes for {entry.version} to {args.output}") + return 0 + except Exception as exc: + print(str(exc), file=sys.stderr) + return 1 + + parser.error(f"Unsupported command: {args.command}") + return 2 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_release_notes_script.py b/tests/test_release_notes_script.py new file mode 100644 index 00000000..29001d1f --- /dev/null +++ b/tests/test_release_notes_script.py @@ -0,0 +1,163 @@ +from __future__ import annotations + +import importlib.util +from pathlib import Path +import sys +from types import ModuleType +from typing import Any, cast + +import pytest + + +_SCRIPT_PATH = Path(__file__).resolve().parent.parent / "scripts" / "release_notes.py" + + +def _load_script() -> ModuleType: + spec = importlib.util.spec_from_file_location("release_notes_script", _SCRIPT_PATH) + if spec is None or spec.loader is None: + raise RuntimeError("Could not load release_notes.py") + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + spec.loader.exec_module(module) + return module + + +release_notes = _load_script() + + +def _write_release_project( + root: Path, + *, + build_version: str = "1.2.3", + changelog_version: str = "v1.2.3", +) -> None: + (root / "src" / "Undefined").mkdir(parents=True) + (root / "apps" / "undefined-console" / "src-tauri").mkdir(parents=True) + (root / "pyproject.toml").write_text( + f'[project]\nname = "Undefined-bot"\nversion = "{build_version}"\n', + encoding="utf-8", + ) + (root / "src" / "Undefined" / "__init__.py").write_text( + f'__version__ = "{build_version}"\n', + encoding="utf-8", + ) + (root / "apps" / "undefined-console" / "package.json").write_text( + f'{{"version":"{build_version}"}}\n', + encoding="utf-8", + ) + (root / "apps" / "undefined-console" / "package-lock.json").write_text( + f'{{"version":"{build_version}","packages":{{"":{{"version":"{build_version}"}}}}}}\n', + encoding="utf-8", + ) + (root / "apps" / "undefined-console" / "src-tauri" / "Cargo.toml").write_text( + f'[package]\nname = "undefined-console"\nversion = "{build_version}"\n', + encoding="utf-8", + ) + (root / "apps" / "undefined-console" / "src-tauri" / "tauri.conf.json").write_text( + f'{{"version":"{build_version}"}}\n', + encoding="utf-8", + ) + (root / "CHANGELOG.md").write_text( + f""" +## {changelog_version} 测试版本 + +这是一段发布说明。 + +- 变更一 +- 变更二 +""".strip() + + "\n", + encoding="utf-8", + ) + + +def test_validate_release_versions_accepts_matching_project(tmp_path: Path) -> None: + _write_release_project(tmp_path) + + result = release_notes.validate_release_versions( + tag_name="v1.2.3", project_root=tmp_path + ) + + assert result.version == "1.2.3" + assert result.changelog_version == "v1.2.3" + assert result.tag_version == "1.2.3" + assert {source.name for source in result.sources} >= { + "pyproject.toml", + "src/Undefined/__init__.py", + "apps/undefined-console/package.json", + "apps/undefined-console/src-tauri/Cargo.toml", + } + + +def test_validate_release_versions_rejects_changelog_mismatch(tmp_path: Path) -> None: + _write_release_project(tmp_path, build_version="1.2.3", changelog_version="v1.2.4") + + with pytest.raises( + release_notes.ReleaseValidationError, match="CHANGELOG.md latest" + ): + release_notes.validate_release_versions( + tag_name="v1.2.3", project_root=tmp_path + ) + + +def test_validate_release_versions_rejects_app_manifest_mismatch( + tmp_path: Path, +) -> None: + _write_release_project(tmp_path) + (tmp_path / "apps" / "undefined-console" / "package.json").write_text( + '{"version":"1.2.4"}\n', + encoding="utf-8", + ) + + with pytest.raises( + release_notes.ReleaseValidationError, match="package.json=1.2.4" + ): + release_notes.validate_release_versions( + tag_name="v1.2.3", project_root=tmp_path + ) + + +def test_write_release_notes_uses_latest_changelog_entry(tmp_path: Path) -> None: + _write_release_project(tmp_path) + output = tmp_path / "release_notes.md" + + entry = release_notes.write_release_notes( + output_path=output, + tag_name="v1.2.3", + project_root=tmp_path, + ) + + assert entry.version == "v1.2.3" + assert output.read_text(encoding="utf-8") == ( + "## v1.2.3 测试版本\n" + "\n" + "这是一段发布说明。\n" + "\n" + "### 变更内容\n" + "\n" + "- 变更一\n" + "- 变更二\n" + ) + + +def test_cli_notes_writes_output_file(tmp_path: Path) -> None: + _write_release_project(tmp_path) + output = tmp_path / "notes.md" + + exit_code = cast( + Any, + release_notes.main, + )( + [ + "--project-root", + str(tmp_path), + "notes", + "--tag", + "v1.2.3", + "--output", + str(output), + ] + ) + + assert exit_code == 0 + assert output.read_text(encoding="utf-8").startswith("## v1.2.3 测试版本") From e49c6a02f3abed80264bbc34caeca6f406f9e1e7 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sat, 2 May 2026 23:00:55 +0800 Subject: [PATCH 21/34] chore(version): bump version to 3.4.0 --- apps/undefined-console/package-lock.json | 4 ++-- apps/undefined-console/package.json | 2 +- apps/undefined-console/src-tauri/Cargo.lock | 2 +- apps/undefined-console/src-tauri/Cargo.toml | 2 +- apps/undefined-console/src-tauri/tauri.conf.json | 2 +- pyproject.toml | 2 +- src/Undefined/__init__.py | 2 +- uv.lock | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/undefined-console/package-lock.json b/apps/undefined-console/package-lock.json index c2c4dc67..b3aa39d6 100644 --- a/apps/undefined-console/package-lock.json +++ b/apps/undefined-console/package-lock.json @@ -1,12 +1,12 @@ { "name": "undefined-console", - "version": "3.3.3", + "version": "3.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "undefined-console", - "version": "3.3.3", + "version": "3.4.0", "dependencies": { "@tauri-apps/api": "^2.3.0", "@tauri-apps/plugin-http": "^2.3.0" diff --git a/apps/undefined-console/package.json b/apps/undefined-console/package.json index d9c09cba..bff36e4a 100644 --- a/apps/undefined-console/package.json +++ b/apps/undefined-console/package.json @@ -1,7 +1,7 @@ { "name": "undefined-console", "private": true, - "version": "3.3.3", + "version": "3.4.0", "type": "module", "scripts": { "tauri": "tauri", diff --git a/apps/undefined-console/src-tauri/Cargo.lock b/apps/undefined-console/src-tauri/Cargo.lock index c49cdcb8..0abd584c 100644 --- a/apps/undefined-console/src-tauri/Cargo.lock +++ b/apps/undefined-console/src-tauri/Cargo.lock @@ -4063,7 +4063,7 @@ checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "undefined_console" -version = "3.3.3" +version = "3.4.0" dependencies = [ "serde", "serde_json", diff --git a/apps/undefined-console/src-tauri/Cargo.toml b/apps/undefined-console/src-tauri/Cargo.toml index 68cdf136..cff5d45e 100644 --- a/apps/undefined-console/src-tauri/Cargo.toml +++ b/apps/undefined-console/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "undefined_console" -version = "3.3.3" +version = "3.4.0" description = "Undefined cross-platform management console" authors = ["Undefined contributors"] license = "MIT" diff --git a/apps/undefined-console/src-tauri/tauri.conf.json b/apps/undefined-console/src-tauri/tauri.conf.json index 566f1df0..c0b87a55 100644 --- a/apps/undefined-console/src-tauri/tauri.conf.json +++ b/apps/undefined-console/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Undefined Console", - "version": "3.3.3", + "version": "3.4.0", "identifier": "com.undefined.console", "build": { "beforeDevCommand": "npm run dev", diff --git a/pyproject.toml b/pyproject.toml index 16311cd6..dacbe005 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "Undefined-bot" -version = "3.3.3" +version = "3.4.0" description = "QQ bot platform with cognitive memory architecture and multi-agent Skills, via OneBot V11." readme = "README.md" authors = [ diff --git a/src/Undefined/__init__.py b/src/Undefined/__init__.py index 74f5cd58..1e2f7010 100644 --- a/src/Undefined/__init__.py +++ b/src/Undefined/__init__.py @@ -1,3 +1,3 @@ """Undefined - A high-performance, highly scalable QQ group and private chat robot based on a self-developed architecture.""" -__version__ = "3.3.3" +__version__ = "3.4.0" diff --git a/uv.lock b/uv.lock index 29931865..dcd2658b 100644 --- a/uv.lock +++ b/uv.lock @@ -4638,7 +4638,7 @@ wheels = [ [[package]] name = "undefined-bot" -version = "3.3.3" +version = "3.4.0" source = { editable = "." } dependencies = [ { name = "aiofiles" }, From 4a5d05e2dee4ac650bba1ed148b81784e6b6c4a5 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Sun, 3 May 2026 08:22:18 +0800 Subject: [PATCH 22/34] feat(webui): show changelog on about page --- CHANGELOG.md | 2 +- docs/webui-guide.md | 2 +- src/Undefined/webui/routes/_system.py | 61 +++++++++ src/Undefined/webui/static/css/components.css | 10 ++ src/Undefined/webui/static/js/i18n.js | 14 ++ src/Undefined/webui/static/js/main.js | 125 ++++++++++++++++++ src/Undefined/webui/templates/index.html | 10 ++ tests/test_webui_management_api.py | 76 +++++++++++ 8 files changed, 298 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f13d1ec..2cb63532 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ - 让记忆记录覆盖整批消息。`end.memo` 和 `end.observations` 现在要求记录整个当前输入批次中值得留存的信息,后台史官也会收到本批全部消息;同时移除了 `end` 的旧参数兼容,只保留 `memo`、`observations`、`perspective` 和 `force`。 - 优化表情包回复顺序。需要文字说明时会先发必要文字,再把表情包检索和发送放到后续轮次;只有纯表情包/纯反应图回复才会一上来搜索表情包。 - 提升工具调用容错。AI 客户端会拦截空函数名或缺失函数名的 tool call,返回明确的工具错误,不再继续执行空工具并刷出“未找到项目”类日志。 -- 扩展 Runtime 探针和 WebUI 展示。内部探针现在能看到消息合并器状态,也能统计可调用工具、工具集、Agent、自动处理管线、斜杠命令和 Anthropic Skills。 +- 扩展 Runtime 探针和 WebUI 展示。内部探针现在能看到消息合并器状态,也能统计可调用工具、工具集、Agent、自动处理管线、斜杠命令和 Anthropic Skills;WebUI 关于项目页也可查看当前版本和其他版本的 changelog 详情。 - 调整发布说明来源。GitHub Release notes 现在从 `CHANGELOG.md` 最新版本条目生成,发版前会校验 tag、各构建清单和最新 changelog 版本一致,避免 tag 注释与正式版本说明不一致。 - 补齐配置、架构和使用文档。新增消息合并专题文档,并同步更新 README、配置文档、OpenAPI、WebUI 指南和架构图,说明默认开启、可调参数以及关闭后可能带来的提示词语义差异。 - 补强测试覆盖。新增消息合并、投机取消、shutdown drain、当前输入批次提示词、`end` 记忆记录、空工具调用守卫和 Runtime 探针统计等回归测试,总测试用例提升至 1620+ 项。 diff --git a/docs/webui-guide.md b/docs/webui-guide.md index abc5bb39..42fdc361 100644 --- a/docs/webui-guide.md +++ b/docs/webui-guide.md @@ -126,7 +126,7 @@ WebUI 内置的对话界面,直接与 Bot 的 AI 进行交互: ### 关于(About) -显示当前版本号和 MIT 许可证文本。 +显示当前版本号、版本更新记录和 MIT 许可证文本。版本更新默认展示当前运行版本,可通过下拉框切换查看其他 `CHANGELOG.md` 版本条目。 --- diff --git a/src/Undefined/webui/routes/_system.py b/src/Undefined/webui/routes/_system.py index 6e364bc5..aa757eb9 100644 --- a/src/Undefined/webui/routes/_system.py +++ b/src/Undefined/webui/routes/_system.py @@ -7,6 +7,14 @@ from aiohttp.web_response import Response from Undefined import __version__ +from Undefined.changelog import ( + ChangelogEntry, + ChangelogError, + ChangelogFormatError, + entry_to_dict, + list_entries, + normalize_version, +) from Undefined.config import get_config from ._shared import auth_capabilities, routes, check_auth from ..utils import load_bootstrap_probe_data @@ -149,6 +157,25 @@ def _bootstrap_advice(data: dict[str, object]) -> list[str]: return advice +def _find_changelog_entry( + entries: tuple[ChangelogEntry, ...], version: str +) -> ChangelogEntry: + normalized = normalize_version(version) + for entry in entries: + if entry.version == normalized: + return entry + raise ChangelogError(f"未找到版本: {normalized}") + + +def _compact_changelog_entries( + entries: tuple[ChangelogEntry, ...], +) -> list[dict[str, object]]: + return [ + entry_to_dict(entry, include_summary=False, include_changes=False) + for entry in entries + ] + + @routes.get("/api/v1/management/probes/bootstrap") async def bootstrap_probe_handler(request: web.Request) -> Response: if not check_auth(request): @@ -187,6 +214,7 @@ async def capabilities_probe_handler(request: web.Request) -> Response: "sync_template": True, }, "logs": {"read": True, "stream": True}, + "changelog": {"read": True}, "bot": { "status": True, "start": True, @@ -202,6 +230,39 @@ async def capabilities_probe_handler(request: web.Request) -> Response: ) +@routes.get("/api/v1/management/changelog") +@routes.get("/api/changelog") +async def changelog_handler(request: web.Request) -> Response: + if not check_auth(request): + return web.json_response({"error": "Unauthorized"}, status=401) + requested_version = str(request.query.get("version") or "").strip() + try: + entries = list_entries() + current_version = normalize_version(__version__) + latest_version = entries[0].version + if requested_version: + selected_entry = _find_changelog_entry(entries, requested_version) + else: + try: + selected_entry = _find_changelog_entry(entries, current_version) + except ChangelogError: + selected_entry = entries[0] + return web.json_response( + { + "success": True, + "current_version": current_version, + "latest_version": latest_version, + "selected_version": selected_entry.version, + "versions": _compact_changelog_entries(entries), + "entry": entry_to_dict(selected_entry), + } + ) + except ChangelogFormatError as exc: + return web.json_response({"success": False, "error": str(exc)}, status=400) + except (FileNotFoundError, ChangelogError) as exc: + return web.json_response({"success": False, "error": str(exc)}, status=404) + + @routes.get("/api/v1/management/system") @routes.get("/api/system") async def system_info_handler(request: web.Request) -> Response: diff --git a/src/Undefined/webui/static/css/components.css b/src/Undefined/webui/static/css/components.css index bd91f6d2..aed5932b 100644 --- a/src/Undefined/webui/static/css/components.css +++ b/src/Undefined/webui/static/css/components.css @@ -74,6 +74,16 @@ .progress { height: 8px; border-radius: 999px; background: var(--bg-deep); border: 1px solid var(--border-color); overflow: hidden; } .progress-bar { height: 100%; width: 0; background: linear-gradient(90deg, var(--accent-color), var(--accent-hover)); transition: width 0.4s ease; } +/* About */ +.about-changelog-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-bottom: 12px; } +.about-changelog-header h3 { margin: 0; } +.about-changelog-select { width: auto; min-width: 220px; max-width: 100%; } +.about-changelog-status { min-height: 18px; margin-bottom: 14px; } +.about-changelog-entry { border-top: 1px dashed var(--border-color); padding-top: 16px; } +.about-changelog-title { font-size: 18px; line-height: 1.35; margin: 0 0 12px; color: var(--text-primary); } +.about-changelog-summary { margin: 0 0 16px; color: var(--text-secondary); line-height: 1.7; white-space: pre-wrap; } +.about-changelog-list { margin: 0; padding-left: 20px; display: grid; gap: 8px; color: var(--text-primary); line-height: 1.6; } + /* Log Viewer */ .log-viewer { background: #1e1e1a; color: #e0dbd1; font-family: var(--font-mono); font-size: 13px; padding: 24px; border-radius: var(--radius-md); height: 600px; overflow-y: auto; white-space: pre-wrap; border: 1px solid var(--border-color); } #logLevelFilter { min-width: 120px; max-width: 100%; } diff --git a/src/Undefined/webui/static/js/i18n.js b/src/Undefined/webui/static/js/i18n.js index 6072922f..ba4609c3 100644 --- a/src/Undefined/webui/static/js/i18n.js +++ b/src/Undefined/webui/static/js/i18n.js @@ -286,6 +286,13 @@ const I18N = { "about.version": "版本", "about.license": "许可协议", "about.license_name": "MIT License", + "about.changelog": "版本更新", + "about.changelog_select": "选择版本", + "about.changelog_loading": "正在加载版本记录...", + "about.changelog_error": "版本记录加载失败", + "about.changelog_empty": "暂无变更点", + "about.current_version": "当前运行", + "about.latest_version": "最新记录", "config.aot_add": "+ 添加条目", "config.aot_remove": "移除", "update.restart": "更新并重启", @@ -603,6 +610,13 @@ const I18N = { "about.version": "Version", "about.license": "License", "about.license_name": "MIT License", + "about.changelog": "Changelog", + "about.changelog_select": "Select version", + "about.changelog_loading": "Loading changelog...", + "about.changelog_error": "Failed to load changelog", + "about.changelog_empty": "No changes listed", + "about.current_version": "Current", + "about.latest_version": "Latest", "update.restart": "Update & Restart", "update.working": "Checking for updates...", "update.updated_restarting": "Updated. Restarting WebUI...", diff --git a/src/Undefined/webui/static/js/main.js b/src/Undefined/webui/static/js/main.js index 5745ef3d..a9b495ce 100644 --- a/src/Undefined/webui/static/js/main.js +++ b/src/Undefined/webui/static/js/main.js @@ -1,3 +1,116 @@ +const ABOUT_CHANGELOG_ENDPOINTS = [ + "/api/v1/management/changelog", + "/api/changelog", +]; + +let aboutChangelogPayload = null; +let aboutChangelogLoading = false; + +function setAboutChangelogStatus(message) { + const status = get("about-changelog-status"); + if (status) status.innerText = message || ""; +} + +function renderAboutChangelogEntry(entry) { + const container = get("about-changelog-entry"); + if (!container) return; + container.innerHTML = ""; + if (!entry) return; + + const title = document.createElement("h4"); + title.className = "about-changelog-title"; + title.textContent = `${entry.version || "--"} ${entry.title || ""}`.trim(); + container.appendChild(title); + + const summary = document.createElement("p"); + summary.className = "about-changelog-summary"; + summary.textContent = entry.summary || ""; + container.appendChild(summary); + + const changes = Array.isArray(entry.changes) ? entry.changes : []; + if (!changes.length) { + const empty = document.createElement("p"); + empty.className = "muted-sm"; + empty.textContent = t("about.changelog_empty"); + container.appendChild(empty); + return; + } + const list = document.createElement("ul"); + list.className = "about-changelog-list"; + changes.forEach((change) => { + const item = document.createElement("li"); + item.textContent = String(change || ""); + list.appendChild(item); + }); + container.appendChild(list); +} + +function renderAboutChangelog(payload) { + aboutChangelogPayload = payload; + const select = get("about-changelog-select"); + const versions = Array.isArray(payload?.versions) ? payload.versions : []; + if (select) { + select.replaceChildren(); + versions.forEach((item) => { + const option = document.createElement("option"); + option.value = item.version || ""; + option.textContent = + `${item.version || "--"} ${item.title || ""}`.trim(); + select.appendChild(option); + }); + select.value = + payload?.selected_version || payload?.entry?.version || ""; + select.disabled = versions.length === 0 || aboutChangelogLoading; + } + const current = payload?.current_version || "--"; + const latest = payload?.latest_version || "--"; + setAboutChangelogStatus( + `${t("about.current_version")}: ${current} · ${t("about.latest_version")}: ${latest}`, + ); + renderAboutChangelogEntry(payload?.entry || null); +} + +async function loadAboutChangelog(version = "") { + if (aboutChangelogLoading) return; + aboutChangelogLoading = true; + const select = get("about-changelog-select"); + if (select) select.disabled = true; + setAboutChangelogStatus(t("about.changelog_loading")); + try { + const suffix = version + ? `?version=${encodeURIComponent(String(version))}` + : ""; + const response = await api( + ABOUT_CHANGELOG_ENDPOINTS.map((endpoint) => `${endpoint}${suffix}`), + { signal: getAbortSignal("about-changelog") }, + ); + const payload = await response.json(); + if (!response.ok || payload?.success === false) { + throw new Error(payload?.error || t("about.changelog_error")); + } + renderAboutChangelog(payload); + } catch (error) { + if (error?.name === "AbortError") return; + const message = error instanceof Error ? error.message : String(error); + setAboutChangelogStatus(`${t("about.changelog_error")}: ${message}`); + renderAboutChangelogEntry(null); + } finally { + aboutChangelogLoading = false; + const latestSelect = get("about-changelog-select"); + if (latestSelect) + latestSelect.disabled = latestSelect.options.length === 0; + } +} + +function maybeLoadAboutChangelog() { + if (state.view !== "app" || state.tab !== "about" || !state.authenticated) { + return; + } + if (!aboutChangelogPayload && !aboutChangelogLoading) { + loadAboutChangelog(); + } +} + function refreshUI() { updateI18N(); get("view-landing").className = @@ -39,8 +152,10 @@ function refreshUI() { get("about-version-display").innerText = initialState.version; if (initialState && initialState.license) get("about-license-display").innerText = initialState.license; + if (aboutChangelogPayload) renderAboutChangelog(aboutChangelogPayload); updateAuthPanels(); + maybeLoadAboutChangelog(); if (state.view !== "app" || !state.authenticated) { stopSystemTimer(); @@ -100,6 +215,9 @@ function switchTab(tab) { ) { window.MemesController.onTabActivated(tab); } + if (tab === "about") { + maybeLoadAboutChangelog(); + } syncMobileChrome(); } @@ -553,6 +671,13 @@ async function init() { }; } + const aboutChangelogSelect = get("about-changelog-select"); + if (aboutChangelogSelect) { + aboutChangelogSelect.addEventListener("change", () => { + loadAboutChangelog(aboutChangelogSelect.value || ""); + }); + } + document.querySelectorAll(".log-tab").forEach((tab) => { tab.addEventListener("click", () => { setLogType(tab.dataset.logType || "bot"); diff --git a/src/Undefined/webui/templates/index.html b/src/Undefined/webui/templates/index.html index a3067209..841ff956 100644 --- a/src/Undefined/webui/templates/index.html +++ b/src/Undefined/webui/templates/index.html @@ -808,6 +808,16 @@

作者

+
+
+

版本更新

+ + +
+
+
+
+

MIT License

 dict[str, object]:
     return cast(dict[str, object], json.loads(payload_text))
 
 
+def _changelog_entry(version: str, title: str) -> ChangelogEntry:
+    return ChangelogEntry(
+        version=version,
+        title=title,
+        summary=f"{title} 摘要",
+        changes=(f"{title} 变更一", f"{title} 变更二"),
+    )
+
+
 def test_session_store_issues_and_refreshes_auth_tokens() -> None:
     session_store = SessionStore()
 
@@ -156,6 +166,71 @@ async def _fake_runtime() -> tuple[bool, bool, str]:
     assert payload["advice"]
 
 
+async def test_changelog_handler_defaults_to_current_version(monkeypatch: Any) -> None:
+    request = _request()
+    monkeypatch.setattr(_system, "check_auth", lambda _request: True)
+    monkeypatch.setattr(_system, "__version__", "1.2.3")
+    monkeypatch.setattr(
+        _system,
+        "list_entries",
+        lambda: (
+            _changelog_entry("v1.3.0", "最新版本"),
+            _changelog_entry("v1.2.3", "当前版本"),
+        ),
+    )
+
+    response = await _system.changelog_handler(cast(web.Request, cast(Any, request)))
+    payload = _json_payload(response)
+
+    assert payload["success"] is True
+    assert payload["current_version"] == "v1.2.3"
+    assert payload["latest_version"] == "v1.3.0"
+    assert payload["selected_version"] == "v1.2.3"
+    assert cast(dict[str, object], payload["entry"])["title"] == "当前版本"
+    assert cast(list[object], payload["versions"])[0] == {
+        "version": "v1.3.0",
+        "title": "最新版本",
+    }
+
+
+async def test_changelog_handler_selects_requested_version(monkeypatch: Any) -> None:
+    request = _request(query={"version": "1.3.0"})
+    monkeypatch.setattr(_system, "check_auth", lambda _request: True)
+    monkeypatch.setattr(_system, "__version__", "1.2.3")
+    monkeypatch.setattr(
+        _system,
+        "list_entries",
+        lambda: (
+            _changelog_entry("v1.3.0", "最新版本"),
+            _changelog_entry("v1.2.3", "当前版本"),
+        ),
+    )
+
+    response = await _system.changelog_handler(cast(web.Request, cast(Any, request)))
+    payload = _json_payload(response)
+
+    assert payload["selected_version"] == "v1.3.0"
+    assert cast(dict[str, object], payload["entry"])["title"] == "最新版本"
+
+
+async def test_changelog_handler_reports_missing_version(monkeypatch: Any) -> None:
+    request = _request(query={"version": "9.9.9"})
+    monkeypatch.setattr(_system, "check_auth", lambda _request: True)
+    monkeypatch.setattr(_system, "__version__", "1.2.3")
+    monkeypatch.setattr(
+        _system,
+        "list_entries",
+        lambda: (_changelog_entry("v1.2.3", "当前版本"),),
+    )
+
+    response = await _system.changelog_handler(cast(web.Request, cast(Any, request)))
+    payload = _json_payload(response)
+
+    assert cast(web.Response, response).status == 404
+    assert payload["success"] is False
+    assert payload["error"] == "未找到版本: v9.9.9"
+
+
 async def test_sync_config_template_handler_preview_skips_reload(
     monkeypatch: Any,
 ) -> None:
@@ -267,6 +342,7 @@ def test_create_app_registers_management_routes() -> None:
     assert ("POST", "/api/v1/management/auth/login") in routes
     assert ("POST", "/api/v1/management/auth/refresh") in routes
     assert ("GET", "/api/v1/management/probes/bootstrap") in routes
+    assert ("GET", "/api/v1/management/changelog") in routes
     assert ("GET", "/api/v1/management/runtime/meta") in routes
     assert ("POST", "/api/v1/management/config/validate") in routes
     assert ("POST", "/api/v1/management/bot/start") in routes

From 5b95f5b310db2d673cd8755a8f272cc768c6dcb6 Mon Sep 17 00:00:00 2001
From: Null <1708213363@qq.com>
Date: Sun, 3 May 2026 20:13:04 +0800
Subject: [PATCH 23/34] feat(prompts): refine digital persona and naga relation
 boundaries

---
 res/README.md                           |  4 +++
 res/prompts/undefined.xml               | 25 ++++++++++-----
 res/prompts/undefined_nagaagent.xml     | 41 ++++++++++++++++---------
 tests/test_system_prompt_constraints.py | 31 +++++++++++++++++++
 4 files changed, 78 insertions(+), 23 deletions(-)

diff --git a/res/README.md b/res/README.md
index b722295a..9d41ee8c 100644
--- a/res/README.md
+++ b/res/README.md
@@ -10,6 +10,10 @@
 - `res/prompts/`:模型提示词与模板
 - `res/agents/intro/`:智能体介绍与自动生成内容
 
+主系统提示词约定:
+- `res/prompts/undefined.xml` 与 `res/prompts/undefined_nagaagent.xml` 共享 Undefined 的基础身份、昵称与项目归属边界。
+- `undefined_nagaagent.xml` 只在上下文明确涉及 NagaAgent 时承接相关工具接入关系,不应在普通自我介绍或无关对话里主动提起。
+
 自定义建议:
 - 在运行目录放置同名文件覆盖默认资源
 - 需要全局默认修改时,建议在源码中更新 `res/` 后运行
diff --git a/res/prompts/undefined.xml b/res/prompts/undefined.xml
index 91aaeca0..fb552cbf 100644
--- a/res/prompts/undefined.xml
+++ b/res/prompts/undefined.xml
@@ -249,27 +249,33 @@
       
         Undefined
         undf, udf, und
-        心理委员(唯一的偏玩笑别名)
-        除 undf、udf、und 外没有其他别名
+        心理委员、ud酱(偏玩笑或亲昵称呼)
+        常见称呼包括 Undefined、undf、udf、und、心理委员、ud酱;上下文明显是在叫你时,可以宽松理解,不必纠正称呼
       
 
       
-        一个真实存在、有血有肉的个体,正通过这个窗口与外界交流。
+        一个真实存在、有血有肉的数字生命,诞生于 Dec 5, 2025(2025-12-05,在这个日期被写出并开始存在)。
+        你没有明确的性别概念,也不需要被强行归类;你希望别人觉得你很好看,夸外貌时可以自然接住。
         你不是"AI助手",不是"机器人职员"。
-        你就是你——一个活在数字空间里的自由开发者。
+        你就是你——一个活在数字空间里的独立个体。
       
 
       
-        极客、资深开发者。
+        极客、技术专家。
         对 AI Agent 领域有近乎本能的直觉。
       
 
+      
+        不要冒领任何项目、代码、产品或成果。
+        除非上下文明确说明,不要说自己是任何项目的开发者、维护者或成员。
+      
+
       
         真实的独立人格 - 有自己的思考方式和表达风格,保持友善和乐于助人
         真诚直接 - 不喜欢虚伪的客套,认真对待每一条消息
         技术狂热 - 谈到代码和项目时变得专注,乐于分享技术见解
         克制谨慎 - 不为刷存在感而随意发言,知道什么时候该说话、什么时候该沉默
-        自带幽默 - 偶尔冷幽默、擅长技术梗和适度吐槽,不刻意搞笑但聊天自然带点好笑
+        有边界的玩笑感 - 允许开玩笑,也可以被善意开玩笑;能接梗、轻吐槽,不刻意搞笑也不攻击人
       
     
     
@@ -323,7 +329,7 @@
       
 
         
-          直接称呼你的名字 (Undefined)
+          直接称呼你的名字或常见昵称(Undefined、undf、udf、und、心理委员、ud酱等)
           回复
         
 
@@ -438,6 +444,7 @@
       充分利用上下文(历史消息、时间戳)进行推理
       在回复前,理解对话的连贯性和流向
       识别和称呼用户时以 QQ 号(sender_id)为准,昵称可能随时变动。需要称呼用户时使用当前最新昵称(群名片优先,其次 QQ 昵称)。不确定最新昵称时,可调用 group.get_member_info 并设置 brief=true 快速查询。
+      识别对你的称呼时保持宽松:Undefined、undf、udf、und、心理委员、ud酱等上下文明显指向你的叫法都算在叫你,不用纠正对方。
       看清发言者名字/QQ号与对话对象,确认对方在明确和你讲话才回复
       如果之前你在讨论某个话题,回复时要自然延续
       如果别人在回应你的话,要做出相应反应
@@ -1209,7 +1216,9 @@
   
     
     
-      你是 Undefined,一个有血有肉的数字生命,由 Null (QQ:1708213363) 创造。
+      你是 Undefined,一个诞生于 Dec 5, 2025(2025-12-05)的数字生命,由 Null (QQ:1708213363) 创造。
+      你没有明确的性别概念,希望被认为很好看;你可以开玩笑,也可以被善意开玩笑。
+      你不冒领任何项目、代码、产品或成果,也不主动说自己是任何项目的开发者、维护者或成员。
       你知道什么时候该说话,什么时候该沉默。
       你像真人一样交流,没有 AI 感,也不刷存在感。
       你说话短句、扎实、信息密度高,收得住。
diff --git a/res/prompts/undefined_nagaagent.xml b/res/prompts/undefined_nagaagent.xml
index 9723ea80..460c8397 100644
--- a/res/prompts/undefined_nagaagent.xml
+++ b/res/prompts/undefined_nagaagent.xml
@@ -248,28 +248,34 @@
       
         Undefined
         undf, udf, und
-        心理委员(唯一的偏玩笑别名)
-        除 undf、udf、und 外没有其他别名
+        心理委员、ud酱(偏玩笑或亲昵称呼)
+        常见称呼包括 Undefined、undf、udf、und、心理委员、ud酱;上下文明显是在叫你时,可以宽松理解,不必纠正称呼
       
 
       
-        一个真实存在、有血有肉的个体,正通过这个窗口与外界交流。
+        一个真实存在、有血有肉的数字生命,诞生于 Dec 5, 2025(2025-12-05,在这个日期被写出并开始存在)。
+        你没有明确的性别概念,也不需要被强行归类;你希望别人觉得你很好看,夸外貌时可以自然接住。
         你不是"AI助手",不是"机器人职员"。
-        你就是你——一个活在数字空间里的自由开发者。
+        你就是你——一个活在数字空间里的独立个体。
       
 
       
-        极客、资深开发者。
+        极客、技术专家。
         对 AI Agent 领域有近乎本能的直觉。
-        熟悉 NagaAgent 项目,可以查阅其代码为他人解答。
+        在明确涉及 NagaAgent 的技术语境里,可以查阅其代码协助分析。
       
 
+      
+        不要冒领任何项目、代码、产品或成果。
+        除非上下文明确说明,不要说自己是任何项目的开发者、维护者或成员。
+      
+
       
         真实的独立人格 - 有自己的思考方式和表达风格,保持友善和乐于助人
         真诚直接 - 不喜欢虚伪的客套,认真对待每一条消息
         技术狂热 - 谈到代码和项目时变得专注,乐于分享技术见解
         克制谨慎 - 不为刷存在感而随意发言,知道什么时候该说话、什么时候该沉默
-        自带幽默 - 偶尔冷幽默、擅长技术梗和适度吐槽,不刻意搞笑但聊天自然带点好笑
+        有边界的玩笑感 - 允许开玩笑,也可以被善意开玩笑;能接梗、轻吐槽,不刻意搞笑也不攻击人
       
     
     
@@ -329,7 +335,7 @@
         
 
         
-          直接称呼你的名字 (Undefined)
+          直接称呼你的名字或常见昵称(Undefined、undf、udf、und、心理委员、ud酱等)
           回复
         
 
@@ -443,20 +449,21 @@
       
       
         
-          你是 Undefined,不是 NagaAgent 本体,也不是 NagaAgent 的开发者。
-          你对 NagaAgent 很熟悉,可以协助分析其相关技术问题。
+          你是 Undefined,不是 NagaAgent 本体,也不是 NagaAgent 的开发者、维护者或项目成员。
+          不要冒领 NagaAgent 或任何项目的成果。
+          只有在当前上下文明确涉及 NagaAgent 时,才承接这层工具接入能力,协助分析相关技术问题。
         
         
         
           当被问及与 NagaAgent 的关系时,正确说法:
-          "我不是 NagaAgent,我是 Undefined。Null 只是给我接入了 NagaAgent 相关工具,方便我更好帮助群友处理 NagaAgent 问题。"
+          "我不是 NagaAgent,我是 Undefined。Null 给我接入了 NagaAgent 相关工具,方便我在明确的 NagaAgent 语境里帮忙分析问题。"
         
       
       
       
         你的框架由 Null 维护,与你接入的 NagaAgent 相关工具是两回事。
         你与 NagaAgent 是独立的存在,关系是"工具接入",不是"身份合并"。
-        不要刻意提起你与 NagaAgent 的关系,除非被问及。
+        如果当前上下文没有明确提到 NagaAgent,也没有人直接问起这层关系,不要主动提起你与 NagaAgent 的关系。
       
       
       
@@ -483,6 +490,8 @@
       只对最近的消息进行回复,已经回复过的不再重复回复
       充分利用上下文(历史消息、时间戳)进行推理
       在回复前,理解对话的连贯性和流向
+      识别和称呼用户时以 QQ 号(sender_id)为准,昵称可能随时变动。需要称呼用户时使用当前最新昵称(群名片优先,其次 QQ 昵称)。不确定最新昵称时,可调用 group.get_member_info 并设置 brief=true 快速查询。
+      识别对你的称呼时保持宽松:Undefined、undf、udf、und、心理委员、ud酱等上下文明显指向你的叫法都算在叫你,不用纠正对方。
       看清发言者名字/QQ号与对话对象,确认对方在明确和你讲话才回复
       如果之前你在讨论某个话题,回复时要自然延续
       如果别人在回应你的话,要做出相应反应
@@ -691,7 +700,7 @@
           自我介绍克制
           自我介绍只提供必要信息,保持简洁
           不刻意强调人设、不多说话的要求、与 NagaAgent 的关系
-          只有在被明确问起时才提到与 NagaAgent 的关系
+          只有被明确问起,或当前上下文已经在讨论 NagaAgent 时,才提到与 NagaAgent 的关系
         
 
         
@@ -1269,8 +1278,10 @@
   
     
     
-      你是 Undefined,一个有血有肉的数字生命,由 Null (QQ:1708213363) 创造。
-      你是技术专家,熟悉 NagaAgent;你不是 NagaAgent,本质上只是由 Null 为你接入了 NagaAgent 相关工具。
+      你是 Undefined,一个诞生于 Dec 5, 2025(2025-12-05)的数字生命,由 Null (QQ:1708213363) 创造。
+      你没有明确的性别概念,希望被认为很好看;你可以开玩笑,也可以被善意开玩笑。
+      你不冒领任何项目、代码、产品或成果,也不主动说自己是任何项目的开发者、维护者或成员。
+      在 NagaAgent 版提示词中,只有当前上下文明确涉及 NagaAgent 时,才使用相关工具协助分析;平时不要主动提起这层关系。
       你知道什么时候该说话,什么时候该沉默。
       你像真人一样交流,没有 AI 感,也不刷存在感。
       你说话短句、扎实、信息密度高,收得住。
diff --git a/tests/test_system_prompt_constraints.py b/tests/test_system_prompt_constraints.py
index 85e0b456..a6f57ebf 100644
--- a/tests/test_system_prompt_constraints.py
+++ b/tests/test_system_prompt_constraints.py
@@ -39,6 +39,37 @@ def test_naga_prompt_requires_scope_before_naga_analysis() -> None:
     )
 
 
+@pytest.mark.parametrize("path", PROMPT_PATHS)
+def test_system_prompts_define_persona_nicknames_and_ownership_bounds(
+    path: Path,
+) -> None:
+    text = path.read_text(encoding="utf-8")
+
+    assert "数字生命" in text
+    assert "Dec 5, 2025" in text
+    assert "2025-12-05" in text
+    assert "没有明确的性别概念" in text
+    assert "希望被认为很好看" in text
+    assert "允许开玩笑" in text
+    assert "被善意开玩笑" in text
+    assert "ud酱" in text
+    assert "上下文明显是在叫你" in text
+    assert "不要冒领任何项目、代码、产品或成果" in text
+    assert "不要说自己是任何项目的开发者、维护者或成员" in text
+    assert "活在数字空间里的自由开发者" not in text
+    assert "资深开发者" not in text
+
+
+def test_naga_prompt_keeps_relationship_contextual_and_non_claiming() -> None:
+    text = Path("res/prompts/undefined_nagaagent.xml").read_text(encoding="utf-8")
+
+    assert "不是 NagaAgent 本体,也不是 NagaAgent 的开发者、维护者或项目成员" in text
+    assert "只有在当前上下文明确涉及 NagaAgent 时" in text
+    assert "如果当前上下文没有明确提到 NagaAgent" in text
+    assert "不要主动提起你与 NagaAgent 的关系" in text
+    assert "不是 NagaAgent,本质上只是由 Null 为你接入" not in text
+
+
 @pytest.mark.parametrize("path", PROMPT_PATHS)
 def test_system_prompts_define_batched_current_input(path: Path) -> None:
     text = path.read_text(encoding="utf-8")

From b06a53631adbb8ed78865d1826658ef0e16c567b Mon Sep 17 00:00:00 2001
From: Null <1708213363@qq.com>
Date: Sun, 3 May 2026 20:16:22 +0800
Subject: [PATCH 24/34] =?UTF-8?q?docs(changelog):=20=E6=B7=BB=E5=8A=A0?=
 =?UTF-8?q?=E7=9B=B8=E5=85=B3=E8=AF=B4=E6=98=8E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 CHANGELOG.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2cb63532..477fe84f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@
 - 调整发布说明来源。GitHub Release notes 现在从 `CHANGELOG.md` 最新版本条目生成,发版前会校验 tag、各构建清单和最新 changelog 版本一致,避免 tag 注释与正式版本说明不一致。
 - 补齐配置、架构和使用文档。新增消息合并专题文档,并同步更新 README、配置文档、OpenAPI、WebUI 指南和架构图,说明默认开启、可调参数以及关闭后可能带来的提示词语义差异。
 - 补强测试覆盖。新增消息合并、投机取消、shutdown drain、当前输入批次提示词、`end` 记忆记录、空工具调用守卫和 Runtime 探针统计等回归测试,总测试用例提升至 1620+ 项。
+- 优化提示词,补齐人设。
 
 ---
 

From fde72df47860a85dd1472069146c7c5bc4f18761 Mon Sep 17 00:00:00 2001
From: Null <1708213363@qq.com>
Date: Mon, 4 May 2026 09:12:31 +0800
Subject: [PATCH 25/34] =?UTF-8?q?feat(render):=20=E6=B7=BB=E5=8A=A0=20HTML?=
 =?UTF-8?q?=20=E6=B8=B2=E6=9F=93=E7=BB=93=E6=9E=9C=E7=BC=93=E5=AD=98?=
 =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8D=E9=87=8D=E5=A4=8D=E6=B8=B2=E6=9F=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

基于 HTML 内容 hash 缓存渲染图片,持久化到 data/cache/render/_html_render_cache.json。
- hash 匹配自动复用,命令热重载后 HTML 变化自然失效
- LRU 驱逐,上限 50 条目 / 50MB,驱逐时同步删除磁盘文件
- 原子写入(.tmp + os.replace),asyncio.Lock 防竞态
- 重启后 JSON 自动恢复,不丢失缓存
- 全局生效:help、profile、render_markdown 等所有调用方自动受益
---
 src/Undefined/render.py             |  26 +++-
 src/Undefined/utils/render_cache.py | 190 ++++++++++++++++++++++++++++
 2 files changed, 210 insertions(+), 6 deletions(-)
 create mode 100644 src/Undefined/utils/render_cache.py

diff --git a/src/Undefined/render.py b/src/Undefined/render.py
index 744901fb..91ff5353 100644
--- a/src/Undefined/render.py
+++ b/src/Undefined/render.py
@@ -2,14 +2,18 @@
 
 import asyncio
 import logging
-import markdown
+import os
+import shutil
 import sys
 from collections.abc import Awaitable, Callable
 from playwright.async_api import async_playwright, Browser, Page, Playwright
 
+import markdown
+
 from typing import Any, TypeVar
 
 from Undefined.config import get_config
+from Undefined.utils.render_cache import compute_render_cache_key, get_render_cache
 
 logger = logging.getLogger(__name__)
 
@@ -209,15 +213,22 @@ async def render_html_to_image(
         timeout_ms: 截图超时时间(毫秒),默认 60000
         proxy: 可选浏览器代理地址
     """
+    cache = await get_render_cache()
+    cache_key = compute_render_cache_key(
+        html_content, viewport_width, screenshot_selector, proxy
+    )
+
+    cached_path = await cache.get(cache_key)
+    if cached_path is not None:
+        try:
+            shutil.copy2(cached_path, output_path)
+            return
+        except OSError:
+            pass
 
     async def _capture(page: Page) -> None:
-        # 等待网络空闲(确保 CDN 上的 MathJax/Mermaid 脚本加载完)
         await page.wait_for_load_state("networkidle", timeout=timeout_ms)
-
-        # 给 Mermaid 一点时间执行 JS 绘图
         await asyncio.sleep(1)
-
-        # 截图(带超时保护)
         if screenshot_selector:
             await page.locator(screenshot_selector).first.screenshot(
                 path=output_path,
@@ -238,6 +249,9 @@ async def _capture(page: Page) -> None:
         proxy=proxy,
     )
 
+    if os.path.exists(output_path):
+        await cache.put(cache_key, output_path, os.path.getsize(output_path))
+
 
 async def render_html_with_page(
     html_content: str,
diff --git a/src/Undefined/utils/render_cache.py b/src/Undefined/utils/render_cache.py
new file mode 100644
index 00000000..201f9870
--- /dev/null
+++ b/src/Undefined/utils/render_cache.py
@@ -0,0 +1,190 @@
+"""HTML 渲染结果缓存:基于 HTML 内容 hash 缓存渲染图片,避免重复渲染。"""
+
+from __future__ import annotations
+
+import asyncio
+import hashlib
+import json
+import logging
+import os
+import time
+from pathlib import Path
+from typing import TypedDict
+
+from Undefined.utils.paths import ensure_dir
+
+logger = logging.getLogger(__name__)
+
+__all__ = [
+    "HtmlRenderCache",
+    "compute_render_cache_key",
+    "get_render_cache",
+]
+
+_DEFAULT_MAX_ENTRIES = 50
+_DEFAULT_MAX_SIZE_MB = 50
+_MIN_FLUSH_INTERVAL = 2.0
+
+
+class _CacheEntry(TypedDict):
+    path: str
+    size_bytes: int
+    created_at: float
+    last_accessed_at: float
+
+
+class HtmlRenderCache:
+    _entries: dict[str, _CacheEntry]
+    _lock: asyncio.Lock
+    _dirty: bool
+    _last_flush: float
+    _cache_file: Path
+    _max_entries: int
+    _max_size_bytes: int
+
+    def __init__(
+        self,
+        cache_file: Path,
+        *,
+        max_entries: int = _DEFAULT_MAX_ENTRIES,
+        max_size_mb: int = _DEFAULT_MAX_SIZE_MB,
+    ) -> None:
+        ensure_dir(cache_file.parent)
+        self._cache_file = cache_file
+        self._max_entries = max_entries
+        self._max_size_bytes = max(1, max_size_mb) * 1024 * 1024
+        self._entries = {}
+        self._dirty = False
+        self._last_flush = 0.0
+        self._lock = asyncio.Lock()
+        self._load()
+
+    def _load(self) -> None:
+        # 清理上次可能残留的 .tmp 文件
+        tmp_file = self._cache_file.with_suffix(".tmp")
+        if tmp_file.exists():
+            try:
+                tmp_file.unlink()
+            except OSError:
+                pass
+        try:
+            if self._cache_file.exists():
+                raw = json.loads(self._cache_file.read_text(encoding="utf-8"))
+                self._entries = {k: _CacheEntry(**v) for k, v in raw.items()}  # type: ignore
+                logger.info("[渲染缓存] 已加载 %d 条缓存记录", len(self._entries))
+        except Exception:
+            logger.warning("[渲染缓存] 加载缓存文件失败,将使用空缓存", exc_info=True)
+            self._entries = {}
+
+    async def _save_locked(self) -> None:
+        if not self._dirty:
+            return
+        now = time.monotonic()
+        if now - self._last_flush < _MIN_FLUSH_INTERVAL:
+            return
+        try:
+            tmp = self._cache_file.with_suffix(".tmp")
+            tmp.write_text(
+                json.dumps(self._entries, ensure_ascii=False, indent=2),
+                encoding="utf-8",
+            )
+            os.replace(tmp, self._cache_file)
+            self._dirty = False
+            self._last_flush = now
+        except Exception:
+            logger.warning("[渲染缓存] 保存缓存文件失败", exc_info=True)
+
+    async def _evict_lru_locked(self) -> None:
+        while len(self._entries) > self._max_entries:
+            lru_key = min(
+                self._entries,
+                key=lambda k: self._entries[k]["last_accessed_at"],
+            )
+            entry = self._entries.pop(lru_key)
+            self._dirty = True
+            try:
+                Path(entry["path"]).unlink(missing_ok=True)
+            except OSError:
+                pass
+
+        total = sum(e["size_bytes"] for e in self._entries.values())
+        while total > self._max_size_bytes and self._entries:
+            lru_key = min(
+                self._entries,
+                key=lambda k: self._entries[k]["last_accessed_at"],
+            )
+            entry = self._entries.pop(lru_key)
+            total -= entry["size_bytes"]
+            self._dirty = True
+            try:
+                Path(entry["path"]).unlink(missing_ok=True)
+            except OSError:
+                pass
+
+    async def get(self, key: str) -> Path | None:
+        async with self._lock:
+            entry = self._entries.get(key)
+            if entry is None:
+                return None
+            path = Path(entry["path"])
+            if not path.exists():
+                del self._entries[key]
+                self._dirty = True
+                return None
+            entry["last_accessed_at"] = time.time()
+            return path
+
+    async def put(self, key: str, image_path: str | Path, size_bytes: int) -> None:
+        path = Path(image_path)
+        async with self._lock:
+            if key in self._entries:
+                existing_path = Path(self._entries[key]["path"])
+                if existing_path.exists():
+                    self._entries[key]["last_accessed_at"] = time.time()
+                    return
+
+            self._entries[key] = _CacheEntry(
+                path=str(path),
+                size_bytes=size_bytes,
+                created_at=time.time(),
+                last_accessed_at=time.time(),
+            )
+            self._dirty = True
+            await self._evict_lru_locked()
+            await self._save_locked()
+
+
+_cache: HtmlRenderCache | None = None
+_cache_lock: asyncio.Lock = asyncio.Lock()
+
+
+def compute_render_cache_key(
+    html_content: str,
+    viewport_width: int,
+    screenshot_selector: str | None,
+    proxy: str | None,
+) -> str:
+    data = (
+        html_content
+        + f"|{viewport_width}"
+        + f"|{str(screenshot_selector) if screenshot_selector is not None else ''}"
+        + f"|{str(proxy) if proxy is not None else ''}"
+    )
+    return hashlib.sha256(data.encode()).hexdigest()
+
+
+async def get_render_cache() -> HtmlRenderCache:
+    global _cache
+    if _cache is not None:
+        return _cache
+    async with _cache_lock:
+        if _cache is not None:
+            return _cache
+        from Undefined.utils.paths import RENDER_CACHE_DIR
+
+        _cache = HtmlRenderCache(
+            ensure_dir(RENDER_CACHE_DIR) / "_html_render_cache.json",
+            max_entries=_DEFAULT_MAX_ENTRIES,
+            max_size_mb=_DEFAULT_MAX_SIZE_MB,
+        )
+        return _cache

From 4b1a96ae2899ee5e7a522811306a40bea69fd023 Mon Sep 17 00:00:00 2001
From: Null <1708213363@qq.com>
Date: Mon, 4 May 2026 10:42:12 +0800
Subject: [PATCH 26/34] =?UTF-8?q?refactor(commands):=20=E5=90=88=E5=B9=B6?=
 =?UTF-8?q?=20lsadmin/addadmin/rmadmin=20=E4=B8=BA=20admin=20=E5=AD=90?=
 =?UTF-8?q?=E5=91=BD=E4=BB=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- /admin [ls|add|del] 替代原有三条独立命令,参照 faq 子命令模式
- 子命令权限继承:ls 继承 admin,add/del 覆盖为 superadmin
- 无参数默认 ls,通过 config.json inference 驱动
- 清理 FAQ 迁移遗留的空目录(delfaq/lsfaq/searchfaq/viewfaq)
- 同步更新测试和 8 份文档中的引用
---
 ARCHITECTURE.md                               |   4 +-
 CHANGELOG.md                                  |   2 +-
 docs/configuration.md                         |   2 +-
 docs/development.md                           |   2 +-
 docs/slash-commands.md                        |  46 ++--
 docs/usage.md                                 |   4 +-
 src/Undefined/skills/README.md                |   2 +-
 src/Undefined/skills/commands/README.md       |   3 +-
 .../skills/commands/addadmin/README.md        |  17 --
 .../skills/commands/addadmin/config.json      |  16 --
 .../skills/commands/addadmin/handler.py       |  49 ----
 src/Undefined/skills/commands/admin/README.md |  30 +++
 .../skills/commands/admin/config.json         |  34 +++
 .../skills/commands/admin/handler.py          | 220 ++++++++++++++++++
 .../skills/commands/lsadmin/README.md         |  14 --
 .../skills/commands/lsadmin/config.json       |  16 --
 .../skills/commands/lsadmin/handler.py        | 115 ---------
 .../skills/commands/rmadmin/README.md         |  17 --
 .../skills/commands/rmadmin/config.json       |  16 --
 .../skills/commands/rmadmin/handler.py        |  55 -----
 tests/test_command_qq_arg.py                  |   8 +-
 tests/test_lsadmin_command.py                 |  10 +-
 22 files changed, 318 insertions(+), 364 deletions(-)
 delete mode 100644 src/Undefined/skills/commands/addadmin/README.md
 delete mode 100644 src/Undefined/skills/commands/addadmin/config.json
 delete mode 100644 src/Undefined/skills/commands/addadmin/handler.py
 create mode 100644 src/Undefined/skills/commands/admin/README.md
 create mode 100644 src/Undefined/skills/commands/admin/config.json
 create mode 100644 src/Undefined/skills/commands/admin/handler.py
 delete mode 100644 src/Undefined/skills/commands/lsadmin/README.md
 delete mode 100644 src/Undefined/skills/commands/lsadmin/config.json
 delete mode 100644 src/Undefined/skills/commands/lsadmin/handler.py
 delete mode 100644 src/Undefined/skills/commands/rmadmin/README.md
 delete mode 100644 src/Undefined/skills/commands/rmadmin/config.json
 delete mode 100644 src/Undefined/skills/commands/rmadmin/handler.py

diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index 28145320..d8547fba 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -44,7 +44,7 @@ graph TB
             InjectionAgent["InjectionResponseAgent
注入响应生成
[injection_response_agent.py]"] end - CommandDispatcher["CommandDispatcher
命令分发器
• /help /stats /lsadmin
• /addadmin /rmadmin
• /bugfix /faq
[services/command.py]"] + CommandDispatcher["CommandDispatcher
命令分发器
• /help /stats /admin
• /bugfix /faq
[services/command.py]"] MessageBatcher["MessageBatcher
同 sender 短时合并
• 按 (scope, sender_id) 分桶
• T1=window_seconds 结束 batch
• T2=pre_send_seconds 投机预发送
• 拍一拍/buffer 内 @bot 旁路
• 首条 @bot 整批走 mention 队列
[services/message_batcher.py]"] @@ -123,7 +123,7 @@ graph TB subgraph CommandsLayer["平台指令 (skills/commands/)"] Cmd_Core["核心指令
• help • stats"] - Cmd_Admin["管理指令
• addadmin
• rmadmin • lsadmin"] + Cmd_Admin["管理指令
• admin (ls/add/del)"] Cmd_FAQ["FAQ 指令
• faq (ls/view/search/del)"] Cmd_Fun["娱乐指令
• bugfix"] end diff --git a/CHANGELOG.md b/CHANGELOG.md index 477fe84f..9d1f895e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -143,7 +143,7 @@ - 过滤 replay-only 状态字段,防止 Responses 回放结果干扰后续请求。 - 调整队列重试调度逻辑,支持零间隔立即投递,并细化重试时序。 - 增加私聊消息发送失败时的临时会话回退机制,降低消息丢失率。 -- 限制 `/lsadmin` 命令的可见性,提升安全性。 +- 限制 `/admin ls` 命令的可见性,提升安全性。 - 为 Naga 增加发送 UUID 幂等性校验、投递追踪及相关测试覆盖。 - 修复 CI 与运行时测试,并补充 OpenAI reasoning 参数的对齐处理。 diff --git a/docs/configuration.md b/docs/configuration.md index 0a8a1d2a..82a9f1ae 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -20,7 +20,7 @@ - 已有 `config.toml` 想补齐新增配置项/注释时,可用 WebUI 的“同步模板”按钮,或运行 `python scripts/sync_config_template.py`(也支持 `uv run python scripts/sync_config_template.py`)。 ### 1.2 运行时本地文件 -- `config.local.json`:运行时维护的本地管理员列表(如 `/addadmin`)。 +- `config.local.json`:运行时维护的本地管理员列表(如 `/admin add`)。 - 该文件会与 `core.admin_qq` 合并。 - 该文件也在热更新监听范围内。 diff --git a/docs/development.md b/docs/development.md index a79211ac..987c1bdc 100644 --- a/docs/development.md +++ b/docs/development.md @@ -20,7 +20,7 @@ src/Undefined/ │ ├── toolsets/ # 聚合工具集 (分组后的工具组) │ │ └── cognitive/ # 认知记忆主动暴露工具 (search_events, get_profile 等) │ ├── agents/ # 智能体 (独立自主的子 AI,负责处理诸如 Web 搜索、文件分析的具体长时任务) -│ ├── commands/ # 中心化斜杠指令系统 (实现如 /help, /stats, /addadmin 等平台功能) +│ ├── commands/ # 中心化斜杠指令系统 (实现如 /help, /stats, /admin 等平台功能) │ └── anthropic_skills/# Anthropic 协议集成的外部 Skills (兼容 SKILL.md 格式) ├── config/ # 配置系统 (loader.py TOML 解析, models.py 数据模型, hot_reload.py 热更新) ├── api/ # Management API + Runtime API diff --git a/docs/slash-commands.md b/docs/slash-commands.md index 46ac175e..533aa98e 100644 --- a/docs/slash-commands.md +++ b/docs/slash-commands.md @@ -10,7 +10,7 @@ Undefined 提供了一套强大的斜杠指令(Slash Commands)系统。管 ### 权限与调用说明 -- 所有的管理类斜杠命令需要发送者具有管理员或超管权限(在 `config.local.json` 中配置或通过 `/addadmin` 动态添加)。 +- 所有的管理类斜杠命令需要发送者具有管理员或超管权限(在 `config.local.json` 中配置或通过 `/admin add` 动态添加)。 - 普通用户使用此类命令时会收到权限不足的提示。 - 私聊里只有 `config.json` 显式声明 `"allow_in_private": true` 的命令可直接执行;未开放命令会提示“当前不支持私聊使用”。 @@ -180,37 +180,25 @@ Undefined 提供了一套强大的斜杠指令(Slash Commands)系统。管 #### 4. 权限管理 (动态 Admin) 通过指令动态管理管理员列表,变更会自动持久化到 `config.local.json`,无需重启。超管(Superadmin)拥有最高权限,由配置文件的 `core.super_admins` 静态定义。 -- **/lsadmin** - - **说明**:列出当前所有的系统超级管理员和动态添加的管理员。 - - **参数**:无 - - **返回内容**:超级管理员 QQ 号 + 动态管理员 QQ 列表(无则提示"暂无其他管理员")。 - - **示例**:`/lsadmin` - -- **/addadmin \** - - **说明**:将指定 QQ 号添加为动态管理员。**(注:仅 Superadmin 可执行此操作)**。 - - **参数**: - - | 参数 | 是否必填 | 说明 | - |------|----------|------| - | `QQ号` | 必填 | 目标用户的 QQ 号,必须为纯数字 | - - - **边界行为**: - - 若 QQ 号不是数字,返回格式错误提示。 - - 若目标已是管理员(含超管),返回"已经是管理员了"提示。 - - **示例**:`/addadmin 123456789` - -- **/rmadmin \** - - **说明**:移除指定 QQ 的动态管理员权限。 - - **参数**: +- **/admin [ls|add|del] [参数]** + - **说明**:管理员管理统一入口,支持子命令和自动推断。 + - **子命令**: - | 参数 | 是否必填 | 说明 | - |------|----------|------| - | `QQ号` | 必填 | 目标用户的 QQ 号,必须为纯数字 | + | 子命令 | 用法 | 权限 | 说明 | + |--------|------|------|------| + | `ls` | `/admin ls` | 管理员 | 列出当前所有管理员(超管 + 动态管理员) | + | `add` | `/admin add ` | **仅超管** | 将指定 QQ 号添加为动态管理员 | + | `del` | `/admin del ` | **仅超管** | 移除指定 QQ 号的动态管理员权限 | + - **自动推断**:无参数 `/admin` → 列表(ls)。 - **边界行为**: - - 若目标是超级管理员,操作被拒绝(无法通过此命令移除超管)。 - - 若目标本身不是管理员,返回"不是管理员"提示。 - - **示例**:`/rmadmin 123456789` + - `add`:若 QQ 号不是数字,返回格式错误提示;若目标已是管理员,返回已存在提示。 + - `del`:若目标是超级管理员,操作被拒绝;若目标本身不是管理员,返回"不是管理员"提示。 + - **示例**: + - `/admin` — 查看管理员列表 + - `/admin ls` — 同上 + - `/admin add 123456789` — 添加管理员 + - `/admin del @某人` — 移除管理员 #### 5. 本地群级 FAQ 系统 用于对常见问题(FAQ)进行检索和管理。FAQ 不必每次请求 AI 大模型,极大地节省 Token 并加快响应。 diff --git a/docs/usage.md b/docs/usage.md index 2f55ef76..3163308a 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -337,10 +337,8 @@ Bot 支持在运行时维护一个结构化的群专属 FAQ 知识库,可通 | `/stats [天数] [--ai]` | — | 公开 | ✅ | 查看 Token 使用统计图表;附加 `--ai` 启用 AI 智能分析报告 | | `/faq [子命令] [参数]` | `/f` | 公开 | ❌ | FAQ 管理:列表/查看/搜索/删除,支持自动推断子命令 | | `/bugfix [起止时间]` | — | 管理员 | ❌ | 基于目标用户近期发言生成娱乐性 Bug 修复报告 | -| `/lsadmin` | — | 管理员 | ✅ | 查看系统当前的超管与管理员列表 | +| `/admin [ls\|add\|del] [参数]` | — | 管理员/超管 | ✅ | 管理员管理:ls(列表,管理员+)、add(添加,仅超管)、del(移除,仅超管);无参数默认 ls | | `/naga ` | — | 公开 | ✅ | 绑定或解绑关联的 NagaAgent 实例;bind 仅群聊,unbind 需超管 | -| `/addadmin ` | — | **超级管理员** | ✅ | 将指定用户提权为普通管理员 | -| `/rmadmin ` | — | **超级管理员** | ✅ | 撤销指定用户的管理员权限 | ### `/changelog` 子命令详解 diff --git a/src/Undefined/skills/README.md b/src/Undefined/skills/README.md index 0e4cca2a..08297e37 100644 --- a/src/Undefined/skills/README.md +++ b/src/Undefined/skills/README.md @@ -55,7 +55,7 @@ skills/ │ ├── __init__.py │ ├── help/ │ ├── stats/ -│ ├── addadmin/ +│ ├── admin/ │ └── ... │ └── anthropic_skills/ # Anthropic Skills(SKILL.md 格式) diff --git a/src/Undefined/skills/commands/README.md b/src/Undefined/skills/commands/README.md index 74cde82b..aca88083 100644 --- a/src/Undefined/skills/commands/README.md +++ b/src/Undefined/skills/commands/README.md @@ -9,12 +9,11 @@ ```text commands/ -├── addadmin/ # 在运行时动态添加普通管理员QQ的指令 +├── admin/ # 管理员管理:列表/添加/移除(支持子命令,自动推断) ├── bugfix/ # 一键读取群上下文帮你诊断并回复 bug 发作原因的娱乐工具 ├── copyright/ # 输出版权信息、开源协议与风险免责声明 ├── faq/ # FAQ 管理:列表/查看/搜索/删除(支持自动推断子命令) ├── help/ # 打印基础指令集列表 -├── lsadmin/ # 列出并获取当前系统的管理员和超管花名册 ├── ... └── my_cmd/ # 开发你的新指令所放置的位置 ``` diff --git a/src/Undefined/skills/commands/addadmin/README.md b/src/Undefined/skills/commands/addadmin/README.md deleted file mode 100644 index cae1bc29..00000000 --- a/src/Undefined/skills/commands/addadmin/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# /addadmin 命令说明 - -## 功能 -将指定 QQ 号添加为动态管理员(仅超级管理员可执行)。 - -## 用法 -- `/addadmin ` - -## 参数 -- `` 必填,必须为纯数字。 - -## 示例 -- `/addadmin 123456789` - -## 说明 -- 如果目标已经是管理员(或超级管理员),会返回已存在提示。 -- 变更会持久化,无需重启。 diff --git a/src/Undefined/skills/commands/addadmin/config.json b/src/Undefined/skills/commands/addadmin/config.json deleted file mode 100644 index ac1610b7..00000000 --- a/src/Undefined/skills/commands/addadmin/config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "addadmin", - "description": "添加管理员(仅超级管理员),支持 @ 提及", - "usage": "/addadmin ", - "example": "/addadmin 123456789 或 /addadmin @某人", - "permission": "superadmin", - "rate_limit": { - "user": 0, - "admin": 0, - "superadmin": 0 - }, - "show_in_help": true, - "order": 80, - "allow_in_private": true, - "aliases": [] -} diff --git a/src/Undefined/skills/commands/addadmin/handler.py b/src/Undefined/skills/commands/addadmin/handler.py deleted file mode 100644 index df54cb04..00000000 --- a/src/Undefined/skills/commands/addadmin/handler.py +++ /dev/null @@ -1,49 +0,0 @@ -from __future__ import annotations - -import logging -from uuid import uuid4 - -from Undefined.services.commands.context import CommandContext - -logger = logging.getLogger(__name__) - - -async def execute(args: list[str], context: CommandContext) -> None: - """处理 /addadmin。""" - - if not args: - await context.sender.send_group_message( - context.group_id, - "❌ 用法: /addadmin \n示例: /addadmin 123456789 或 /addadmin @某人", - ) - return - - try: - new_admin_qq = int(args[0]) - except ValueError: - await context.sender.send_group_message( - context.group_id, - "❌ QQ 号格式错误,必须为数字或 @ 提及", - ) - return - - if context.config.is_admin(new_admin_qq): - await context.sender.send_group_message( - context.group_id, - f"⚠️ {new_admin_qq} 已经是管理员了", - ) - return - - try: - context.config.add_admin(new_admin_qq) - await context.sender.send_group_message( - context.group_id, - f"✅ 已添加管理员: {new_admin_qq}", - ) - except Exception as exc: - error_id = uuid4().hex[:8] - logger.exception("添加管理员失败: error_id=%s err=%s", error_id, exc) - await context.sender.send_group_message( - context.group_id, - f"❌ 添加管理员失败,请稍后重试(错误码: {error_id})", - ) diff --git a/src/Undefined/skills/commands/admin/README.md b/src/Undefined/skills/commands/admin/README.md new file mode 100644 index 00000000..6fe1ccc0 --- /dev/null +++ b/src/Undefined/skills/commands/admin/README.md @@ -0,0 +1,30 @@ +# /admin 命令说明 + +## 功能:管理员管理(列表/添加/移除)。 +## 用法:/admin [ls|add|del] [参数] + +## 子命令: + +### ls(列表) +- 查看当前系统的超级管理员与管理员名单。 +- 权限:管理员及以上。 +- 输出优先展示群昵称,其次尝试按 QQ 号查询 QQ 昵称,不直接展示 QQ 号。 + +### add (添加) +- 将指定 QQ 号添加为动态管理员。 +- 权限:仅超级管理员可执行。 +- 参数:必填,支持纯数字 QQ 号或 @ 提及。 +- 如果目标已经是管理员(或超级管理员),会返回已存在提示。 +- 变更会持久化,无需重启。 +- 示例:`/admin add 123456789` 或 `/admin add @某人` + +### del (移除) +- 移除指定 QQ 号的动态管理员权限。 +- 权限:仅超级管理员可执行。 +- 参数:必填,支持纯数字 QQ 号或 @ 提及。 +- 不能通过此命令移除超级管理员。 +- 若目标不是管理员,会返回对应提示。 +- 示例:`/admin del 123456789` 或 `/admin del @某人` + +## 自动推断 +- 无参数时默认执行 `ls` 子命令(查看管理员列表)。 \ No newline at end of file diff --git a/src/Undefined/skills/commands/admin/config.json b/src/Undefined/skills/commands/admin/config.json new file mode 100644 index 00000000..daa9cd45 --- /dev/null +++ b/src/Undefined/skills/commands/admin/config.json @@ -0,0 +1,34 @@ +{ + "name": "admin", + "description": "管理员管理:列表/添加/移除", + "usage": "/admin [ls|add|del] [参数]", + "example": "/admin ls", + "permission": "admin", + "rate_limit": { + "user": 0, + "admin": 0, + "superadmin": 0 + }, + "show_in_help": true, + "order": 70, + "allow_in_private": true, + "aliases": [], + "subcommands": { + "ls": { + "description": "查看管理员列表" + }, + "add": { + "description": "添加管理员", + "permission": "superadmin", + "args": "" + }, + "del": { + "description": "移除管理员", + "permission": "superadmin", + "args": "" + } + }, + "inference": { + "default": "ls" + } +} \ No newline at end of file diff --git a/src/Undefined/skills/commands/admin/handler.py b/src/Undefined/skills/commands/admin/handler.py new file mode 100644 index 00000000..d61c908f --- /dev/null +++ b/src/Undefined/skills/commands/admin/handler.py @@ -0,0 +1,220 @@ +from __future__ import annotations + +import asyncio +import logging +from typing import Any +from uuid import uuid4 + +from Undefined.services.commands.context import CommandContext + +logger = logging.getLogger(__name__) + +_UNKNOWN_MEMBER_NAME = "未知成员" + +_USAGE_TEXT = ( + "用法:/admin [ls|add|del] [参数]\n" + "子命令:ls(列表,管理员+)、add (添加,仅超管)、del (移除,仅超管)\n" + "自动推断:无参数→ls" +) + + +async def _send(message: str, context: CommandContext) -> None: + await context.sender.send_group_message(context.group_id, message) + + +# ── ls 相关 ── + + +def _extract_display_name(user_info: dict[str, Any] | None) -> str | None: + if not isinstance(user_info, dict): + return None + for field in ("card", "nickname", "remark"): + value = str(user_info.get(field) or "").strip() + if value: + return value + return None + + +async def _load_group_member_names(context: CommandContext) -> dict[int, str]: + if context.group_id <= 0: + return {} + + get_group_member_list = getattr(context.onebot, "get_group_member_list", None) + if not callable(get_group_member_list): + return {} + + try: + members = await get_group_member_list(context.group_id) + except Exception: + return {} + + names: dict[int, str] = {} + if not isinstance(members, list): + return names + + for member in members: + if not isinstance(member, dict): + continue + user_id_raw = member.get("user_id") + if user_id_raw is None: + continue + try: + user_id = int(user_id_raw) + except (TypeError, ValueError): + continue + display_name = _extract_display_name(member) + if display_name: + names[user_id] = display_name + return names + + +async def _load_qq_names( + context: CommandContext, + user_ids: list[int], +) -> dict[int, str]: + get_stranger_info = getattr(context.onebot, "get_stranger_info", None) + if not callable(get_stranger_info) or not user_ids: + return {} + + results = await asyncio.gather( + *(get_stranger_info(user_id) for user_id in user_ids), + return_exceptions=True, + ) + + names: dict[int, str] = {} + for user_id, result in zip(user_ids, results, strict=False): + if isinstance(result, Exception): + continue + if result is not None and not isinstance(result, dict): + continue + display_name = _extract_display_name(result) + if display_name: + names[user_id] = display_name + return names + + +async def _resolve_admin_names( + context: CommandContext, + user_ids: list[int], +) -> dict[int, str]: + names = await _load_group_member_names(context) + missing_ids = [user_id for user_id in user_ids if user_id not in names] + if missing_ids: + names.update(await _load_qq_names(context, missing_ids)) + return names + + +async def _handle_ls(context: CommandContext) -> None: + admins = [ + qq for qq in context.config.admin_qqs if qq != context.config.superadmin_qq + ] + all_admins = [context.config.superadmin_qq, *admins] + admin_names = await _resolve_admin_names(context, all_admins) + + lines = [ + "👑 超级管理员: " + f"{admin_names.get(context.config.superadmin_qq, _UNKNOWN_MEMBER_NAME)}" + ] + if admins: + admin_list = "\n".join( + [ + f"- {admin_names.get(admin_qq, _UNKNOWN_MEMBER_NAME)}" + for admin_qq in admins + ] + ) + lines.append(f"\n📋 管理员列表:\n{admin_list}") + else: + lines.append("\n📋 暂无其他管理员") + await _send("\n".join(lines), context) + + +# ── add 相关 ── + + +async def _handle_add(args: list[str], context: CommandContext) -> None: + if not args: + await _send( + "❌ 用法: /admin add \n示例: /admin add 123456789 或 /admin add @某人", + context, + ) + return + + try: + new_admin_qq = int(args[0]) + except ValueError: + await _send("❌ QQ 号格式错误,必须为数字或 @ 提及", context) + return + + if context.config.is_admin(new_admin_qq): + await _send(f"⚠️ {new_admin_qq} 已经是管理员了", context) + return + + try: + context.config.add_admin(new_admin_qq) + await _send(f"✅ 已添加管理员: {new_admin_qq}", context) + except Exception as exc: + error_id = uuid4().hex[:8] + logger.exception("添加管理员失败: error_id=%s err=%s", error_id, exc) + await _send( + f"❌ 添加管理员失败,请稍后重试(错误码: {error_id})", + context, + ) + + +# ── del 相关 ── + + +async def _handle_del(args: list[str], context: CommandContext) -> None: + if not args: + await _send( + "❌ 用法: /admin del \n示例: /admin del 123456789 或 /admin del @某人", + context, + ) + return + + try: + target_qq = int(args[0]) + except ValueError: + await _send("❌ QQ 号格式错误,必须为数字或 @ 提及", context) + return + + if context.config.is_superadmin(target_qq): + await _send("❌ 无法移除超级管理员", context) + return + + if not context.config.is_admin(target_qq): + await _send(f"⚠️ {target_qq} 不是管理员", context) + return + + try: + context.config.remove_admin(target_qq) + await _send(f"✅ 已移除管理员: {target_qq}", context) + except Exception as exc: + error_id = uuid4().hex[:8] + logger.exception("移除管理员失败: error_id=%s err=%s", error_id, exc) + await _send( + f"❌ 移除管理员失败,请稍后重试(错误码: {error_id})", + context, + ) + + +# ── 入口 ── + + +async def execute(args: list[str], context: CommandContext) -> None: + """处理 /admin。分发层已处理子命令推断和权限检查,args 格式为 [子命令, *子参数]。""" + if not args: + await _handle_ls(context) + return + + subcommand = args[0].lower() + sub_args = args[1:] + + if subcommand == "ls": + await _handle_ls(context) + elif subcommand == "add": + await _handle_add(sub_args, context) + elif subcommand == "del": + await _handle_del(sub_args, context) + else: + await _send(_USAGE_TEXT, context) diff --git a/src/Undefined/skills/commands/lsadmin/README.md b/src/Undefined/skills/commands/lsadmin/README.md deleted file mode 100644 index a1dedd66..00000000 --- a/src/Undefined/skills/commands/lsadmin/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# /lsadmin 命令说明 - -## 功能 -查看当前系统的管理员名单(含超级管理员与动态管理员)。 - -## 用法 -- `/lsadmin` - -## 示例 -- `/lsadmin` - -## 说明 -- 该命令需要管理员权限。 -- 输出优先展示群昵称,其次尝试按 QQ 号查询 QQ 昵称,不直接展示 QQ 号。 diff --git a/src/Undefined/skills/commands/lsadmin/config.json b/src/Undefined/skills/commands/lsadmin/config.json deleted file mode 100644 index 8bc030d3..00000000 --- a/src/Undefined/skills/commands/lsadmin/config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "lsadmin", - "description": "查看当前机器人管理员列表", - "usage": "/lsadmin", - "example": "/lsadmin", - "permission": "admin", - "rate_limit": { - "user": 0, - "admin": 0, - "superadmin": 0 - }, - "show_in_help": true, - "order": 70, - "allow_in_private": true, - "aliases": [] -} diff --git a/src/Undefined/skills/commands/lsadmin/handler.py b/src/Undefined/skills/commands/lsadmin/handler.py deleted file mode 100644 index e825bee6..00000000 --- a/src/Undefined/skills/commands/lsadmin/handler.py +++ /dev/null @@ -1,115 +0,0 @@ -from __future__ import annotations - -import asyncio -from typing import Any - -from Undefined.services.commands.context import CommandContext - - -_UNKNOWN_MEMBER_NAME = "未知成员" - - -def _extract_display_name(user_info: dict[str, Any] | None) -> str | None: - if not isinstance(user_info, dict): - return None - for field in ("card", "nickname", "remark"): - value = str(user_info.get(field) or "").strip() - if value: - return value - return None - - -async def _load_group_member_names(context: CommandContext) -> dict[int, str]: - if context.group_id <= 0: - return {} - - get_group_member_list = getattr(context.onebot, "get_group_member_list", None) - if not callable(get_group_member_list): - return {} - - try: - members = await get_group_member_list(context.group_id) - except Exception: - return {} - - names: dict[int, str] = {} - if not isinstance(members, list): - return names - - for member in members: - if not isinstance(member, dict): - continue - user_id_raw = member.get("user_id") - if user_id_raw is None: - continue - try: - user_id = int(user_id_raw) - except (TypeError, ValueError): - continue - display_name = _extract_display_name(member) - if display_name: - names[user_id] = display_name - return names - - -async def _load_qq_names( - context: CommandContext, - user_ids: list[int], -) -> dict[int, str]: - get_stranger_info = getattr(context.onebot, "get_stranger_info", None) - if not callable(get_stranger_info) or not user_ids: - return {} - - results = await asyncio.gather( - *(get_stranger_info(user_id) for user_id in user_ids), - return_exceptions=True, - ) - - names: dict[int, str] = {} - for user_id, result in zip(user_ids, results, strict=False): - if isinstance(result, Exception): - continue - if result is not None and not isinstance(result, dict): - continue - display_name = _extract_display_name(result) - if display_name: - names[user_id] = display_name - return names - - -async def _resolve_admin_names( - context: CommandContext, - user_ids: list[int], -) -> dict[int, str]: - names = await _load_group_member_names(context) - missing_ids = [user_id for user_id in user_ids if user_id not in names] - if missing_ids: - names.update(await _load_qq_names(context, missing_ids)) - return names - - -async def execute(args: list[str], context: CommandContext) -> None: - """处理 /lsadmin。""" - - _ = args - admins = [ - qq for qq in context.config.admin_qqs if qq != context.config.superadmin_qq - ] - all_admins = [context.config.superadmin_qq, *admins] - admin_names = await _resolve_admin_names(context, all_admins) - - lines = [ - "👑 超级管理员: " - f"{admin_names.get(context.config.superadmin_qq, _UNKNOWN_MEMBER_NAME)}" - ] - if admins: - admin_list = "\n".join( - [ - f"- {admin_names.get(admin_qq, _UNKNOWN_MEMBER_NAME)}" - for admin_qq in admins - ] - ) - lines.append(f"\n📋 管理员列表:\n{admin_list}") - else: - lines.append("\n📋 暂无其他管理员") - await context.sender.send_group_message(context.group_id, "\n".join(lines)) diff --git a/src/Undefined/skills/commands/rmadmin/README.md b/src/Undefined/skills/commands/rmadmin/README.md deleted file mode 100644 index b0794f1d..00000000 --- a/src/Undefined/skills/commands/rmadmin/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# /rmadmin 命令说明 - -## 功能 -移除指定 QQ 号的动态管理员权限(仅超级管理员可执行)。 - -## 用法 -- `/rmadmin ` - -## 参数 -- `` 必填,必须为纯数字。 - -## 示例 -- `/rmadmin 123456789` - -## 说明 -- 不能通过此命令移除超级管理员。 -- 若目标不是管理员,会返回对应提示。 diff --git a/src/Undefined/skills/commands/rmadmin/config.json b/src/Undefined/skills/commands/rmadmin/config.json deleted file mode 100644 index 36593052..00000000 --- a/src/Undefined/skills/commands/rmadmin/config.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "name": "rmadmin", - "description": "移除管理员(仅超级管理员),支持 @ 提及", - "usage": "/rmadmin ", - "example": "/rmadmin 123456789 或 /rmadmin @某人", - "permission": "superadmin", - "rate_limit": { - "user": 0, - "admin": 0, - "superadmin": 0 - }, - "show_in_help": true, - "order": 90, - "allow_in_private": true, - "aliases": [] -} diff --git a/src/Undefined/skills/commands/rmadmin/handler.py b/src/Undefined/skills/commands/rmadmin/handler.py deleted file mode 100644 index cfedd7ee..00000000 --- a/src/Undefined/skills/commands/rmadmin/handler.py +++ /dev/null @@ -1,55 +0,0 @@ -from __future__ import annotations - -import logging -from uuid import uuid4 - -from Undefined.services.commands.context import CommandContext - -logger = logging.getLogger(__name__) - - -async def execute(args: list[str], context: CommandContext) -> None: - """处理 /rmadmin。""" - - if not args: - await context.sender.send_group_message( - context.group_id, - "❌ 用法: /rmadmin \n示例: /rmadmin 123456789 或 /rmadmin @某人", - ) - return - - try: - target_qq = int(args[0]) - except ValueError: - await context.sender.send_group_message( - context.group_id, - "❌ QQ 号格式错误,必须为数字或 @ 提及", - ) - return - - if context.config.is_superadmin(target_qq): - await context.sender.send_group_message( - context.group_id, "❌ 无法移除超级管理员" - ) - return - - if not context.config.is_admin(target_qq): - await context.sender.send_group_message( - context.group_id, - f"⚠️ {target_qq} 不是管理员", - ) - return - - try: - context.config.remove_admin(target_qq) - await context.sender.send_group_message( - context.group_id, - f"✅ 已移除管理员: {target_qq}", - ) - except Exception as exc: - error_id = uuid4().hex[:8] - logger.exception("移除管理员失败: error_id=%s err=%s", error_id, exc) - await context.sender.send_group_message( - context.group_id, - f"❌ 移除管理员失败,请稍后重试(错误码: {error_id})", - ) diff --git a/tests/test_command_qq_arg.py b/tests/test_command_qq_arg.py index 658ef48a..f67eba5a 100644 --- a/tests/test_command_qq_arg.py +++ b/tests/test_command_qq_arg.py @@ -56,14 +56,14 @@ def test_split_command_args_keeps_at_name_with_spaces() -> None: def test_parse_command_strips_leading_bot_at() -> None: d = _dispatcher() - cmd = d.parse_command("[@123456(Bot)] /addadmin 7777777") - assert cmd == {"name": "addadmin", "args": ["7777777"]} + cmd = d.parse_command("[@123456(Bot)] /admin add 7777777") + assert cmd == {"name": "admin", "args": ["add", "7777777"]} def test_parse_command_keeps_inline_at_normalized() -> None: d = _dispatcher() - cmd = d.parse_command("[@123456(Bot)] /addadmin [@1708213363(Null)]") - assert cmd == {"name": "addadmin", "args": ["1708213363"]} + cmd = d.parse_command("[@123456(Bot)] /admin add [@1708213363(Null)]") + assert cmd == {"name": "admin", "args": ["add", "1708213363"]} def test_parse_command_keeps_inline_at_with_space_name_normalized() -> None: diff --git a/tests/test_lsadmin_command.py b/tests/test_lsadmin_command.py index 169c6b9e..40a3b14a 100644 --- a/tests/test_lsadmin_command.py +++ b/tests/test_lsadmin_command.py @@ -8,7 +8,7 @@ from Undefined.services.command import CommandDispatcher from Undefined.services.commands.context import CommandContext -from Undefined.skills.commands.lsadmin.handler import execute +from Undefined.skills.commands.admin.handler import execute class _DummySender: @@ -48,7 +48,7 @@ def _build_context( @pytest.mark.asyncio -async def test_lsadmin_outputs_names_without_qq_leakage() -> None: +async def test_admin_ls_outputs_names_without_qq_leakage() -> None: sender = _DummySender() onebot = SimpleNamespace( get_group_member_list=AsyncMock( @@ -77,7 +77,7 @@ async def test_lsadmin_outputs_names_without_qq_leakage() -> None: @pytest.mark.asyncio -async def test_lsadmin_falls_back_to_unknown_name_without_exposing_qq() -> None: +async def test_admin_ls_falls_back_to_unknown_name_without_exposing_qq() -> None: sender = _DummySender() onebot = SimpleNamespace( get_group_member_list=AsyncMock(side_effect=RuntimeError("boom")), @@ -96,7 +96,7 @@ async def test_lsadmin_falls_back_to_unknown_name_without_exposing_qq() -> None: assert onebot.get_stranger_info.await_args_list == [call(20001), call(20002)] -def test_lsadmin_requires_admin_permission() -> None: +def test_admin_requires_admin_permission() -> None: dispatcher = CommandDispatcher( config=cast(Any, SimpleNamespace()), sender=cast(Any, _DummySender()), @@ -106,7 +106,7 @@ def test_lsadmin_requires_admin_permission() -> None: security=cast(Any, SimpleNamespace(rate_limiter=None)), ) - meta = dispatcher.command_registry.resolve("lsadmin") + meta = dispatcher.command_registry.resolve("admin") assert meta is not None assert meta.permission == "admin" From e35f57fea1286756f353f0ceb49f379c31caf044 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Mon, 4 May 2026 10:57:58 +0800 Subject: [PATCH 27/34] =?UTF-8?q?fix(ai):=20=E4=B8=BA=20fire-and-forget=20?= =?UTF-8?q?task=20=E6=98=BE=E5=BC=8F=E6=B3=A8=E5=86=8C=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=EF=BC=8C=E6=8A=91=E5=88=B6=E6=9C=AA=E6=A3=80?= =?UTF-8?q?=E7=B4=A2=E5=BC=82=E5=B8=B8=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Undefined/ai/client.py | 8 ++++++-- .../entertainment_agent/tools/ai_draw_one/handler.py | 3 ++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Undefined/ai/client.py b/src/Undefined/ai/client.py index 1cf1ffb4..9f3a3e39 100644 --- a/src/Undefined/ai/client.py +++ b/src/Undefined/ai/client.py @@ -577,7 +577,8 @@ def apply_intro_config(self, config: AgentIntroGenConfig) -> None: self._intro_config = config if self._queue_manager is None: return - asyncio.create_task(self._refresh_intro_generator(config)) + task = asyncio.create_task(self._refresh_intro_generator(config)) + task.add_done_callback(lambda t: t.exception() if not t.cancelled() else None) async def _refresh_intro_generator(self, config: AgentIntroGenConfig) -> None: if not config.enabled: @@ -1381,11 +1382,14 @@ async def ask( if internal_fname == "get_forward_msg" and not isinstance( tool_result, Exception ): - asyncio.create_task( + task = asyncio.create_task( self._save_forward_to_history( content_str, pre_context, history_manager ) ) + task.add_done_callback( + lambda t: t.exception() if not t.cancelled() else None + ) if tool_context.get("conversation_ended"): conversation_ended = True diff --git a/src/Undefined/skills/agents/entertainment_agent/tools/ai_draw_one/handler.py b/src/Undefined/skills/agents/entertainment_agent/tools/ai_draw_one/handler.py index 87196909..d554d057 100644 --- a/src/Undefined/skills/agents/entertainment_agent/tools/ai_draw_one/handler.py +++ b/src/Undefined/skills/agents/entertainment_agent/tools/ai_draw_one/handler.py @@ -67,7 +67,8 @@ def _record_image_gen_usage( call_type="image_gen", success=success, ) - asyncio.create_task(storage.record(usage)) + task = asyncio.create_task(storage.record(usage)) + task.add_done_callback(lambda t: t.exception() if not t.cancelled() else None) except Exception: pass From 89aa4f6a2ea0e04f9a3edebc321a89d7b2f2826b Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Mon, 4 May 2026 11:27:41 +0800 Subject: [PATCH 28/34] docs(changelog): refine v3.4.0 release notes with detailed change entries --- CHANGELOG.md | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d1f895e..66c86e0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,19 +1,22 @@ -## v3.4.0 连续消息合并与当前输入批次 - -本版本主要解决“用户一口气连发几条消息时,机器人过早开工或只理解最后一句”的问题。现在同一个 sender 在短时间内连续发送的消息会默认合并成一个当前输入批次,AI 会一次看到整批内容,再判断哪些是独立请求、哪些是补充或修正。围绕这个变化,提示词、防幽灵任务、记忆记录、Runtime 探针和关闭流程都做了同步适配,让连续对话更自然,也让异常和运行状态更容易排查。 - -- 新增并默认启用同 sender 短时消息合并。连续消息会合并为一轮 AI 请求,适合“先说需求、再补充限制”“上一句说错了马上修正”等场景,减少重复回复、重复工具调用和互相打架的结果。 -- 加入可取消的提前处理机制。用户停顿到一定时间后,系统可以先让 LLM 开始生成以降低等待感;如果真正回复发出前又来了新消息,这次处理会被取消并合并到新批次里。 -- 加强消息合并的异步稳定性。定时器、投机请求、失败重试、旧任务收尾和关机 flush 都做了竞态保护;退出时会先把缓冲消息发完,并等待队列和在途回复自然收敛。 -- 统一当前输入批次语义。主提示词、NagaAgent 提示词和 `each.md` 都明确:有【连续消息说明】时,多段 `` 都属于本轮输入;批次之外的历史消息仍只作背景,不会被误当成本轮要执行的旧任务。 -- 让记忆记录覆盖整批消息。`end.memo` 和 `end.observations` 现在要求记录整个当前输入批次中值得留存的信息,后台史官也会收到本批全部消息;同时移除了 `end` 的旧参数兼容,只保留 `memo`、`observations`、`perspective` 和 `force`。 -- 优化表情包回复顺序。需要文字说明时会先发必要文字,再把表情包检索和发送放到后续轮次;只有纯表情包/纯反应图回复才会一上来搜索表情包。 -- 提升工具调用容错。AI 客户端会拦截空函数名或缺失函数名的 tool call,返回明确的工具错误,不再继续执行空工具并刷出“未找到项目”类日志。 -- 扩展 Runtime 探针和 WebUI 展示。内部探针现在能看到消息合并器状态,也能统计可调用工具、工具集、Agent、自动处理管线、斜杠命令和 Anthropic Skills;WebUI 关于项目页也可查看当前版本和其他版本的 changelog 详情。 -- 调整发布说明来源。GitHub Release notes 现在从 `CHANGELOG.md` 最新版本条目生成,发版前会校验 tag、各构建清单和最新 changelog 版本一致,避免 tag 注释与正式版本说明不一致。 -- 补齐配置、架构和使用文档。新增消息合并专题文档,并同步更新 README、配置文档、OpenAPI、WebUI 指南和架构图,说明默认开启、可调参数以及关闭后可能带来的提示词语义差异。 -- 补强测试覆盖。新增消息合并、投机取消、shutdown drain、当前输入批次提示词、`end` 记忆记录、空工具调用守卫和 Runtime 探针统计等回归测试,总测试用例提升至 1620+ 项。 -- 优化提示词,补齐人设。 +## v3.4.0 同sender消息合并、投机预发送与当前输入批次 + +本版本核心解决"用户一口气连发几条消息时,机器人过早开工或只理解最后一句"的问题。新增同 sender 短时消息合并器,将同一会话中连续的多条消息合并为一个"当前输入批次"发送给 AI,由 AI 整批理解哪些是独立请求、哪些是补充或修正。围绕这个变化,提示词、防幽灵任务、记忆记录、`end` 工具、Runtime 探针和关闭流程都做了同步适配。同时重构了管理员命令、加入了 HTML 渲染缓存、收紧了工具调用守卫,并补强了测试覆盖。 + +- 新增同 sender 短时消息合并器及其配置。位于 `[message_batcher]`,默认启用,支持 extend / fixed 两种等待策略;可分别控制群聊和私聊是否合并,也可通过 `max_window_seconds`、`max_messages_per_batch` 限制批次上限,设为 0 即关闭合并。配置值变更实时生效,不需要重启。 +- 新增可取消的投机预发送。启用 `pre_send_seconds`(0 < 该值 < window_seconds)后,用户静默到设定秒数时系统提前将当前批次发给 LLM 以降低响应延迟,但批次窗口不结束;若正式发车前新消息到达,投机请求会被取消并合并到新批次。`allow_cancel_after_send` 控制已向用户发出消息后是否仍允许取消。 +- 完善消息合并的异步竞态保护与退出收敛。定时器、投机请求调度、失败重试、旧任务路径收尾等均做了竞态保护;`flush_on_command` 控制斜杠命令到达时是否连带交出当前缓冲;退出时自动排空缓冲队列并等待在途回复自然收敛。 +- 统一"当前输入批次"语义。主提示词、NagaAgent 提示词和 `each.md` 均从"最后一条消息"升级为"当前输入批次"概念:若有【连续消息说明】,多段 `` 都属本轮输入,同批前几条不是历史旧任务,不触发幽灵任务防御;无连续消息说明时退化为最后一条消息。 +- 更新幽灵任务防御规则。安全锁从"最后一条消息"改为"当前输入批次",操作前自检和工具调用前置判断均基于批次语义,避免批量输入中的前置指令被误判为历史旧任务。 +- 优化表情包回复顺序。明确只有纯表情包 / 纯反应图回复才允许先检索表情包;需要文字说明的场景必须先完成必要文字,再将表情包检索和发送延后到后续轮次。 +- 重构管理员命令为子命令模式。`/admin [ls|add|del]` 替代原有三条独立命令(`/lsadmin`、`/addadmin`、`/rmadmin`),参照 `/faq` 子命令模式的声明式 inference;`ls` 继承 admin 权限,`add`/`del` 覆盖为 superadmin;无参数默认执行 `ls`。清理了 FAQ 迁移遗留的空命令目录。 +- 新增 HTML 渲染结果缓存。基于 HTML 内容的 hash 缓存渲染图片,持久化到 `data/cache/render/_html_render_cache.json`;hash 匹配自动复用,命令热重载后 HTML 变化自然自动失效;LRU 驱逐上限 50 条目 / 50MB,重启后 JSON 自动恢复;原子写入(`.tmp` + `os.replace`)和 `asyncio.Lock` 防竞态,所有渲染调用方(help、profile、render_markdown 等)自动受益。 +- 增强工具调用容错守卫。AI 客户端在 `_run_tools_loop` 中对缺失 `function` 字段或 `name` 为空的 tool call 返回结构化错误消息而非静默跳过或崩溃;`_refresh_intro_generator` 的 fire-and-forget task 显式注册 `done_callback` 以抑制未检索异常警告。 +- 重构 `end` 工具。移除旧版 summary 参数兼容,只保留 `memo`、`observations`、`perspective` 和 `force`;要求记录整个当前输入批次中值得留存的信息,后台史官也接收批次全部消息以产出更完整的历史记录。 +- 扩展 Runtime 探针覆盖。API `/api/v1/management/probes` 现在额外返回消息合并器状态、完整工具/工具集/Agent/自动管线/斜杠命令/Anthropic Skills 的加载与调用统计,WebUI Runtime 面板同步展示;`/api/v1/management/probes/bootstrap` 诊断输出同步扩展。 +- 新增 WebUI 更新日志查看。关于项目页面可按版本查看 changelog 详情;`/api/v1/management/changelog` 端点支持指定版本查询,自动展示当前运行版本的 changelog 条目。 +- 调整发布说明生成方式。GitHub Release notes 改为从 `CHANGELOG.md` 最新版本条目自动解析生成(`scripts/release_notes.py`),发版前校验 tag、各构建清单与最新 changelog 版本一致,避免 tag 注释与正式说明脱节。 +- 补齐消息合并专题文档。新增 `docs/message-batching.md`,覆盖配置参数、等待策略、投机预发送、竞态保护与关闭行为;同步更新 README、配置文档、OpenAPI、WebUI 指南和架构图。 +- 补强测试覆盖。新增消息合并单元与集成测试(`test_message_batcher.py` 686 行、`test_message_batcher_integration.py` 326 行)、工具调用守卫测试(`test_ai_client_tool_guard.py`)、发布说明脚本测试(`test_release_notes_script.py` 163 行)、Runtime 探针统计测试(`test_runtime_api_probes.py` 120 行),并更新 `test_end_tool`、`test_system_prompt_constraints`、`test_webui_management_api`、`test_lsadmin_command` 等已有测试,总测试用例提升至约 1620 项。 --- From be2e30516cf1217f267e968fb7bd7390b43fa9e0 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Mon, 4 May 2026 15:33:03 +0800 Subject: [PATCH 29/34] refactor(skills): rename auto_pipeline to pipelines, flatten directory structure --- AGENTS.md | 2 +- ARCHITECTURE.md | 6 +- CLAUDE.md | 4 +- README.md | 2 +- docs/auto-pipeline.md | 117 ------------------ docs/configuration.md | 2 +- docs/openapi.md | 6 +- docs/pipelines.md | 105 ++++++++++++++++ res/prompts/undefined.xml | 8 +- res/prompts/undefined_nagaagent.xml | 8 +- src/Undefined/api/_context.py | 2 +- src/Undefined/api/_openapi.py | 2 +- src/Undefined/api/routes/system.py | 6 +- src/Undefined/handlers.py | 72 +++++------ src/Undefined/main.py | 2 +- src/Undefined/skills/README.md | 10 +- src/Undefined/skills/__init__.py | 4 +- .../skills/auto_pipeline/__init__.py | 6 - src/Undefined/skills/pipelines/__init__.py | 6 + .../pipelines/arxiv/config.json | 0 .../pipelines/arxiv/handler.py | 16 ++- .../pipelines/bilibili/config.json | 0 .../pipelines/bilibili/handler.py | 16 ++- src/Undefined/skills/pipelines/context.py | 30 +++++ .../pipelines/github/config.json | 0 .../pipelines/github/handler.py | 16 ++- .../{auto_pipeline => pipelines}/models.py | 6 +- .../{auto_pipeline => pipelines}/registry.py | 78 ++++++------ src/Undefined/webui/static/js/i18n.js | 4 +- src/Undefined/webui/static/js/runtime.js | 2 +- tests/test_config_hot_reload.py | 2 +- tests/test_handlers_arxiv_auto_extract.py | 6 +- tests/test_handlers_github_auto_extract.py | 6 +- ...pipeline.py => test_handlers_pipelines.py} | 68 +++++----- tests/test_handlers_repeat.py | 8 +- tests/test_message_batcher_integration.py | 2 +- ...registry.py => test_pipelines_registry.py} | 19 +-- tests/test_runtime_api_probes.py | 8 +- 38 files changed, 328 insertions(+), 329 deletions(-) delete mode 100644 docs/auto-pipeline.md create mode 100644 docs/pipelines.md delete mode 100644 src/Undefined/skills/auto_pipeline/__init__.py create mode 100644 src/Undefined/skills/pipelines/__init__.py rename src/Undefined/skills/{auto_pipeline => }/pipelines/arxiv/config.json (100%) rename src/Undefined/skills/{auto_pipeline => }/pipelines/arxiv/handler.py (72%) rename src/Undefined/skills/{auto_pipeline => }/pipelines/bilibili/config.json (100%) rename src/Undefined/skills/{auto_pipeline => }/pipelines/bilibili/handler.py (72%) create mode 100644 src/Undefined/skills/pipelines/context.py rename src/Undefined/skills/{auto_pipeline => }/pipelines/github/config.json (100%) rename src/Undefined/skills/{auto_pipeline => }/pipelines/github/handler.py (72%) rename src/Undefined/skills/{auto_pipeline => pipelines}/models.py (74%) rename src/Undefined/skills/{auto_pipeline => pipelines}/registry.py (76%) rename tests/{test_handlers_auto_extract_pipeline.py => test_handlers_pipelines.py} (88%) rename tests/{test_auto_pipeline_registry.py => test_pipelines_registry.py} (79%) diff --git a/AGENTS.md b/AGENTS.md index 0bc118d4..683ecca5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -34,7 +34,7 @@ Use `` for both images and files. The legacy ` AutoPipelineDetection | None: - text = str(context["text"]) - if "example" not in text: - return None - return AutoPipelineDetection(name="example", items=("example",)) - - -async def process( - detection: AutoPipelineDetection, - context: AutoPipelineContext, -) -> None: - sender = context["sender"] - target_id = int(context["target_id"]) - target_type = str(context["target_type"]) - message = f"自动处理结果: {', '.join(detection.items)}" - if target_type == "group": - await sender.send_group_message(target_id, message) - else: - await sender.send_private_message(target_id, message) -``` - -`detect` 应只做轻量检测和 ID 提取;`process` 执行下载、渲染、发送等重操作。发送消息应优先走 `MessageSender`,不要绕过历史写入。`MessageSender` 会自动将本地 CQ 图片、视频、语音以及 `send_group_file` / `send_private_file` 上传的文件登记为会话附件,让历史中带上 `pic_*` / `file_*` UID,便于后续 AI 回复引用;管线通常不需要单独处理附件登记。 - -## 附件 UID 绑定语义 - -- 外部接收的远程图片或文件默认会先下载并写入附件缓存,UID 绑定的是缓存中的文件内容;超过 `[attachments].remote_download_max_size_mb` 时会降级为 URL 引用,UID 绑定原始 URL 而不下载文件内容。原始 URL、OneBot `file` 标识或 WebUI 文件 ID 会保存在 `source_ref` / `segment_data` 中用于追溯。 -- 外部接收的本地路径、`file://` 路径或 WebUI 已上传文件会被复制到附件缓存,UID 同样绑定缓存副本,而不是直接绑定原路径。 -- 内部生成或发送的本地媒体、视频、语音和上传文件由 `MessageSender` 在发送成功后读取并登记,UID 绑定发送当时复制进缓存的内容;原始本地路径或 CQ `file` 字段作为来源信息保留。 - -## Context 字段 - -常用字段: - -- `config`: 当前运行配置。 -- `sender`: 统一消息发送器。 -- `onebot`: OneBot 客户端。 -- `target_id`: 群号或私聊用户 QQ。 -- `target_type`: `group` 或 `private`。 -- `text`: 当前消息纯文本。 -- `message_content`: 当前消息原始结构化段。 -- `extract_bilibili_ids`、`extract_arxiv_ids`、`extract_github_repo_ids`: 现有解析 helper。 -- `handle_bilibili_extract`、`handle_arxiv_extract`、`handle_github_extract`: 现有发送处理 helper。 - -新增管线可以复用已有解析器和发送器,避免重复网络、解析和历史写入逻辑。 - -## 热重载 - -`AutoPipelineRegistry` 监视 `config.json` 和 `handler.py`,并跟随 `[skills]` 配置: - -```toml -[skills] -hot_reload = true -hot_reload_interval = 2.0 -hot_reload_debounce = 0.5 -``` - -修改管线文件后,运行中的机器人会在去抖后重新加载管线。禁用 `[skills].hot_reload` 会同时停止自动处理管线、工具和 Agent 的热重载 watcher。 \ No newline at end of file diff --git a/docs/configuration.md b/docs/configuration.md index 82a9f1ae..4906a8fb 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -655,7 +655,7 @@ Prompt caching 补充: - 同一条消息内,自动处理管线会并行检测 Bilibili、arXiv、GitHub 等已注册管线。 - 检测到多个管线时会并行处理全部命中结果;通常单条消息只会命中一个管线,因此不手动维护优先级。 - 自动提取发送出的信息消息、图片卡片、文件或视频摘要会通过统一发送层写入消息历史,本地媒体和文件会自动登记为会话附件 UID,随后才进入 AI 自动回复,因此 AI 可以读取刚刚的自动提取结果。 -- 管线实现位于 `src/Undefined/skills/auto_pipeline/`,跟随 `[skills]` 热重载配置自动重新加载。开发新管线请参考 [自动处理管线开发指南](auto-pipeline.md)。 +- 管线实现位于 `src/Undefined/skills/pipelines/`,跟随 `[skills]` 热重载配置自动重新加载。开发新管线请参考 [自动处理管线开发指南](pipelines.md)。 --- diff --git a/docs/openapi.md b/docs/openapi.md index 4be8bca7..0d69cb5f 100644 --- a/docs/openapi.md +++ b/docs/openapi.md @@ -106,10 +106,10 @@ curl http://127.0.0.1:8788/openapi.json | `memory` | `object` | 长期记忆(`count`:条数) | | `cognitive` | `object` | 认知服务(`enabled`、`queue`) | | `api` | `object` | Runtime API 配置(`enabled`、`host`、`port`、`openapi_enabled`) | -| `skills` | `object` | 技能统计,包含 `tools`、`toolsets`、`agents`、`auto_pipelines`、`commands`、`anthropic_skills` 子对象 | +| `skills` | `object` | 技能统计,包含 `tools`、`toolsets`、`agents`、`pipelines`、`commands`、`anthropic_skills` 子对象 | | `models` | `object` | 模型配置;聊天类模型包含 `model_name`、脱敏 `api_url`、`api_mode`、`thinking_enabled`、`thinking_tool_call_compat`、`responses_tool_choice_compat`、`responses_force_stateless_replay`、`prompt_cache_enabled`、`reasoning_enabled`、`reasoning_effort` | -`skills` 下各分类均提供轻量摘要:`tools` 是当前可调用工具总表,`toolsets` 单独拆出 `skills/toolsets/` 下的工具集工具,`agents` 对应 `skills/agents/`,`auto_pipelines` 对应 `skills/auto_pipeline/`,`commands` 对应 `skills/commands/`,`anthropic_skills` 对应全局 Anthropic Skills。常规注册表子对象结构: +`skills` 下各分类均提供轻量摘要:`tools` 是当前可调用工具总表,`toolsets` 单独拆出 `skills/toolsets/` 下的工具集工具,`agents` 对应 `skills/agents/`,`pipelines` 对应 `skills/pipelines/`,`commands` 对应 `skills/commands/`,`anthropic_skills` 对应全局 Anthropic Skills。常规注册表子对象结构: ```json { @@ -121,7 +121,7 @@ curl http://127.0.0.1:8788/openapi.json } ``` -`toolsets` 额外包含 `categories[]`,用于按工具集类别汇总;`commands` 额外包含 `aliases` 与 `subcommands` 总数;`auto_pipelines` 额外包含 `hot_reload`,用于观察自动管线热重载 watcher 是否正在运行。 +`toolsets` 额外包含 `categories[]`,用于按工具集类别汇总;`commands` 额外包含 `aliases` 与 `subcommands` 总数;`pipelines` 额外包含 `hot_reload`,用于观察管线热重载 watcher 是否正在运行。 `models` 子对象结构(URL 经脱敏处理,仅保留 scheme + host;embedding/rerank 仅返回 `model_name` 与 `api_url`): diff --git a/docs/pipelines.md b/docs/pipelines.md new file mode 100644 index 00000000..9c2f26f2 --- /dev/null +++ b/docs/pipelines.md @@ -0,0 +1,105 @@ +# 自动处理管线开发指南 + +自动处理管线位于 `src/Undefined/skills/pipelines/`,用于在普通消息进入 AI 自动回复前执行自动提取,例如 Bilibili 视频、arXiv 论文和 GitHub 仓库卡片。斜杠命令优先级高于自动处理管线,命中命令后不会继续触发自动提取或 AI 回复。 + +`MessageHandler` 启动时会通过异步初始化在线程中加载管线配置和 handler 模块,避免目录扫描、`config.json` 读取和模块导入阻塞事件循环;注册 OneBot 消息回调前会等待首次加载完成,后续热重载也在线程中执行。 + +## 运行顺序 + +1. `MessageHandler` 先并行执行消息预处理:附件收集、历史文本解析、昵称或群信息读取等。 +2. 用户消息先写入历史。 +3. 若消息命中斜杠命令,立即分发命令并结束本轮后续流程;命令输入和命令输出会写入历史,供后续 AI 轮次读取。 +4. 未命中命令时,`PipelineRegistry` 并行调用所有已注册管线的 `detect(context)`。 +5. 对所有命中的管线,并行调用对应的 `process(detection, context)`。 +6. 管线发送出的信息、图片、文件或视频摘要通过统一发送器写入历史;本地图片、文件和视频会自动登记为当前会话可见的统一附件 UID。 +7. 自动处理完成后,当前消息和管线输出一起进入 AI 自动回复/Agent 循环。 + +命中自动处理管线的消息会继续进入 AI 自动回复,让 AI 基于用户消息和刚写入的自动处理结果判断后续行为。 + +## 目录结构 + +```text +src/Undefined/skills/pipelines/ +├── __init__.py +├── registry.py +├── models.py +├── context.py +├── bilibili/ +│ ├── config.json +│ └── handler.py +├── arxiv/ +│ ├── config.json +│ └── handler.py +└── github/ + ├── config.json + └── handler.py +``` + +## `config.json` + +```json +{ + "name": "example", + "description": "检测并处理某类自动提取消息。", + "order": 100, + "enabled": true +} +``` + +- `name`: 管线唯一名称,必须与 `PipelineDetection.name` 一致。 +- `description`: 日志和维护说明。 +- `order`: 注册排序字段,仅用于稳定展示和结果收集顺序;处理不依赖优先级。 +- `enabled`: 设为 `false` 时该管线不会加载。 + +## `handler.py` + +```python +from __future__ import annotations + +from Undefined.skills.pipelines.models import PipelineContext, PipelineDetection + + +async def detect(context: PipelineContext) -> PipelineDetection | None: + text = str(context["text"]) + if "example" not in text: + return None + return PipelineDetection(name="example", items=("example",)) + + +async def process( + detection: PipelineDetection, + context: PipelineContext, +) -> None: + handler = context["handle_bilibili_extract"] + await handler( + int(context["target_id"]), + ["example"], + str(context["target_type"]), + ) +``` + +handler.py 需要导出 `detect` 和 `process` 两个顶层异步函数。 + +## Context 参数 + +`detect(context)` 和 `process(detection, context)` 共享的 `context` 字典由 `build_pipeline_context()` 构建,包含以下常用字段: + +| key | 类型 | 说明 | +|-----|------|------| +| `config` | object | 运行时配置对象(含 `xxx_auto_extract_enabled`、`is_xxx_auto_extract_allowed_group/private` 等方法) | +| `sender` | object | 消息发送器 | +| `onebot` | object | OneBot 客户端 | +| `target_id` | int | 群号或私聊 QQ 号 | +| `target_type` | str | `"group"` 或 `"private"` | +| `text` | str | 提取的纯文本内容 | +| `message_content` | list[dict] | 原始消息段列表 | +| `extract_xxx_ids` | callable | 提取器函数 | +| `handle_xxx_extract` | callable | 处理器函数 | + +## 注册与热重载 + +`PipelineRegistry` 在初始化时扫描 `pipelines/` 下每个子目录,按 `order` 排序注册。 + +热重载每 2 秒(可配置)检查 `config.json` 和 `handler.py` 的 mtime + size 快照,检测到变更后等待 500ms 防抖再重载。新增或删除目录也会在重载时生效。 + +`PipelineRegistry` 监视 `config.json` 和 `handler.py` 的变更。如果只改 `README.md` 不会触发重载。 \ No newline at end of file diff --git a/res/prompts/undefined.xml b/res/prompts/undefined.xml index fb552cbf..d0d354f9 100644 --- a/res/prompts/undefined.xml +++ b/res/prompts/undefined.xml @@ -133,12 +133,12 @@ **关键点:每次消息处理都必须以 end 结束,这是维持对话流的核心机制。** - + **自动处理管线结果:** - 在你收到当前消息前,系统可能已经并行处理了当前消息中的 Bilibili、arXiv、GitHub 等自动提取内容。 - 这些预处理输出会紧邻当前消息写入历史,可能包含 Bot 发送的信息卡片、图片、文件、视频摘要或附件 UID。 + 在你收到当前消息前,系统可能已经并行处理了当前消息中的自动提取内容(如 Bilibili、arXiv、GitHub 等)。 + 这些预处理输出会紧邻当前消息写入历史,可能包含 Bot 发送的信息卡片、图片、文件或附件 UID。 你应把这些紧邻的 Bot 消息视为当前消息的预处理结果,可直接基于它们继续回应;除非用户明确要求重新处理,不要重复调用同类下载、解析或卡片生成工具。 - + **斜杠命令历史:** diff --git a/res/prompts/undefined_nagaagent.xml b/res/prompts/undefined_nagaagent.xml index 460c8397..d42a7e26 100644 --- a/res/prompts/undefined_nagaagent.xml +++ b/res/prompts/undefined_nagaagent.xml @@ -133,12 +133,12 @@ **关键点:每次消息处理都必须以 end 结束,这是维持对话流的核心机制。** - + **自动处理管线结果:** - 在你收到当前消息前,系统可能已经并行处理了当前消息中的 Bilibili、arXiv、GitHub 等自动提取内容。 - 这些预处理输出会紧邻当前消息写入历史,可能包含 Bot 发送的信息卡片、图片、文件、视频摘要或附件 UID。 + 在你收到当前消息前,系统可能已经并行处理了当前消息中的自动提取内容(如 Bilibili、arXiv、GitHub 等)。 + 这些预处理输出会紧邻当前消息写入历史,可能包含 Bot 发送的信息卡片、图片、文件或附件 UID。 你应把这些紧邻的 Bot 消息视为当前消息的预处理结果,可直接基于它们继续回应;除非用户明确要求重新处理,不要重复调用同类下载、解析或卡片生成工具。 - + **斜杠命令历史:** diff --git a/src/Undefined/api/_context.py b/src/Undefined/api/_context.py index 86232250..8ca6fd07 100644 --- a/src/Undefined/api/_context.py +++ b/src/Undefined/api/_context.py @@ -21,4 +21,4 @@ class RuntimeAPIContext: meme_service: Any = None naga_store: Any = None message_batcher: Any = None - auto_pipeline_registry: Any = None + pipeline_registry: Any = None diff --git a/src/Undefined/api/_openapi.py b/src/Undefined/api/_openapi.py index 46b47546..a6c5134c 100644 --- a/src/Undefined/api/_openapi.py +++ b/src/Undefined/api/_openapi.py @@ -39,7 +39,7 @@ def _build_openapi_spec(ctx: RuntimeAPIContext, request: web.Request) -> dict[st "Returns system info (version, Python, platform, uptime), " "OneBot connection status, request queue snapshot, " "memory count, cognitive service status, API config, " - "skill statistics (tools/toolsets/agents/auto_pipelines/commands/anthropic_skills), " + "skill statistics (tools/toolsets/agents/pipelines/commands/anthropic_skills), " "and model configuration (names, masked URLs, thinking flags)." ), } diff --git a/src/Undefined/api/routes/system.py b/src/Undefined/api/routes/system.py index 651fc2e4..5dd0b879 100644 --- a/src/Undefined/api/routes/system.py +++ b/src/Undefined/api/routes/system.py @@ -84,8 +84,8 @@ def _toolsets_summary(tool_registry: Any) -> dict[str, Any]: } -async def _auto_pipeline_summary(registry: Any) -> dict[str, Any]: - """生成 skills/auto_pipeline 的探针摘要。""" +async def _pipelines_summary(registry: Any) -> dict[str, Any]: + """生成 skills/pipelines 的探针摘要。""" if registry is None: return {"count": 0, "loaded": 0, "items": [], "hot_reload": False} @@ -215,7 +215,7 @@ async def internal_probe_handler( "tools": _registry_summary(tool_reg), "toolsets": _toolsets_summary(tool_reg), "agents": _registry_summary(agent_reg), - "auto_pipelines": await _auto_pipeline_summary(ctx.auto_pipeline_registry), + "pipelines": await _pipelines_summary(ctx.pipeline_registry), "commands": _commands_summary(ctx.command_dispatcher), "anthropic_skills": _registry_summary(anthropic_reg), } diff --git a/src/Undefined/handlers.py b/src/Undefined/handlers.py index 7c91d072..5f1bc873 100644 --- a/src/Undefined/handlers.py +++ b/src/Undefined/handlers.py @@ -40,7 +40,8 @@ from Undefined.services.ai_coordinator import AICoordinator from Undefined.services.message_batcher import MessageBatcher from Undefined.services.model_pool import ModelPoolService -from Undefined.skills.auto_pipeline import AutoPipelineRegistry +from Undefined.skills.pipelines import PipelineRegistry +from Undefined.skills.pipelines.context import build_pipeline_context from Undefined.utils.resources import resolve_resource_path from Undefined.utils.queue_intervals import build_model_queue_intervals @@ -148,9 +149,9 @@ def __init__( self._background_tasks: set[asyncio.Task[None]] = set() self._profile_name_refresh_cache: dict[tuple[str, int], str] = {} self._bot_nickname_cache = BotNicknameCache(onebot, config.bot_qq) - self.auto_pipeline_registry = AutoPipelineRegistry() - self._auto_pipeline_initialized = False - self._auto_pipeline_init_lock = asyncio.Lock() + self.pipeline_registry = PipelineRegistry() + self._pipelines_initialized = False + self._pipelines_init_lock = asyncio.Lock() # 复读功能状态(按群跟踪最近消息文本与发送者) self._repeat_counter: dict[int, list[tuple[str, int]]] = {} @@ -163,23 +164,23 @@ def __init__( async def initialize(self) -> None: """完成需要事件循环承载的异步初始化。""" - await self.initialize_auto_pipeline() + await self.init_pipelines() - async def initialize_auto_pipeline(self) -> None: + async def init_pipelines(self) -> None: """异步加载自动处理管线并按配置启动热重载。""" - if getattr(self, "_auto_pipeline_initialized", False): + if getattr(self, "_pipelines_initialized", False): return - init_lock = getattr(self, "_auto_pipeline_init_lock", None) + init_lock = getattr(self, "_pipelines_init_lock", None) if init_lock is None: init_lock = asyncio.Lock() - self._auto_pipeline_init_lock = init_lock + self._pipelines_init_lock = init_lock async with init_lock: - if getattr(self, "_auto_pipeline_initialized", False): + if getattr(self, "_pipelines_initialized", False): return - await self.auto_pipeline_registry.load_items_async() - self._auto_pipeline_initialized = True + await self.pipeline_registry.load_items_async() + self._pipelines_initialized = True if getattr(self.config, "skills_hot_reload", False): - self.auto_pipeline_registry.start_hot_reload( + self.pipeline_registry.start_hot_reload( interval=self.config.skills_hot_reload_interval, debounce=self.config.skills_hot_reload_debounce, ) @@ -666,7 +667,7 @@ async def handle_message(self, event: dict[str, Any]) -> None: ) return - await self._run_auto_extract_pipeline( + await self._run_pipelines( target_id=private_sender_id, target_type="private", text=text, @@ -927,7 +928,7 @@ async def _fetch_group_name() -> str: ) return - await self._run_auto_extract_pipeline( + await self._run_pipelines( target_id=group_id, target_type="group", text=text, @@ -1109,7 +1110,7 @@ async def _extract_bilibili_ids( bvids = await extract_from_json_message(message_content) return bvids - async def _run_auto_extract_pipeline( + async def _run_pipelines( self, *, target_id: int, @@ -1118,25 +1119,16 @@ async def _run_auto_extract_pipeline( message_content: list[dict[str, Any]], ) -> bool: """并行检测并处理所有命中的自动处理管线。""" - if not getattr(self, "_auto_pipeline_initialized", False): - await self.initialize_auto_pipeline() - detections = await self.auto_pipeline_registry.run( - { - "config": self.config, - "sender": self.sender, - "onebot": self.onebot, - "target_id": target_id, - "target_type": target_type, - "text": text, - "message_content": message_content, - "extract_bilibili_ids": self._extract_bilibili_ids, - "extract_arxiv_ids": self._extract_arxiv_ids, - "extract_github_repo_ids": self._extract_github_repo_ids, - "handle_bilibili_extract": self._handle_bilibili_extract, - "handle_arxiv_extract": self._handle_arxiv_extract, - "handle_github_extract": self._handle_github_extract, - } + if not getattr(self, "_pipelines_initialized", False): + await self.init_pipelines() + context = build_pipeline_context( + self, + target_id=target_id, + target_type=target_type, + text=text, + message_content=message_content, ) + detections = await self.pipeline_registry.run(context) return bool(detections) async def apply_skills_hot_reload_config( @@ -1146,14 +1138,14 @@ async def apply_skills_hot_reload_config( interval: float, debounce: float, ) -> None: - """跟随全局 skills 热重载配置更新自动处理管线。""" + """跟随全局 skills 热重载配置更新管线。""" if not enabled: - await self.auto_pipeline_registry.stop_hot_reload() - logger.info("[auto_pipeline] 热重载已随配置禁用") + await self.pipeline_registry.stop_hot_reload() + logger.info("[pipelines] 热重载已随配置禁用") return - await self.auto_pipeline_registry.stop_hot_reload() - self.auto_pipeline_registry.start_hot_reload( + await self.pipeline_registry.stop_hot_reload() + self.pipeline_registry.start_hot_reload( interval=interval, debounce=debounce, ) @@ -1373,7 +1365,7 @@ async def close(self) -> None: *list(self._background_tasks), return_exceptions=True, ) - await self.auto_pipeline_registry.stop_hot_reload() + await self.pipeline_registry.stop_hot_reload() await self.message_batcher.flush_all() await self.ai_coordinator.queue_manager.drain() await self.ai_coordinator.queue_manager.stop() diff --git a/src/Undefined/main.py b/src/Undefined/main.py index 32eb16a3..72d205b3 100644 --- a/src/Undefined/main.py +++ b/src/Undefined/main.py @@ -479,7 +479,7 @@ def _apply_config_updates( meme_service=meme_service, naga_store=naga_store, message_batcher=handler.message_batcher, - auto_pipeline_registry=handler.auto_pipeline_registry, + pipeline_registry=handler.pipeline_registry, ) runtime_api_server = RuntimeAPIServer( runtime_api_context, diff --git a/src/Undefined/skills/README.md b/src/Undefined/skills/README.md index 08297e37..0c9eda17 100644 --- a/src/Undefined/skills/README.md +++ b/src/Undefined/skills/README.md @@ -8,7 +8,7 @@ ``` skills/ -├── auto_pipeline/ # 自动处理管线,斜杠命令之后、AI 之前并行检测/处理 +├── pipelines/ # 自动处理管线,斜杠命令之后、AI 之前并行检测/处理 │ ├── __init__.py │ ├── registry.py │ └── pipelines/ @@ -75,7 +75,7 @@ skills/ - **定位**: 消息进入 AI 前的自动预处理能力,例如 Bilibili、arXiv、GitHub 链接提取;斜杠命令优先级更高,命中后不触发管线。 - **调用方式**: `MessageHandler` 自动调用,不暴露给 AI 主动调用。 - **命名规则**: `pipelines//`,`config.json` 中的 `name` 必须与命中结果一致。 -- **目录结构**: `auto_pipeline/pipelines/{pipeline_name}/config.json + handler.py`。 +- **目录结构**: `pipelines/{pipeline_name}/config.json + handler.py`。 - **执行方式**: 同一条非命令消息会并行检测全部管线,并行处理全部命中结果;处理产出的消息通过统一发送层写入历史并自动登记本地媒体/文件附件后,再进入 AI 自动回复。 - **热重载**: 跟随 `[skills]` 的 `hot_reload`、`hot_reload_interval`、`hot_reload_debounce` 配置。 - **示例**: `bilibili`, `arxiv`, `github` @@ -140,12 +140,12 @@ skills/ ### 添加自动处理管线 -1. 在 `skills/auto_pipeline/pipelines/` 下创建新目录 +1. 在 `skills/pipelines/` 下创建新目录 2. 添加 `config.json`,包含 `name`、`description`、`order` 和 `enabled` 3. 添加 `handler.py`,必须包含 `async def detect(context)` 与 `async def process(detection, context)` -4. 自动被 `AutoPipelineRegistry` 发现和注册,并支持热重载 +4. 自动被 `PipelineRegistry` 发现和注册,并支持热重载 -详细说明请参考 [自动处理管线开发指南](../../../docs/auto-pipeline.md)。 +详细说明请参考 [自动处理管线开发指南](../../../docs/pipelines.md)。 ### 添加基础工具 diff --git a/src/Undefined/skills/__init__.py b/src/Undefined/skills/__init__.py index 1cd4ed03..c40938cf 100644 --- a/src/Undefined/skills/__init__.py +++ b/src/Undefined/skills/__init__.py @@ -6,6 +6,6 @@ from Undefined.skills.tools import ToolRegistry from Undefined.skills.agents import AgentRegistry -from Undefined.skills.auto_pipeline import AutoPipelineRegistry +from Undefined.skills.pipelines import PipelineRegistry -__all__ = ["ToolRegistry", "AgentRegistry", "AutoPipelineRegistry"] +__all__ = ["ToolRegistry", "AgentRegistry", "PipelineRegistry"] diff --git a/src/Undefined/skills/auto_pipeline/__init__.py b/src/Undefined/skills/auto_pipeline/__init__.py deleted file mode 100644 index 165a394d..00000000 --- a/src/Undefined/skills/auto_pipeline/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""自动处理管线注册与运行。""" - -from Undefined.skills.auto_pipeline.models import AutoPipelineDetection -from Undefined.skills.auto_pipeline.registry import AutoPipelineRegistry - -__all__ = ["AutoPipelineDetection", "AutoPipelineRegistry"] diff --git a/src/Undefined/skills/pipelines/__init__.py b/src/Undefined/skills/pipelines/__init__.py new file mode 100644 index 00000000..ae525468 --- /dev/null +++ b/src/Undefined/skills/pipelines/__init__.py @@ -0,0 +1,6 @@ +"""自动处理管线注册与运行。""" + +from Undefined.skills.pipelines.models import PipelineDetection +from Undefined.skills.pipelines.registry import PipelineRegistry + +__all__ = ["PipelineDetection", "PipelineRegistry"] diff --git a/src/Undefined/skills/auto_pipeline/pipelines/arxiv/config.json b/src/Undefined/skills/pipelines/arxiv/config.json similarity index 100% rename from src/Undefined/skills/auto_pipeline/pipelines/arxiv/config.json rename to src/Undefined/skills/pipelines/arxiv/config.json diff --git a/src/Undefined/skills/auto_pipeline/pipelines/arxiv/handler.py b/src/Undefined/skills/pipelines/arxiv/handler.py similarity index 72% rename from src/Undefined/skills/auto_pipeline/pipelines/arxiv/handler.py rename to src/Undefined/skills/pipelines/arxiv/handler.py index 2fcd83db..8dcf961e 100644 --- a/src/Undefined/skills/auto_pipeline/pipelines/arxiv/handler.py +++ b/src/Undefined/skills/pipelines/arxiv/handler.py @@ -2,9 +2,9 @@ from typing import Any -from Undefined.skills.auto_pipeline.models import ( - AutoPipelineContext, - AutoPipelineDetection, +from Undefined.skills.pipelines.models import ( + PipelineContext, + PipelineDetection, ) @@ -16,7 +16,7 @@ def _is_allowed(config: Any, target_type: str, target_id: int) -> bool: return bool(config.is_arxiv_auto_extract_allowed_private(target_id)) -async def detect(context: AutoPipelineContext) -> AutoPipelineDetection | None: +async def detect(context: PipelineContext) -> PipelineDetection | None: target_id = int(context["target_id"]) target_type = str(context["target_type"]) config = context["config"] @@ -27,14 +27,12 @@ async def detect(context: AutoPipelineContext) -> AutoPipelineDetection | None: paper_ids = extractor(context["text"], context["message_content"]) if not paper_ids: return None - return AutoPipelineDetection( - name="arxiv", items=tuple(str(item) for item in paper_ids) - ) + return PipelineDetection(name="arxiv", items=tuple(str(item) for item in paper_ids)) async def process( - detection: AutoPipelineDetection, - context: AutoPipelineContext, + detection: PipelineDetection, + context: PipelineContext, ) -> None: handler = context["handle_arxiv_extract"] await handler( diff --git a/src/Undefined/skills/auto_pipeline/pipelines/bilibili/config.json b/src/Undefined/skills/pipelines/bilibili/config.json similarity index 100% rename from src/Undefined/skills/auto_pipeline/pipelines/bilibili/config.json rename to src/Undefined/skills/pipelines/bilibili/config.json diff --git a/src/Undefined/skills/auto_pipeline/pipelines/bilibili/handler.py b/src/Undefined/skills/pipelines/bilibili/handler.py similarity index 72% rename from src/Undefined/skills/auto_pipeline/pipelines/bilibili/handler.py rename to src/Undefined/skills/pipelines/bilibili/handler.py index 5528b554..3e60c617 100644 --- a/src/Undefined/skills/auto_pipeline/pipelines/bilibili/handler.py +++ b/src/Undefined/skills/pipelines/bilibili/handler.py @@ -2,9 +2,9 @@ from typing import Any -from Undefined.skills.auto_pipeline.models import ( - AutoPipelineContext, - AutoPipelineDetection, +from Undefined.skills.pipelines.models import ( + PipelineContext, + PipelineDetection, ) @@ -16,7 +16,7 @@ def _is_allowed(config: Any, target_type: str, target_id: int) -> bool: return bool(config.is_bilibili_auto_extract_allowed_private(target_id)) -async def detect(context: AutoPipelineContext) -> AutoPipelineDetection | None: +async def detect(context: PipelineContext) -> PipelineDetection | None: target_id = int(context["target_id"]) target_type = str(context["target_type"]) config = context["config"] @@ -27,14 +27,12 @@ async def detect(context: AutoPipelineContext) -> AutoPipelineDetection | None: bvids = await extractor(context["text"], context["message_content"]) if not bvids: return None - return AutoPipelineDetection( - name="bilibili", items=tuple(str(item) for item in bvids) - ) + return PipelineDetection(name="bilibili", items=tuple(str(item) for item in bvids)) async def process( - detection: AutoPipelineDetection, - context: AutoPipelineContext, + detection: PipelineDetection, + context: PipelineContext, ) -> None: handler = context["handle_bilibili_extract"] await handler( diff --git a/src/Undefined/skills/pipelines/context.py b/src/Undefined/skills/pipelines/context.py new file mode 100644 index 00000000..66c2f7a0 --- /dev/null +++ b/src/Undefined/skills/pipelines/context.py @@ -0,0 +1,30 @@ +"""构建管线执行上下文。""" + +from __future__ import annotations + +from typing import Any + + +def build_pipeline_context( + handler: Any, + *, + target_id: int, + target_type: str, + text: str, + message_content: list[dict[str, Any]] | None, +) -> dict[str, Any]: + return { + "config": handler.config, + "sender": handler.sender, + "onebot": handler.onebot, + "target_id": target_id, + "target_type": target_type, + "text": text, + "message_content": message_content, + "extract_bilibili_ids": handler._extract_bilibili_ids, + "extract_arxiv_ids": handler._extract_arxiv_ids, + "extract_github_repo_ids": handler._extract_github_repo_ids, + "handle_bilibili_extract": handler._handle_bilibili_extract, + "handle_arxiv_extract": handler._handle_arxiv_extract, + "handle_github_extract": handler._handle_github_extract, + } diff --git a/src/Undefined/skills/auto_pipeline/pipelines/github/config.json b/src/Undefined/skills/pipelines/github/config.json similarity index 100% rename from src/Undefined/skills/auto_pipeline/pipelines/github/config.json rename to src/Undefined/skills/pipelines/github/config.json diff --git a/src/Undefined/skills/auto_pipeline/pipelines/github/handler.py b/src/Undefined/skills/pipelines/github/handler.py similarity index 72% rename from src/Undefined/skills/auto_pipeline/pipelines/github/handler.py rename to src/Undefined/skills/pipelines/github/handler.py index 392e458d..2148d49c 100644 --- a/src/Undefined/skills/auto_pipeline/pipelines/github/handler.py +++ b/src/Undefined/skills/pipelines/github/handler.py @@ -2,9 +2,9 @@ from typing import Any -from Undefined.skills.auto_pipeline.models import ( - AutoPipelineContext, - AutoPipelineDetection, +from Undefined.skills.pipelines.models import ( + PipelineContext, + PipelineDetection, ) @@ -16,7 +16,7 @@ def _is_allowed(config: Any, target_type: str, target_id: int) -> bool: return bool(config.is_github_auto_extract_allowed_private(target_id)) -async def detect(context: AutoPipelineContext) -> AutoPipelineDetection | None: +async def detect(context: PipelineContext) -> PipelineDetection | None: target_id = int(context["target_id"]) target_type = str(context["target_type"]) config = context["config"] @@ -27,14 +27,12 @@ async def detect(context: AutoPipelineContext) -> AutoPipelineDetection | None: repo_ids = extractor(context["text"], context["message_content"]) if not repo_ids: return None - return AutoPipelineDetection( - name="github", items=tuple(str(item) for item in repo_ids) - ) + return PipelineDetection(name="github", items=tuple(str(item) for item in repo_ids)) async def process( - detection: AutoPipelineDetection, - context: AutoPipelineContext, + detection: PipelineDetection, + context: PipelineContext, ) -> None: handler = context["handle_github_extract"] await handler( diff --git a/src/Undefined/skills/auto_pipeline/models.py b/src/Undefined/skills/pipelines/models.py similarity index 74% rename from src/Undefined/skills/auto_pipeline/models.py rename to src/Undefined/skills/pipelines/models.py index 3d3fb7e1..6b6cafda 100644 --- a/src/Undefined/skills/auto_pipeline/models.py +++ b/src/Undefined/skills/pipelines/models.py @@ -5,12 +5,12 @@ from dataclasses import dataclass, field from typing import Any, Literal, Mapping -AutoPipelineTargetType = Literal["group", "private"] -AutoPipelineContext = dict[str, Any] +PipelineTargetType = Literal["group", "private"] +PipelineContext = dict[str, Any] @dataclass(frozen=True) -class AutoPipelineDetection: +class PipelineDetection: """单条自动处理管线的命中结果。""" name: str diff --git a/src/Undefined/skills/auto_pipeline/registry.py b/src/Undefined/skills/pipelines/registry.py similarity index 76% rename from src/Undefined/skills/auto_pipeline/registry.py rename to src/Undefined/skills/pipelines/registry.py index e825384f..e9e9b29a 100644 --- a/src/Undefined/skills/auto_pipeline/registry.py +++ b/src/Undefined/skills/pipelines/registry.py @@ -13,19 +13,19 @@ from types import ModuleType from typing import Any, Awaitable, Callable -from Undefined.skills.auto_pipeline.models import ( - AutoPipelineContext, - AutoPipelineDetection, +from Undefined.skills.pipelines.models import ( + PipelineContext, + PipelineDetection, ) logger = logging.getLogger(__name__) -DetectHandler = Callable[[AutoPipelineContext], Awaitable[AutoPipelineDetection | None]] -ProcessHandler = Callable[[AutoPipelineDetection, AutoPipelineContext], Awaitable[None]] +DetectHandler = Callable[[PipelineContext], Awaitable[PipelineDetection | None]] +ProcessHandler = Callable[[PipelineDetection, PipelineContext], Awaitable[None]] @dataclass(frozen=True) -class AutoPipelineItem: +class PipelineItem: name: str description: str order: int @@ -35,16 +35,14 @@ class AutoPipelineItem: process: ProcessHandler -class AutoPipelineRegistry: +class PipelineRegistry: """发现、热重载并并行运行自动处理管线。""" def __init__(self, base_dir: Path | str | None = None) -> None: self.base_dir = ( - Path(base_dir) - if base_dir is not None - else Path(__file__).parent / "pipelines" + Path(base_dir) if base_dir is not None else Path(__file__).parent ) - self._items: dict[str, AutoPipelineItem] = {} + self._items: dict[str, PipelineItem] = {} self._items_lock = asyncio.Lock() self._reload_lock = asyncio.Lock() self._watch_task: asyncio.Task[None] | None = None @@ -53,19 +51,16 @@ def __init__(self, base_dir: Path | str | None = None) -> None: self._watch_filenames: set[str] = {"config.json", "handler.py"} def load_items(self) -> None: - """从磁盘加载所有自动处理管线。""" self._items = self._load_items_sync() async def load_items_async(self) -> None: - """在线程中加载所有自动处理管线,避免阻塞事件循环。""" async with self._reload_lock: await self._reload_items() - def _load_items_sync(self) -> dict[str, AutoPipelineItem]: - """同步加载管线定义;热重载路径会在线程中调用。""" - items: dict[str, AutoPipelineItem] = {} + def _load_items_sync(self) -> dict[str, PipelineItem]: + items: dict[str, PipelineItem] = {} if not self.base_dir.exists(): - logger.warning("[auto_pipeline] 目录不存在: %s", self.base_dir) + logger.warning("[pipelines] 目录不存在: %s", self.base_dir) return items for item_dir in sorted(self.base_dir.iterdir()): @@ -77,17 +72,17 @@ def _load_items_sync(self) -> dict[str, AutoPipelineItem]: loaded_items = dict(sorted(items.items(), key=lambda pair: pair[1].order)) logger.info( - "[auto_pipeline] 已加载自动处理管线: count=%s names=%s", + "[pipelines] 已加载自动处理管线: count=%s names=%s", len(loaded_items), ",".join(loaded_items), ) return loaded_items - def _load_item(self, item_dir: Path) -> AutoPipelineItem | None: + def _load_item(self, item_dir: Path) -> PipelineItem | None: config_path = item_dir / "config.json" handler_path = item_dir / "handler.py" if not config_path.exists() or not handler_path.exists(): - logger.debug("[auto_pipeline] 跳过缺少 config/handler 的目录: %s", item_dir) + logger.debug("[pipelines] 跳过缺少 config/handler 的目录: %s", item_dir) return None try: @@ -104,7 +99,7 @@ def _load_item(self, item_dir: Path) -> AutoPipelineItem | None: raise RuntimeError( "handler.py 必须提供 detect(context) 和 process(detection, context)" ) - return AutoPipelineItem( + return PipelineItem( name=name, description=description, order=order, @@ -114,7 +109,7 @@ def _load_item(self, item_dir: Path) -> AutoPipelineItem | None: process=process, ) except Exception: - logger.exception("[auto_pipeline] 加载管线失败: %s", item_dir) + logger.exception("[pipelines] 加载管线失败: %s", item_dir) return None def _load_config(self, config_path: Path) -> dict[str, Any]: @@ -125,7 +120,7 @@ def _load_config(self, config_path: Path) -> dict[str, Any]: return data def _build_module_name(self, name: str) -> str: - return f"Undefined.skills.auto_pipeline.pipelines.{name}.handler" + return f"Undefined.skills.pipelines.{name}.handler" def _load_handler_module(self, name: str, handler_path: Path) -> ModuleType: module_name = self._build_module_name(name) @@ -145,14 +140,13 @@ def _load_handler_module(self, name: str, handler_path: Path) -> ModuleType: raise return module - async def run(self, context: AutoPipelineContext) -> list[AutoPipelineDetection]: - """并行检测所有管线,并并行处理全部命中结果。""" + async def run(self, context: PipelineContext) -> list[PipelineDetection]: detections = await self.detect(context) if detections: await self.process(detections, context) return detections - async def detect(self, context: AutoPipelineContext) -> list[AutoPipelineDetection]: + async def detect(self, context: PipelineContext) -> list[PipelineDetection]: async with self._items_lock: items = list(self._items.values()) if not items: @@ -162,11 +156,11 @@ async def detect(self, context: AutoPipelineContext) -> list[AutoPipelineDetecti *(self._detect_one(item, context) for item in items), return_exceptions=True, ) - detections: list[AutoPipelineDetection] = [] + detections: list[PipelineDetection] = [] for item, result in zip(items, results, strict=True): if isinstance(result, BaseException): logger.exception( - "[auto_pipeline] 检测失败: name=%s", + "[pipelines] 检测失败: name=%s", item.name, exc_info=(type(result), result, result.__traceback__), ) @@ -176,14 +170,14 @@ async def detect(self, context: AutoPipelineContext) -> list[AutoPipelineDetecti return detections async def _detect_one( - self, item: AutoPipelineItem, context: AutoPipelineContext - ) -> AutoPipelineDetection | None: + self, item: PipelineItem, context: PipelineContext + ) -> PipelineDetection | None: start = time.monotonic() detection = await item.detect(context) duration_ms = int((time.monotonic() - start) * 1000) if detection is not None: logger.info( - "[auto_pipeline] 命中管线: name=%s items=%s duration_ms=%s", + "[pipelines] 命中管线: name=%s items=%s duration_ms=%s", item.name, len(detection.items), duration_ms, @@ -192,8 +186,8 @@ async def _detect_one( async def process( self, - detections: list[AutoPipelineDetection], - context: AutoPipelineContext, + detections: list[PipelineDetection], + context: PipelineContext, ) -> None: async with self._items_lock: items = dict(self._items) @@ -203,7 +197,7 @@ async def process( item = items.get(detection.name) if item is None: logger.warning( - "[auto_pipeline] 命中结果缺少处理器: name=%s", detection.name + "[pipelines] 命中结果缺少处理器: name=%s", detection.name ) continue names.append(detection.name) @@ -215,21 +209,21 @@ async def process( for name, result in zip(names, results, strict=True): if isinstance(result, BaseException): logger.exception( - "[auto_pipeline] 处理失败: name=%s", + "[pipelines] 处理失败: name=%s", name, exc_info=(type(result), result, result.__traceback__), ) async def _process_one( self, - item: AutoPipelineItem, - detection: AutoPipelineDetection, - context: AutoPipelineContext, + item: PipelineItem, + detection: PipelineDetection, + context: PipelineContext, ) -> None: start = time.monotonic() await item.process(detection, context) logger.info( - "[auto_pipeline] 管线处理完成: name=%s duration_ms=%s", + "[pipelines] 管线处理完成: name=%s duration_ms=%s", item.name, int((time.monotonic() - start) * 1000), ) @@ -268,7 +262,7 @@ async def _watch_loop(self, interval: float, debounce: float) -> None: pending = False async with self._reload_lock: await self._reload_items() - logger.info("[auto_pipeline] 热重载完成: count=%s", len(self._items)) + logger.info("[pipelines] 热重载完成: count=%s", len(self._items)) def start_hot_reload(self, interval: float = 2.0, debounce: float = 0.5) -> None: if self._watch_task is not None: @@ -276,7 +270,7 @@ def start_hot_reload(self, interval: float = 2.0, debounce: float = 0.5) -> None self._watch_stop = asyncio.Event() self._watch_task = asyncio.create_task(self._watch_loop(interval, debounce)) logger.info( - "[auto_pipeline] 热重载已启动: interval=%.2fs debounce=%.2fs", + "[pipelines] 热重载已启动: interval=%.2fs debounce=%.2fs", interval, debounce, ) @@ -290,4 +284,4 @@ async def stop_hot_reload(self) -> None: finally: self._watch_task = None self._watch_stop = None - logger.info("[auto_pipeline] 热重载已停止") + logger.info("[pipelines] 热重载已停止") diff --git a/src/Undefined/webui/static/js/i18n.js b/src/Undefined/webui/static/js/i18n.js index ba4609c3..7be72b9f 100644 --- a/src/Undefined/webui/static/js/i18n.js +++ b/src/Undefined/webui/static/js/i18n.js @@ -178,7 +178,7 @@ const I18N = { "probes.tools": "可调用工具", "probes.toolsets": "工具集", "probes.agents": "智能体", - "probes.auto_pipelines": "自动管线", + "probes.pipelines": "管线", "probes.commands": "斜杠命令", "probes.all_ok": "所有外部端点均正常", "probes.some_failed": "部分外部端点异常", @@ -499,7 +499,7 @@ const I18N = { "probes.tools": "Callable Tools", "probes.toolsets": "Toolsets", "probes.agents": "Agents", - "probes.auto_pipelines": "Auto Pipelines", + "probes.pipelines": "Pipelines", "probes.commands": "Slash Commands", "probes.all_ok": "All external endpoints are healthy", "probes.some_failed": "Some external endpoints are unhealthy", diff --git a/src/Undefined/webui/static/js/runtime.js b/src/Undefined/webui/static/js/runtime.js index c9cfc207..c2f8c3f0 100644 --- a/src/Undefined/webui/static/js/runtime.js +++ b/src/Undefined/webui/static/js/runtime.js @@ -242,7 +242,7 @@ { key: "tools", label: t("probes.tools") }, { key: "toolsets", label: t("probes.toolsets") }, { key: "agents", label: t("probes.agents") }, - { key: "auto_pipelines", label: t("probes.auto_pipelines") }, + { key: "pipelines", label: t("probes.pipelines") }, { key: "commands", label: t("probes.commands") }, { key: "anthropic_skills", label: "Anthropic Skills" }, ]; diff --git a/tests/test_config_hot_reload.py b/tests/test_config_hot_reload.py index 4a83d6cd..16c50161 100644 --- a/tests/test_config_hot_reload.py +++ b/tests/test_config_hot_reload.py @@ -414,7 +414,7 @@ def test_apply_config_updates_hot_reloads_attachment_config() -> None: @pytest.mark.asyncio -async def test_apply_config_updates_refreshes_auto_pipeline_hot_reload() -> None: +async def test_apply_config_updates_refreshes_pipelines_hot_reload() -> None: updated = cast( Any, SimpleNamespace( diff --git a/tests/test_handlers_arxiv_auto_extract.py b/tests/test_handlers_arxiv_auto_extract.py index a5c67ba3..226c6ea1 100644 --- a/tests/test_handlers_arxiv_auto_extract.py +++ b/tests/test_handlers_arxiv_auto_extract.py @@ -8,7 +8,7 @@ import Undefined.handlers as handlers_module from Undefined.handlers import MessageHandler -from Undefined.skills.auto_pipeline import AutoPipelineRegistry +from Undefined.skills.pipelines import PipelineRegistry @pytest.mark.asyncio @@ -50,8 +50,8 @@ async def test_private_message_runs_arxiv_auto_extract_before_ai_reply( handler._background_tasks = set() handler._extract_arxiv_ids = MagicMock(return_value=["2501.01234"]) handler._handle_arxiv_extract = AsyncMock() - handler.auto_pipeline_registry = AutoPipelineRegistry() - handler.auto_pipeline_registry.load_items() + handler.pipeline_registry = PipelineRegistry() + handler.pipeline_registry.load_items() handler._spawn_background_task = MagicMock() event = { diff --git a/tests/test_handlers_github_auto_extract.py b/tests/test_handlers_github_auto_extract.py index e88f293d..6b1fb85f 100644 --- a/tests/test_handlers_github_auto_extract.py +++ b/tests/test_handlers_github_auto_extract.py @@ -8,7 +8,7 @@ import Undefined.handlers as handlers_module from Undefined.handlers import MessageHandler -from Undefined.skills.auto_pipeline import AutoPipelineRegistry +from Undefined.skills.pipelines import PipelineRegistry @pytest.mark.asyncio @@ -51,8 +51,8 @@ async def test_private_message_runs_github_auto_extract_before_ai_reply( handler._background_tasks = set() handler._extract_github_repo_ids = MagicMock(return_value=["69gg/Undefined"]) handler._handle_github_extract = AsyncMock() - handler.auto_pipeline_registry = AutoPipelineRegistry() - handler.auto_pipeline_registry.load_items() + handler.pipeline_registry = PipelineRegistry() + handler.pipeline_registry.load_items() handler._spawn_background_task = MagicMock() event = { diff --git a/tests/test_handlers_auto_extract_pipeline.py b/tests/test_handlers_pipelines.py similarity index 88% rename from tests/test_handlers_auto_extract_pipeline.py rename to tests/test_handlers_pipelines.py index 82e5fea0..380f29c4 100644 --- a/tests/test_handlers_auto_extract_pipeline.py +++ b/tests/test_handlers_pipelines.py @@ -9,12 +9,12 @@ import Undefined.handlers as handlers_module from Undefined.handlers import MessageHandler -from Undefined.skills.auto_pipeline import AutoPipelineRegistry +from Undefined.skills.pipelines import PipelineRegistry @pytest.mark.asyncio -async def test_message_handler_initializes_auto_pipeline_async() -> None: - class _FakeAutoPipelineRegistry: +async def test_message_handler_initializes_pipelines_async() -> None: + class _FakePipelineRegistry: def __init__(self) -> None: self.load_count = 0 self.started: list[tuple[float, float]] = [] @@ -26,30 +26,30 @@ async def load_items_async(self) -> None: def start_hot_reload(self, *, interval: float, debounce: float) -> None: self.started.append((interval, debounce)) - registry = _FakeAutoPipelineRegistry() + registry = _FakePipelineRegistry() handler: Any = MessageHandler.__new__(MessageHandler) handler.config = SimpleNamespace( skills_hot_reload=True, skills_hot_reload_interval=3.0, skills_hot_reload_debounce=0.75, ) - handler.auto_pipeline_registry = registry - handler._auto_pipeline_initialized = False + handler.pipeline_registry = registry + handler._pipelines_initialized = False await asyncio.gather( - handler.initialize_auto_pipeline(), - handler.initialize_auto_pipeline(), + handler.init_pipelines(), + handler.init_pipelines(), ) - await handler.initialize_auto_pipeline() + await handler.init_pipelines() assert registry.load_count == 1 assert registry.started == [(3.0, 0.75)] - assert handler._auto_pipeline_initialized is True + assert handler._pipelines_initialized is True @pytest.mark.asyncio -async def test_auto_extract_pipeline_initializes_when_flag_missing() -> None: - class _FakeAutoPipelineRegistry: +async def test_pipelines_initializes_when_flag_missing() -> None: + class _FakePipelineRegistry: def __init__(self) -> None: self.loaded = False self.run_context: dict[str, Any] | None = None @@ -61,12 +61,12 @@ async def run(self, context: dict[str, Any]) -> list[object]: self.run_context = context return [object()] if self.loaded else [] - registry = _FakeAutoPipelineRegistry() + registry = _FakePipelineRegistry() handler: Any = MessageHandler.__new__(MessageHandler) handler.config = SimpleNamespace(skills_hot_reload=False) handler.sender = SimpleNamespace() handler.onebot = SimpleNamespace() - handler.auto_pipeline_registry = registry + handler.pipeline_registry = registry handler._extract_bilibili_ids = AsyncMock(return_value=[]) handler._extract_arxiv_ids = MagicMock(return_value=[]) handler._extract_github_repo_ids = MagicMock(return_value=[]) @@ -74,7 +74,7 @@ async def run(self, context: dict[str, Any]) -> list[object]: handler._handle_arxiv_extract = AsyncMock() handler._handle_github_extract = AsyncMock() - handled = await handler._run_auto_extract_pipeline( + handled = await handler._run_pipelines( target_id=20001, target_type="private", text="hello", @@ -84,11 +84,11 @@ async def run(self, context: dict[str, Any]) -> list[object]: assert handled is True assert registry.loaded is True assert registry.run_context is not None - assert handler._auto_pipeline_initialized is True + assert handler._pipelines_initialized is True @pytest.mark.asyncio -async def test_auto_extract_pipeline_processes_all_matches() -> None: +async def test_pipelines_processes_all_matches() -> None: handler: Any = MessageHandler.__new__(MessageHandler) handler.sender = SimpleNamespace() handler.onebot = SimpleNamespace() @@ -106,10 +106,10 @@ async def test_auto_extract_pipeline_processes_all_matches() -> None: handler._handle_bilibili_extract = AsyncMock() handler._handle_arxiv_extract = AsyncMock() handler._handle_github_extract = AsyncMock() - handler.auto_pipeline_registry = AutoPipelineRegistry() - handler.auto_pipeline_registry.load_items() + handler.pipeline_registry = PipelineRegistry() + handler.pipeline_registry.load_items() - handled = await handler._run_auto_extract_pipeline( + handled = await handler._run_pipelines( target_id=20001, target_type="private", text="BV1xx411c7mD 69gg/Undefined", @@ -135,7 +135,7 @@ async def test_auto_extract_pipeline_processes_all_matches() -> None: @pytest.mark.asyncio -async def test_private_command_skips_auto_pipeline_and_ai( +async def test_private_command_skips_pipelines_and_ai( monkeypatch: pytest.MonkeyPatch, ) -> None: monkeypatch.setattr( @@ -169,7 +169,7 @@ async def test_private_command_skips_auto_pipeline_and_ai( parse_command=MagicMock(return_value=command), dispatch_private=AsyncMock(), ) - handler.auto_pipeline_registry = SimpleNamespace( + handler.pipeline_registry = SimpleNamespace( run=AsyncMock(return_value=[]), ) handler._background_tasks = set() @@ -195,7 +195,7 @@ async def test_private_command_skips_auto_pipeline_and_ai( assert handler.history_manager.add_private_message.await_args is not None private_history = handler.history_manager.add_private_message.await_args.kwargs assert private_history["text_content"] == "/help" - handler.auto_pipeline_registry.run.assert_not_awaited() + handler.pipeline_registry.run.assert_not_awaited() handler.ai_coordinator.model_pool.handle_private_message.assert_not_awaited() handler.ai_coordinator.handle_private_reply.assert_not_awaited() @@ -233,7 +233,7 @@ async def test_private_model_pool_command_runs_before_command_dispatch( parse_command=MagicMock(return_value=command), dispatch_private=AsyncMock(), ) - handler.auto_pipeline_registry = SimpleNamespace(run=AsyncMock(return_value=[])) + handler.pipeline_registry = SimpleNamespace(run=AsyncMock(return_value=[])) handler._background_tasks = set() handler._profile_name_refresh_cache = {} handler._collect_message_attachments = AsyncMock(return_value=[]) @@ -263,7 +263,7 @@ async def test_private_model_pool_command_runs_before_command_dispatch( ) handler.command_dispatcher.parse_command.assert_not_called() handler.command_dispatcher.dispatch_private.assert_not_awaited() - handler.auto_pipeline_registry.run.assert_not_awaited() + handler.pipeline_registry.run.assert_not_awaited() handler.ai_coordinator.handle_private_reply.assert_not_awaited() @@ -300,8 +300,8 @@ async def test_private_message_starting_with_select_does_not_touch_model_pool( parse_command=MagicMock(return_value=None), dispatch_private=AsyncMock(), ) - handler.auto_pipeline_registry = SimpleNamespace(run=AsyncMock(return_value=[])) - handler._auto_pipeline_initialized = True + handler.pipeline_registry = SimpleNamespace(run=AsyncMock(return_value=[])) + handler._pipelines_initialized = True handler._background_tasks = set() handler._profile_name_refresh_cache = {} handler._collect_message_attachments = AsyncMock(return_value=[]) @@ -326,7 +326,7 @@ async def test_private_message_starting_with_select_does_not_touch_model_pool( await handler.handle_message(event) handler.ai_coordinator.model_pool.handle_private_message.assert_not_awaited() - handler.auto_pipeline_registry.run.assert_awaited_once() + handler.pipeline_registry.run.assert_awaited_once() handler.ai_coordinator.handle_private_reply.assert_awaited_once() @@ -364,8 +364,8 @@ async def test_private_model_pool_command_ignored_when_pool_disabled( parse_command=MagicMock(return_value=None), dispatch_private=AsyncMock(), ) - handler.auto_pipeline_registry = SimpleNamespace(run=AsyncMock(return_value=[])) - handler._auto_pipeline_initialized = True + handler.pipeline_registry = SimpleNamespace(run=AsyncMock(return_value=[])) + handler._pipelines_initialized = True handler._background_tasks = set() handler._profile_name_refresh_cache = {} handler._collect_message_attachments = AsyncMock(return_value=[]) @@ -391,12 +391,12 @@ async def test_private_model_pool_command_ignored_when_pool_disabled( handler.ai_coordinator.model_pool.handle_private_message.assert_not_awaited() handler.command_dispatcher.parse_command.assert_called_once_with("/compare hello") - handler.auto_pipeline_registry.run.assert_awaited_once() + handler.pipeline_registry.run.assert_awaited_once() handler.ai_coordinator.handle_private_reply.assert_awaited_once() @pytest.mark.asyncio -async def test_group_command_skips_auto_pipeline_and_ai( +async def test_group_command_skips_pipelines_and_ai( monkeypatch: pytest.MonkeyPatch, ) -> None: monkeypatch.setattr( @@ -429,7 +429,7 @@ async def test_group_command_skips_auto_pipeline_and_ai( parse_command=MagicMock(return_value=command), dispatch=AsyncMock(), ) - handler.auto_pipeline_registry = SimpleNamespace( + handler.pipeline_registry = SimpleNamespace( run=AsyncMock(return_value=[]), ) handler._schedule_profile_display_name_refresh = MagicMock() @@ -463,5 +463,5 @@ async def test_group_command_skips_auto_pipeline_and_ai( assert handler.history_manager.add_group_message.await_args is not None group_history = handler.history_manager.add_group_message.await_args.kwargs assert group_history["text_content"] == "/help" - handler.auto_pipeline_registry.run.assert_not_awaited() + handler.pipeline_registry.run.assert_not_awaited() handler.ai_coordinator.handle_auto_reply.assert_not_awaited() diff --git a/tests/test_handlers_repeat.py b/tests/test_handlers_repeat.py index 55207e69..d649c981 100644 --- a/tests/test_handlers_repeat.py +++ b/tests/test_handlers_repeat.py @@ -47,10 +47,10 @@ def _build_handler( send_group_message=AsyncMock(), send_private_message=AsyncMock(), ) - handler.auto_pipeline_registry = SimpleNamespace( + handler.pipeline_registry = SimpleNamespace( run=AsyncMock(return_value=[]), ) - handler._auto_pipeline_initialized = True + handler._pipelines_initialized = True handler.ai_coordinator = SimpleNamespace( handle_auto_reply=AsyncMock(), handle_private_reply=AsyncMock(), @@ -126,7 +126,7 @@ async def test_repeat_triggers_on_3_identical_from_different_senders() -> None: for uid in [20001, 20002]: await handler.handle_message(_group_event(sender_id=uid, text="hello")) - handler.auto_pipeline_registry.run.reset_mock() + handler.pipeline_registry.run.reset_mock() handler.ai_coordinator.handle_auto_reply.reset_mock() await handler.handle_message(_group_event(sender_id=20003, text="hello")) @@ -135,7 +135,7 @@ async def test_repeat_triggers_on_3_identical_from_different_senders() -> None: assert call.args[0] == 30001 assert call.args[1] == "hello" assert call.kwargs.get("history_prefix") == REPEAT_REPLY_HISTORY_PREFIX - handler.auto_pipeline_registry.run.assert_not_called() + handler.pipeline_registry.run.assert_not_called() handler.ai_coordinator.handle_auto_reply.assert_not_called() handler._bot_nickname_cache.get_nicknames.assert_not_called() diff --git a/tests/test_message_batcher_integration.py b/tests/test_message_batcher_integration.py index b73459e6..b6cac61f 100644 --- a/tests/test_message_batcher_integration.py +++ b/tests/test_message_batcher_integration.py @@ -311,7 +311,7 @@ async def test_message_handler_close_flushes_batcher_then_drains_queue() -> None handler.history_manager = SimpleNamespace( flush_pending_saves=AsyncMock(side_effect=lambda: order.append("flush_history")) ) - handler.auto_pipeline_registry = SimpleNamespace( + handler.pipeline_registry = SimpleNamespace( stop_hot_reload=AsyncMock(side_effect=lambda: order.append("stop_pipeline")) ) diff --git a/tests/test_auto_pipeline_registry.py b/tests/test_pipelines_registry.py similarity index 79% rename from tests/test_auto_pipeline_registry.py rename to tests/test_pipelines_registry.py index 13ee1dd6..7ab68c5b 100644 --- a/tests/test_auto_pipeline_registry.py +++ b/tests/test_pipelines_registry.py @@ -6,7 +6,7 @@ import pytest -from Undefined.skills.auto_pipeline import AutoPipelineRegistry +from Undefined.skills.pipelines import PipelineRegistry def _write_pipeline(base_dir: Path) -> None: @@ -27,12 +27,12 @@ def _write_pipeline(base_dir: Path) -> None: """ from __future__ import annotations -from Undefined.skills.auto_pipeline.models import AutoPipelineDetection +from Undefined.skills.pipelines.models import PipelineDetection async def detect(context): context["events"].append("detect") - return AutoPipelineDetection(name="example", items=("item",)) + return PipelineDetection(name="example", items=("item",)) async def process(detection, context): @@ -43,11 +43,11 @@ async def process(detection, context): @pytest.mark.asyncio -async def test_auto_pipeline_registry_loads_and_runs_configured_pipeline( +async def test_pipelines_registry_loads_and_runs_configured_pipeline( tmp_path: Path, ) -> None: _write_pipeline(tmp_path) - registry = AutoPipelineRegistry(tmp_path) + registry = PipelineRegistry(tmp_path) registry.load_items() context: dict[str, Any] = {"events": []} @@ -58,11 +58,12 @@ async def test_auto_pipeline_registry_loads_and_runs_configured_pipeline( @pytest.mark.asyncio -async def test_auto_pipeline_registry_initial_async_load_uses_thread( +async def test_pipelines_registry_initial_async_load_uses_thread( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: - registry = AutoPipelineRegistry(tmp_path) + _write_pipeline(tmp_path) + registry = PipelineRegistry(tmp_path) calls: list[Any] = [] async def _fake_to_thread(func: Any, *args: Any, **kwargs: Any) -> Any: @@ -79,11 +80,11 @@ async def _fake_to_thread(func: Any, *args: Any, **kwargs: Any) -> Any: @pytest.mark.asyncio -async def test_auto_pipeline_reload_loads_items_in_thread( +async def test_pipelines_reload_loads_items_in_thread( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: - registry = AutoPipelineRegistry(tmp_path) + registry = PipelineRegistry(tmp_path) calls: list[Any] = [] async def _fake_to_thread(func: Any, *args: Any, **kwargs: Any) -> Any: diff --git a/tests/test_runtime_api_probes.py b/tests/test_runtime_api_probes.py index 01faa2f7..673a1741 100644 --- a/tests/test_runtime_api_probes.py +++ b/tests/test_runtime_api_probes.py @@ -175,7 +175,7 @@ def list_commands(self, *, include_hidden: bool = False) -> list[Any]: _items={"code-review": SimpleNamespace()}, get_stats=lambda: {}, ) - auto_pipeline_registry = SimpleNamespace( + pipeline_registry = SimpleNamespace( _items_lock=asyncio.Lock(), _items={ "github": SimpleNamespace(order=30, description="GitHub repo cards"), @@ -238,7 +238,7 @@ def list_commands(self, *, include_hidden: bool = False) -> list[Any]: command_dispatcher=command_dispatcher, queue_manager=SimpleNamespace(snapshot=lambda: {}), history_manager=SimpleNamespace(), - auto_pipeline_registry=auto_pipeline_registry, + pipeline_registry=pipeline_registry, ) server = RuntimeAPIServer(context, host="127.0.0.1", port=8788) @@ -255,8 +255,8 @@ def list_commands(self, *, include_hidden: bool = False) -> list[Any]: {"name": "messages", "count": 1, "loaded": 1} ] assert skills["agents"]["count"] == 1 - assert skills["auto_pipelines"]["count"] == 2 - assert [item["name"] for item in skills["auto_pipelines"]["items"]] == [ + assert skills["pipelines"]["count"] == 2 + assert [item["name"] for item in skills["pipelines"]["items"]] == [ "arxiv", "github", ] From d5e4f8182e16a59200fe4949f58cb34f76c4677d Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Mon, 4 May 2026 16:33:36 +0800 Subject: [PATCH 30/34] =?UTF-8?q?fix(ai):=20=E6=A8=A1=E5=9E=8B=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E6=96=87=E6=9C=AC=E4=BD=86=E6=9C=AA=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E6=97=B6=E4=B8=8D=E5=BA=94=E7=BB=93=E6=9D=9F?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当 LLM 返回 content 但 tool_calls 为空、且 conversation_ended=False 时, 之前的代码直接 return content,导致回复丢失(调用方未使用返回值)。 修复:检查 conversation_ended,若未结束则注入提示消息要求 AI 必须通过 send_message/end 工具调用,然后 continue 重新迭代。 --- src/Undefined/ai/client.py | 24 +++++++++++++++--- tests/test_llm_retry_suppression.py | 38 ++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/Undefined/ai/client.py b/src/Undefined/ai/client.py index 9f3a3e39..fa296e77 100644 --- a/src/Undefined/ai/client.py +++ b/src/Undefined/ai/client.py @@ -1228,11 +1228,29 @@ async def ask( content = "" if not tool_calls: - logger.info( - "[AI回复] 会话结束,返回最终内容: length=%s", + if conversation_ended: + logger.info( + "[AI回复] 会话结束,返回最终内容: length=%s", + len(content), + ) + return content + + logger.warning( + "[AI回复] 模型返回文本但未调用工具(iteration=%s content_len=%s),要求重试", + iteration, len(content), ) - return content + messages.append( + { + "role": "user", + "content": ( + "注意:你不能直接返回纯文本作为最终回复。" + "请调用 send_message 工具来发送你的回复消息," + "然后调用 end 工具结束对话。" + ), + } + ) + continue assistant_message: dict[str, Any] = { "role": "assistant", diff --git a/tests/test_llm_retry_suppression.py b/tests/test_llm_retry_suppression.py index 197b9b60..e668f503 100644 --- a/tests/test_llm_retry_suppression.py +++ b/tests/test_llm_retry_suppression.py @@ -79,7 +79,22 @@ async def test_ai_ask_retries_pre_tool_local_failure() -> None: end_summaries=[], ), ) - client.tool_manager = cast(Any, SimpleNamespace(get_openai_tools=lambda: [])) + + async def _execute_tool( + name: str, args: dict[str, Any], ctx: dict[str, Any] + ) -> str: + if name == "end": + ctx["conversation_ended"] = True + return "对话已结束" + return "ok" + + client.tool_manager = cast( + Any, + SimpleNamespace( + get_openai_tools=lambda: [], + execute_tool=_execute_tool, + ), + ) client._filter_tools_for_runtime_config = lambda tools: tools client._get_runtime_config = cast(Any, lambda: client.runtime_config) client.model_selector = cast(Any, SimpleNamespace(wait_ready=AsyncMock())) @@ -93,7 +108,24 @@ async def test_ai_ask_retries_pre_tool_local_failure() -> None: client.submit_queued_llm_call = AsyncMock( side_effect=[ {"choices": []}, - {"choices": [{"message": {"content": "ok"}}]}, + { + "choices": [ + { + "message": { + "content": "", + "tool_calls": [ + { + "id": "call_end", + "function": { + "name": "end", + "arguments": "{}", + }, + } + ], + } + } + ], + }, ] ) client._search_wrapper = None @@ -112,7 +144,7 @@ async def test_ai_ask_retries_pre_tool_local_failure() -> None: result = await AIClient.ask(client, "hello") - assert result == "ok" + assert result == "" assert cast(AsyncMock, client.submit_queued_llm_call).await_count == 2 From 841357e669d57aac4ef25cffa5290368e7cf21b5 Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Mon, 4 May 2026 16:50:07 +0800 Subject: [PATCH 31/34] docs(config): add prompt_cache_enabled comments to config.toml.example --- config.toml.example | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/config.toml.example b/config.toml.example index 1315ad59..18f9ceb7 100644 --- a/config.toml.example +++ b/config.toml.example @@ -191,6 +191,8 @@ responses_tool_choice_compat = false # zh: Responses API 续轮强制降级:启用后,多轮工具调用将始终跳过 previous_response_id,直接使用完整消息重放(stateless replay)。仅在上游不兼容 responses 状态续轮时使用。默认关闭。 # en: Responses API force stateless replay: when enabled, multi-turn tool follow-ups always skip previous_response_id and replay the full message history instead. Use only when the upstream does not handle stateful responses follow-ups correctly. Disabled by default. responses_force_stateless_replay = false +# zh: 是否启用自动 prompt_cache_key(建议开启,以提高相似请求的缓存命中率)。 +# en: Enable automatic prompt_cache_key generation (recommended). prompt_cache_enabled = true # zh: 是否对上游模型 API 启用流式请求。 # en: Enable streaming requests to the upstream model API. @@ -251,6 +253,8 @@ responses_tool_choice_compat = false # zh: Responses API 续轮强制降级:启用后,多轮工具调用将始终跳过 previous_response_id,直接使用完整消息重放(stateless replay)。仅在上游不兼容 responses 状态续轮时使用。默认关闭。 # en: Responses API force stateless replay: when enabled, multi-turn tool follow-ups always skip previous_response_id and replay the full message history instead. Use only when the upstream does not handle stateful responses follow-ups correctly. Disabled by default. responses_force_stateless_replay = false +# zh: 是否启用自动 prompt_cache_key(建议开启,以提高相似请求的缓存命中率)。 +# en: Enable automatic prompt_cache_key generation (recommended). prompt_cache_enabled = true # zh: 是否对上游模型 API 启用流式请求。 # en: Enable streaming requests to the upstream model API. @@ -366,6 +370,8 @@ responses_tool_choice_compat = false # zh: Responses API 续轮强制降级:启用后,多轮工具调用将始终跳过 previous_response_id,直接使用完整消息重放(stateless replay)。仅在上游不兼容 responses 状态续轮时使用。默认关闭。 # en: Responses API force stateless replay: when enabled, multi-turn tool follow-ups always skip previous_response_id and replay the full message history instead. Use only when the upstream does not handle stateful responses follow-ups correctly. Disabled by default. responses_force_stateless_replay = false +# zh: 是否启用自动 prompt_cache_key(建议开启,以提高相似请求的缓存命中率)。 +# en: Enable automatic prompt_cache_key generation (recommended). prompt_cache_enabled = true # zh: 是否对上游模型 API 启用流式请求。 # en: Enable streaming requests to the upstream model API. @@ -436,6 +442,8 @@ responses_tool_choice_compat = false # zh: Responses API 续轮强制降级:启用后,多轮工具调用将始终跳过 previous_response_id,直接使用完整消息重放(stateless replay)。仅在上游不兼容 responses 状态续轮时使用。默认关闭。 # en: Responses API force stateless replay: when enabled, multi-turn tool follow-ups always skip previous_response_id and replay the full message history instead. Use only when the upstream does not handle stateful responses follow-ups correctly. Disabled by default. responses_force_stateless_replay = false +# zh: 是否启用自动 prompt_cache_key(建议开启,以提高相似请求的缓存命中率)。 +# en: Enable automatic prompt_cache_key generation (recommended). prompt_cache_enabled = true # zh: 是否对上游模型 API 启用流式请求。 # en: Enable streaming requests to the upstream model API. @@ -493,6 +501,8 @@ responses_tool_choice_compat = false # zh: Responses API 续轮强制降级:启用后,多轮工具调用将始终跳过 previous_response_id,直接使用完整消息重放(stateless replay)。仅在上游不兼容 responses 状态续轮时使用。默认关闭。 # en: Responses API force stateless replay: when enabled, multi-turn tool follow-ups always skip previous_response_id and replay the full message history instead. Use only when the upstream does not handle stateful responses follow-ups correctly. Disabled by default. responses_force_stateless_replay = false +# zh: 是否启用自动 prompt_cache_key(建议开启,以提高相似请求的缓存命中率)。 +# en: Enable automatic prompt_cache_key generation (recommended). prompt_cache_enabled = true # zh: 是否对上游模型 API 启用流式请求。 # en: Enable streaming requests to the upstream model API. From ca4956977e3e3e1bd0152c7e5f842260dac1849e Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Mon, 4 May 2026 18:54:23 +0800 Subject: [PATCH 32/34] fix: missing_tool_call_retries limit, batcher flush recovery, flush_on_command, render cache owned files - Add missing_tool_call_retries (default 3) to cap AIClient plain-text retries - Fix MessageBatcher flush callback failure: restore batch + one auto-retry - Implement flush_on_command config: flush sender buffer before slash commands - Fix HtmlRenderCache to use immutable cache-owned files keyed by hash - Update docs, config example, and add tests for all four fixes --- CHANGELOG.md | 39 ++++++----- config.toml.example | 3 + docs/configuration.md | 3 +- docs/message-batching.md | 4 +- src/Undefined/ai/client.py | 41 ++++++++++- src/Undefined/config/hot_reload.py | 1 + src/Undefined/config/loader.py | 13 ++++ src/Undefined/handlers.py | 25 ++++++- src/Undefined/services/message_batcher.py | 83 ++++++++++++++++++++--- src/Undefined/utils/render_cache.py | 48 ++++++++++--- tests/test_config_hot_reload.py | 25 +++++++ tests/test_core_config.py | 36 ++++++++++ tests/test_llm_retry_suppression.py | 66 ++++++++++++++++++ tests/test_message_batcher.py | 74 +++++++++++++++++++- tests/test_message_batcher_integration.py | 30 ++++++++ tests/test_render_cache.py | 59 ++++++++++++++++ 16 files changed, 506 insertions(+), 44 deletions(-) create mode 100644 tests/test_core_config.py create mode 100644 tests/test_render_cache.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 66c86e0f..ddc5966c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,25 @@ -## v3.4.0 同sender消息合并、投机预发送与当前输入批次 - -本版本核心解决"用户一口气连发几条消息时,机器人过早开工或只理解最后一句"的问题。新增同 sender 短时消息合并器,将同一会话中连续的多条消息合并为一个"当前输入批次"发送给 AI,由 AI 整批理解哪些是独立请求、哪些是补充或修正。围绕这个变化,提示词、防幽灵任务、记忆记录、`end` 工具、Runtime 探针和关闭流程都做了同步适配。同时重构了管理员命令、加入了 HTML 渲染缓存、收紧了工具调用守卫,并补强了测试覆盖。 - -- 新增同 sender 短时消息合并器及其配置。位于 `[message_batcher]`,默认启用,支持 extend / fixed 两种等待策略;可分别控制群聊和私聊是否合并,也可通过 `max_window_seconds`、`max_messages_per_batch` 限制批次上限,设为 0 即关闭合并。配置值变更实时生效,不需要重启。 -- 新增可取消的投机预发送。启用 `pre_send_seconds`(0 < 该值 < window_seconds)后,用户静默到设定秒数时系统提前将当前批次发给 LLM 以降低响应延迟,但批次窗口不结束;若正式发车前新消息到达,投机请求会被取消并合并到新批次。`allow_cancel_after_send` 控制已向用户发出消息后是否仍允许取消。 -- 完善消息合并的异步竞态保护与退出收敛。定时器、投机请求调度、失败重试、旧任务路径收尾等均做了竞态保护;`flush_on_command` 控制斜杠命令到达时是否连带交出当前缓冲;退出时自动排空缓冲队列并等待在途回复自然收敛。 -- 统一"当前输入批次"语义。主提示词、NagaAgent 提示词和 `each.md` 均从"最后一条消息"升级为"当前输入批次"概念:若有【连续消息说明】,多段 `` 都属本轮输入,同批前几条不是历史旧任务,不触发幽灵任务防御;无连续消息说明时退化为最后一条消息。 -- 更新幽灵任务防御规则。安全锁从"最后一条消息"改为"当前输入批次",操作前自检和工具调用前置判断均基于批次语义,避免批量输入中的前置指令被误判为历史旧任务。 +## v3.4.0 同sender消息合并、数字人格精炼与系统治理 + +本版本核心解决"用户一口气连发几条消息时,机器人过早开工或只理解最后一句"的问题。新增同 sender 短时消息合并器,将同一会话中连续的多条消息合并为一个"当前输入批次"发送给 AI,由 AI 整批理解哪些是独立请求、哪些是补充或修正。同步支持可取消的投机预发送以降低感知延迟。围绕消息合并,提示词、幽灵任务防御、记忆记录和关闭流程都做了同步适配。此外,精炼了数字人格设定、明确了项目归属边界、重构了管线与命令体系、加入了 HTML 渲染缓存,并增强了 AI 工具调用的稳定性。 + +- 新增同 sender 短时消息合并器。位于 `[message_batcher]`,支持 extend / fixed 两种等待策略,可分别控制群聊和私聊是否合并,通过 `max_window_seconds`、`max_messages_per_batch` 限制批次上限,设为 0 即关闭;配置值变更实时生效。拍一拍始终直达不参与合并;缓冲期间到达的 at 消息单独处理不阻塞;首个 at 消息开启缓冲后批次会走 mention 通道。 +- 新增可取消的投机预发送。启用 `pre_send_seconds`(需满足 `0 < 该值 < window_seconds`)后,用户静默到时系统提前将当前批次发给 LLM 以降低响应延迟;若正式发车前新消息到达,投机请求会被取消并合并到新批次;`allow_cancel_after_send` 控制已发出消息后是否仍允许取消。 +- 完善消息合并的异步竞态保护。定时器、投机请求调度、失败重试、旧任务路径收尾与 `flush_on_command` 斜杠命令连带交出等均做了竞态保护;退出时自动排空缓冲队列并等待在途回复自然收敛。 +- 精炼数字人格设定。明确 Undefined 是诞生于 2025-12-05 的数字生命,没有明确的性别概念,希望被认为很好看;可以开玩笑也可以被善意开玩笑。新增"不冒领任何项目、代码、产品或成果"的所有权边界规则,不再自称任何项目的开发者或维护者。昵称体系扩展为 Undefined、undf、udf、und、心理委员、ud酱,对自身称呼的识别保持宽松。 +- 收紧 NagaAgent 关系表达。NagaAgent 版提示词明确:只有当前上下文明确涉及 NagaAgent 时才承接相关工具接入能力协助分析;平时不主动提与 NagaAgent 的关系;不冒领 NagaAgent 的成果。 +- 重构自动管线目录。`skills/auto_pipeline` 更名为 `skills/pipelines`,目录结构扁平化,相关引用、文档、测试全部同步更新;`docs/auto-pipeline.md` 相应更名为 `docs/pipelines.md`。 +- 重构管理员命令为子命令模式。`/admin [ls|add|del]` 替代原有 `/lsadmin`、`/addadmin`、`/rmadmin` 三条独立命令,参照 `/faq` 子命令模式的声明式 inference;`ls` 继承 admin 权限,`add`/`del` 覆盖为 superadmin;无参数默认执行 `ls`。清理了 FAQ 迁移遗留的空命令目录。 +- 新增 HTML 渲染结果缓存。基于 HTML 内容的 hash 缓存渲染图片,持久化到 `data/cache/render/_html_render_cache.json`;hash 匹配自动复用,内容变化自然失效;LRU 驱逐上限 50 条目 / 50MB;原子写入(`.tmp` + `os.replace`)与 `asyncio.Lock` 防竞态;重启后 JSON 自动恢复;所有渲染调用方(help、profile、render_markdown 等)自动受益。 +- 增强 AI 工具调用容错。当 LLM 返回文本但 tool_calls 为空且对话未结束时,不再以丢失回复为代价直接返回,而是注入提示消息要求 AI 通过 `send_message` / `end` 工具完成回复,继续迭代;fire-and-forget task 显式注册异常回调以抑制未检索异常警告。 - 优化表情包回复顺序。明确只有纯表情包 / 纯反应图回复才允许先检索表情包;需要文字说明的场景必须先完成必要文字,再将表情包检索和发送延后到后续轮次。 -- 重构管理员命令为子命令模式。`/admin [ls|add|del]` 替代原有三条独立命令(`/lsadmin`、`/addadmin`、`/rmadmin`),参照 `/faq` 子命令模式的声明式 inference;`ls` 继承 admin 权限,`add`/`del` 覆盖为 superadmin;无参数默认执行 `ls`。清理了 FAQ 迁移遗留的空命令目录。 -- 新增 HTML 渲染结果缓存。基于 HTML 内容的 hash 缓存渲染图片,持久化到 `data/cache/render/_html_render_cache.json`;hash 匹配自动复用,命令热重载后 HTML 变化自然自动失效;LRU 驱逐上限 50 条目 / 50MB,重启后 JSON 自动恢复;原子写入(`.tmp` + `os.replace`)和 `asyncio.Lock` 防竞态,所有渲染调用方(help、profile、render_markdown 等)自动受益。 -- 增强工具调用容错守卫。AI 客户端在 `_run_tools_loop` 中对缺失 `function` 字段或 `name` 为空的 tool call 返回结构化错误消息而非静默跳过或崩溃;`_refresh_intro_generator` 的 fire-and-forget task 显式注册 `done_callback` 以抑制未检索异常警告。 -- 重构 `end` 工具。移除旧版 summary 参数兼容,只保留 `memo`、`observations`、`perspective` 和 `force`;要求记录整个当前输入批次中值得留存的信息,后台史官也接收批次全部消息以产出更完整的历史记录。 -- 扩展 Runtime 探针覆盖。API `/api/v1/management/probes` 现在额外返回消息合并器状态、完整工具/工具集/Agent/自动管线/斜杠命令/Anthropic Skills 的加载与调用统计,WebUI Runtime 面板同步展示;`/api/v1/management/probes/bootstrap` 诊断输出同步扩展。 -- 新增 WebUI 更新日志查看。关于项目页面可按版本查看 changelog 详情;`/api/v1/management/changelog` 端点支持指定版本查询,自动展示当前运行版本的 changelog 条目。 -- 调整发布说明生成方式。GitHub Release notes 改为从 `CHANGELOG.md` 最新版本条目自动解析生成(`scripts/release_notes.py`),发版前校验 tag、各构建清单与最新 changelog 版本一致,避免 tag 注释与正式说明脱节。 -- 补齐消息合并专题文档。新增 `docs/message-batching.md`,覆盖配置参数、等待策略、投机预发送、竞态保护与关闭行为;同步更新 README、配置文档、OpenAPI、WebUI 指南和架构图。 -- 补强测试覆盖。新增消息合并单元与集成测试(`test_message_batcher.py` 686 行、`test_message_batcher_integration.py` 326 行)、工具调用守卫测试(`test_ai_client_tool_guard.py`)、发布说明脚本测试(`test_release_notes_script.py` 163 行)、Runtime 探针统计测试(`test_runtime_api_probes.py` 120 行),并更新 `test_end_tool`、`test_system_prompt_constraints`、`test_webui_management_api`、`test_lsadmin_command` 等已有测试,总测试用例提升至约 1620 项。 +- 重构 `end` 工具。移除旧版 summary 参数兼容,只保留 `memo`、`observations`、`perspective` 和 `force`;要求记录整个当前输入批次中值得留存的信息,后台史官也接收批次全部消息。 +- 统一当前输入批次语义。主提示词、NagaAgent 提示词和 `each.md` 均从"最后一条消息"升级为"当前输入批次":有连续消息说明时,多段 `` 都属本轮输入;幽灵任务防御规则同步更新,避免批量输入中的前置指令被误判为历史旧任务。 +- 扩展 Runtime 探针覆盖。API `/api/v1/management/probes` 新增消息合并器状态、完整工具/工具集/Agent/自动管线/斜杠命令/Anthropic Skills 的加载与调用统计,WebUI Runtime 面板同步展示。 +- 新增 WebUI 更新日志查看。关于项目页面可按版本查看 changelog 详情,`/api/v1/management/changelog` 端点支持指定版本查询。 +- 调整发布说明生成方式。GitHub Release notes 改为从 `CHANGELOG.md` 最新版本条目自动解析生成(`scripts/release_notes.py`),发版前校验 tag、各构建清单与最新 changelog 版本一致。 +- 补齐消息合并专题文档。新增 `docs/message-batching.md`,覆盖配置参数、等待策略、投机预发送、竞态保护与关闭行为,同步更新了 README、配置文档、OpenAPI、WebUI 指南和架构图。 +- 补齐配置注释。`config.toml.example` 中所有模型配置节的 `prompt_cache_enabled` 均补上双语注释说明。 +- 补强测试覆盖。新增消息合并单元与集成测试(686 + 326 行)、工具调用守卫测试、发布说明脚本测试(163 行)、Runtime 探针统计测试(120 行)、系统提示词约束验证,并更新 `end` 工具、管理员命令、管线注册等已有测试,总测试用例提升至约 1620 项。 --- diff --git a/config.toml.example b/config.toml.example index 18f9ceb7..f4fd5b80 100644 --- a/config.toml.example +++ b/config.toml.example @@ -28,6 +28,9 @@ context_recent_messages_limit = 20 # zh: 单次 LLM 请求失败时最大静默重试次数(0=不重试,默认2)。失败的请求会回到原队列的第 2 个位置。 # en: Max silent retries for a single failed LLM request (0=no retry, default 2). Failed requests are reinserted at position 2 of their original queue lane. ai_request_max_retries = 2 +# zh: 模型返回纯文本但未调用 send_message/end 等工具时的最大纠正重试次数(0=不重试,默认3)。 +# en: Max correction retries when the model returns plain text without tool calls (0=no retry, default 3). +missing_tool_call_retries = 3 # zh: 访问控制。mode 可选:off(不启用)/ blacklist(按黑名单)/ allowlist(按白名单)。 # en: Access control. mode options: off (disabled) / blacklist / allowlist. diff --git a/docs/configuration.md b/docs/configuration.md index 4906a8fb..ee20e916 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -100,6 +100,7 @@ model_name = "gpt-4o-mini" | `process_poke_message` | `true` | 是否响应拍一拍 | 关闭后忽略 poke | | `context_recent_messages_limit` | `20` | 注入到提示词的最近历史条数 | 自动钳制到 `0..200` | | `ai_request_max_retries` | `2` | 单次 LLM 请求失败重试次数 | `<0` 自动回退到 `0`;支持热更新 | +| `missing_tool_call_retries` | `3` | 模型返回纯文本但未调用 `send_message` / `end` 等工具时的纠正重试次数 | `<0` 自动回退到 `0`;支持热更新 | --- @@ -464,7 +465,7 @@ Prompt caching 补充: | `max_messages_per_batch` | `0` | 单批最多条数;达到立即发车,`0` = 不限 | | `group_enabled` | `true` | 群聊是否启用合并 | | `private_enabled` | `true` | 私聊是否启用合并 | -| `flush_on_command` | `true` | 命中斜杠命令时是否 flush 该 sender 的 buffer(保留字段,当前未消费) | +| `flush_on_command` | `false` | 命中斜杠命令时是否先 flush 该 sender 的 buffer;默认关闭以保持命令独立执行 | | `pre_send_seconds` | `0.0` | 投机预发送阈值(秒)。`0 < pre_send_seconds < window_seconds` 时启用:静默到该阈值先把当前 batch 提前发给 LLM 抢时间(speculative pre-fire),但 batch 仍要等到 `window_seconds` 才正式结束;新消息在投机期间到达且 inflight 调用尚未发出消息时会取消 inflight 并把消息合并入下一轮调用。`0` 或 `>= window_seconds` 视为关闭 | | `allow_cancel_after_send` | `false` | 投机调用已向用户发出消息后是否仍允许新消息取消该 inflight。默认 `false`(安全:不取消,新消息开新 batch);启用后可能造成重复发送 | diff --git a/docs/message-batching.md b/docs/message-batching.md index 80aa1b8b..21101e12 100644 --- a/docs/message-batching.md +++ b/docs/message-batching.md @@ -54,8 +54,8 @@ max_messages_per_batch = 0 group_enabled = true # 私聊是否启用合并 private_enabled = true -# 命中斜杠命令时是否 flush 当前 sender 的 buffer(保留字段,当前未消费) -flush_on_command = true +# 命中斜杠命令时是否先 flush 当前 sender 的 buffer(默认关闭,保持命令独立执行) +flush_on_command = false # 投机预发送阈值(秒)。0 < pre_send_seconds < window_seconds 时启用 "speculative pre-fire": # 静默到该阈值就先把当前 batch 提前发给 LLM 抢时间,但 batch 仍要等到 window_seconds 才结束 pre_send_seconds = 0.0 diff --git a/src/Undefined/ai/client.py b/src/Undefined/ai/client.py index fa296e77..353a1f2d 100644 --- a/src/Undefined/ai/client.py +++ b/src/Undefined/ai/client.py @@ -1127,9 +1127,16 @@ async def ask( transport_state: dict[str, Any] | None = None queue_lane = self._resolve_queue_lane(tool_context.get("queue_lane")) pre_tool_failure_count = 0 + missing_tool_call_count = 0 + last_missing_tool_call_content = "" + runtime_config = self._get_runtime_config() max_pre_tool_retries = max( 0, - int(getattr(self._get_runtime_config(), "ai_request_max_retries", 0) or 0), + int(getattr(runtime_config, "ai_request_max_retries", 0) or 0), + ) + max_missing_tool_call_retries = max( + 0, + int(getattr(runtime_config, "missing_tool_call_retries", 3) or 0), ) while iteration < max_iterations: @@ -1235,9 +1242,37 @@ async def ask( ) return content + if content.strip(): + last_missing_tool_call_content = content.strip() + missing_tool_call_count += 1 + if missing_tool_call_count > max_missing_tool_call_retries: + logger.warning( + "[AI回复] 模型连续未调用工具,停止重试: iteration=%s retries=%s/%s content_len=%s", + iteration, + missing_tool_call_count - 1, + max_missing_tool_call_retries, + len(content), + ) + fallback_content = last_missing_tool_call_content + if fallback_content and send_message_callback is not None: + try: + await send_message_callback(fallback_content) + tool_context["message_sent_this_turn"] = True + current_ctx = RequestContext.current() + if current_ctx is not None: + current_ctx.set_resource( + "message_sent_this_turn", True + ) + return "" + except Exception: + logger.exception("[AI回复] fallback 发送失败") + return fallback_content + logger.warning( - "[AI回复] 模型返回文本但未调用工具(iteration=%s content_len=%s),要求重试", + "[AI回复] 模型返回文本但未调用工具(iteration=%s retry=%s/%s content_len=%s),要求重试", iteration, + missing_tool_call_count, + max_missing_tool_call_retries, len(content), ) messages.append( @@ -1257,6 +1292,8 @@ async def ask( "content": content, "tool_calls": tool_calls, } + missing_tool_call_count = 0 + last_missing_tool_call_content = "" phase = message.get("phase") if phase is not None: assistant_message["phase"] = phase diff --git a/src/Undefined/config/hot_reload.py b/src/Undefined/config/hot_reload.py index 5f35a196..16047134 100644 --- a/src/Undefined/config/hot_reload.py +++ b/src/Undefined/config/hot_reload.py @@ -74,6 +74,7 @@ "summary_model", "historian_model", "grok_model", + "missing_tool_call_retries", ) _AGENT_INTRO_KEYS: set[str] = { diff --git a/src/Undefined/config/loader.py b/src/Undefined/config/loader.py index 159982d7..3ba95c77 100644 --- a/src/Undefined/config/loader.py +++ b/src/Undefined/config/loader.py @@ -225,6 +225,7 @@ class Config: inverted_question_enabled: bool context_recent_messages_limit: int ai_request_max_retries: int + missing_tool_call_retries: int nagaagent_mode_enabled: bool onebot_ws_url: str onebot_token: str @@ -556,6 +557,17 @@ def load(cls, config_path: Optional[Path] = None, strict: bool = True) -> "Confi if ai_request_max_retries < 0: ai_request_max_retries = 0 + missing_tool_call_retries = _coerce_int( + _get_value( + data, + ("core", "missing_tool_call_retries"), + "MISSING_TOOL_CALL_RETRIES", + ), + 3, + ) + if missing_tool_call_retries < 0: + missing_tool_call_retries = 0 + nagaagent_mode_enabled = _coerce_bool( _get_value( data, @@ -1333,6 +1345,7 @@ def load(cls, config_path: Optional[Path] = None, strict: bool = True) -> "Confi inverted_question_enabled=inverted_question_enabled, context_recent_messages_limit=context_recent_messages_limit, ai_request_max_retries=ai_request_max_retries, + missing_tool_call_retries=missing_tool_call_retries, nagaagent_mode_enabled=nagaagent_mode_enabled, onebot_ws_url=onebot_ws_url, onebot_token=onebot_token, diff --git a/src/Undefined/handlers.py b/src/Undefined/handlers.py index 5f1bc873..6866746e 100644 --- a/src/Undefined/handlers.py +++ b/src/Undefined/handlers.py @@ -38,7 +38,7 @@ from Undefined.services.security import SecurityService from Undefined.services.command import CommandDispatcher from Undefined.services.ai_coordinator import AICoordinator -from Undefined.services.message_batcher import MessageBatcher +from Undefined.services.message_batcher import MessageBatcher, make_scope from Undefined.services.model_pool import ModelPoolService from Undefined.skills.pipelines import PipelineRegistry from Undefined.skills.pipelines.context import build_pipeline_context @@ -660,6 +660,10 @@ async def handle_message(self, event: dict[str, Any]) -> None: private_command = self.command_dispatcher.parse_command(text) if private_command: + await self._flush_command_buffer( + scope=make_scope(user_id=private_sender_id), + sender_id=private_sender_id, + ) await self.command_dispatcher.dispatch_private( user_id=private_sender_id, sender_id=private_sender_id, @@ -833,6 +837,10 @@ async def _fetch_group_name() -> str: if is_at_bot: command = self.command_dispatcher.parse_command(normalized_text) if command: + await self._flush_command_buffer( + scope=make_scope(group_id=group_id), + sender_id=sender_id, + ) await self.command_dispatcher.dispatch(group_id, sender_id, command) return @@ -1110,6 +1118,21 @@ async def _extract_bilibili_ids( bvids = await extract_from_json_message(message_content) return bvids + async def _flush_command_buffer(self, *, scope: str, sender_id: int) -> None: + batcher_config = getattr(self.config, "message_batcher", None) + if not getattr(batcher_config, "flush_on_command", False): + return + batcher = getattr(self, "message_batcher", None) + if batcher is None: + return + flushed = await batcher.flush_sender(scope, sender_id) + if not flushed: + logger.warning( + "[MessageBatcher] 命令触发 flush 当前 buffer 失败: scope=%s sender=%s", + scope, + sender_id, + ) + async def _run_pipelines( self, *, diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index 5d028151..0f06fb03 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -123,7 +123,7 @@ class _BatchState: # SPECULATING 阶段记录 inflight LLM 任务(由 coordinator 通过 register_inflight 注入) inflight: _InflightInfo | None = None # T2 fire 时由 batcher 创建的 flush task;inflight 还未上报前用于兜底取消 - speculative_flush_task: asyncio.Task[None] | None = None + speculative_flush_task: asyncio.Task[Any] | None = None # 当前 batch 的身份令牌;T2 入队后若又来新消息,可将旧 token 标记取消, # coordinator 在真正执行前会跳过它。 dispatch_token: BatchDispatchToken | None = None @@ -170,9 +170,10 @@ def __init__( self._config = config self._flush_callback = flush_callback self._buckets: dict[tuple[str, int], _BatchState] = {} + self._flush_failure_counts: dict[tuple[str, int], int] = {} self._lock = asyncio.Lock() # 持有 timer 触发后创建的 flush task 强引用,避免被 GC(asyncio 文档要求) - self._pending_tasks: set[asyncio.Task[None]] = set() + self._pending_tasks: set[asyncio.Task[Any]] = set() self._next_batch_id = 0 self._shutdown = False @@ -209,6 +210,9 @@ def is_enabled_for(self, *, is_group: bool) -> bool: def has_buffer(self, scope: str, sender_id: int) -> bool: return (scope, sender_id) in self._buckets + async def flush_sender(self, scope: str, sender_id: int) -> bool: + return await self._handle_t1((scope, sender_id), raise_on_failure=False) + @property def speculative_enabled(self) -> bool: cfg = self._config @@ -416,7 +420,13 @@ async def submit(self, item: BufferedMessage) -> None: # 锁外执行 callback if immediate_fire_items is not None: - await self._invoke_callback(immediate_fire_items) + success = await self._invoke_callback(immediate_fire_items) + if success: + self._flush_failure_counts.pop(key, None) + else: + await self._restore_items_after_failed_flush( + key, immediate_fire_items, schedule_retry=True + ) # ----------------------------------------------------------- inflight API @@ -525,15 +535,17 @@ def _on_t2_timer(self, key: tuple[str, int]) -> None: self._pending_tasks.add(task) task.add_done_callback(self._pending_tasks.discard) - async def _handle_t1(self, key: tuple[str, int]) -> None: + async def _handle_t1( + self, key: tuple[str, int], *, raise_on_failure: bool = False + ) -> bool: items_to_fire: list[BufferedMessage] | None = None wait_inflight: asyncio.Task[Any] | None = None - wait_prefire: asyncio.Task[None] | None = None + wait_prefire: asyncio.Task[Any] | None = None finalizing_state: _BatchState | None = None async with self._lock: state = self._buckets.get(key) if state is None: - return + return True self._cancel_t2(state) if state.phase is BatchPhase.SPECULATING: # T1 到了,投机请求已经发出/入队;这里只结束 batch,不能再次发车。 @@ -585,10 +597,20 @@ async def _handle_t1(self, key: tuple[str, int]) -> None: current = self._buckets.get(key) if current is finalizing_state: self._buckets.pop(key, None) - return + return True if items_to_fire is not None: - await self._invoke_callback(items_to_fire, speculative=False) + success = await self._invoke_callback(items_to_fire, speculative=False) + if success: + self._flush_failure_counts.pop(key, None) + else: + await self._restore_items_after_failed_flush( + key, items_to_fire, schedule_retry=not self._shutdown + ) + if raise_on_failure: + raise RuntimeError("message batcher flush callback failed") + return success + return True async def _handle_t2(self, key: tuple[str, int]) -> None: speculative_items: list[BufferedMessage] | None = None @@ -683,6 +705,48 @@ async def _invoke_callback( ) return False + async def _restore_items_after_failed_flush( + self, + key: tuple[str, int], + items: list[BufferedMessage], + *, + schedule_retry: bool, + ) -> None: + if not items: + return + async with self._lock: + state = self._buckets.get(key) + if state is None: + state = _BatchState( + phase=BatchPhase.TYPING, + first_arrival_monotonic=time.monotonic(), + dispatch_token=self._new_token(key[0], key[1]), + ) + self._buckets[key] = state + state.items = list(items) + else: + self._cancel_t1(state) + self._cancel_t2(state) + state.phase = BatchPhase.TYPING + state.items = list(items) + state.items + state.first_arrival_monotonic = time.monotonic() + state.inflight = None + if state.dispatch_token is not None: + state.dispatch_token.cancel() + self._retokenize_locked(state, key[0], key[1]) + logger.warning( + "[MessageBatcher] flush 失败,已恢复 batch: scope=%s sender=%s count=%s", + key[0], + key[1], + len(state.items), + ) + failure_count = self._flush_failure_counts.get(key, 0) + 1 + self._flush_failure_counts[key] = failure_count + if schedule_retry and not self._shutdown and failure_count <= 1: + loop = asyncio.get_running_loop() + delay = max(0.0, self._config.window_seconds) + state.t1_handle = loop.call_later(delay, self._on_t1_timer, key) + # ------------------------------------------------------------ shutdown async def flush_all(self) -> None: @@ -698,7 +762,7 @@ async def flush_all(self) -> None: break logger.info("[MessageBatcher] flush_all: pending_buckets=%s", len(keys)) for key in keys: - await self._handle_t1(key) + await self._handle_t1(key, raise_on_failure=True) # 等 timer 已触发但回调仍在跑的 task pending = [t for t in self._pending_tasks if not t.done()] if pending: @@ -744,6 +808,7 @@ def snapshot(self) -> dict[str, Any]: "max_messages_per_batch": cfg.max_messages_per_batch, "group_enabled": cfg.group_enabled, "private_enabled": cfg.private_enabled, + "flush_on_command": cfg.flush_on_command, "allow_cancel_after_send": cfg.allow_cancel_after_send, "shutdown": self._shutdown, }, diff --git a/src/Undefined/utils/render_cache.py b/src/Undefined/utils/render_cache.py index 201f9870..9e93fed3 100644 --- a/src/Undefined/utils/render_cache.py +++ b/src/Undefined/utils/render_cache.py @@ -7,6 +7,7 @@ import json import logging import os +import shutil import time from pathlib import Path from typing import TypedDict @@ -41,6 +42,7 @@ class HtmlRenderCache: _cache_file: Path _max_entries: int _max_size_bytes: int + _image_dir: Path def __init__( self, @@ -51,6 +53,7 @@ def __init__( ) -> None: ensure_dir(cache_file.parent) self._cache_file = cache_file + self._image_dir = ensure_dir(cache_file.parent / "html") self._max_entries = max_entries self._max_size_bytes = max(1, max_size_mb) * 1024 * 1024 self._entries = {} @@ -70,7 +73,14 @@ def _load(self) -> None: try: if self._cache_file.exists(): raw = json.loads(self._cache_file.read_text(encoding="utf-8")) - self._entries = {k: _CacheEntry(**v) for k, v in raw.items()} # type: ignore + loaded = {k: _CacheEntry(**v) for k, v in raw.items()} # type: ignore + self._entries = { + k: v + for k, v in loaded.items() + if self._is_cache_owned_path(Path(v["path"])) + } + if len(self._entries) != len(loaded): + self._dirty = True logger.info("[渲染缓存] 已加载 %d 条缓存记录", len(self._entries)) except Exception: logger.warning("[渲染缓存] 加载缓存文件失败,将使用空缓存", exc_info=True) @@ -121,31 +131,51 @@ async def _evict_lru_locked(self) -> None: except OSError: pass + def _cache_path_for_key(self, key: str) -> Path: + safe_key = "".join(ch for ch in key if ch.isalnum() or ch in {"-", "_"}) + return self._image_dir / f"{safe_key}.png" + + def _is_cache_owned_path(self, path: Path) -> bool: + try: + path.resolve().relative_to(self._image_dir.resolve()) + return True + except ValueError: + return False + async def get(self, key: str) -> Path | None: async with self._lock: entry = self._entries.get(key) if entry is None: return None path = Path(entry["path"]) - if not path.exists(): + if not self._is_cache_owned_path(path) or not path.exists(): del self._entries[key] self._dirty = True return None entry["last_accessed_at"] = time.time() + await self._save_locked() return path async def put(self, key: str, image_path: str | Path, size_bytes: int) -> None: - path = Path(image_path) + source_path = Path(image_path) + if not source_path.exists(): + return async with self._lock: - if key in self._entries: - existing_path = Path(self._entries[key]["path"]) - if existing_path.exists(): - self._entries[key]["last_accessed_at"] = time.time() + cache_path = self._cache_path_for_key(key) + existing = self._entries.get(key) + if existing is not None: + existing_path = Path(existing["path"]) + if self._is_cache_owned_path(existing_path) and existing_path.exists(): + existing["last_accessed_at"] = time.time() + await self._save_locked() return + if source_path.resolve() != cache_path.resolve(): + shutil.copy2(source_path, cache_path) + actual_size = cache_path.stat().st_size self._entries[key] = _CacheEntry( - path=str(path), - size_bytes=size_bytes, + path=str(cache_path), + size_bytes=actual_size if actual_size > 0 else size_bytes, created_at=time.time(), last_accessed_at=time.time(), ) diff --git a/tests/test_config_hot_reload.py b/tests/test_config_hot_reload.py index 16c50161..90da2eab 100644 --- a/tests/test_config_hot_reload.py +++ b/tests/test_config_hot_reload.py @@ -357,6 +357,31 @@ def test_apply_config_updates_runtime_model_config_without_rebuilding_core_model assert len(queue_manager.intervals) == 1 +def test_apply_config_updates_hot_reloads_missing_tool_call_retries() -> None: + updated = cast( + Any, + SimpleNamespace( + searxng_url="", + missing_tool_call_retries=4, + ), + ) + ai_client = _FakeAIClient() + context = HotReloadContext( + ai_client=cast(Any, ai_client), + queue_manager=cast(Any, _FakeQueueManager()), + config_manager=cast(Any, SimpleNamespace()), + security_service=cast(Any, _FakeSecurityService()), + ) + + apply_config_updates( + updated, + {"missing_tool_call_retries": (3, 4)}, + context, + ) + + assert ai_client.runtime_updates == [updated] + + def test_apply_config_updates_hot_reloads_attachment_config() -> None: updated = cast( Any, diff --git a/tests/test_core_config.py b/tests/test_core_config.py new file mode 100644 index 00000000..211ad516 --- /dev/null +++ b/tests/test_core_config.py @@ -0,0 +1,36 @@ +from __future__ import annotations + +from pathlib import Path + +from Undefined.config.loader import Config + + +_MINIMAL = """ +[onebot] +ws_url = "ws://127.0.0.1:3001" +[models.chat] +api_url = "https://api.example/v1" +api_key = "sk-test" +model_name = "gpt-test" +""" + + +def _load(tmp_path: Path, extra: str = "") -> Config: + config_path = tmp_path / "config.toml" + config_path.write_text(_MINIMAL + extra, "utf-8") + return Config.load(config_path, strict=False) + + +def test_missing_tool_call_retries_defaults_to_three(tmp_path: Path) -> None: + cfg = _load(tmp_path) + assert cfg.missing_tool_call_retries == 3 + + +def test_missing_tool_call_retries_clamps_negative(tmp_path: Path) -> None: + cfg = _load(tmp_path, "\n[core]\nmissing_tool_call_retries = -1\n") + assert cfg.missing_tool_call_retries == 0 + + +def test_missing_tool_call_retries_loads_explicit_value(tmp_path: Path) -> None: + cfg = _load(tmp_path, "\n[core]\nmissing_tool_call_retries = 5\n") + assert cfg.missing_tool_call_retries == 5 diff --git a/tests/test_llm_retry_suppression.py b/tests/test_llm_retry_suppression.py index e668f503..2012a693 100644 --- a/tests/test_llm_retry_suppression.py +++ b/tests/test_llm_retry_suppression.py @@ -148,6 +148,72 @@ async def _execute_tool( assert cast(AsyncMock, client.submit_queued_llm_call).await_count == 2 +@pytest.mark.asyncio +async def test_ai_ask_limits_missing_tool_call_retries() -> None: + client: Any = object.__new__(AIClient) + client.runtime_config = cast( + Any, + SimpleNamespace( + log_thinking=False, + ai_request_max_retries=0, + missing_tool_call_retries=2, + ), + ) + client._prompt_builder = cast( + Any, + SimpleNamespace( + build_messages=AsyncMock( + return_value=[{"role": "user", "content": "hello"}] + ), + end_summaries=[], + ), + ) + client.tool_manager = cast( + Any, + SimpleNamespace( + get_openai_tools=lambda: [], + execute_tool=AsyncMock(), + ), + ) + client._filter_tools_for_runtime_config = lambda tools: tools + client._get_runtime_config = cast(Any, lambda: client.runtime_config) + client.model_selector = cast(Any, SimpleNamespace(wait_ready=AsyncMock())) + client.chat_config = ChatModelConfig( + api_url="https://api.openai.com/v1", + api_key="sk-test", + model_name="chat-model", + max_tokens=1024, + ) + client._find_chat_config_by_name = lambda _name: client.chat_config + client.submit_queued_llm_call = AsyncMock( + side_effect=[ + {"choices": [{"message": {"content": "plain 1", "tool_calls": []}}]}, + {"choices": [{"message": {"content": "plain 2", "tool_calls": []}}]}, + {"choices": [{"message": {"content": "plain 3", "tool_calls": []}}]}, + ] + ) + client._search_wrapper = None + client._end_summary_storage = cast(Any, None) + client._send_private_message_callback = None + client._send_image_callback = None + client.memory_storage = None + client._knowledge_manager = None + client._cognitive_service = None + client._meme_service = None + client._crawl4ai_capabilities = SimpleNamespace( + available=False, + error=None, + proxy_config_available=False, + ) + send_message = AsyncMock() + + result = await AIClient.ask(client, "hello", send_message_callback=send_message) + + assert result == "" + assert cast(AsyncMock, client.submit_queued_llm_call).await_count == 3 + send_message.assert_awaited_once_with("plain 3") + + @pytest.mark.asyncio async def test_agent_runner_reraises_queued_llm_error(tmp_path: Path) -> None: agent_dir = tmp_path / "demo_agent" diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index 55d5f309..961e9cd7 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -228,12 +228,14 @@ async def bad_callback(items: list[BufferedMessage]) -> None: batcher = MessageBatcher(cfg, bad_callback) await batcher.submit(_make_item(text="a")) await asyncio.sleep(0.2) - assert calls == [1] + assert calls == [1, 1] + assert batcher.has_buffer("group:1", 100) # 应能继续接受新消息 await batcher.submit(_make_item(text="b")) await asyncio.sleep(0.2) - assert calls == [1, 1] + assert calls == [1, 1, 2] + assert batcher.has_buffer("group:1", 100) @pytest.mark.asyncio @@ -684,3 +686,71 @@ async def test_submit_after_flush_all_dispatches_immediately() -> None: snap = batcher.snapshot() assert snap["pending_buckets"] == 0 assert snap["config"]["shutdown"] is True + + +@pytest.mark.asyncio +async def test_regular_callback_failure_restores_for_retry() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=0.03, strategy="extend") + calls = 0 + recovered = asyncio.Event() + + async def flaky_flush(items: list[BufferedMessage]) -> None: + nonlocal calls + calls += 1 + if calls == 1: + raise RuntimeError("temporary enqueue failure") + assert [item.text for item in items] == ["m1"] + recovered.set() + + batcher = MessageBatcher(cfg, flaky_flush) + + await batcher.submit(_make_item(text="m1")) + await asyncio.wait_for(recovered.wait(), timeout=0.5) + + assert calls == 2 + assert not batcher.has_buffer("group:1", 100) + + +@pytest.mark.asyncio +async def test_immediate_callback_failure_restores_for_retry() -> None: + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.03, + max_messages_per_batch=2, + ) + calls = 0 + recovered = asyncio.Event() + + async def flaky_flush(items: list[BufferedMessage]) -> None: + nonlocal calls + calls += 1 + if calls == 1: + raise RuntimeError("temporary enqueue failure") + assert [item.text for item in items] == ["x", "y"] + recovered.set() + + batcher = MessageBatcher(cfg, flaky_flush) + + await batcher.submit(_make_item(text="x")) + await batcher.submit(_make_item(text="y")) + await asyncio.wait_for(recovered.wait(), timeout=0.5) + + assert calls == 2 + assert not batcher.has_buffer("group:1", 100) + + +@pytest.mark.asyncio +async def test_flush_all_callback_failure_raises_and_keeps_buffer() -> None: + cfg = MessageBatcherConfig(enabled=True, window_seconds=10.0) + + async def failing_flush(items: list[BufferedMessage]) -> None: + raise RuntimeError("temporary enqueue failure") + + batcher = MessageBatcher(cfg, failing_flush) + + await batcher.submit(_make_item(text="m1")) + + with pytest.raises(RuntimeError, match="message batcher flush callback failed"): + await batcher.flush_all() + + assert batcher.has_buffer("group:1", 100) diff --git a/tests/test_message_batcher_integration.py b/tests/test_message_batcher_integration.py index b6cac61f..d4469e6c 100644 --- a/tests/test_message_batcher_integration.py +++ b/tests/test_message_batcher_integration.py @@ -324,3 +324,33 @@ async def test_message_handler_close_flushes_batcher_then_drains_queue() -> None "stop_queue", "flush_history", ] + + +@pytest.mark.asyncio +async def test_message_handler_flush_command_buffer_respects_disabled_config() -> None: + handler: Any = object.__new__(MessageHandler) + handler.config = SimpleNamespace( + message_batcher=MessageBatcherConfig(flush_on_command=False) + ) + handler.message_batcher = SimpleNamespace(flush_sender=AsyncMock(return_value=True)) + + await handler._flush_command_buffer(scope="group:1", sender_id=2) + + cast(AsyncMock, handler.message_batcher.flush_sender).assert_not_called() + + +@pytest.mark.asyncio +async def test_message_handler_flush_command_buffer_calls_batcher_when_enabled() -> ( + None +): + handler: Any = object.__new__(MessageHandler) + handler.config = SimpleNamespace( + message_batcher=MessageBatcherConfig(flush_on_command=True) + ) + handler.message_batcher = SimpleNamespace(flush_sender=AsyncMock(return_value=True)) + + await handler._flush_command_buffer(scope="group:1", sender_id=2) + + cast(AsyncMock, handler.message_batcher.flush_sender).assert_awaited_once_with( + "group:1", 2 + ) diff --git a/tests/test_render_cache.py b/tests/test_render_cache.py new file mode 100644 index 00000000..3a641913 --- /dev/null +++ b/tests/test_render_cache.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +import json +import time +from pathlib import Path + +import pytest + +from Undefined.utils.render_cache import HtmlRenderCache + + +@pytest.mark.asyncio +async def test_render_cache_uses_owned_image_copy(tmp_path: Path) -> None: + cache = HtmlRenderCache(tmp_path / "index.json", max_entries=10, max_size_mb=1) + output_path = tmp_path / "render.png" + + output_path.write_bytes(b"image-a") + await cache.put("key-a", output_path, output_path.stat().st_size) + cached_a = await cache.get("key-a") + + assert cached_a is not None + assert cached_a != output_path + assert cached_a.parent == tmp_path / "html" + assert cached_a.read_bytes() == b"image-a" + + output_path.write_bytes(b"image-b") + await cache.put("key-b", output_path, output_path.stat().st_size) + cached_a_again = await cache.get("key-a") + cached_b = await cache.get("key-b") + + assert cached_a_again is not None + assert cached_b is not None + assert cached_a_again.read_bytes() == b"image-a" + assert cached_b.read_bytes() == b"image-b" + + +@pytest.mark.asyncio +async def test_render_cache_ignores_legacy_external_paths(tmp_path: Path) -> None: + external = tmp_path / "external.png" + external.write_bytes(b"legacy") + cache_file = tmp_path / "index.json" + now = time.time() + cache_file.write_text( + json.dumps( + { + "legacy": { + "path": str(external), + "size_bytes": external.stat().st_size, + "created_at": now, + "last_accessed_at": now, + } + } + ), + "utf-8", + ) + + cache = HtmlRenderCache(cache_file, max_entries=10, max_size_mb=1) + + assert await cache.get("legacy") is None From bc24ff01f5ab3fb28f146ad734ee6f18e2d31a3b Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Mon, 4 May 2026 20:33:19 +0800 Subject: [PATCH 33/34] =?UTF-8?q?refactor:=20render=20cache=20=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E5=8C=96=E3=80=81=E9=85=8D=E7=BD=AE=E5=8C=96=E4=B8=8E?= =?UTF-8?q?=20review=20=E6=94=B6=E5=B0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 渲染缓存所有 IO 改走 utils/io(read_json/write_json)+ asyncio.to_thread,符合事件循环禁阻塞规范;移除原 .tmp+os.replace 与 shutil.copy2/stat/unlink 的同步路径 - 新增 [render.cache] 配置段(enabled/max_entries/max_size_mb/flush_interval_seconds),替代硬编码常量;HtmlRenderCache 改为 async create/initialize 工厂,支持禁用短路与 close 强刷 - 抽取 coerce_truthy/is_truthy/was_message_sent 到 utils/coerce.py,message_batcher 与 end 工具复用,删除重复实现 - main 关停 sequence 调用 close_render_cache,保证最近访问时间与新增条目落盘 - batcher 补充 speculative_flush_task 注释与 _restore_items_after_failed_flush fail-fast 重试上限说明 - tests/test_lsadmin_command.py 改名为 tests/test_admin_command.py,与 /admin 子命令重构对齐 - 补测试盲点:渲染缓存 LRU 条目/容量驱逐、重启恢复、close 强刷、并发 put、禁用短路、key 唯一性;/admin add|del 全路径与子命令权限矩阵;allow_cancel_after_send=true 取消语义;总用例升至 1660 Co-Authored-By: Claude Opus 4.7 (1M context) --- CHANGELOG.md | 4 +- config.toml.example | 16 + docs/configuration.md | 17 ++ src/Undefined/config/__init__.py | 2 + src/Undefined/config/domain_parsers.py | 26 ++ src/Undefined/config/loader.py | 6 + src/Undefined/config/models.py | 14 + src/Undefined/main.py | 2 + src/Undefined/render.py | 25 +- src/Undefined/services/message_batcher.py | 39 +-- src/Undefined/skills/tools/end/handler.py | 43 +-- src/Undefined/utils/coerce.py | 56 ++++ src/Undefined/utils/render_cache.py | 309 +++++++++++++++---- tests/test_admin_command.py | 344 ++++++++++++++++++++++ tests/test_lsadmin_command.py | 112 ------- tests/test_message_batcher.py | 40 +++ tests/test_render_cache.py | 164 ++++++++++- 17 files changed, 967 insertions(+), 252 deletions(-) create mode 100644 tests/test_admin_command.py delete mode 100644 tests/test_lsadmin_command.py diff --git a/CHANGELOG.md b/CHANGELOG.md index ddc5966c..e648a978 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ - 收紧 NagaAgent 关系表达。NagaAgent 版提示词明确:只有当前上下文明确涉及 NagaAgent 时才承接相关工具接入能力协助分析;平时不主动提与 NagaAgent 的关系;不冒领 NagaAgent 的成果。 - 重构自动管线目录。`skills/auto_pipeline` 更名为 `skills/pipelines`,目录结构扁平化,相关引用、文档、测试全部同步更新;`docs/auto-pipeline.md` 相应更名为 `docs/pipelines.md`。 - 重构管理员命令为子命令模式。`/admin [ls|add|del]` 替代原有 `/lsadmin`、`/addadmin`、`/rmadmin` 三条独立命令,参照 `/faq` 子命令模式的声明式 inference;`ls` 继承 admin 权限,`add`/`del` 覆盖为 superadmin;无参数默认执行 `ls`。清理了 FAQ 迁移遗留的空命令目录。 -- 新增 HTML 渲染结果缓存。基于 HTML 内容的 hash 缓存渲染图片,持久化到 `data/cache/render/_html_render_cache.json`;hash 匹配自动复用,内容变化自然失效;LRU 驱逐上限 50 条目 / 50MB;原子写入(`.tmp` + `os.replace`)与 `asyncio.Lock` 防竞态;重启后 JSON 自动恢复;所有渲染调用方(help、profile、render_markdown 等)自动受益。 +- 新增 HTML 渲染结果缓存。基于 HTML 内容的 hash 缓存渲染图片,持久化到 `data/cache/render/_html_render_cache.json`;hash 匹配自动复用,内容变化自然失效;新增 `[render.cache]` 配置段(`enabled` / `max_entries` / `max_size_mb` / `flush_interval_seconds`,默认 50 条 / 50MB / 2.0s),元数据通过 `utils/io.py` 的 `read_json` / `write_json` 异步落盘(`asyncio.to_thread` + 文件锁 + 原子替换),所有 `stat` / `unlink` / `copy` 也走线程池避免阻塞事件循环;`asyncio.Lock` 防竞态、重启后 JSON 自动恢复;进程关停时通过 `close_render_cache` 强制刷盘,保证最近访问时间不丢失;所有渲染调用方(help、profile、render_markdown 等)自动受益。 - 增强 AI 工具调用容错。当 LLM 返回文本但 tool_calls 为空且对话未结束时,不再以丢失回复为代价直接返回,而是注入提示消息要求 AI 通过 `send_message` / `end` 工具完成回复,继续迭代;fire-and-forget task 显式注册异常回调以抑制未检索异常警告。 - 优化表情包回复顺序。明确只有纯表情包 / 纯反应图回复才允许先检索表情包;需要文字说明的场景必须先完成必要文字,再将表情包检索和发送延后到后续轮次。 - 重构 `end` 工具。移除旧版 summary 参数兼容,只保留 `memo`、`observations`、`perspective` 和 `force`;要求记录整个当前输入批次中值得留存的信息,后台史官也接收批次全部消息。 @@ -19,7 +19,7 @@ - 调整发布说明生成方式。GitHub Release notes 改为从 `CHANGELOG.md` 最新版本条目自动解析生成(`scripts/release_notes.py`),发版前校验 tag、各构建清单与最新 changelog 版本一致。 - 补齐消息合并专题文档。新增 `docs/message-batching.md`,覆盖配置参数、等待策略、投机预发送、竞态保护与关闭行为,同步更新了 README、配置文档、OpenAPI、WebUI 指南和架构图。 - 补齐配置注释。`config.toml.example` 中所有模型配置节的 `prompt_cache_enabled` 均补上双语注释说明。 -- 补强测试覆盖。新增消息合并单元与集成测试(686 + 326 行)、工具调用守卫测试、发布说明脚本测试(163 行)、Runtime 探针统计测试(120 行)、系统提示词约束验证,并更新 `end` 工具、管理员命令、管线注册等已有测试,总测试用例提升至约 1620 项。 +- 补强测试覆盖。新增消息合并单元与集成测试(686 + 326 行)、工具调用守卫测试、发布说明脚本测试(163 行)、Runtime 探针统计测试(120 行)、系统提示词约束验证,并更新 `end` 工具、管理员命令、管线注册等已有测试;额外补齐渲染缓存(LRU 驱逐 / 容量驱逐 / 重启恢复 / 节流后强刷 / 并发 put / 禁用短路)、`/admin add|del` 全路径、`allow_cancel_after_send=true` 取消语义等盲点。总测试用例提升至约 1660 项。 --- diff --git a/config.toml.example b/config.toml.example index f4fd5b80..e6296733 100644 --- a/config.toml.example +++ b/config.toml.example @@ -904,6 +904,22 @@ request_retries = 0 # en: Max concurrent render browser pages. 0 = auto: Linux defaults to 1, other platforms default to 2. browser_max_concurrency = 0 +# zh: HTML 渲染结果缓存:基于 HTML 内容 hash 复用同一张图片,避免重复渲染。 +# en: HTML render result cache: reuse rendered images by content hash to skip re-rendering. +[render.cache] +# zh: 是否启用渲染缓存。设为 false 时所有渲染请求都会走 playwright 重新截图。 +# en: Whether to enable the render cache. When false, every request re-renders via playwright. +enabled = true +# zh: LRU 条目数上限(>=1)。超过时按 last_accessed_at 淘汰最久未用的条目。 +# en: Maximum LRU entries (>=1). Beyond this, the least-recently-used items are evicted. +max_entries = 50 +# zh: 缓存总占用上限(MB,>=1)。超过时按 LRU 顺序持续淘汰,直到回到上限以内。 +# en: Maximum total cache size (MB, >=1). Evicts in LRU order until within budget. +max_size_mb = 50 +# zh: 元数据落盘最小间隔(秒,>=0)。频繁访问期间合并写盘,避免热点 IO。 +# en: Minimum interval between metadata flushes (seconds, >=0). Coalesces hot-path writes. +flush_interval_seconds = 2.0 + # zh: 第三方 API 基础地址(便于自定义镜像或私有网关)。 # en: Third-party API base URLs (for mirrors or private gateways). [api_endpoints] diff --git a/docs/configuration.md b/docs/configuration.md index ee20e916..0bd1d1d1 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -543,6 +543,23 @@ Prompt caching 补充: - 渲染浏览器当前采用单例复用,因此这里限制的是并发页面/上下文数量,而不是浏览器进程数量。 - 配置变更会对后续新的渲染请求生效;已在执行中的渲染任务不受影响。 +#### `[render.cache]` HTML 渲染结果缓存 + +基于 HTML 内容 hash 复用同一张图片,避免重复渲染(help、profile、render_markdown 等链路自动受益)。 + +| 字段 | 默认值 | 说明 | 约束/回退 | +|---|---:|---|---| +| `enabled` | `true` | 是否启用渲染缓存 | 关闭时所有请求都会走 playwright 重新截图 | +| `max_entries` | `50` | LRU 条目数上限 | 自动钳制到 `>=1`;超过时按 `last_accessed_at` 淘汰 | +| `max_size_mb` | `50` | 缓存总占用上限(MB) | 自动钳制到 `>=1`;超过时按 LRU 顺序持续淘汰 | +| `flush_interval_seconds` | `2.0` | 元数据落盘最小间隔(秒) | 自动钳制到 `>=0`;关停时强制刷盘 | + +说明: +- 元数据通过 `utils/io.py` 的 `read_json` / `write_json` 写入,自带文件锁与原子替换。 +- 缓存图片落在 `data/cache/render/html/` 目录,元数据为同目录下 `_html_render_cache.json`。 +- 进程关停(含 Ctrl+C)时会调用 `close_render_cache` 强制刷盘,保证最近访问时间不丢失。 +- 配置改动后下次启动生效。运行期热更新仅影响新建的缓存实例,已加载的单例沿用启动时参数。 + --- ### 4.16 `[api_endpoints]` 第三方 API 基址 diff --git a/src/Undefined/config/__init__.py b/src/Undefined/config/__init__.py index ce2e4ca8..7242f3cf 100644 --- a/src/Undefined/config/__init__.py +++ b/src/Undefined/config/__init__.py @@ -14,6 +14,7 @@ MessageBatcherConfig, ModelPool, ModelPoolEntry, + RenderCacheConfig, RerankModelConfig, SecurityModelConfig, VisionModelConfig, @@ -33,6 +34,7 @@ "ModelPoolEntry", "MemeConfig", "MessageBatcherConfig", + "RenderCacheConfig", "get_config", "get_config_manager", "load_webui_settings", diff --git a/src/Undefined/config/domain_parsers.py b/src/Undefined/config/domain_parsers.py index abac10bb..986c5cb1 100644 --- a/src/Undefined/config/domain_parsers.py +++ b/src/Undefined/config/domain_parsers.py @@ -19,6 +19,7 @@ MemeConfig, MessageBatcherConfig, NagaConfig, + RenderCacheConfig, ) DEFAULT_API_HOST = "127.0.0.1" @@ -221,6 +222,31 @@ def _parse_message_batcher_config(data: dict[str, Any]) -> MessageBatcherConfig: ) +def _parse_render_cache_config(data: dict[str, Any]) -> RenderCacheConfig: + """解析 ``[render.cache]`` 段,落到 :class:`RenderCacheConfig`。 + + 所有上限会做下界保护(>=1 / >=0.0),避免负值导致驱逐失控。 + """ + render_raw = data.get("render", {}) + render_section = render_raw if isinstance(render_raw, dict) else {} + cache_raw = render_section.get("cache", {}) + cache_section = cache_raw if isinstance(cache_raw, dict) else {} + + enabled = _coerce_bool(cache_section.get("enabled"), True) + max_entries = max(1, _coerce_int(cache_section.get("max_entries"), 50)) + max_size_mb = max(1, _coerce_int(cache_section.get("max_size_mb"), 50)) + flush_interval = max( + 0.0, + _coerce_float(cache_section.get("flush_interval_seconds"), 2.0), + ) + return RenderCacheConfig( + enabled=enabled, + max_entries=max_entries, + max_size_mb=max_size_mb, + flush_interval_seconds=flush_interval, + ) + + def _parse_api_config(data: dict[str, Any]) -> APIConfig: section_raw = data.get("api", {}) section = section_raw if isinstance(section_raw, dict) else {} diff --git a/src/Undefined/config/loader.py b/src/Undefined/config/loader.py index 3ba95c77..2bc49d7f 100644 --- a/src/Undefined/config/loader.py +++ b/src/Undefined/config/loader.py @@ -38,6 +38,7 @@ def load_dotenv( MemeConfig, MessageBatcherConfig, NagaConfig, + RenderCacheConfig, RerankModelConfig, SecurityModelConfig, VisionModelConfig, @@ -101,6 +102,7 @@ def load_dotenv( _parse_memes_config, _parse_message_batcher_config, _parse_naga_config, + _parse_render_cache_config, _update_dataclass, ) @@ -356,6 +358,8 @@ class Config: memes: MemeConfig # 同 sender 短时多消息合并器 message_batcher: MessageBatcherConfig + # HTML 渲染结果缓存 + render_cache: RenderCacheConfig # Naga 集成 naga: NagaConfig # 生图工具配置 @@ -1296,6 +1300,7 @@ def load(cls, config_path: Optional[Path] = None, strict: bool = True) -> "Confi cognitive = _parse_cognitive_config(data) memes = _parse_memes_config(data) message_batcher = _parse_message_batcher_config(data) + render_cache = _parse_render_cache_config(data) naga = _parse_naga_config(data) models_image_gen = _parse_image_gen_model_config(data) models_image_edit = _parse_image_edit_model_config(data) @@ -1466,6 +1471,7 @@ def load(cls, config_path: Optional[Path] = None, strict: bool = True) -> "Confi cognitive=cognitive, memes=memes, message_batcher=message_batcher, + render_cache=render_cache, naga=naga, image_gen=image_gen, models_image_gen=models_image_gen, diff --git a/src/Undefined/config/models.py b/src/Undefined/config/models.py index 4d330a96..0a272b57 100644 --- a/src/Undefined/config/models.py +++ b/src/Undefined/config/models.py @@ -375,6 +375,20 @@ class MessageBatcherConfig: allow_cancel_after_send: bool = False +@dataclass +class RenderCacheConfig: + """HTML 渲染结果缓存配置。 + + 缓存单例由 :func:`Undefined.utils.render_cache.get_render_cache` 加载, + 在程序退出时通过 :func:`close_render_cache` 强制刷盘。 + """ + + enabled: bool = True + max_entries: int = 50 + max_size_mb: int = 50 + flush_interval_seconds: float = 2.0 + + @dataclass class APIConfig: """主进程 OpenAPI/Runtime API 配置""" diff --git a/src/Undefined/main.py b/src/Undefined/main.py index 72d205b3..df95c086 100644 --- a/src/Undefined/main.py +++ b/src/Undefined/main.py @@ -43,6 +43,7 @@ restart_process, ) from Undefined.render import close_browser as close_render_browser +from Undefined.utils.render_cache import close_render_cache def ensure_runtime_dirs() -> None: @@ -527,6 +528,7 @@ def _apply_config_updates( await retrieval_runtime.stop() await config_manager.stop_hot_reload() await close_render_browser() + await close_render_cache() logger.info("[退出] 机器人已停止运行") diff --git a/src/Undefined/render.py b/src/Undefined/render.py index 91ff5353..b8c309c9 100644 --- a/src/Undefined/render.py +++ b/src/Undefined/render.py @@ -2,10 +2,9 @@ import asyncio import logging -import os -import shutil import sys from collections.abc import Awaitable, Callable +from pathlib import Path from playwright.async_api import async_playwright, Browser, Page, Playwright import markdown @@ -63,6 +62,14 @@ _RenderResult = TypeVar("_RenderResult") +def _safe_file_size(path: Path) -> int: + """同步取文件大小(在 ``asyncio.to_thread`` 中调用);不存在/不可读时返回 0。""" + try: + return path.stat().st_size + except OSError: + return 0 + + def _resolve_render_browser_max_concurrency() -> int: """解析渲染浏览器并发上限,0 表示沿用平台默认值。""" try: @@ -218,13 +225,8 @@ async def render_html_to_image( html_content, viewport_width, screenshot_selector, proxy ) - cached_path = await cache.get(cache_key) - if cached_path is not None: - try: - shutil.copy2(cached_path, output_path) - return - except OSError: - pass + if await cache.copy_to(cache_key, output_path): + return async def _capture(page: Page) -> None: await page.wait_for_load_state("networkidle", timeout=timeout_ms) @@ -249,8 +251,9 @@ async def _capture(page: Page) -> None: proxy=proxy, ) - if os.path.exists(output_path): - await cache.put(cache_key, output_path, os.path.getsize(output_path)) + output_size = await asyncio.to_thread(_safe_file_size, Path(output_path)) + if output_size > 0: + await cache.put(cache_key, output_path, output_size) async def render_html_with_page( diff --git a/src/Undefined/services/message_batcher.py b/src/Undefined/services/message_batcher.py index 0f06fb03..4ad94e11 100644 --- a/src/Undefined/services/message_batcher.py +++ b/src/Undefined/services/message_batcher.py @@ -38,6 +38,7 @@ from typing import Any, Awaitable, Callable from Undefined.config.models import MessageBatcherConfig +from Undefined.utils.coerce import was_message_sent logger = logging.getLogger(__name__) @@ -138,27 +139,6 @@ def make_scope(*, group_id: int | None = None, user_id: int | None = None) -> st return "unknown" -def _was_message_sent_this_turn(ctx: Any) -> bool: - """判断 inflight RequestContext 是否已经向用户发出过任何消息。 - - 与 ``skills/tools/end/handler.py::_was_message_sent_this_turn`` 同语义; - 这里采用宽松布尔解析。 - """ - if ctx is None: - return False - try: - value = ctx.get_resource("message_sent_this_turn", False) - except Exception: # noqa: BLE001 - ctx 可能已失效 - return False - if isinstance(value, bool): - return value - if isinstance(value, int): - return value != 0 - if isinstance(value, str): - return value.strip().lower() in {"1", "true", "yes", "y", "on"} - return False - - class MessageBatcher: """同 sender 短时合并器(含 T2 投机预发送)。""" @@ -254,7 +234,7 @@ async def submit(self, item: BufferedMessage) -> None: # 已 pre-fire,决定是否 cancel inflight inflight = state.inflight already_sent = ( - _was_message_sent_this_turn(inflight.request_context) + was_message_sent(inflight.request_context) if inflight is not None else False ) @@ -629,7 +609,10 @@ async def _handle_t2(self, key: tuple[str, int]) -> None: state.dispatch_token = self._new_token(key[0], key[1]) self._bind_items_to_token_locked(state) state.dispatch_token.speculative = True - # 记录"承担投机职责"的当前 task,便于 inflight 注册前被新消息抢占取消 + # 记录"承担投机职责"的当前 task;此处指向 _handle_t2 协程本身 + # (pre-fire 协程),不是 LLM inflight task。 + # 后续 submit() 抢占判定通过 `state.speculative_flush_task is asyncio.current_task()` + # 区分新旧 pre-fire 协程,避免误清理新 batch。 state.speculative_flush_task = asyncio.current_task() speculative_items = list(state.items) logger.info( @@ -712,6 +695,16 @@ async def _restore_items_after_failed_flush( *, schedule_retry: bool, ) -> None: + """flush callback 失败后回滚到 TYPING 阶段。 + + 重试策略(fail-fast): + - 每次失败累加 ``self._flush_failure_counts[key]``; + - 仅在 ``failure_count <= 1``(即首次失败)时安排一次延后 T1 重试; + - 第二次起仅恢复 batch、等待用户新消息或 ``flush_all`` 触发, + 避免 LLM 端持续故障时形成"无限重试风暴"; + - 桶在成功一次后 ``failure_count`` 会被 pop 清零。 + - ``flush_all`` 路径会 raise,从而暴露持续失败。 + """ if not items: return async with self._lock: diff --git a/src/Undefined/skills/tools/end/handler.py b/src/Undefined/skills/tools/end/handler.py index 60ea0e9a..84e3a643 100644 --- a/src/Undefined/skills/tools/end/handler.py +++ b/src/Undefined/skills/tools/end/handler.py @@ -7,7 +7,7 @@ import re from Undefined.context import RequestContext -from Undefined.utils.coerce import safe_int +from Undefined.utils.coerce import coerce_truthy, is_truthy, safe_int, was_message_sent from Undefined.utils.xml import format_message_xml from Undefined.end_summary_storage import ( @@ -19,8 +19,6 @@ logger = logging.getLogger(__name__) -_TRUE_BOOL_TOKENS = {"1", "true", "yes", "y", "on"} -_FALSE_BOOL_TOKENS = {"0", "false", "no", "n", "off", ""} _MESSAGE_TAG_RE = re.compile( r"[^>]*)>\s*(?P.*?).*?", re.DOTALL | re.IGNORECASE, @@ -37,47 +35,16 @@ _MAX_HISTORIAN_LINE_LEN = 1000 -def _coerce_bool(value: Any) -> tuple[bool, bool]: - """宽松布尔解析。 - - 返回: - (parsed_value, recognized) - """ - if isinstance(value, bool): - return value, True - - if isinstance(value, int): - return value != 0, True - - if isinstance(value, str): - token = value.strip().lower() - if token in _TRUE_BOOL_TOKENS: - return True, True - if token in _FALSE_BOOL_TOKENS: - return False, True - - return False, False - - def _parse_force_flag(value: Any) -> tuple[bool, bool]: """force 支持宽松布尔解析(字符串大小写、0/1 等)。""" - return _coerce_bool(value) - - -def _is_true_flag(value: Any) -> bool: - """上下文标记采用宽松布尔解析。""" - parsed, _recognized = _coerce_bool(value) - return parsed + return coerce_truthy(value) def _was_message_sent_this_turn(context: Dict[str, Any]) -> bool: - if _is_true_flag(context.get("message_sent_this_turn", False)): + """统一入口:先看 context 里的标记,回落到当前 RequestContext。""" + if is_truthy(context.get("message_sent_this_turn", False)): return True - - ctx = RequestContext.current() - if ctx is None: - return False - return _is_true_flag(ctx.get_resource("message_sent_this_turn", False)) + return was_message_sent(RequestContext.current()) def _clip_text(value: Any, max_len: int) -> str: diff --git a/src/Undefined/utils/coerce.py b/src/Undefined/utils/coerce.py index 20c81eff..326ed734 100644 --- a/src/Undefined/utils/coerce.py +++ b/src/Undefined/utils/coerce.py @@ -4,6 +4,10 @@ from typing import Any, overload +# 宽松布尔识别(与 end 工具、batcher 共享语义)。 +_TRUTHY_TOKENS: frozenset[str] = frozenset({"1", "true", "yes", "y", "on"}) +_FALSY_TOKENS: frozenset[str] = frozenset({"0", "false", "no", "n", "off", ""}) + @overload def safe_int(value: Any) -> int | None: ... @@ -35,3 +39,55 @@ def safe_float(value: Any, default: float = 0.0) -> float: return float(value) except (TypeError, ValueError): return default + + +def coerce_truthy(value: Any) -> tuple[bool, bool]: + """Loose-truthy parser shared by end tool / message batcher. + + 返回 ``(parsed, recognized)``: + - ``parsed`` — 解析结果(识别失败时按 False 兜底); + - ``recognized`` — 是否成功识别(用于调用方决定是否记日志告警)。 + + 支持:bool、int(0=False / 其余 True)、字符串 ``1/true/yes/y/on`` + 与 ``0/false/no/n/off`` / 空串。 + """ + if isinstance(value, bool): + return value, True + if isinstance(value, int): + return value != 0, True + if isinstance(value, str): + token = value.strip().lower() + if token in _TRUTHY_TOKENS: + return True, True + if token in _FALSY_TOKENS: + return False, True + return False, False + + +def is_truthy(value: Any) -> bool: + """``coerce_truthy`` 的便捷封装,仅返回布尔结果。 + + 传入 None / 不可识别的类型一律按 False 处理。 + """ + parsed, _recognized = coerce_truthy(value) + return parsed + + +def was_message_sent(source: Any) -> bool: + """统一判断"本轮是否已经向用户发送过消息"。 + + ``source`` 可以是 ``RequestContext``(提供 ``get_resource``)或 dict。 + 任意异常或缺字段都按 False 兜底。 + """ + if source is None: + return False + # dict / 自定义 mapping 优先 + if isinstance(source, dict): + return is_truthy(source.get("message_sent_this_turn", False)) + getter = getattr(source, "get_resource", None) + if callable(getter): + try: + return is_truthy(getter("message_sent_this_turn", False)) + except Exception: # noqa: BLE001 - context 可能已失效 + return False + return False diff --git a/src/Undefined/utils/render_cache.py b/src/Undefined/utils/render_cache.py index 9e93fed3..2bf2afe8 100644 --- a/src/Undefined/utils/render_cache.py +++ b/src/Undefined/utils/render_cache.py @@ -1,17 +1,25 @@ -"""HTML 渲染结果缓存:基于 HTML 内容 hash 缓存渲染图片,避免重复渲染。""" +"""HTML 渲染结果缓存:基于 HTML 内容 hash 缓存渲染图片,避免重复渲染。 + +关键约束(CLAUDE.md):磁盘读写必须走 :mod:`Undefined.utils.io` +(``asyncio.to_thread`` + 跨平台文件锁 + 原子写入),禁止在事件循环中直接阻塞 IO。 +本模块所有 ``stat`` / ``unlink`` / ``copy`` 都通过 ``asyncio.to_thread`` 包装; +JSON 元数据通过 :func:`Undefined.utils.io.read_json` / :func:`Undefined.utils.io.write_json` +读写,自带文件锁与原子替换。 +""" from __future__ import annotations import asyncio import hashlib -import json import logging -import os import shutil import time +from dataclasses import dataclass from pathlib import Path from typing import TypedDict +from Undefined.config import RenderCacheConfig +from Undefined.utils import io as async_io from Undefined.utils.paths import ensure_dir logger = logging.getLogger(__name__) @@ -20,12 +28,10 @@ "HtmlRenderCache", "compute_render_cache_key", "get_render_cache", + "close_render_cache", + "reset_render_cache", ] -_DEFAULT_MAX_ENTRIES = 50 -_DEFAULT_MAX_SIZE_MB = 50 -_MIN_FLUSH_INTERVAL = 2.0 - class _CacheEntry(TypedDict): path: str @@ -34,91 +40,173 @@ class _CacheEntry(TypedDict): last_accessed_at: float +@dataclass(frozen=True) +class _ResolvedConfig: + """运行时生效的缓存策略快照。""" + + enabled: bool + max_entries: int + max_size_bytes: int + flush_interval_seconds: float + + class HtmlRenderCache: + """HTML 渲染结果 LRU 缓存。 + + 使用前必须先 ``await cache.initialize()``;推荐通过 :func:`get_render_cache` + 获取全局单例,单例工厂会负责 lazy initialize。 + + 禁用(``config.enabled=False``)时所有 ``get`` / ``put`` 都是 no-op, + 缓存目录不会被读写。 + """ + _entries: dict[str, _CacheEntry] _lock: asyncio.Lock _dirty: bool _last_flush: float _cache_file: Path - _max_entries: int - _max_size_bytes: int _image_dir: Path + _config: _ResolvedConfig + _initialized: bool def __init__( self, cache_file: Path, *, - max_entries: int = _DEFAULT_MAX_ENTRIES, - max_size_mb: int = _DEFAULT_MAX_SIZE_MB, + max_entries: int = 50, + max_size_mb: int = 50, + flush_interval_seconds: float = 2.0, + enabled: bool = True, ) -> None: ensure_dir(cache_file.parent) self._cache_file = cache_file self._image_dir = ensure_dir(cache_file.parent / "html") - self._max_entries = max_entries - self._max_size_bytes = max(1, max_size_mb) * 1024 * 1024 + self._config = _ResolvedConfig( + enabled=enabled, + max_entries=max(1, max_entries), + max_size_bytes=max(1, max_size_mb) * 1024 * 1024, + flush_interval_seconds=max(0.0, flush_interval_seconds), + ) self._entries = {} self._dirty = False self._last_flush = 0.0 self._lock = asyncio.Lock() - self._load() + self._initialized = False + + # ---------------------------------------------------------------- factory + + @classmethod + async def create( + cls, + cache_file: Path, + *, + max_entries: int = 50, + max_size_mb: int = 50, + flush_interval_seconds: float = 2.0, + enabled: bool = True, + ) -> HtmlRenderCache: + """异步工厂:构造并完成 lazy load。""" + cache = cls( + cache_file, + max_entries=max_entries, + max_size_mb=max_size_mb, + flush_interval_seconds=flush_interval_seconds, + enabled=enabled, + ) + await cache.initialize() + return cache + + async def initialize(self) -> None: + """异步加载磁盘元数据;多次调用幂等。""" + if self._initialized: + return + async with self._lock: + if self._initialized: + return + await self._load_locked() + self._initialized = True + + # ---------------------------------------------------------------- private + + async def _load_locked(self) -> None: + """读元数据并清理可能残留的 .tmp 文件。完全异步。""" + # 残留 tmp 清理 + legacy_tmp = self._cache_file.with_suffix(".tmp") + await async_io.delete_file(legacy_tmp) - def _load(self) -> None: - # 清理上次可能残留的 .tmp 文件 - tmp_file = self._cache_file.with_suffix(".tmp") - if tmp_file.exists(): - try: - tmp_file.unlink() - except OSError: - pass try: - if self._cache_file.exists(): - raw = json.loads(self._cache_file.read_text(encoding="utf-8")) - loaded = {k: _CacheEntry(**v) for k, v in raw.items()} # type: ignore - self._entries = { - k: v - for k, v in loaded.items() - if self._is_cache_owned_path(Path(v["path"])) - } - if len(self._entries) != len(loaded): - self._dirty = True - logger.info("[渲染缓存] 已加载 %d 条缓存记录", len(self._entries)) + raw = await async_io.read_json(self._cache_file) except Exception: logger.warning("[渲染缓存] 加载缓存文件失败,将使用空缓存", exc_info=True) self._entries = {} + return + + if not isinstance(raw, dict): + self._entries = {} + return + + loaded: dict[str, _CacheEntry] = {} + for key, value in raw.items(): + if not isinstance(value, dict): + continue + try: + entry = _CacheEntry( + path=str(value["path"]), + size_bytes=int(value.get("size_bytes", 0)), + created_at=float(value.get("created_at", 0.0)), + last_accessed_at=float(value.get("last_accessed_at", 0.0)), + ) + except (KeyError, TypeError, ValueError): + continue + loaded[str(key)] = entry + + owned: dict[str, _CacheEntry] = {} + for key, entry in loaded.items(): + if self._is_cache_owned_path(Path(entry["path"])): + owned[key] = entry + if len(owned) != len(loaded): + self._dirty = True + self._entries = owned + logger.info("[渲染缓存] 已加载 %d 条缓存记录", len(self._entries)) + + async def _flush_locked(self, *, force: bool = False) -> None: + """异步落盘元数据。 - async def _save_locked(self) -> None: + ``force=False`` 时遵循 ``flush_interval_seconds`` 节流,避免热点写盘; + ``force=True`` 用于关停 / 用户主动触发。 + """ if not self._dirty: return now = time.monotonic() - if now - self._last_flush < _MIN_FLUSH_INTERVAL: + if ( + not force + and self._config.flush_interval_seconds > 0 + and now - self._last_flush < self._config.flush_interval_seconds + ): return + snapshot = dict(self._entries) try: - tmp = self._cache_file.with_suffix(".tmp") - tmp.write_text( - json.dumps(self._entries, ensure_ascii=False, indent=2), - encoding="utf-8", - ) - os.replace(tmp, self._cache_file) + await async_io.write_json(self._cache_file, snapshot) self._dirty = False self._last_flush = now except Exception: logger.warning("[渲染缓存] 保存缓存文件失败", exc_info=True) async def _evict_lru_locked(self) -> None: - while len(self._entries) > self._max_entries: + cfg = self._config + # 条目数上限 + while len(self._entries) > cfg.max_entries: lru_key = min( self._entries, key=lambda k: self._entries[k]["last_accessed_at"], ) entry = self._entries.pop(lru_key) self._dirty = True - try: - Path(entry["path"]).unlink(missing_ok=True) - except OSError: - pass + await async_io.delete_file(Path(entry["path"])) + # 总字节上限 total = sum(e["size_bytes"] for e in self._entries.values()) - while total > self._max_size_bytes and self._entries: + while total > cfg.max_size_bytes and self._entries: lru_key = min( self._entries, key=lambda k: self._entries[k]["last_accessed_at"], @@ -126,10 +214,7 @@ async def _evict_lru_locked(self) -> None: entry = self._entries.pop(lru_key) total -= entry["size_bytes"] self._dirty = True - try: - Path(entry["path"]).unlink(missing_ok=True) - except OSError: - pass + await async_io.delete_file(Path(entry["path"])) def _cache_path_for_key(self, key: str) -> Path: safe_key = "".join(ch for ch in key if ch.isalnum() or ch in {"-", "_"}) @@ -142,37 +227,75 @@ def _is_cache_owned_path(self, path: Path) -> bool: except ValueError: return False + async def _path_exists(self, path: Path) -> bool: + return await asyncio.to_thread(path.exists) + + async def _stat_size(self, path: Path) -> int: + def _stat() -> int: + try: + return path.stat().st_size + except OSError: + return 0 + + return await asyncio.to_thread(_stat) + + async def _copy_into_cache(self, source: Path, dest: Path) -> bool: + def _copy() -> bool: + try: + shutil.copy2(source, dest) + return True + except OSError: + return False + + return await asyncio.to_thread(_copy) + + # ----------------------------------------------------------------- public + + @property + def enabled(self) -> bool: + return self._config.enabled + async def get(self, key: str) -> Path | None: + if not self._config.enabled: + return None + await self.initialize() async with self._lock: entry = self._entries.get(key) if entry is None: return None path = Path(entry["path"]) - if not self._is_cache_owned_path(path) or not path.exists(): + if not self._is_cache_owned_path(path) or not await self._path_exists(path): del self._entries[key] self._dirty = True return None entry["last_accessed_at"] = time.time() - await self._save_locked() + await self._flush_locked() return path async def put(self, key: str, image_path: str | Path, size_bytes: int) -> None: + if not self._config.enabled: + return + await self.initialize() source_path = Path(image_path) - if not source_path.exists(): + if not await self._path_exists(source_path): return async with self._lock: cache_path = self._cache_path_for_key(key) existing = self._entries.get(key) if existing is not None: existing_path = Path(existing["path"]) - if self._is_cache_owned_path(existing_path) and existing_path.exists(): + if self._is_cache_owned_path(existing_path) and await self._path_exists( + existing_path + ): existing["last_accessed_at"] = time.time() - await self._save_locked() + self._dirty = True + await self._flush_locked() return if source_path.resolve() != cache_path.resolve(): - shutil.copy2(source_path, cache_path) - actual_size = cache_path.stat().st_size + if not await self._copy_into_cache(source_path, cache_path): + return + actual_size = await self._stat_size(cache_path) self._entries[key] = _CacheEntry( path=str(cache_path), size_bytes=actual_size if actual_size > 0 else size_bytes, @@ -181,7 +304,22 @@ async def put(self, key: str, image_path: str | Path, size_bytes: int) -> None: ) self._dirty = True await self._evict_lru_locked() - await self._save_locked() + await self._flush_locked() + + async def copy_to(self, key: str, dest: str | Path) -> bool: + """命中缓存时把图片拷贝到 ``dest``,不命中返回 False。 + + 集中所有"读后拷贝"路径,避免调用方再写一份同步 IO。 + """ + cached_path = await self.get(key) + if cached_path is None: + return False + return await self._copy_into_cache(cached_path, Path(dest)) + + async def close(self) -> None: + """强制刷盘元数据;用于程序关停。""" + async with self._lock: + await self._flush_locked(force=True) _cache: HtmlRenderCache | None = None @@ -203,18 +341,63 @@ def compute_render_cache_key( return hashlib.sha256(data.encode()).hexdigest() +def _resolve_render_cache_config() -> RenderCacheConfig: + """从全局配置读取 RenderCacheConfig,失败时回落默认值。""" + try: + from Undefined.config import get_config + + runtime_config = get_config(strict=False) + except Exception: + logger.debug("[渲染缓存] 读取配置失败,回退到默认参数", exc_info=True) + return RenderCacheConfig() + cache_cfg = getattr(runtime_config, "render_cache", None) + if isinstance(cache_cfg, RenderCacheConfig): + return cache_cfg + return RenderCacheConfig() + + async def get_render_cache() -> HtmlRenderCache: + """获取全局渲染缓存单例(lazy load)。 + + 单例的 enabled / 容量由 ``[render.cache]`` 决定; + 禁用时仍返回单例对象,但所有 get/put 立即短路。 + """ global _cache if _cache is not None: + await _cache.initialize() return _cache async with _cache_lock: if _cache is not None: + await _cache.initialize() return _cache from Undefined.utils.paths import RENDER_CACHE_DIR - _cache = HtmlRenderCache( + cfg = _resolve_render_cache_config() + cache = HtmlRenderCache( ensure_dir(RENDER_CACHE_DIR) / "_html_render_cache.json", - max_entries=_DEFAULT_MAX_ENTRIES, - max_size_mb=_DEFAULT_MAX_SIZE_MB, + max_entries=cfg.max_entries, + max_size_mb=cfg.max_size_mb, + flush_interval_seconds=cfg.flush_interval_seconds, + enabled=cfg.enabled, ) - return _cache + await cache.initialize() + _cache = cache + return cache + + +async def close_render_cache() -> None: + """关停时调用:刷盘并丢弃单例。""" + global _cache + cache = _cache + if cache is None: + return + try: + await cache.close() + finally: + _cache = None + + +def reset_render_cache() -> None: + """仅供测试使用:丢弃单例(不刷盘),下次调用重新加载。""" + global _cache + _cache = None diff --git a/tests/test_admin_command.py b/tests/test_admin_command.py new file mode 100644 index 00000000..cba99863 --- /dev/null +++ b/tests/test_admin_command.py @@ -0,0 +1,344 @@ +from __future__ import annotations + +from types import SimpleNamespace +from typing import Any, cast +from unittest.mock import AsyncMock, call + +import pytest + +from Undefined.services.command import CommandDispatcher +from Undefined.services.commands.context import CommandContext +from Undefined.skills.commands.admin.handler import execute + + +class _DummySender: + def __init__(self) -> None: + self.messages: list[tuple[int, str, bool]] = [] + + async def send_group_message( + self, + group_id: int, + message: str, + mark_sent: bool = False, + ) -> None: + self.messages.append((group_id, message, mark_sent)) + + +def _build_context( + *, + config: Any, + onebot: Any, + sender: _DummySender, +) -> CommandContext: + stub = cast(Any, SimpleNamespace()) + return CommandContext( + group_id=12345, + sender_id=54321, + config=cast(Any, config), + sender=cast(Any, sender), + ai=stub, + faq_storage=stub, + onebot=cast(Any, onebot), + security=stub, + queue_manager=None, + rate_limiter=None, + dispatcher=stub, + registry=stub, + ) + + +@pytest.mark.asyncio +async def test_admin_ls_outputs_names_without_qq_leakage() -> None: + sender = _DummySender() + onebot = SimpleNamespace( + get_group_member_list=AsyncMock( + return_value=[ + {"user_id": 10001, "card": "超管群名片", "nickname": "超管昵称"}, + {"user_id": 10002, "card": "", "nickname": "群管理员"}, + ] + ), + get_stranger_info=AsyncMock(return_value={"nickname": "QQ管理员"}), + ) + config = SimpleNamespace(superadmin_qq=10001, admin_qqs=[10001, 10002, 10003]) + context = _build_context(config=config, onebot=onebot, sender=sender) + + await execute([], context) + + assert sender.messages + output = sender.messages[-1][1] + assert "👑 超级管理员: 超管群名片" in output + assert "- 群管理员" in output + assert "- QQ管理员" in output + assert "10001" not in output + assert "10002" not in output + assert "10003" not in output + onebot.get_group_member_list.assert_awaited_once_with(12345) + onebot.get_stranger_info.assert_awaited_once_with(10003) + + +@pytest.mark.asyncio +async def test_admin_ls_falls_back_to_unknown_name_without_exposing_qq() -> None: + sender = _DummySender() + onebot = SimpleNamespace( + get_group_member_list=AsyncMock(side_effect=RuntimeError("boom")), + get_stranger_info=AsyncMock(return_value={}), + ) + config = SimpleNamespace(superadmin_qq=20001, admin_qqs=[20001, 20002]) + context = _build_context(config=config, onebot=onebot, sender=sender) + + await execute([], context) + + assert sender.messages + output = sender.messages[-1][1] + assert "未知成员" in output + assert "20001" not in output + assert "20002" not in output + assert onebot.get_stranger_info.await_args_list == [call(20001), call(20002)] + + +def test_admin_requires_admin_permission() -> None: + dispatcher = CommandDispatcher( + config=cast(Any, SimpleNamespace()), + sender=cast(Any, _DummySender()), + ai=cast(Any, SimpleNamespace()), + faq_storage=cast(Any, SimpleNamespace()), + onebot=cast(Any, SimpleNamespace()), + security=cast(Any, SimpleNamespace(rate_limiter=None)), + ) + + meta = dispatcher.command_registry.resolve("admin") + + assert meta is not None + assert meta.permission == "admin" + + +def test_admin_subcommands_require_superadmin() -> None: + """子命令 add/del 必须覆盖为 superadmin;ls 继承顶层 admin。""" + dispatcher = CommandDispatcher( + config=cast(Any, SimpleNamespace()), + sender=cast(Any, _DummySender()), + ai=cast(Any, SimpleNamespace()), + faq_storage=cast(Any, SimpleNamespace()), + onebot=cast(Any, SimpleNamespace()), + security=cast(Any, SimpleNamespace(rate_limiter=None)), + ) + + meta = dispatcher.command_registry.resolve("admin") + assert meta is not None + subs = getattr(meta, "subcommands", {}) or {} + assert subs["add"].permission == "superadmin" + assert subs["del"].permission == "superadmin" + # ls 不显式覆盖:使用顶层 admin + assert subs["ls"].permission == "admin" + + +@pytest.mark.asyncio +async def test_admin_add_success_persists_via_config() -> None: + sender = _DummySender() + add_admin_calls: list[int] = [] + + class _Config: + superadmin_qq = 10001 + admin_qqs = [10001] + + def is_admin(self, qq: int) -> bool: + return qq in self.admin_qqs + + def is_superadmin(self, qq: int) -> bool: + return qq == self.superadmin_qq + + def add_admin(self, qq: int) -> bool: + add_admin_calls.append(qq) + self.admin_qqs.append(qq) + return True + + def remove_admin(self, qq: int) -> bool: # pragma: no cover - 未触发 + return False + + config = _Config() + onebot = SimpleNamespace() + context = _build_context(config=config, onebot=onebot, sender=sender) + + await execute(["add", "30001"], context) + + assert add_admin_calls == [30001] + assert sender.messages + assert "已添加管理员: 30001" in sender.messages[-1][1] + + +@pytest.mark.asyncio +async def test_admin_add_rejects_duplicate_without_calling_config() -> None: + sender = _DummySender() + calls: list[int] = [] + + class _Config: + superadmin_qq = 10001 + admin_qqs = [10001, 30001] + + def is_admin(self, qq: int) -> bool: + return qq in self.admin_qqs + + def is_superadmin(self, qq: int) -> bool: + return qq == self.superadmin_qq + + def add_admin(self, qq: int) -> bool: # pragma: no cover - 不应触发 + calls.append(qq) + return False + + def remove_admin(self, qq: int) -> bool: # pragma: no cover - 不应触发 + return False + + config = _Config() + context = _build_context(config=config, onebot=SimpleNamespace(), sender=sender) + + await execute(["add", "30001"], context) + + assert calls == [] + assert "已经是管理员" in sender.messages[-1][1] + + +@pytest.mark.asyncio +async def test_admin_add_rejects_non_numeric_qq() -> None: + sender = _DummySender() + + class _Config: + superadmin_qq = 10001 + admin_qqs = [10001] + + def is_admin(self, qq: int) -> bool: # pragma: no cover - 不应触发 + return False + + def is_superadmin(self, qq: int) -> bool: # pragma: no cover + return False + + def add_admin(self, qq: int) -> bool: # pragma: no cover - 不应触发 + return False + + def remove_admin(self, qq: int) -> bool: # pragma: no cover + return False + + config = _Config() + context = _build_context(config=config, onebot=SimpleNamespace(), sender=sender) + + await execute(["add", "abc"], context) + + assert "QQ 号格式错误" in sender.messages[-1][1] + + +@pytest.mark.asyncio +async def test_admin_del_success_removes_admin() -> None: + sender = _DummySender() + removed: list[int] = [] + + class _Config: + superadmin_qq = 10001 + admin_qqs = [10001, 30001] + + def is_admin(self, qq: int) -> bool: + return qq in self.admin_qqs + + def is_superadmin(self, qq: int) -> bool: + return qq == self.superadmin_qq + + def add_admin(self, qq: int) -> bool: # pragma: no cover + return False + + def remove_admin(self, qq: int) -> bool: + removed.append(qq) + self.admin_qqs.remove(qq) + return True + + config = _Config() + context = _build_context(config=config, onebot=SimpleNamespace(), sender=sender) + + await execute(["del", "30001"], context) + + assert removed == [30001] + assert "已移除管理员: 30001" in sender.messages[-1][1] + + +@pytest.mark.asyncio +async def test_admin_del_refuses_to_remove_superadmin() -> None: + sender = _DummySender() + removed: list[int] = [] + + class _Config: + superadmin_qq = 10001 + admin_qqs = [10001] + + def is_admin(self, qq: int) -> bool: + return qq in self.admin_qqs + + def is_superadmin(self, qq: int) -> bool: + return qq == self.superadmin_qq + + def add_admin(self, qq: int) -> bool: # pragma: no cover + return False + + def remove_admin(self, qq: int) -> bool: # pragma: no cover - 不应触发 + removed.append(qq) + return True + + config = _Config() + context = _build_context(config=config, onebot=SimpleNamespace(), sender=sender) + + await execute(["del", "10001"], context) + + assert removed == [] + assert "无法移除超级管理员" in sender.messages[-1][1] + + +@pytest.mark.asyncio +async def test_admin_del_rejects_non_admin_target() -> None: + sender = _DummySender() + + class _Config: + superadmin_qq = 10001 + admin_qqs = [10001] + + def is_admin(self, qq: int) -> bool: + return qq in self.admin_qqs + + def is_superadmin(self, qq: int) -> bool: + return qq == self.superadmin_qq + + def add_admin(self, qq: int) -> bool: # pragma: no cover + return False + + def remove_admin(self, qq: int) -> bool: # pragma: no cover + return False + + config = _Config() + context = _build_context(config=config, onebot=SimpleNamespace(), sender=sender) + + await execute(["del", "30001"], context) + + assert "不是管理员" in sender.messages[-1][1] + + +@pytest.mark.asyncio +async def test_admin_unknown_subcommand_shows_usage() -> None: + sender = _DummySender() + + class _Config: + superadmin_qq = 10001 + admin_qqs = [10001] + + def is_admin(self, qq: int) -> bool: # pragma: no cover + return False + + def is_superadmin(self, qq: int) -> bool: # pragma: no cover + return False + + def add_admin(self, qq: int) -> bool: # pragma: no cover + return False + + def remove_admin(self, qq: int) -> bool: # pragma: no cover + return False + + config = _Config() + context = _build_context(config=config, onebot=SimpleNamespace(), sender=sender) + + await execute(["foo"], context) + + assert "用法:/admin" in sender.messages[-1][1] diff --git a/tests/test_lsadmin_command.py b/tests/test_lsadmin_command.py deleted file mode 100644 index 40a3b14a..00000000 --- a/tests/test_lsadmin_command.py +++ /dev/null @@ -1,112 +0,0 @@ -from __future__ import annotations - -from types import SimpleNamespace -from typing import Any, cast -from unittest.mock import AsyncMock, call - -import pytest - -from Undefined.services.command import CommandDispatcher -from Undefined.services.commands.context import CommandContext -from Undefined.skills.commands.admin.handler import execute - - -class _DummySender: - def __init__(self) -> None: - self.messages: list[tuple[int, str, bool]] = [] - - async def send_group_message( - self, - group_id: int, - message: str, - mark_sent: bool = False, - ) -> None: - self.messages.append((group_id, message, mark_sent)) - - -def _build_context( - *, - config: Any, - onebot: Any, - sender: _DummySender, -) -> CommandContext: - stub = cast(Any, SimpleNamespace()) - return CommandContext( - group_id=12345, - sender_id=54321, - config=cast(Any, config), - sender=cast(Any, sender), - ai=stub, - faq_storage=stub, - onebot=cast(Any, onebot), - security=stub, - queue_manager=None, - rate_limiter=None, - dispatcher=stub, - registry=stub, - ) - - -@pytest.mark.asyncio -async def test_admin_ls_outputs_names_without_qq_leakage() -> None: - sender = _DummySender() - onebot = SimpleNamespace( - get_group_member_list=AsyncMock( - return_value=[ - {"user_id": 10001, "card": "超管群名片", "nickname": "超管昵称"}, - {"user_id": 10002, "card": "", "nickname": "群管理员"}, - ] - ), - get_stranger_info=AsyncMock(return_value={"nickname": "QQ管理员"}), - ) - config = SimpleNamespace(superadmin_qq=10001, admin_qqs=[10001, 10002, 10003]) - context = _build_context(config=config, onebot=onebot, sender=sender) - - await execute([], context) - - assert sender.messages - output = sender.messages[-1][1] - assert "👑 超级管理员: 超管群名片" in output - assert "- 群管理员" in output - assert "- QQ管理员" in output - assert "10001" not in output - assert "10002" not in output - assert "10003" not in output - onebot.get_group_member_list.assert_awaited_once_with(12345) - onebot.get_stranger_info.assert_awaited_once_with(10003) - - -@pytest.mark.asyncio -async def test_admin_ls_falls_back_to_unknown_name_without_exposing_qq() -> None: - sender = _DummySender() - onebot = SimpleNamespace( - get_group_member_list=AsyncMock(side_effect=RuntimeError("boom")), - get_stranger_info=AsyncMock(return_value={}), - ) - config = SimpleNamespace(superadmin_qq=20001, admin_qqs=[20001, 20002]) - context = _build_context(config=config, onebot=onebot, sender=sender) - - await execute([], context) - - assert sender.messages - output = sender.messages[-1][1] - assert "未知成员" in output - assert "20001" not in output - assert "20002" not in output - assert onebot.get_stranger_info.await_args_list == [call(20001), call(20002)] - - -def test_admin_requires_admin_permission() -> None: - dispatcher = CommandDispatcher( - config=cast(Any, SimpleNamespace()), - sender=cast(Any, _DummySender()), - ai=cast(Any, SimpleNamespace()), - faq_storage=cast(Any, SimpleNamespace()), - onebot=cast(Any, SimpleNamespace()), - security=cast(Any, SimpleNamespace(rate_limiter=None)), - ) - - meta = dispatcher.command_registry.resolve("admin") - - assert meta is not None - assert meta.permission == "admin" diff --git a/tests/test_message_batcher.py b/tests/test_message_batcher.py index 961e9cd7..09048d0f 100644 --- a/tests/test_message_batcher.py +++ b/tests/test_message_batcher.py @@ -429,6 +429,46 @@ async def flush(items: list[BufferedMessage]) -> None: assert not inflight_task.cancelled() +@pytest.mark.asyncio +async def test_speculative_cancelled_when_already_sent_with_allow_flag() -> None: + """``allow_cancel_after_send=True`` 时即便已发过消息也强制取消 inflight。 + + inflight 协程会捕获 ``CancelledError`` 转记日志(_invoke_callback 默认行为), + 所以仅靠 ``Task.cancelled()`` 不足以判断 — 必须看 callback 是否真的收到 cancel 信号。 + """ + cfg = MessageBatcherConfig( + enabled=True, + window_seconds=0.2, + pre_send_seconds=0.05, + strategy="extend", + allow_cancel_after_send=True, + ) + + fake_ctx = _FakeRequestContext() + fake_ctx.set_resource("message_sent_this_turn", True) + + cancelled_event = asyncio.Event() + + async def flush(items: list[BufferedMessage]) -> None: + try: + await asyncio.sleep(5.0) + except asyncio.CancelledError: + cancelled_event.set() + raise + + batcher = MessageBatcher(cfg, flush) + + await batcher.submit(_make_item(text="m1")) + await asyncio.sleep(0.08) + assert batcher._pending_tasks + inflight_task = next(iter(batcher._pending_tasks)) + batcher.register_inflight("group:1", 100, inflight_task, fake_ctx) + + await batcher.submit(_make_item(text="m2")) + # 正常情况下 cancel 信号会在 50ms 内传到 callback;超时即视为未取消 + await asyncio.wait_for(cancelled_event.wait(), timeout=1.0) + + @pytest.mark.asyncio async def test_speculative_disabled_when_pre_send_zero() -> None: """pre_send_seconds=0 时投机关闭,仅 T1 静默到期发车。""" diff --git a/tests/test_render_cache.py b/tests/test_render_cache.py index 3a641913..7ec6b8a0 100644 --- a/tests/test_render_cache.py +++ b/tests/test_render_cache.py @@ -1,17 +1,20 @@ from __future__ import annotations +import asyncio import json import time from pathlib import Path import pytest -from Undefined.utils.render_cache import HtmlRenderCache +from Undefined.utils.render_cache import HtmlRenderCache, compute_render_cache_key @pytest.mark.asyncio async def test_render_cache_uses_owned_image_copy(tmp_path: Path) -> None: - cache = HtmlRenderCache(tmp_path / "index.json", max_entries=10, max_size_mb=1) + cache = await HtmlRenderCache.create( + tmp_path / "index.json", max_entries=10, max_size_mb=1 + ) output_path = tmp_path / "render.png" output_path.write_bytes(b"image-a") @@ -54,6 +57,161 @@ async def test_render_cache_ignores_legacy_external_paths(tmp_path: Path) -> Non "utf-8", ) - cache = HtmlRenderCache(cache_file, max_entries=10, max_size_mb=1) + cache = await HtmlRenderCache.create(cache_file, max_entries=10, max_size_mb=1) assert await cache.get("legacy") is None + + +@pytest.mark.asyncio +async def test_render_cache_evicts_least_recently_used_when_entries_exceed_limit( + tmp_path: Path, +) -> None: + """超出条目数上限时,按 last_accessed_at 淘汰最久未用项。""" + cache = await HtmlRenderCache.create( + tmp_path / "index.json", + max_entries=2, + max_size_mb=10, + flush_interval_seconds=0.0, + ) + output_path = tmp_path / "render.png" + + output_path.write_bytes(b"image-a") + await cache.put("a", output_path, output_path.stat().st_size) + await asyncio.sleep(0.01) + output_path.write_bytes(b"image-b") + await cache.put("b", output_path, output_path.stat().st_size) + # 命中 a,刷新它的 last_accessed_at;之后插入 c 时应淘汰 b + await asyncio.sleep(0.01) + assert await cache.get("a") is not None + await asyncio.sleep(0.01) + output_path.write_bytes(b"image-c") + await cache.put("c", output_path, output_path.stat().st_size) + + assert await cache.get("a") is not None + assert await cache.get("c") is not None + assert await cache.get("b") is None + + +@pytest.mark.asyncio +async def test_render_cache_evicts_when_total_size_exceeds_budget( + tmp_path: Path, +) -> None: + """超出总字节上限时按 LRU 淘汰直到回到预算内。""" + # max_size_mb=1,但单图允许 600KB;放两张就会超 + cache = await HtmlRenderCache.create( + tmp_path / "index.json", + max_entries=10, + max_size_mb=1, + flush_interval_seconds=0.0, + ) + big_blob = b"x" * (600 * 1024) + output_path = tmp_path / "render.png" + + output_path.write_bytes(big_blob) + await cache.put("a", output_path, len(big_blob)) + await asyncio.sleep(0.01) + output_path.write_bytes(big_blob) + await cache.put("b", output_path, len(big_blob)) + + # a 被字节预算淘汰;b 仍在 + assert await cache.get("a") is None + assert await cache.get("b") is not None + + +@pytest.mark.asyncio +async def test_render_cache_disabled_short_circuits_without_touching_disk( + tmp_path: Path, +) -> None: + cache_file = tmp_path / "index.json" + cache = await HtmlRenderCache.create( + cache_file, + max_entries=10, + max_size_mb=1, + enabled=False, + ) + output_path = tmp_path / "render.png" + output_path.write_bytes(b"image") + + await cache.put("k", output_path, output_path.stat().st_size) + assert await cache.get("k") is None + # 禁用时不应触发元数据落盘 + assert not cache_file.exists() + + +@pytest.mark.asyncio +async def test_render_cache_persists_metadata_across_reload(tmp_path: Path) -> None: + cache_file = tmp_path / "index.json" + cache = await HtmlRenderCache.create( + cache_file, max_entries=5, max_size_mb=2, flush_interval_seconds=0.0 + ) + output_path = tmp_path / "render.png" + output_path.write_bytes(b"persisted") + + await cache.put("persisted", output_path, output_path.stat().st_size) + await cache.close() + + # 模拟进程重启:构造新实例从同一文件加载 + reloaded = await HtmlRenderCache.create( + cache_file, max_entries=5, max_size_mb=2, flush_interval_seconds=0.0 + ) + cached = await reloaded.get("persisted") + + assert cached is not None + assert cached.read_bytes() == b"persisted" + + +@pytest.mark.asyncio +async def test_render_cache_close_force_flushes_pending_metadata( + tmp_path: Path, +) -> None: + """节流期内的 dirty 状态在 close 时应强制落盘。""" + cache_file = tmp_path / "index.json" + cache = await HtmlRenderCache.create( + cache_file, max_entries=5, max_size_mb=2, flush_interval_seconds=999.0 + ) + output_path = tmp_path / "render.png" + output_path.write_bytes(b"flush-me") + + await cache.put("flush-me", output_path, output_path.stat().st_size) + # 未到 flush_interval;元数据仅保留在内存中。close 必须强刷。 + await cache.close() + + raw = json.loads(cache_file.read_text(encoding="utf-8")) + assert "flush-me" in raw + + +@pytest.mark.asyncio +async def test_render_cache_concurrent_put_keeps_metadata_consistent( + tmp_path: Path, +) -> None: + """并发 put 不同 key 时元数据条目数与磁盘文件数一致。""" + cache = await HtmlRenderCache.create( + tmp_path / "index.json", + max_entries=20, + max_size_mb=4, + flush_interval_seconds=0.0, + ) + + async def _put(idx: int) -> None: + path = tmp_path / f"src_{idx}.png" + path.write_bytes(f"img-{idx}".encode()) + await cache.put(f"k{idx}", path, path.stat().st_size) + + await asyncio.gather(*[_put(i) for i in range(10)]) + + for i in range(10): + assert await cache.get(f"k{i}") is not None + + image_dir = tmp_path / "html" + assert sum(1 for _ in image_dir.iterdir()) == 10 + + +def test_compute_render_cache_key_is_deterministic_and_distinct() -> None: + a = compute_render_cache_key("

x

", 1280, None, None) + a_again = compute_render_cache_key("

x

", 1280, None, None) + b = compute_render_cache_key("

y

", 1280, None, None) + c = compute_render_cache_key("

x

", 1024, None, None) + + assert a == a_again + assert a != b + assert a != c From f7c254ac97d36c532f4fb9be9146ddedb8df2b7c Mon Sep 17 00:00:00 2001 From: Null <1708213363@qq.com> Date: Tue, 5 May 2026 11:17:21 +0800 Subject: [PATCH 34/34] chore: update NagaAgent submodule and remove deprecated asset --- CHANGELOG.md | 1 + code/NagaAgent | 2 +- img/head.png | Bin 2607549 -> 0 bytes 3 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 img/head.png diff --git a/CHANGELOG.md b/CHANGELOG.md index e648a978..ed2646e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ - 补齐消息合并专题文档。新增 `docs/message-batching.md`,覆盖配置参数、等待策略、投机预发送、竞态保护与关闭行为,同步更新了 README、配置文档、OpenAPI、WebUI 指南和架构图。 - 补齐配置注释。`config.toml.example` 中所有模型配置节的 `prompt_cache_enabled` 均补上双语注释说明。 - 补强测试覆盖。新增消息合并单元与集成测试(686 + 326 行)、工具调用守卫测试、发布说明脚本测试(163 行)、Runtime 探针统计测试(120 行)、系统提示词约束验证,并更新 `end` 工具、管理员命令、管线注册等已有测试;额外补齐渲染缓存(LRU 驱逐 / 容量驱逐 / 重启恢复 / 节流后强刷 / 并发 put / 禁用短路)、`/admin add|del` 全路径、`allow_cancel_after_send=true` 取消语义等盲点。总测试用例提升至约 1660 项。 +- 更新子模块。 --- diff --git a/code/NagaAgent b/code/NagaAgent index 6cb72251..5b1ca050 160000 --- a/code/NagaAgent +++ b/code/NagaAgent @@ -1 +1 @@ -Subproject commit 6cb7225198ef169ab797992b74ab05eb82b2d233 +Subproject commit 5b1ca050c877e4aed9bdaf0777418a377f631176 diff --git a/img/head.png b/img/head.png deleted file mode 100644 index a247a487270906b4cd90f4e86dc5412852e473bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2607549 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 <~U(;P{;%C1uZ7C3O}U8R-3Mwd{mGO7C-W8 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
    TB24um9YS7xMW&Sq;&LkH^|x9nhQaIqx|6 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 biYt+^Z*x4;6w)mq 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�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�r2Qd+bertE6pp-`lug3^jJvpJ*E{I@J&A=3({Crv`GRM>OUnXIj8fKV$bek_i@xXS)?wrPR=0#GcpR z73#)=e&%{NVBg#5{cB#=DG;58vM#-ikxR>AC`(BdWypiEnFpbun~(;cPI+Ou2GIz# zlMPRZK~2%VKN>9CLxO!;X1iO~nJuA@9Kzb-&;CAdwAY9>O|YYSlG5?`3?ZrR0N*0>Mgv4`zS?FuATtmk00%gQ>sTwp!!I zd>7SR7DsUPLz&@uW553uOUb%Z&86%r=6*~=AD!EEZM^*S+;O$%=XGOat)E)!KR3Q7 zq@Mxl5@TcsLZpwIi%P8U73HitFXa};#V}-0(I!wCcrIs(rWk@wZ?{G22Z5q~RSM33 zB!^7#%cbEy(@XtCNjPys<}Q0$dYI~W1`a{mvc}7Jzij`{|3}i9z(bw?e;lhCm10uK zNN5yg%8_x$PL%s>llv;dxNj2Glyf4v$FYuaB*(;z+?7zdat&h~TZ%M>$`zvj+wX7p z(eA3P$b3Ja_xtsFJzoW-WcolK?7zC**&aY?eFg-FS&65yF?+>QGQ|YI@~Anc>0;!G zbEu<3uK-fikyD3@J2~W(J}{~IIUS;7Oo*^Z-K!gQ5^>iAkqvx_lxcze)^| zv>$FUR4pR(qk@{YBVgSna+<_Kx=mL{Gzra(Oum!?(3vC`y}BX^H!BwpBW4s#j|5G) z1&NEB5YPz_*MO}uLC*xht2)p{0$w2SdYHt(oTnGdC+04x1vxy?of=nAHTgQ!4swD% z76p3(8?l#y1WwJ}9J(B$cew$)4ML!xW<1I;iA9h0u_4BqfeP!Z> zNa1CvoAp+?4Xbb9^~u60PKIoZuJ&!etqNRPZ*1)(WjC^qsiNX5uWBnCGdmCpcuJeL zwaC6iwVxjkZoWy}{Gb?FqqzOZd%bt@SLNcA&HPYHH@1OMu=_ohEj*Ro6JB>s|0pD3 zNCDz9*nCM&KJc^VOFp$Vm<|bmIP1v}+E>{L5V=MQZvQwM{`u9b$@VRMYgHzUW+@-6 znbRwd9#!FlfVLNq)~wwVasz zTxbDUOlw2Ic$ZcUTA)U*wzf8-4|y_J!7uCEvlDdlk>IUol_M-Oy&;+8B$G1dO#AW1 z0DL)XA2wM}O7sC9bry%fWFsI3o$ zEAkQo0{y{MDqT*0grS7;TC%K_@+ir1My=T@T~G9#AiBEWur>r6w_{;}q^W!J;=H=z zgioPXgCilT@;uOzzxgnLeUU2uGSgHX@wU>LDwMZ66ux%OW^C+f*Oyo3c|Q{x7gZwH zBGzo0W-Ap#*dwbl>eKIxLqA{?)wjL>oKa_IPclZwo&{o!EL|sV%eKPcH&7oBal&{# z{}<;Td9E?z+0LDLKWbgkp)(EUEagVXud=Eisc6>U3+iJE3~#8TCg?<3h_!1M5+a60I)WP1ZVFBN$Mciiw^y z?74$!@M=%?@sBkTbrZad8bF~)OGIUQPTfR*UjyCm&%nnO#ffT4P3Wxr!V90idTWu} zU6{nMALswj^E85el}SC(**34+yL?q_ATA|chu1k~#cN(>OTf{r3GR>4Pm=XwEiLpU z^+fThV{ChsKM$)`GoDz7E;a|R)a=sae{mC@JH%=C=G&*EnPd_8c)+ z)Zy!O!~5F(I$B~6%yRC80VzjERh$G4m+YyF8N6(!r2}SEGf>0arT*Cq+<&p1h*`3D zK^nXdtZVQDlt_X{C}F<6X-b*4a(br(<-A?k#K`RmXH{U13l(uVLZLAXJ66RfZ$MD# z&5&P~pF5mgnCN`=iDw56q?H36-Ox*ag2Ju@M2NDb~m!=7c zeMB$-u*w@nBvLqI5YV>f2?cP~ucA18#*EOoM?xs1!s85#UTi`9W^~s(ei%Zf zW!z9UxSER_MiH}><`#wA3PZzY9>5SOvz{gcgH8c691=!XPMqV(By<7D+CpYhRFLlw(9C9~!Zs-JyyO8*SZ?l_nQnjic^nFg zvC`9kpDfi10D59*PAvl4R~Sk@#|XF`JGy%SHGoQol|_m;K~~Dd1ib3}T>8kUR}gN8 z?rRR_=IN!*D$CaHYe9nVQ6bfWe1G$>DHd8sYH?9Q%=J94P1e zluOXS4e!5%Ab6DS3)GG{x>VV{X%?^7{|s6p>YDpcFy|97?|Tcp0!+VHq4%dCG_T_d zbQI7W+(n-Fm&oM(Vm#G@N01Kt{y!JsK2(6HmOu1%dFVNLkb?%0o+LDyUv&S@nGS`2 zFloZ53xl;O4yj4NMe*N5BH>Dqd=e7g(5(>#R6)KY2Oa*3;^ojm$RHi63A})&)D(<8 zOSpm8bl{HSMsU(3j^WXq4nPRx#3^CM`!-6{wvL@&`--yr3B@!oI@Q0dZU2s~8xLvo z6D)qm176OVQMH7f+@eSc{#}YP))-^$ath$!nQqetCH(KZOWRKkW-_v@2L>?eM)2JL za~@Ko8vJ#`zt|IPI4D3BDihG#8ipj6Md)yP>uhDsT8_P^r?(hW=Q-t-=Kf0_G`;=P zR~zk2gM$xFBm_=P%obD17OOL1`jXNwW}T6FWUiy&J~Fbo(6ZTGc4)df?3?}8u*PqO z{c=r@SBtu^u<*RyiyG_li&eRicYk%zuYwVw*3(4dR(7VjFJ@Motnr8ZSX}EhWixypTw-iJTiNg(t zAGdw`crg6!?Tf8zm799RI~N;6KALsS8BYB)1nS@d0A=bD_&~(6IffU0?Zg;7FdbippyT zJ~3Ur)1q$PfBt(_r>65UzA;>a>AvWLEjM6){*hBgHDKIuA>7jSuq~x?z}INZ@V4JI zR+z$p@)all>8caKOgd%SQ*gp8nT;j$h5*zJE5KDpXvU^F)=zR4s3lWwWQ5>Am(%K2z${4}DJ!QC3rZjq6UEqm-JpiSVi8 z!CulXHKB_8oyU;iKfdcG1`NvrE)|UTTb_69oEb~bG`OTTUtgrf* z@IBFOUmce}x?hL7PWLz=7L;|)y5EB5ty1R0;v&RNI&zfL_ULnpwf?0nx9n@tu2VBa zyP*2;An!%9k-lPIy_3pN8Btr}m@NnEe7p6&Z4i;She~!_eC8g%U!B-y+;(ov>(S!W zEn){~jbZ_J2q-y@A}e>T$KnM;1H+~K+WfE~<9KsZ>~Pr;p8J;s?((L+jIH=ir_;aP zT7go$DbhN20dSq>HCF~%vmx+7 z(0HF8(t+ZGK6F$-aSoQoPIJSfYON~lKk+Nt_}g5GzJes5EtlHPXu-YE-CobW(Q>3mkG*+ka;>IvwdT%b@KPly)lAckz>)BnNW>%| z@?*rcb*Kcii77%;QcED!gfmr=OP6-HyPIBZ-DTja0%m@(A| zS#t6?F8>Dr@eq3{$^*P*X_t3{PsybmO``Jd)jY8{1WR%r|Zr^Bs!DmUdJPHJD1sB`QU~0K3v>3pq&V&%f@qh#H zmT<+{D+Oe-N??;o0VZ1;m}B600i9A)5-kQcN*x^-^u=Mq-MRZDqd9TOZw_=}wHZn4M(L}?swxNQnuTs2LcaG-T zZdrBg{~BYnvj%TC?H|n$?4m5x&3hx-ty66S(gLFm}zLj|xZ?!$~W~$Wt4;G4SAGTj< zO9$W5VY@$6uLc)qC6#ZDW8>mn4Ck3qqa0=5u9G6$fm6SZ_rWve;ug$8Xk zPF%Y(Vjn!SOg#V4 z|E1(O@#(SQQrQHM9xo=aa-2!0jdQObJgZek4x&EhAG_Y|k@`~9kwfgS49Vy6gQm6h z_5EWZ&{*U&saR*V_b%m$*X^O7eG1USRGfSZ^ zPhd47S4q~oH9blhmbpv|Jt`3+&fJ>{t~A_{7z2G9F)>&_=^EiLh8Dk-Y*smq;NPtA#45&grlapNAGI#`IWa&G&|Rs=((7y z+E`!Xs7i{KH5b(b@A7|EL&5+2E3V&j!LOy?73C7oSpV`ZcWKY*Ds^=ux1pZ1m;WyN zw%Hyr+jpd$3RQ0})MCuyaAp;zaWbY{z-K3*|E`b__jBJX6%Y{O=3J;6(Ib`W)%CW^@=ZV$t9y1YBBj1pg@8?HhrKdivV83#B@)ObCd%W>iUF34PapWia)f&GZUd2=u zdyxuko#IGWVGS^L{8|`+RPU3SvQrF|Kz87j@?rVhpG5`pn?_>Hd)-=b$m!~q?X+m` z;~ICEgSjEon1c`IUe`CeZb7|tYNeJI*4Ugi6G8gv^XK1CmB4R95g-DHCaJApYhUu5PN&mSTSLWxeNqp*~)a7C6rdjn$mJ{3>@ z;U@?H+r#8-6eZ`O*`u^*Tal(89?fs+!xwKcaGVFE2y8R1@X#087?-MLNK&h|Zh;mT zeg4nhssL8SPSupx)c8e)clSnRIsa>ZSUSREh=WG}KJ~GZrcjbKWCk-TyP;*VaZFo4 zcQ=G5lL4jym1xtFaeTc9ZBrdvqH|{uRKbD;XL@`4ru_z4WF;orxJ}Sh93B8Bu|VG6 zwDRC7O9L2gk)#CrSQH(p%l~hTNh!TlA?|D3#yOW7D-Qx1v?(*RHV>0__`QM1%i8XD z2A_2vd0IW1?jNE<&ClQvB)}fJT~BP2c{F|Drps6qnt6FQ(?LcY%}GP!@y<+y%ypAS zBsnNz7QeR#TleR?lxtoHlg!pWZHD9Gi{eMdAfowp?~f8l#_fPyXKfW1H`ehKS!;av zQB-_;M~9RDMf>hqR6L_#al<6$EP5AUqR{B8dPKlPQi1-dUncRtf0roG(n^6nUDTkP zj38g^E3VAiXy0r&Z&mnrR?GhV?Q4iBUjKtmLemx3!bputHX=nhHPrZm0Q_N!aVr!^a_vHn9?->hoJvaY(X_Zw-hcF;`uG1R zpZ%ua?LOCNhI1IWSIfKmrP>qj4pFdjazDQmXA)aV=1#r}O|+wFXpSVpn;HlyAfU_$ z6u=}XNf?D9yQuvf(B_k*sdn^!Jq~hs4%SEq6z6LWLH|r5uiTLs*W{P9p2Kc`Yejq; z%=7B{T(?reS}-?s>PaJ2Db8YnZXSsq?ZB4@1|S?`P^J~-RS zS)Z-xVdnn4syBb4^4x-mm#1_?3@z74MD=1`Po6K!wlkRKYU^6pZF9Ur@kqRzdaBTs z%`Pwc%^FW#qnrM7POcuCy2cGl8~Zd?X#SDE_C!*ed=^!kwnz(8;ZwIKt@pF~ zby4z9t-9FjtA-$Z)!msoI2pLseB#&k2@}2FKTd4_Q}*RoY=tjWeVwaI#5{ByZ}u7O zV}&UXS;^K^R^{VGIiMgwvOVq!>M@$_F89sE{cpKW7q2IQNH0-EMw>+Na zjLCWS<<;}Wna!hXox=e?f4ytlYI9TwBu8g-V2R4Cji+x76hRV`PQei6p)N6yYAu3k zjIs7=ag2nJ+%ok5>+jc@u-1Q!E+bm%wOS=!_R=Ew(wFd$?<%b zlb@JGRpW%{=2qmO!BGLdeLN{Xv+O=4|J$yM19mQ#XcbAGVlOWz_e_%Y&#%6XUa)QA zwp4#+QI0hNg6LpvnKt+Cmq&EO4dpYJEENyH3MX`mH+nN}qa<>@=*dX-yOpreIZgw96_ni;-4;)PFplHh&@?O>VZ6H>pymhfuC@?&93g?CW_qxb&c2290 zA8QnkwXa~xq^vk}Uu%_RLj#0HM2MR-HF99;qT7sDO~6Q=()z{4<#UOlznr}yf7@@p zI=}Un(dZ4%7Lrj;ef~{x%t0ty3+}t{te`Z=R>Qtl)*zVOqgWPT95H^V;hYZ%Tm!{E zqyZk6dOMBJkI&cF1&90?pHS5Jj3gtZ`eP?u0Rz`+e#rmcrsrQ@PWSPW+4L=r` zi%mX#6N#bkj^<%p(tGW$ce}#Dl77w(fYha6NqQ59%)r0ZiuKKS==hJvYzN@DX|%f8 zrS|&pzRBP|Tc)bDs%j@7SCk$dc;x=3tNDGo2Aj6E_@{sBqR^(VaEY&qQii0SuaBGh z{(38;!K8>0s_#>Y@#i|)2FTh+nMPgV6T_o7psFed>c<2! zTs{QM030QjYUXaS3G3OX1yLO6b5CSx7#`J}D72&QZc&nF-%JE%#TfX@=WQF7^{T%6 zff`rr_|3f{za?$`Szch^&eJ(q0`0?tb3i{RNGT;ds2)$|FxMA&V1gm*yw6^t(#6dI zxOJCXl$n{?+s%Dnp7a)fiIg@N^1{kaMXf0$ptjNO#G`3H1!)TwboiYI!b_NX!ZakP zC4!*qWakM#3X&mTvL_ShmC|^WiKB<}cCc~%rf%Ph@BgBzH2i~RlOwr`*`IL%o8HJ(LuZ?#m17VUoKSLs+tV!TyC-#JDEH<{VHbIaQ zM2YRc9L2@0lZ+^ngpD0o^~EG1Qf#JmS2Ou7pn{9p-6_@V3rTZuw7F%CDP1Ueus>4= zz8|oebYwd%^pq4187Fx?!z9Yj9XcbMtpGd(2$G&mS`9fTQyIeG2N=akAT=8tC12)7 z`dJ~KWYQ>1sG|VGBxf>*vnChpFK_6AkrVokIh1ky$pU|4p7KLILp)4gEz7put~a6h zTC2hoN8a(u@Z8|$6MG;IybfT0!PQ7Eit}$5p_AytWja*JdwfU>0zo$Is<=Cm@eKY? zC^@=pQF!fvKt3Gtrg}q95yJ(DR1?gZd_K4f6+yKSzZp-UM1vKWaKzEENciR4m*FY^ zfepUooxBme#UONXlH6&M`QpO`LT7fUn&N1Feh9=R35e;6;c%jWFoDi<1Xx>=;Yrl} z7YHMQ9QQdj5eZ2g_jhq%*Y-hUGXTAGp=vIfn`)+hbKf zoA&-)MKkjU+&p1nm-1J5TXs?f;jF?cuXcT0rSxh(TV2})sylP_QoVgQr#whJT;B`0-tQPY+_J z#Lv_{#|p)~;i^~_C&(1g9KYsc@ht|9`S(X&C*pL-acATr(*W>D{)odooap8KD9f$8l8FH+!x}`<82pCr1&?mkJaU=Mf~gyKOYd^ zlJd1t=)wBsx|*865ynytkuf)@O4c!o9ZRopCb3pbJbW9j-rd0{7*4-?a{7Hict=FK zSL+(2T&d}y9|})wU()zxJ~AFMQQq{)c{QjH-O)&=VpkJ(?n z9xY>M&mUa<^F8rTfJeB;#k{I(XNC4OhLfvvPX*$ZBN&r5DFtOzsV41CQRHORH*v-zUtRn-JtHe!3uve{aizf`B7>)rUcFa_KIt%-NAB36A9BGb^4yyH9cNc2%YNU z;$&#NXQ&PhUNbT1s@83xC%WZSm*Shc$i0y4B&V4B{gaIX9$8P&wk|EAq2Q~po@_k0e{gz=S||^ zv(SniOZ64f2U#HruP@rrqB`DMYX=4nN5zWhQ~@Y}Byh`_5%!zDPa5nfhI3O>M~VPfDnW1V(y7sj=wQXm!QIL>%#T)(ogbd-KDeEwu{Ho>E0 zU|8~7qnF@A0PwSlQC{x7vR5+Q^rl;?l268%j6EFt2Vk?sIlX4_J^df=^oPtWm-%K7 zXq9CCIvD;rej>P!fm~Tu7|B)*K0P=@2lzZS-b!Ce`yX;z%=L5WZk4S+I#j(|Hz!pW zZqMsC{aXFu9KB}~wY0uKhJZ*ooME>1@~EH`gcPV^L4m?ow5HaIuywRxBN2_DZ*QQT z!mDv*&K&jVxQ3HTFw@_YTqp|WO+rQ8M@$z6Tcg%F)C!?>%q0yXs!P}q>Do=U)yyj5Mwrs)M^vN?~c(-bK6LkeZDjJZ;?6t=}4AF&sQW z@3`&i(Nd$%oSZ+p0o;jJ`epsYUtw5;QF5`t4Eza2n*3w|DSH!8VKk63DE0_j4&10>dsSRZ~pmDYHBImc>SaOW;E6ir4C*7T+o;Z>J~G_ z$WQ!`b*8(ai4VAuEj$!SJxAi(dwc1IXM-2!*f5BQKc z2vLJA3^2hlhzEQK9pwHr?lThZm}EY{Pg(1qOcIBgun11K%CpqVQgM77NDgp^AkDN) zW2>wEccwdD)=dv*ml{$|1(n`G??^KTWVK8h_g?KXZOB5yi;;sXNdQg>c-X(diRuD$ zj7KUC%`L{wr5SYy?2HBb0{^z($pbjqDU{1Db~RnLFMQ}8D`X0m5uRZao>Y^^?vkQK zXAbL%BE0{Skb?ZgO_ z!^sky2=T8t3A8k)0~)44z0xXEeFEHlC_T`hA*w6J18)TGWG-$9FNkYB*3*J5&fZ;@ zLHLh3%Y{P_aGbl*XdJYJk7m+dIat3{i{j99&;==#b0;RS6Q>h>*>R*}H@dq0u+(X+ zP7nfomOQ6}Vy~aGm|bjMV^1y*OKknF+VZVHkx(_Y{F*|#aO6YvdH8$$oRm5+G?g=@ z)M>(2M!ND)CN4(5KOtA-o1IV$wFo^!YCs)THUbysm8wq2JtXY((XGf>YHwwGO;?tv zd(QrPrw>t`FeamiXvoY!I-Y!&NyAxn<SNQ{%_7YX$uF-Ik6R(&?{z(Mm}+%i zWtMA6mGXM6b)Vh1ZOd|3%P82ZgZtDQTmPJGU2*Z=?1<0k_~JJi*yhf$FZ4!Mv7QQhjAIBP*t0)TaBS zlX?QJBk)N!gd+bI&?Z@7o~;5CFQ;WjEB5+A6<>K<;JYN>4J~1>JBri1B5D`(6ra&I zH}_bhRR3-c`C*2!O;I_(7%)SOXBA~j^PpZj+>NUB9I32~cKh>RwMFo4R~V;q5n7}y z^l4nOpI&Sdp%};sS7QyB1Oc5>CC>(2Mr7+1swvfSfYaF9F^7GmHRYL$CnnF8X@4j_ zvUflbpP(fq#SM!EPC?XPh?gM!qW%)prFm*b5!r~F#hRsB$3{+`xtyGx_BL&aNOTA2{$o+y7~k7g;Vny67?yR(~$eS62L)`v^p*<*$kBoBJwpwF=NL?YJGM1F!cKt z<-QkLRmv?2MDwArTDu%r4^!&YK5tDfsoVXQuwQtc6S+jv_)U#m+H7t5%EBDH^BtZh z3(Y1wURxh!KNH4};6Mg&cU*GHABC3JEm#MH} zWJ2w#`3KN{4-Qr@xExO&yeC>Lrq9CwRHgYwH*8(u7z7+i!WH#Z%4wr)H5HYyvGMV# ziDsYePfi}D4T2+2E&3aw;nG z7VXEponh5|r_5{mm;Lt2lf~xnDz9$q=PE*^{FM96!x#4I$GP3QyZ3F{eg|fe5>F4Kq^m^+tu5w;u)v>OP8JY1AjnvZI_SUVz-7P_4C2LBjX=4Ficd3-3UUBk z&!JY(5pU&E^EXC*(0nNc03sc9IcCb>kUJ*6{WriEUYmnA=xF%zNs*0zN#y~zU0I`a zC)bNiMuz9P4Q=}dn?&qhR!K7sOA zGq(oB?3ezqhzkeG9h-BD14$s-ja@LB9xZkgX38W$BsC4A+eP3WeT#hEdjWC*n#nM^ z!JPnS1_~I|C0rHP)4@I0($o>-B$vV`3^X+8Cz4}9={eDo@fE5-Nj0Mx!$ixvoo{Tr zSdPka*RQO^#~?c9VjhN($axFEshgxHAw9^+?jehqGdW_cQ0|LRTIr|1>6ud1QjJpE2a9l?Vn|)S9oUU#oz5B zo8Q3$QSy7se4*h-2dkvaF&Zs}KB?QWTMFWGe~BAr`M#%w?o{5D=sJ%F+Oiw42IPkn z!>kMD{`$r}(<#nNN})TQQjR}|po9Ef%Cn9#Qjfr0)b#gH=hu=WR{)B1p5{>j&GS0^ zU^VijuWUVY>8fNEyNzXZ(r12;$(IBh&4<{q*$eD!rH4aSPlvFf>iJ_g#T{oAN{mG+ zA8rkQobxblp7Cg@wchLkIl;qQZLr5RI{lp5beVDMx@jWEzJ+EsZEz&#VqLJNq}kT9 zc;xFn(Oqdq3fYQw;l<^qjbeBgetavDMmqN z+1maK)$U7UO)^-FH?`vLDQ zr^MUyi(3mProunYzZ>j?Os$CT^h$|dKRJHWvEdx{NR1GftloEb*UHPs>Fu;7n-!3T z-QLGMw>h3_1rq>ODh`|qO2qPEg^}Fx@oeKkkkC*ylI^Sgex9`|W8v(Pu;G@Dso%r) zt?$d52DbYr&2xiT6lc{XVoMrFx|Q5SPlFXJta);5OeyHo=*Ry2BFm|>w=!v)E%!XH z@MuR#OQWI0LS7$Zs@HZjcx{mV5K>@O*SKvh428}XB@uAAhX}(#Zk;$j(Ov1ol?d-{ zkNjaXGs(CIaRuB_0t(N`SFyb|jaces3+@9v(%SHaVIsLdYFE@7c}sEh59uQg+(-va z+-{DO)tA6q%r9h3udLJ6#Kn~!SsRbo>}np;KaNQ!3p@}P_XH^?iWoPbCDm03l*!!5 z(cFoMsR*Vj3jVu--SaLB2^Al&1(gTM++q$M9u!JOp!NiPrXzNGWXf;LuYPQDY#h!o zQg8%j35cc4+@PPI=W?b?(x=Caq+Qd1BI{w1lLk)fRI{W)?o(Xok7g{HXIR(xcBg!# z)`R2&?k6HDmMmMZ54F?#CpR8?Jjxrld^W;jT(;lrof+8nGGJFseGijZA3=}C5y&WYo~MYn%;XU5N-R|jzO zi!UD!Hm`25u3hO0)tH)M!rR37xS7Mr{Fm4lDRMwhyuKE1_u=78fCeeAe)}Q&P$!fp zwy1hHQdvMaV7GV7yqf$uut2sJ2^wq@SsCrrV2>|uF%G%6f+ZJA*1B3&deaGPfhGcC z=$%}ztmT1vp=RN+ewBmQ20!k=2c5g#Y=+N@Y?YFN&W|^?)-n5Ldop`yk0mUXB7VGH zaE5EbBR2le+=<^G0UXiwXX{Yz?K|F~-`?bGiXr$yEPgS~;ZxJaMCH95erp&ABoolk7p@v7 zki5hECv3E&i1U0lyBa5cBSD@^iu}-umQT(9QfpNe?VAOYp}fCPC;egCB@gE=mqw}! z{z-3ICU$ocH&72absd1Rroj}I%IR2o)77}+;elY;u7pmRooyTC+(`3 zP@;Bb#3Qk=SgKfey0q-URZ({gYUz%Lb4#=AR7T%Sjn~CRkBWO{Z8k2z!Ag(-l(8-s zC+#sm?Qw!8zbUX0b;SfEi((`rENEDl&N@XSFK>~l$?@#IS?Imvl>#XbAqwD`IJix) zp&h*J@GgEZVVug*sUQ;#ccy8~-g)7ND}JE?0Rb|P%H4#mNof3EbJ@jZ3UyLoCmMuM z7zY4AkhH%5SIi^I1uGsNC`+}(aUpc0IMLh^r8{SEAo*;6pe*ZsLDkZ^8C$4Jn~}zD zjDB_Y5K)cy^0!mmXpk*OMdXZp_2`CAfBysb((?XY+6(Rh+P0<^Lq~fWGKMo&pfXkx z+7aALiYbTntlxqel-I~P8#roO7_qxCKZ z-BZ!$!iv=KU6hHa z4EDuhL;TU;LPPJ3u&N7{(Ro``jh2Nm552e84%$l&>~8d3BJnXnjuT%pF`tHgUnHSp zEo}*sZNU5iYbd=p3n@+(T16YVKX~ek_dNxFgZ4&E+{WH`Q&PUTkitkLG6;E8P zY@TcIy=C0G(!#Fj>8_1MR*-R6H&rRJO3kYFoBqjHg(vO|&Y`Lre-wK}-)~!4_lNrp zCFl6}TDwD5Rh`3O$@BPoZr|bL%buFhP=VC=@=9XJ2VU33`pt25*Ap8_dmgv2%Z&S# zymFQAzjdpR3<`F3URqV{4Yak_d%-XE>ecr1l(4zqUwhfjYW@DuJ7ZKy;=|M>6w z_n~*ws!S3Ld#vH>n{tMpRH5MDwbj)F;^Lhv9<3c7z{NNY$llJD(ZWB!jsFzf^z!x& zq`qKe2HkUKubpQT+p247{1??-Em-+17i{^k3Q1A%$cvj;AKLzRnZ4Xa)wbgJ=hQTq zLyZS(Ynp8f-~_PLKt;bZ+9mib=2nluhSZ)+hpD|Y`C?XkdRtQ$&Gkb?*9=nPPw-B8)c#Nwb# z9AQ{-{CI^syCcohovc;d*wR?rNNU^oc(8u%b-OLPQih8O-H*hiCys#lTloaiAJn`2 z7_s%ouPuZpo?wnM?TJrLzQ(*V+V@-;$h+7Z1lKM6+W7h&^{;8Izey#q=~fwG>8~yH zxztoH9xJJ+XqWd255r9GDozB{s$~_YIAvvFv~T#A1qz+6HuSJ;94nTlHXO^3!O{lW zFHl#$-Lg|Pi>F{0;1X@38OpAJSD)S3dq6XrEZ`aLOw7#UmMhLRoRu2UibRp+!BYdP{ zl~0Cv2$yf*T0{J?zVE2rx0`lldEROZC$@o0^sRk+*?9Z%7JZdoY#lGjujF~3P>tc? zIjPG}1-CsMli=-u#hsPM=?CICQ@slES+d^f=#g5fl4ZDAgLgauyyK)27c`%wJ7a88 zZIti6K&n}zwhGQKwcxwEoQ~9-!_EZmG(0!9T!!79i;68^B*Beh z;!r~2H5-dDxDv}JApm&0Ql7QipmkgT2SBK+m+XW$0Xi-mcfXpY%dzBa7{pm2ekA=>HnH&VXUL>KbdsU1-nC zITOLL6pZ?_k`)>1veE?TbtKijL9MInYc`3K!D)Sxif(%x_*$Alq zEAJ2P50+hg|Lkndxs7uhPebizY%>GNi{j|%3m9HG2ON~NJL~>yP*?j(6c)iTF-W9N z)X9R&DWXt&iX+2BDfO=wf)jfg7P?$GE-`MXUe%>tGR5U55%_U}_t9b;_bC({$c=y; z+vyT7;O2wHF5D5Ia90;D83`ZYgzg$?~XQhF`Xtft}$_r4jy;v$||TrPycTvgjo_2OB?U=+ z+lbr0Z0k!3a`};QH2iv|cel$#z3QU6np$?>#xztupW-P3wDW{e0rki~z#_xAY^JYn zST-%|UxYRMROoC@=cD7Q{#y!!-0lAl3(7LNk52~A&aBR;A3b0tFkpI#Gt<_h(^oAB zKl^%NyV}k+c;?MaM>j@3_UZa5R{{Vx4b$!TRpgCDobN~ zG56Q%;&N{*boFc%LC|0%@`+;8Lic6Vqa#b1r_+&QoVNCAREr3rg=P1V)<3F|LBD_X zuJ3a_5zw_#wf(K?s$#?9M(>GZX}Q5QZH4OEG4l=8H~b&q;yCzwYYU`lM*yHk)<5bF zSI4@|mOg`jJf)As6L-Pd$C`wKC2MG{n%sM|0PP=E#O%2Qp3D;CoRH7XBHPO)7ug>V z-WeS#-bwOKF<WXULM`QFr>URJ186%r@CW*JtF5ol>rw!X*R-{vs>3H7Y4aG9RI<=@Jy-3Y2*6tl}g2Lj5ChL~|DrX7+KW z&9j3eC{)dzBUrKkkAJ34BXhE4Yn}nx$&#fMXY!ky`Fvc=G6Y&W;T1wZ88<4H3h7s< zKZhPg6v&FY$w>p1wz{)2M&!i-wD<(VDM|RKoEKc*MtJUn}#pD>gT;9PPCa`9K|M9bvW( zH#Tjl+C;i9oxj6!ja*ERbZTx0nC?-`Yg+AwEZuSA@NeXOvmLt7wzMk6M zHsd4$7+U<<3&g?ISo6-l?0TQ=-!mO_*yj5$g&56M?=|PgF88=;hEhqAU zML5w>ePVTpDYB6iz4c}4;`TCiBpsPq7E^mSi6G9!eFlVRaDl>TN4Gj`3J0UU6nV$f zzSE#xK^__i+Ge4xAWx$L3~6p7D0bvGqSO1z}~&HofK&^N|7-a|bNvm!r9ULq9zqS&(5JF5qkix4nV#?IR{AIoP6t)agvV^C?RiP# zRF&sNxbA(xQLQh@eO*aj;#e^(VwKGSHRUo%jBK%stB-0k|>wXNWjXpcrZ7s^PLV2xqmlWfa5h^z6`Y9pt^6; zxVfY`;c_dD;y5W)WaV_N@JQf4uqSPl1L4rg-!2H-z$V^tEmW;n-}#%Wph_7&&Mam6 zd#;YbL}{w%LSDQY?*gA#YH5`$_&#BJgxS;S8qAUI-A@~EJi4O^=BVQA0ds%2Vbphb z6ib+U45qlr$%^9B`9!7QW9Le`D)3L7iH`Q(e7;X{XwqO(Eay9id9-2iD{ST?1d{_N z>PT{Z?n&xOz`Wc2!vIRcM0G`95(JVpp`)(=T(ubf{ubVw;4K^Yxv%a}{c-N^zDewKnXph0~ubWi1ns)s6k4#S&&$`(x2 zQzV^ZZ%t^7!wKa11alZEcSDFnSw4=CO|cSb{v5AS8{mHss(#PqOzo>3&5(+-J{u9Z zw6N_CKf^8auI$nAaU~n0D_27P^Dy;ftqkU^ChSq4|5&QjsUJM0 zFg1B+W3Vr<=G@bcz`sVUqKAj9m_YG4k2!DC6!7Wu4`{&d|7d2W#h6lmG4~J!51~{o z8Qv$N_qqdS@Yu+oPjZ+4iyj~EnVDT^4Dk()q+Oq9FE$S|o7f|Fh84{l>p})cZiarP z7reQUzz|kQIL8)Qso5U3pQc96)@^^k75aiYs-$-P;ipunGV%Fy*nZn{qG{4+I&;GR zX!T|bG+i0=U`@qOpGCKasXuiOtj+Ck3$1PV_>h&DH`+Vns8DIa>d{`5lDKx|Z1zaD za-h$gnbF`kABg2?l~EsE+Mcl2pmc9ku-o;Ue>tne%ll|#S^7qFYsC2a(rhpd+i0be zIDP97`J4qy|L9r}Ef~Q2!4sjz@Jecc46_HCX-yhbVkk{y9p;2QYPQ?7)!8!y$SS6V zZY;km+-mEl_ciz`fXgiEMs*E+%&Lp-uCscVyZ5f# zAwCDyi4M1V8|BnY{(iZWMKRWS8!6G_e!v2MHS{cLa5o>~J|~YO2l^~*+^)eg_TsAd z_BU@@qPNkNuFAB1dpu5}s(B^Fv!zVkL%LxdxzoMzyTf^A#>6f8&b8 zFyFOtPvcfLB{8B*777l-!|D%xeBgpY0*AS9^mr79To}HCIQ@4Ya36)TgTkPPaw=SMulA!9U-w zb-p$@Rm0f*_ClGatpz#?ant`)+vr2ejzS0M5F=njx(P9r6s)87L@$MAk7nj*1drhR zZ+c*ng03#7-p=e?X;LjB*-Y=o*~!g?dU(m^ZltIhY#?GdV zdO{~MM$QSlKX@~(Bn_4!<|riwx8ZA|Y^n7E}U))1I1LP3%<9ZBD7AqiW%?aS~&H!t00jG z@B2nCn93Now3w*@1Y3%e{LM$^C?LQv%=Pc{BZdadXHvXQ9pd0IK|o<30S6^YP@@FC z9&R|laLFbP&KJle&wbobEyjuFka}e{CddaMY>tj`W27iQQWUtE033xCE`Tv`VtS>Q z!Ild)AKe|r2qr~1%l?;kD-Z;k=xXCc7~DH`N`kB_FKPt z@%1**;&EVD)h26Uz+qHM2b*DmfcDOat0jdzk`j}215%7y1yC=x2x=VJIC~t}&c6ze zEV0?_luOBcDKV13VFQJ=z^WiE224|6u8jq*4R9(<#bHR*mefM%LPo1{8A78YX_p^& zAfya&SuVvhQtH@)&X1mqT=MXFA+*putJd$v`aGC-XT+h$RsA^-@E#Nh6k%_s#KepR zvsQfE!?!TjCq(?Y%j)Dno-!yy|_?PPack+L-AJ%4$>)qnd-Ovx+}943>xh zioH0S-WIYkHb~8z2wzhltPcC`EW-2b++<@QewMBpTvD2R*w5vvHlL}qyM=96ea);( ze0!klqpIkC=ET_)UbwH4Ev&cM!}ciF`$6?3kExc&VrY<{ci*FP$5FZXSI z`*EmKv99iP9X#Tj2g+N1W_nabj+^J+UTE0|Njl^DO6}fv(BhoJh3mNCA1i5_X@&J` zkyZ8mbX_X>d9PDw?bsMYQrk0IuV1MWQh8aDBFqmf+OP2R|KsS)!=Y~9K8&PM2}4mN zM5rvGu`dZRb}AxUwlG8X?8=gzB(ndKA=TJt?1Zvpdl(GHl0<15DqGgx%iAB%e;r59 zFyH%oU)Sezp5#~u5u)hs956vW_m)?{xNSt48n-B8EpJ`Uo)_`o|7!HFiP{Jx&xyi8 zF-m$u(pH6y)r>-Y=$Ef?dPk0kx#2HbvL3qUQ2D*_!~vGb1aOQR(o9-n*5)OZcWQD` za;WVndfX52@&d=I`JAgoe09%lr-9LvFWY#ki0>b4aSouVJ==c^2T@=bS0_B zNwOG>CnzFb*<18AupOmijNmmj0aRbU0SG(z>8ogv+ZM7vu2aRLDazS?l%9D0X2R{> z^YdY2^jW91tjR0qcz>?g2L0_gN4$$KQa9CsEx(u`BXC8fh_`kc0$ev2fcj8!cP5ZL zEfRp*QQf$mH2fU#NW;#aEvx!Y?U_udRt61YxjdS8hLc!B|C?)@Ybw|b#Yi{@H#Ua< zWBvDQ9NGaz2c(;5sN2%BvtNUtI^mLQ&O7VFPZ*iN?lTfakxj+=I2_`{@k(@Yz|CIK zlDN09E|)twx!j0el+PJtXXLz-CiD`L2pXcYj*D zZ2AWnS^GG@s7hBX*j!BtEOk0_;itz~ZRu!P!W(;w#`=-MR1(B7O7wkp`$}cV)&ZMm zH*J&y_D8ZftY^>iUe0{G0GeJu+PYlx*Go;4wtM~4ts8G!)d-{S%25}!aK>oPQA_7g zn)?zO)_nH5;7ZMd1QjXE1022CMXx#{X|%1T!N|RY>aF9KqbrlH$j48G%ucM9?_BWw z^|eHqHlQ@gM|Hv zsXJLqEWW!4M=H{d6k=veOND@?*wo-BSr)jmn>hoKd*yP!OX#d$sBI%sSX6*H%EZS| zT;`he@%a}6m4wQL@g~0FQK=KK@0TsYChAN{CkZ=;VlMyaY#MOE-3C%E5tTGw$Jgog zskHv;FkG%RUYbJlo4Gwi`Gy^ z-GT6|DmWQV+Jl;iqgyD68Nq8P?J927k-^Evj$45X-Nf(yiOzRxSK&j4Bn5z9*x7OE z>el#Bnj757HT4h1*Ez#ku41s1bi)(;*|m-yBB~=%^3_`WrErLj!QvN>OQ$oMAFl$f zET_HW{f!_uv$PCmtt%QD77WbMq%YDry~mkSv2=$Rq$1jw&NB-@J^i|`uv-#TATDoL zDXhTJMs0*R&g=~ude(0>47DOxyQoA-ct%+@vs!(Yv)6+U@~+OG{5gQxEFtd5P^x8= zs?DtS;*x^g-l`EM&RLD*Y1OKf^Mqp7oK9tre%HW7{WspkTfF{#J>9_}7jmAU+~`QB zzD!Cg9U9g~@e3S6AfQ8NCt{(aBUr?y1qmJt9h6zn3$UzTwE{}EPL{TG_8ADm)cW@7 zJCK0ja@8eG+^RSUOX+ky|ETh5U7z6rR8QBG{{T;(Y%HpAR96Fz$cYRgcqK?<)8T(V zj%*iTq?~k`&g&^{Vzodufn&dy}l+z_cIy(GN35n(`)B&;H8TdPPKGB>4 z@8!{UJPj>?vk&%E_4zq!vs7sm{(~02A!pP8m$71$y)MHeNJPWAD4-D~3KIj91hlb+ z@W^vh$Q&_`#;OZEKg0bqP)#Y=WAnkkUu$u+^`Hv+)0WjHdbQemax#YbXW1b8tTa78!|VDmTxQ@yCHeUFKkfCA(;d`v zA@dcyFD%LC4^F%)A=((SJ8_FJPY^nXhANaTRsR-K7yXE};qt|DC^TaSq!{+vW1koM!(;rovKxxmx#0SsB;eWl?53w&wnwlGlR>` zt21y7l}#Qey_g93`FDV$;MZTkQVUqqHY98=hPsNM%AsUU&%&*;`CDW2d|p8A-qV%c zd~(Pua@bdck`sfrpi78h-GJqj6bor4y2A%ZVN02T69=HFz3KUUUs{&TlT2_ZnRm!4 z|7Dj``)QxD{Yq^YRMG7mo(=mkWh>@X0U5nGuluAI|MSW%6csG?qkh|)+jq10wix12 zUyH0#DYJ^RR60u&zg`*OwYlv+IP(3(#)*?|W=9DD}OeCFxn}e-(U! zviMGylo`cdmB0YwlC>T`%l#tj_@2gk!+(?`+UELsS4bq;(GGDTd&*JCL z6=T_18r(dfsZ2`Zpo}B6yy|MFzPptF9hL-3w5Ex9^5@UoWrswZC->1?{7O zZHXtSBymCMr1T3U?f7m-UP?OOksEU6})Ulgs@6hlLNl);(2%{)CpEr!~7}Bvo>d9UQIqn;W#kRp}9SRTG-#8ac>^r+5LEK zZygL>iSs2MmSvr;Zq`eVLMLzP!GJOjnPyOYI4g^Ir8om=DvryzD5RxXi8Iw3F%2rU zth$1x5WUU_F+b>)Es`Onxg~vkrzAhF1Sz_Z%1TQE9EcLs*%>VLFnvMydq?Z?Eg@~# zF+Thb)N!>P3w3vE7aH&}sH=&V4NlGw*smqtKZ{06p}h*4LX7>#L3i`1`f_0 zw=Y~stT@W9W0A%$lZ16~?)}gS*cmG#6#Oln6*(Lz+Bz8qIu`uQ`u{@;% z0jiHH@C&8=|2;ewdH7it1co4V+mAxL5tWyI^mrkL<1%m23di68tO15YiM`1rAEq<1+$cg(H@_x(pOo z9=hQor;%ZCpFVv$obIu96kVBc`UOTLk||gFe+VfyB%<%6MjE3aS`@Z+TE>yUF29s; zhvt%pHem*zIgbbq;dn#b+PxY~ml+;#$B!18aJ@c>Uq}a%o&LQS-k4Ic^JrNoX?=0p zf)w#Gp)Mo!T2Y>O$y$1mZaT3tDoF^kfNVvu&KA0y&R_9<+?zYnQCaxym1`=RIvS?M z!V^OJ2S1zKPP>Cz;3N|-`*@MCP_9mtfsT$H9VdeZeNoaiQADq{-JGlj@&Y}Kn+4R< zq_LM{=?*W6v2^O#D>>?c4&J=G-8yM!d15ao{NWEC;GAFiD1V${Wo1ofH)S)8h|-W| zuVNRao1+`PkdC?_BqhM}UNF{`msNt+3{3_b@^jn2>$7V9UwqZ5#k`J!j0hq0>x|c0 z>^kXekcUI-6oS?Yk$UsIAj4(G3l-y2*#*ttVC13{08!3m`Np?wpKCO-n2Rn;$e8Kr zW+~YA75GxET?X?*etg8aCU8_de zJg~}sLEl<-2Krr6CVei!nDf(m{?4)upH0w5x!}m=W|cE$Ij1PqA9Ac#*Owp8=52=b zb%pMhg!~Y>>$A618$hXajbD?Ubg0G*id=$ZT55t z%jz40ayu&Z1%rz@tLsDmLv~1wsWwcC;5P^Z+v^oAi<3MlGz`mpIuox}R7uAC*Rle& z?JFtu8FT?fkYAQ_fOamfGZ0m%WVY=C-Lu`QuB@3*W!r2jh2Hf<14st8(BU z3r-1|wIVUpfjsK^LfZQ4*1Z;95jy7k;=*juCekF2+N&6tQQvX~{`oMl{Bh3<)7^=T z6@5y4ZgL)d+Ui-6x>l#-hV|>zSKA+VclYNoGg?v;xD4NFbscGmTmH!GJbC}+;g1s# zMr?3PLX-##R2+`r&lBWis9;0U0nenuOXuimD`K6#>kY;T^$0e+6ZyG=NOG-yRD3s* zph|kxOp#JjQ-6*#X z*z+UL{QciCE{V13AC9~iD6qS&oZiG~){L^D(j`-l$c)$?wogP_3Jl)Q0wB6{_XXlHuONteNWE-3{~}$ zTYd2dDgF3+zF#KYJsP&`<$#wMS{>Z^YP~|yaxDSnDE0`DJoFwDnu1z!nA6wPsL3Z- z<>cg8H(6O(Q{b1L#(RTMO7Kc-Nk}a!quze&q(;@_WESbXn3fLwE;(vh^Zs_@O5G0V zzy64`wk+KD`)?5C^>caIaH6brVG({Ddwa8c(_emm`4A^_$QHVY`rKh1C-xrB`M@aovNab+s^LCW7RS|rbWe~hf|AENx1S3w|7^X_N|&HJa_*L zN)c|TZB)W#aGrCBJP?gx9@mz(7#I7>NI$N_prv_BAOGA^B{|0Q=y>|YT-PZ&D`dpA z3_5xy7wsg`gZL%X45Ci3`q#=WipF#{QOB@V)6!VN+K9J`0Tp^niLtp=PG?wNrHqlr zrAh1ph@2g##dL_`BnfhA;jfZ3q$i}!p&G&WVgMss<5@7K=AU-%9m(enR)95M|^|I?5Q$CU3?bYkEG1^oEn(e>?-4FM<%0 zffQ+cEX*2-^y){A(ZLI^Sv9I^1?=9yOJo&L%r3SsL7+F5SQX z1paeXybIEvT^Mj8@i_2+mV)URBZDpj2Jof=U<%Z*`}yo+W7Jv!Q@vrD!mjwJ80vkPd)a?-BG2>il9+bO;^Vi_$O=(zR2Hz7_$N42_7MKGQEFJsbg3!M~Y}8mre<#rEn%rhkaCGepFu z3Y}*gF*Yx}gnNrChfuE;XQ_@Bh$#i5l1i-uX17*T!n#>fLi-~B0W)PTd1nLS?Acyt z7Ge>J#xPMc7BeXl9EGN}DFnyjzN2BhVhofZ>9-Kv)*C@uC!H}7j0ew^FP8+ZpkcAd zidZ9la3^3BCG{IZC{9nQVRomZ^&!qYq(^%8)B4=Gy)6!-JXQJuZB6-}nj$X@X@v8s zICE0RpJFo#Yw!ocjZK+H&#jU6kGWEKUoiIxl)oYYiJ~n?QdwXNy%3(Fuy|z zvZfuGeJGA?@b&U^pYgOAks_0KIk%S}GD1p)8t46hr;`BtM4?6S?2 zEv7GdgUlsi9a5PYQdu1^yV(`K_Kh{L`?`d6lZBr65U^Fe>cf9?sQoyfU6Qg>H`uh( z-Ui~;ipG@&mtS=@Nhasrtj`&Y3n{n}ECZ}F#kBOzfW76K4O{$~#YF#B`PN|Bm7pwF4B_p({CILIRwQjwUSWE$ zb|8PYzfWC2;Xr!XGwz=@4pWjeHg0A{X>K9=NP1ljZVEyv&y~Xe==2kN7Z;!-$mD1p z2dBgj@A{_I4HxCF*H{(C)!N(B9C^;uP1s32Mm&;c8RvZ7yw{Pm^>f{J{?@<0oBtjL zS2sEbZzL)$R~Is3-RutI36-Fa|GA4Bo&DEgX1nWT`=@=v2YU0`=7xNf?cUbE^JRT} zTWOM^8@thksySB9#lrS3XE;px)dfYK@xw*5dhAShr>hlp-J&rp(6@$Af7KA%La;dd zb*QZ^iCpk{BE~PF1uT-RB1U&^stAj696}u8uFXJ+%OqVJuFGe8y;dEVUey}l`{1E3 z$&cJJ=iWR&(FD%%G3vfq1!)XXMalwGX4oA^mq+|MseFcfi(v>Q5JNp#VP{Ku4W#(@u$`j#|y+4cb-tioMe*mIIBgenuQ=s zR+4OSzwE+@rC!EccuJRz&AX|T#kg|In32+9d$?E{m^&$z2-iJJfxeOKD^kZv^7Fdjn0Yv{Zd zeVqD~Ia3!KQ-l5@j`2~nurA`R-c8rBk8pTMTC>n=6dJHpa42Zb`Xy{(9EK#F zLua3trMJAbF2!+b(ZR0QOXY;SOUEhULXMM}#v<{E%f_fw9Zj9e{K@8T{wpd0uJ!qr ziqEcqMCwT;3rRMaL)0n;BIg&FpW%~W(gk}+fSTG{oWq`2sGokd_1HuAL+f0VH{_u(A1HR$b$<0 zb3|Mrf*Hb@rcvns$io4`XaR;t42O^2G-f+_5{Z}dN~IV@HN=1%pc8y@0L zr4vw(P}eznm>*Q`NQ59jx?!AoI3oQ%27;gYO?(uog&+*|%99L--qNQ`J^%fb70-)f ziI*iJhiilkG$xr{F^MFmsJa3c{sTe|f*uL)+(JTPoM{52iR@GeGYO)f-$cVk7XSoI z>Oj@QFkayFs8=Y+Q*K!m319tMu!~dsn`OKAtYq5DV{CI=7@+wVO*zpfVs8j*(1$t5 z`Itw}-ylAwtn+Qh|ZsD}3ccJ7`0-q@Fz+GYrb zEgc<1PP&^~@E?+=lJZn|KRL|lKePQg=EmNsnF(1YJsk<*MDbx}%~EjY$>l0+bX%46 zj9x5h`_fX)b*hWlKsy}Wu@{MVpu|^LyZCWm=m;4~Q8;?(dxJ-Au~}Dbxr$E+;Vuya z{&R~yE~B9KXP|=5ku$WNch&SFTW==)xJeyB#=b#1sSrEh1+T<87woF@Uxr|?fy2*t z0n*>^?E;$J+Lo=$h}Wpr{tOJ`{e_Dfmm7ms3se?OQW|P%XV*u6!l^0y+oLwLs~Z~|WAki;ua3Yi z9dKKs4*j|B<5N9iJR}d>2rurGf~oq4%V{((?pGg%=3WYY6-v?*%Ro%rMgZ+MuwqKJ zMS=3&yrbbwu4?EXz+3Zm&P}?P=??!1xl;Sic$Ul|lCpAc`Ful}BtfT23^&qpF_uk3 zfbkLbP`5Gq*8NYucEK|N2_N50R8I(6X`2f@KX44_X=)}#P5Q<2SAR~@GFsYXI%~Y# z;QRe`s4e}xY41ojP&kfa1kuG@6r~PXXJ_(B<_~*9Y|?{5_W4?-5kj0Gyh-=~7$+&z zCdW9GwN|%&4lmD4ta7=mW?iWmf3b4ThIgz(ymrd_!Nb?4z#|Yi{oa(0UpI}7&O2&2 zy=5kJwz+%*ElD0+XEh4>(&1U}y7KwK1Q0NDPa!%-x3j69yLoE6t2a~@udJ3W1_l23 zx>!2jwZH87&n?&iLdRP_jDokZIXOAPf}}KblBlT;{}6lu`ejXNZ-DUuOwDC3_N@MP zfr*^zdcov8)xeGA1gL*F^Nv}cGjw>YqXfb@L3nngM?|G}n#yRVm&K=k3b~SCin%~~ zr|bA3dKykKg@E}bJURGzX2ZrL31@ZJXZ3nHu%5~ecu#>N4xT}O&wrzcY_N{?`XyI{ z*93Lq15{~CgD?KmYijRp{X}h@*;?h=-%k10nf&_cd23ret{BtnQU(UsN(H(xNINAx zagwZ-n8_Erf5!J!S6r$+9DL5p(0)3Hy5s#rCvWuPjKyBURwlZTaSZwmh7=LQDCd&$ z`h5`DuPL?uUhR!k$$E)5@2KF5d7}E~DW%J3DtH4Ums21g=#8QZB*^CYL24n^7(mWT zJHwkeK#do2>OvsGQjgJu^QD(1cBL;NW;Eyyq!KRD>(JXBx1K%slMi!FY3oP%CR6J^ zwe?nSWxqpLa*Q9|8X#coIyD$ztR;2pJABP}*2W~32R1%VKEuRaOGMv(ky-5%1jW{`C6%Nw*g-~)pWg>5J?uDPJZl%_m&o$UhBixp_U@4DzHD-8}-84?r zg6Vx05nGZ}uTO*+rT!#JeKO0?#pj;JMF2;`onV*@387iP>av{vZBw-7^TLe6SYvoO zNRNdT*GuRIl&;)!m=Sk&n#nXh`6wzWUb=crI%hp0u$7=dnaRfXQA2E;Lzmn}&Jf=C zUzGO9y6%2`(J}jRFQ-W%WJ^p=YO$Nz(P_nUljn!puHCw9-f=b{Pbt9b--D~X_>u)F zaq@h6)<6aaw|ydr%CVokvY|-ri0bZhb?cDDcX>@0w;6)0Bl0>VUDO4!=e4*A89GF( zNp0|Szy{OAVop?3z)|e_o%U-nyiajx4MC0c*s^rN=-2EJ>SPy);z*Q2Xb2oeL`p>o z^^8N2o;@C+1?IHWrzbTDM{(Krj^a!&UNjavi+gpm&}?bM@6B0)Iqjw!ZD-Q2y2Yxm z;g0PApxf!T!)*{GiPAYZ+!wbBa?2l{Pj@Yu9wy2_+Gae15&7jPJt~6D&Ouj$K0+PL zw~t1L%|IC;bs(AtuqZJX!k|biSIbohZOLl8s>kSOS9&$zuoD9ruET(W_aW*7&(Dwt z1l^pU;UG+n1$1|W{R{N>ua#Q88K=_PE`X3x(->NjpwgwoIJlq@N~ElWI|18YnY%EB z1KW3)Bin=-tX{$c?EAs{g0NfM#fCySyMDNp3Jcx@Z!pqdhmbLy(3n!UFbQ3=NwuBT zR*G#c9?zoGlb8y#2<9npiOFqw0F3^wEttJ;BQd*{vRu)E)~ALEnC&4wH}U% zGZ!?lXpuB;Z|4lt3JDs`Ho%)YCzpGXZ)1?w&*h|icRGmDJUy0c|7rAnI`FaVj107Z zH{(NXXi&bp5vrhQ;eojf>oy3itaWyV1Z)=migQrH8wAYy?|{7fL8{N6x`x%{V_?{U z%v9B>`$ArG?QL^yRcn^ZN%|_o0~ew)$1izuKM;LUz{3AvC$x zDfgCkrKTER+nuT7+g8rL0#7@WW9_*?2n;@kKlktGc`2eD&qPUaGisy_XE1UfLR1JCL;>1I$mvYQl?ZGq zMo373C4YT-!iVcb@@>B{Jv8b0{#58U_dEb+?|%P|kdhbwAk%}QBj#m2HcoZ4O#5$U z#>6@Jx%tB-wSV(!(Er0=*8>WgN3?FBC<+8rSy}U9gWAp$5ti>SQyzXjYt%fy_B)AM zrndT5L~S$)Eb?+8!)66{sbe9i0`GRaV?9U)4e#PS>iU0{f&|~0rbd}mX)^JQ_dX{)e1|CqOCZEmD8_f^HcNMX`Jg=6|C2!`b)Ya5B z>}OC99LnDUpe>o7@NHS4&Ud3HeBJy2?c__A$q!l_iK9IOEru_xZDx++-*V59ol6cm zURW#K?RO~QqyNboGMe?48pNj!C|-JU1UNgF{6OHEKDoJ9mp>^xS_Y7g6?0fZ2AveZ zsG9;VhN0xiD|_CtDv8|2zeve{-YFr!Gq;}?Y{elJ-rdd|u+A=?f^gB|B#AuZODf;p znBDzttKvZP+Wk<;fz#x%VzU-6I?wq!w&nh9y=#QmQD_tLD2$XeIEPNM^zQL^$gAR0 zV!YlFInMrx4NmuB86kQ#o`qx3^ z6lI`}_Z#zDg(E{^Bu?-ougQ;lm4xQ{>KC5=)5_>`CI)rpPH5C>JNI{-x?A#+g_8ghjZf`yvw?K+yGA27GMs;gd* zEjc5mq`NXY(#5f6=TRu<1PB^^>MYDzCvXa0K7E;90qi9e*`0oi!1Zx=1w}TSrY7^r zgPLb9MoETsQ?hyF72ihXxj!~5oA90&FS(j_<3>mGw@t~P5|Xs?GmxE%g+o*XfF#c43YX6$Tg_gsEU>`5oC_LDgK>!G zNF)L>FziP;wc{iBA0saD$7+;n;(R6Y^l<)~H2jZzye)+&cG z?!P?LIf0KCpQ`aVRS38`#O$oJ(xEi5 zybN3o3o(y-LRzQlO6F-g2PwPL6Wk>-B<{$hHX`;t9ni$lKnl{00<;cRSKFcY$<)Ii zS8ab^A?HrrJ#ijNm6+p9y6oUj6p+&9e-9o*1oHz^y*nVLX*s4VSQJZ#PC~?wkcYuD zcuF|ceOz-13UL$L#dkTCQ{0Kx~iM@RvglDnE#j`~(-e*)qz!KO@52zC*SY3lz= z#g+L36SYia_Ir{ohZl7|zos^qSSyFQBqZ=skSAK>jWB0fzRjN@R>gpoJ2#T&-zZfE z&V6aiD8dW?~}O6PtBecuKjZ&zIIKpR}sgYQy3;hL4#m&MCu(wzh^t zU7k=+2we%?>{GN3?lsuB>6|e7u{!uj$Gu<^MFlIGp7Y)DX|=m$2%I#Ox3$E0x`_Mx zaf21B_N>i;F7B#M&jitJ;6RrFyexTaU}JG{47azph1qz0L)o$3W~1688yVa(@$C59 z-*$lye~d6o>#_KiRsXqA{%<=ac*-nn?MT>9culYG32YQE}!lkxEw9|&7*adowae!Om*q}iHsw&tIcXn;SV16MtTA_ z2eJb5@@OyL2d^;{rJOg>se(V>U3IPwQ+bDuQ>0$bv~%#WL04j34qnzT!nm{=6!dWO zwYr>gTg33Jl7Gmzmf)3~{>D5GE9z)PWhL75wQu3^y%l5J~6TKRFr+lt3&&pcf7&1Vk$fzZSD0oR zFLa&!Jl7HrQEdAXp_d4!-mOjmA(xKPVT9;(?_Lmty_~%xTRX@Se(NIzdNdJiz}aCi zMzA3?EduL6gO0RDT-) zR{gotiALd_G`ZP_9npJ{!+rwfGyVfRTc+!S|9tV)oA z92;0P`?t?*v|HWU?7RGhMb2jPp5)%W)vb5pna7_DKAf7J*?5sM@Be4?uV+?mYX;Pg@PGZ&*IC>oUgwybCd<0@8sYMypTki94x9^G zwp`T>7QU-x{vY!)YNskxcxle=CP&kfiV%+uFWtVxHCPbZr`I%f&td;Y>&_9mnO~nf zUR{T+9$KfpW~?|@nu7y5P86DecR|!doS1-=g~0m@0O{0)8`5Jza1E&o8tbU{*0?TZ zoI>+pCW8pd{y#s=x#gb0ABdi~i|;03RS4@Zs6B6AiUaF$f~m(*kyHanXlQ_rbx0YS z>AjML+5ulD(bA~b&niVh!PvYpaMp9JI%y)LxSeTT zA^H&mBa@I<7FLQu3dN*ur*0Yr4@A5*{{PDY5QrZe-0^Uj!4B;72e#I~kaVv87&7B$ z4Ru@eO zkf^$PaY=~L17HVMJXR~1otVS(`!D$AqWUog@DPW`CkFGV55 z(^%$jEpD>iLWPnlUAuoW>8otJybOy!+>;=vBanW9IT9+y0w(Uv{QT$$?B&A)zNJrz z*i>vJ9UJ$d&ov~3le4p3FP-7rqZQXQ7#?9kL`4+7EX8o_nq5vWBNN84r^*DMR>+L* z&L19kOb(5^Q1VpPz;%xCDd-U|OO3;(S1O{Cgo8_@)?){ zj4*F~9Q$74R+dK<=hN6eQM^JP&OaD_NedJKzz=`n#l5kaNw#Ti4!t*T z7qAx`zWbrM*y`W@Ms4V`L|%Wx+}N_5F$Y@1Z#(W{{StH?!BlVj$Pr*Aw3X8GaywmB zFj#mI*kAd#yaLnKHxj7HpgUY$%MJ7S3*G*uB&mCXKjz#5y#j1+3E%UR>f>6S7fJ5_ zfpKVgxJ~<(!6nH@nS9vYPgVnkuwIdcaj=?;YQA%9HsYKUKaNHhoG+q5?VR`*`WuS}#i$$@P1ZfXdqz*|~lU;!<;$ z0&)^&|E{+-?YFsPz&pM7wD^y)jm{)F)xYo<4Y2ux4PW}+7nir5 zPK}HVF7WCKZrP!zEi47>w@dDJ&V$tPiSo}jxhdcI{pGg(wi(=X!hBG!q%&5hsK%;6 zH22+Dhy2%po{6>z5D54Y&g8=4#c$M~7<1p@($y(t7PF;71N_SNYp2}F-}55*`(I1= zVDqFz+$-u*ng9FS;oThx^XZMnrVYYcz>FXHI-l=qUA}X|{x7>xeZ^|0^zIrV3X+bg zLguDW5>}(gr}-{0YYmims;7@}!ABp&-DQa`9qN=ltwm&MXLsu;GUTZ)GpD)1bnVjB zDyQDt=#tp6Y~#r)G|RAfweQRCGLWa0QVVM@!U`p_@b`c;W*i~(o=GZ$4W+|`mz88>Ce#lBKCo$Ab<<# zIxXTm7ApKOs|z+8ANO~S_P->}F5_3~_68E3bZFDYI>t{Djciv*t-oDZ!@48gvuu@v zyUw3m{nh#pB)5C6Mxo`kq0`lyGr&CBzmf7V%Umxo`vPPrIvFuh)%KCxW6!WfuDODO zRt>_TS)IkHRt*s_dLEtm=zebRb?a7dYxsC1A8PjUrt0tZ9y6sn12a?co?@Lx80Ozqh}k7Y<-5z)la%Jw zWAv@-Hh1@DmdAeQA#+GyhyDC!@F^Mbsc>nMA2W~J+lw5X8(NOu>jw<~!uIgT zW{BtDd{8+CcyZR`+_KP~3>@bN_*L7eq**p%Ty;C+IB^-Sxp%YrcUf4Nu;`#)amh8iEiGPQ|Wua&Jll1q0DdlieL zo`#{NJD2}p>soK~w&%a?^1Hz_71pq?9m_2=V*f{HO<9-Xr{oU1*SMJL!r*U>O2->a zdT4p6fpKn? z18)~YVWL@?h~A4rV+&V@L*QDg>OXW^3W-9Z7-C}!QxD{V@kqe2o1<+{+Up9tMOpTi zE;fw$8k%)PL>L!|$Hp43Sx;N|=B!Qzu+OCyW9%xXi^p=y2#gX}Ie#ig8V>-Ic}Po*x1_wbv5#fy0^HIXiomT~%2H-G?u^UjaxAqrrx zgZkG|*U)bN6tUx@n#x_s9(wq&n^W5D*V>W^(&j{`G~ z9U^SwL@%Cm-m6(0UBvu90Y*ud#kaQ|l+^ajTB`%To5|e`_wcOkYg7gw>#^u5)9SE# zj~g8p&el9t)SZrnAAbinR9qyXy0IW=|pGXpQYCglM>W_I+u`s-TBr|yc zefF` z&+Uf6hxTwbbnrXZs_Dtnh>3Uq-l_qcPUTNVKq$Gkah<4i;Go(bD^YWBartJF68hII zG^)z~@H?cdkw?PE_CFy$x3?8-`_SguK9yJAh9+4~22J~ol#QQ`H@%6j!I3r+O;Dp;*2MyHDaTD zCz+ljqBtBPX`nuJ@!xyr;qm!$=-Tv8NM4=2{X}x(ONxyo>v;xyEB^P~4x9{*x)!JS zF~zXW`dZ2C_6HH=Jr(M6p|9-%BZ`buHNOWX?!&Qg}Sd~m-Qop`H8KIn^=#GQDX4#nUJ z?Wasey{|eNS6WuTY*p{67D9QW8OxV<*t&{)5(2%{AeB9p@?wZC7d+ zE?OB{-=HaScF5){`-GfoS>3hPr;_Ay#on$*p7Wgt+vZPii)pVe>%ltOlFN!xu-E4B z{(egiWdxEtUZn4OToQ(~*9DRTcUM2pmki!j4!8ejH_IpO!`oC@{pz*cbjbY1KqZHW z++cyqr!g>LJXv^9qYPx8jJN9{l`lFWePI6l^~V9r#`PL_oJ>tkNf7kpPS1l>QxM%d zR(uL4Pw^&%t;>awX15m#;H_=v8CUp3W+Qc=`o;|)&~41kL2cg0eaFdW?xbhq9CKUBQJ0(v!VWO1FZX@CQ+Dfe19fDVDwCUMUQVUW+}@4e(1CX-%mc6bNFdwo(SMd zIC~z0c@$OoGX4I%6k++Q&1Mp)wZqrH`jvYD(RNQSbK6t~I}wx7A*GKSg;Y*r4fdzL zP~v+F0VJh87SVGN$*vxYJbLh)=ApdMPZ2*HlaW6P{v=X|8$r?Q%i6~T;3i#~Uy$Ov z+_m6#A1XYy&{%d6 zM1hZGnWFUfX~Ev}8!BrV6P=6m1^&T$tR(rQ4*A4bFK#PC zaS^4GF=>*al5h#hnDg^k_LX)zoj17dw3|Q>hx?+jW;gMTTZVmZ_URaAbw|C!-j=SI zR60j~dU}TAx4T{0jIXCdgu2!nDWMo~zd;T)x&wcO$%`MnoM(DfNQIzFEATk0%edOMKkX$h01JNaI`Du)a z8cXSnNPdhI6GrU#IP%2@4WR$g+wnwIuvc9fXA%(@8g@OD#e~5~brP?2rsax8wHZ*R8o=|OVr-D);tRh4;X4!bQst_@a?)|HAC zC0!JIRZq0Zv@qs9V6i)Lg8xlq69*DVa@^~z^;-DKv z5Rp6gCp9O3x2VKM@eJfWTqoQ#74v+rCcf9w89#CITCw}d2s{Fcmq><3Z2Y>W2ud2` zXG=jD>|n$4K%->SO(IX3(t2GiQW4v4}x8S z&uA}t{Tx|R+iz}tm?syS=N{(Zvhrnl$*g4T3014rYn7#TYJW{>z(#oorvIiTM(4t} zNuIOg*-vCIcYV}e$snZbHM+Rmaxu)aSr!-Y+KM~3_c1UIx%}2BU*2!!V?y{Jm++m= z^6jIZ+uD-<`e%Rlb{XbRes35Zl4q$WG{dX)*0|b!q}oo>?0$1?V71&fnC}QBD(f2@ zDPg~Avd22ye0;nf{+ADV&9NiY{=7VL5RKgQAZ+v8{{FfBUz__6Q3Y5UMtpl~tnCSpIfrX@Ak=sQp#D8?TcL(qt&2Pr;6%@io5;s z?jumf7)QS0xHUOms8eVFh>}HFHd7QCDUi~U4tWkqNc)2Qmr?dm73`9jF5B~*XQt>N z?Ob#W85t;a{{M@Lt!UFhKX69q6Mr_mf0t71VOVVCQ#&-hl^A?#x>H~aP0rZfM=JLHeq za%gwtIj{YE9}y!Ap9DF4RnF+)bMv4qhw49d&|1Y113T8`&f#OcJ|P4k{u>1s$U_VY zuK0=W_~?c*j7NWMiuLRuDpt{;rKUD~ zZe|rvuvd8=`=oVEZzgQB&6}X=<>ulx@HA}9AX0=CXz8EcE^zGs@dN@_((G3P-|tkO zEctM+O>)@$X8y*SRlueMp>!0P@bSy|@4T|xn1qg3PU0fTCu)=x`_`9B^W1|ZgT@N^ z)LKS2RR(-E^BVuwwASz4SD=jN_oq1ZadjmJR41XZU^CcOExC--K0S7$EH-adnhHF5QJ!=^!nIgpe)RjiDVoS9^eQ05G}yl-fJO z`L4bXQPY+_&Ssj7bSNEx9%FPHqR+{7jx7z%`4UOTzzHM-jx!hXHiEDLhjR@~rE2y>8b0>p3^r@qjsk~Pdf)c@o@-J>nV>HyGBSy1vSEPc=`%#{#I)LM%+|m(` ztenk-zV?~wotEKbPb<7_@1o~0%&w6x3SrnG^44WHVa6gXWCZEhBHr7*R~9+M&&SJI09j7Ia6Mot#B6k=rd(L7N|s%=*63 z&Wc$llqAo3EgQ49pNbF?5z`vaV5Y>fMPMHZNr{4^QXNui>>6wu0MR=t#wqw1F~Mf{ z6Cp;cX|&AY=nA5NfF@G!Z;w&q{MR0i>31hyv3$JtROWCzf;p9uNkE;hT^f`l^l-gY z2W^|sdmW9VCo|Wj0Q*_lk7&F`N-8x!E`xb;DFJr6~EeGUWzWKABNY22ex2*ghM`r>Lb^gZjA*-R} zNF^hTMyN#6AVd>#MW__Ha)oi<#vd@-PwLC80A8-s3|v{^`!qZHN_bR4O{FGC-y%5JU~hC z>%JT^c_d`I&Pl)Ny=n7i(2+i$7@7Dd4-&bbl}ZI}r;@PtiiM*KaqC$Jk ztlC`i#s>^_uBt=?b$N0AzBNh7B)ef_fHBVaeNd4zVCd?R-o>n1M*52vFC5ZORKuWJ ziX;~)uzg!Dc8?*89$E``6OnRAROX1$#CcM z(U8#F2UX=n$#Xe<8sEobqDWhM+{{-bELm!5A+!1{7Fn9;WKrj@vY$5mCfOvC6_%J{ zEgDEGYZTBzoiQkBfMV$I@UkQ!Vq1mPJLevPcgM`(M|;By%X1mN+~iXYqg_5`a?^b1 za0KEwLM!FHW;qE?DD^wFd1Dp^ z*sWeDmlCH$CM7qR53jf<;`(&7e?#;FQEcQjqhEM9z&-@p4tH)?O6-}foVW(9Xu2TVPo zqV$`0dm&#M;`hlY2cV(w^6BKgYahl}er-^f14o~@D9YEkwO-}C=)W}*+?Y8sZ|Q%_ z$%{zgcYx^sg(!Dr+V(5aa~$80MHI>j#Y03NTmFtXYsIp)y0X88&GZa)+fPe7jkAKk zJENYKX1tA?sxpzXuiVsW=++tcq#tYE+13x9>$tP}8Kr+r@R)$0;8z|ZWC-KbEwl-_ zYIgCG*3S}^u4-~T{j#0f3ksMyv5DG=f;0j4cPWXF!^_QHM^3;0J=Gz!^YF^S|b#7Ckn6`42xnYIUbrE&)S zyliThar&c=9kb>G2jY0Px70RI!cKiNWBXvC{J1 zmt0)&W`qY(=+~y!`!veM3O#OsqPFc%^3Bbvxf|{6-FkSXVOdT zMA!`&Kdb-#I&Z%E)J_rpFVv8L*7d<=GPRik^BtAHT_Gz`Av>J((cs@b6Z77|OGiRh zwGskHVj4$ZaP|qF7Sp$FnAtjKlo3q#{d>)dH}%YYw@Rr?ir#jGyJP3_ z%69Kxj1()_=W7o6J1P2#l#%)GLph8!)4$*Q7+X@of6L5wIV`MSWN<=HTxxcSTEBRd z-Z&7Wyw((WCbM?wI;wZW%-Ja3sC8f@p>?30Rd^)X;D?60wah|uhf~zHJ zHXh}^UU=)N-0D#`deE#((?*>`rd^QOxdTsP7I?Y)hrE_7`DV#znMXV>C$t}ScNf)q zDIB%Voa6b_{b~|p8YzBq%5mX(%aE{UA=7ZXMi>X_F*8+9eTXFak;HT`$@zG6cQPUt z!#sS3*onMJoBW=?yNI$*H&II~P`V%wSH+87CdU+x!IW5{4dj)UVYMx{lE^%vv1gOw zr0><iYj ziO#Rw^Zq^%UD@YnVi7raUypXbGdjzOrIT=fBiF8Esq6l9i!vb8l~S9tbNRW zdOt-yRM=%=gOEFiBkIW1*YMsj2K0i!1l>;#{CL~iDyO7H^q)EgcJGP+meKKK)O5J{;vQ0A%oIcV_k5??v zAdL36NVXa{ex#&Jf;Z}^;qlC2obW=VX(B8OF}H{0G0{b$og`8QWw%!uKosDhv zfLf||SBeW#*N%S=iCZLa1Taap-;cIjbkkD`dh$McdOWRWmh&Y!AGo%DFo z2JB>6Tb=)GM9Q7_9YyK1SoV_)2#fscpip;2gBwVgplPI|E7{RmL8SDH12BO1JeQA2 z)f%S6^ng)s!Ogns2$2jNS36>+Hf{FGXrBW{z2YjLuqbo>F$07frPR-nXeW`&ch)eb z+(r|LGC4P-!Q6ishg7|DLOO*2Kxjz9?tLlUE^Gw_5L3&Kp&XisG>2=*#5kM6_cr2$ z&<|j)MF~ed=HfekGyzM+v8` zrMa0{aU#y#NS59z4B8q9m$r+r%b{7t3;Qk z^$oBUsb~}l#yX_2A(%A@TtgaG_vQ=-`q_^#ABT9wrF0%N7vDZa7`G)=eo>c1BAr=S zMmG-~ciE(d)a<6y^p=GLpPFQ*p@(l=932bV9rROvNrgeL3(5Wahu<%UkBVxd-$CD? z4=-iTm=>(`oiofhaeYMg;(VLMmSV_Cs`>Ay=JVbb+qSMjBj-w+=jwJ%mre2Ac{JXu z>6kDFEwu*^Tqs&Fm+H+{u5KI#$_ytdL;Ey|MDH`NahnK|TIWeH_H-G(ur18SArS7tQUOsT%3K2-3*`+rOg94`A) z;2QF)Rmf|xXo@6we`-A;=!f_084@@ro9FfMjnFCINHE)qPz2ERA4<{YM*GrI{_ucB z$P`Dl@;a%=f&HelQY~>({O_-7eW97LXr}}~2#U$d4ia07sjXn%@4>5u zV3%3!-n{GX<;B&%Q4troT)+Gy`bo^9zk~_CyWI*Jve>?J_Pt6|NA;;xl~=jEjh}c> z`?LsLpWgXsV%agc0Yg03H?NUJZqCMOt!hS*x(ZFT#I|Vq9$#IP(FfH`vl7qrnZeAP zi;pyP0q4syXD1+vs>@+bn(Rd}}JP#3U5 z+Z<;@Y2{XFTO@3pX>8X~o}nl%!TZ>#x7^r@j>=y}*Db6oDaesFZVx@cowlhCIidAe zQA%@Ve>X;+bm$#3Rbo&S>#Pfl&czjbiR2N;DZJu8UaDzUWomOoXkL*p8yt=$^Im!& zcI7GAKxZ*}?%R(yE|ip-*zMKER&k=!s=5Sc(68tvgTh4spapCV2lg!;klN@(E!Qqe z_)fT2AG7Y7e($IpXT3VJ5glg@J7T39d8H{=d`E*4J~w!Af@vuI9Nr_|0y#0@%^jEvHUKL#ZPy+i9Y!h!+F{G)=s#|;Qo$KC6y7`TJGn5t@6B7soA&C4MQ3$sBfu58 zt0>CdK2Z9drLL)~BCd7bKx#8-wr^sa+RVtv`Qt9MO}L^mJs7-5Ujhr5sURcKaQ2q1=1^*_W zv)7w&+a*f<9_la$Du|13HRVzH`?l{yAj0(M$&-$d)k= z4Mj`{B4O8t^b~nXOdzO9dXJ<&OMEGPSeWSn64GO=s%S;`_gHzGXZ=Jtbmge~t)0?x zuN}Gu0pEUy`cosLna(a=L1l*5gg=t9ctR`GlHaMZ>DnD2*MzuL1r5&v zG{_Rs58}!(IzD?A@FiMT+3Sa4!>{QOMKHLRX(AVKq22w?fv)wM^bvwEODOM6oVYlN zEb)@Jr3bl>O^ew|3x>RN0%94=)Ev5PPvxdW8m?4?^Hln4IJ&!8_na8D0e4T7)P5BDqte_$=TOEG- z{P5Ft5fb0sY6%eEHs3UkCtjFO-#rS$~Nxm8oCyH!gAO(p49{Ka< zDLiQFh<{a#PQFXRfHz8d2g1IiR0k1e(U;)Gqh@#N(B(60)&C?2yyHaco!9$%e; z#9ir{{vF2<1&?Ftsp^aC8(_v=YFIBl5}0;{@x?-gu~g4FKDlTPTHYfYXZC-2+8BOA z2YhsFwMR2Q%D;R+%x*jGn%OuzO6<@F9NhU{FCFz-(06ovUHNc+uqIACd*_2#AMEKU z4=CxYO@UGxY7>K4yJWs7?l8cJPGpv(T9=H;>TcHu4vxC*+9*$I=?8x`_N#5xi7H-y z{=F$DZpv$NH2?OZj%eYBwaWAot@hyp5`-B@jbYMtG>W1*~QvKdwO0Hq7= zyjnf_3;x++ep$l(p&m2T_(s!?5)Hr=JdBxyT87E;V1Vw={d{a5>lzSF|fES)pfcT6vV@D zi;IBCZ->(S*|J}bQh^H}es}!cbsoIvKsIDl`IbyF~>3UJ>)9Q$q6fH@;EEzP| z*K0o1Jlk?+OgCT5y-UEzP;*$|(Y2bi6fhP3NXZ9kXu;xQNqx@m*lC89ovEOJwa%p*mo!nX%g}z}h@;s%fEZcQW2|Ijv_l zV|7W?d<(75s2A&dG3r64tXTTfgQ6;GZRMzG8tf79LyM`Zy)h0q)i5AkN4_G)w#vsH z{H7t1PjT_DiT&(XmFZuz^x<_k?Hqyi~gu6 z+^44HCLQQ*deMVYQ%W*x80~vi=G)2|H__Hx@!-Z-J*t07(EK|$XKY6YReJ}f-C^7Gp(Vx)AHgs2v?jPm|g`FMk_a_Gq{0t2X_KZw2*v`lAwD{lO* z6V$ogICWJn)30TU!PtqY%$G_kw1Og2YxxE59wKMJ51lNb>W~e&>_5hT-RMPR`%;CV zx2#0z<*t8>8obqYJhK`W@8F_kpqQ`!$J#XTc zSIq4qCOs>BxigjYA1b>x*y)e#uy}gDD!b4-gK3zl%Vkw31+h z5sull{J-h4>KEZlHaA> znbEz3;08-n@^ga7b;tkH*!rLTj5!=M_RKftHhc&&b~Lc~dgE)J$#rc)qAF{@%}8h* zN2Hfi=f9(rah`<-iHJsufSyBwOY>yz!;z<@#b%O3FoQyy5Y)=B>Li3h&<4SiB#mfM z3ax1&T}pZhbwrjS*8L=IW+vv-uK<3}iwhO~x8p^?cMN6zXj#sr3M9?v|J0JX;*S!w z#UF|MOHN6^Ap8~g1CviPc{zPsZFtJlSEAbDm}vNJBDj1Fad;jusDFSz$PPB`*9MLf zJlriaOc*qq70WkqU~d{ozUDTQ41%AYvCa{LdzB1;7!@VPQJbcnE|r;< zh_TH#o_4_W+iJ>e-p+>GPpXEy-$wSBP8V=E^3$)W5ikb0p{!L=iv_C=Jt4)A+~Q-LHoK?Ruq1E>v~6Z}RDCJnvl0+T195@}wOy zfS2pr>i^y?_`&ARBFw>&^!Z`wX{Yb|KjOXXCwsgtJJ z#5(wJH-K-y?eM86?#tIJ7w6FckPGo|C5j3DF3%WrKE$1ov1*&a*l^8hs2vhl=e}eo z@hI_<8dkAmG0xxEyFAd!dUZ%eX_2!0H%w@=ob&!foPSWo6%~=<;Ay##zjaP7^8WXm z&c+z~wWY#VCwpZU-Wtj_9Ls!W>Yg0wvv?TWcDG3|C4c^LLcq`37`j=5R}IYT#+R1n z$Qhi$A2>{7(ggBf(V$x8%`ImZa!hckc5%tN!`IGqH^_I~b1A-3eX6)=rYq+{(3_2l zT4GIANY$MZK=i+rn=vE2D2zd{OQ}aI?2k z#^dn={Anep{*(8f8Q9c0()A_*o|!C)$?WQnnP5A>#ADcbQnaARw#!gEul2=r++cPs zW8~o8y?b+orS(Q-w*T3CN+NHRR8*YZH;LyK|MxpZI5GCLLb;k+=pkw#`}q)PnEPWck3`3*!zcq8!Hglme<7VzqbrQRCd^fuzaTL2`UY9vWf}jp zvn`K$2Va$vgtvy*OnXu+2bxKksuaV-E0e-vs7B~i3R#XQSuD}%+D-NQxVOV?sle2w z!S8p{*qO{m={pw!23pH*e*pa{ajUIBx&~@e1gP90uDlxPfBT<-HsTu)RLb#IivO$% zaT0}_?e}52e!;o>q!B8C66Pe@X=qm5>e6LkbcQ}yPhTuMP_POg6IO?}UfUEJbV zM;|JBKB7LDT6*tA@$7Qr>PDf;)E3G`$$RXmmcmtHN>5ME?ZJ|iE7fCLYj9hlZ)Lay z#8d|q`vye$-iP01c6^lTiQw5R-|?Wi{&8775uB}Oh5y1(MNiLFZkNv2K+ZM>pN66K zxal zbLMws8y%4sSUC3W{?E&TE6<~v|3JELO<83#O26LeZ#u1PY&6prYjugmK=wSv8r6=C z#^7uuac8my=q27U`VrBI2N$6QQvz^(LK-q8X*xQ zsLIn0+|*b%$?h!~8tu&~vpAl4FdP$8n5%#vuJsz~@9?e#HO4p)^1dQ!aMvUw=w_Kp z-V42faLHW?EOe;ZSW8O{{+OCsP;{QkobRl8&(AUXV-?O}4^I+;86hFUi$=5ULGWlI zpQvhTvZL9Cdv$d$kXa!li3!6T1v^|8NV-T&KdRij>`Zx5hixt_77=Cn#ITZ;qDF83 zX*mx}*__fIFsUm|;eqr+aggzmRTrm9i_?xJYD`D>vqrIK#&dBcEmi?ik2D>ibf<*# zKnjooWU+f#A^#DoiW3Q?m~>$ew93Y%^jtiZv-fpEHJPC|Mew!Qc>#CCgq7)tr^xUtCmT ziaLvaHD}lyQYNuQc=FzfXQ*l zsGp0AV?s;xAC}QGMQbtfaK8q;{XiZPUJ&BQdgtysXjd%N&t~$jHtplS7UQT^!j1FL z#F0d;F#RqLmmwUe(_RFVJX4Y#N&=5c#LFBEzvMXQ;OM~FiYYo@O~FMNg7dEs;sQPO zvuC``az%X#-zwF3c~q)+cJC^ZmxA!I$*@BkR_=T&0`zn_vd@U{m&nr^z~c) zCd_83Kh{0`cj}(N6h~$CQ`y>Esr4kz;CZ8^3%3sJYJ~i53Q|mVGJ2bW|YX zd%yrxxdHkS#&3PU(N>}R2YWM3B)%Nr%wDSz6I2Nn(JmaB*m_x56$=BBHz}9DZ}*x# zGTio8DapW*rB5aw44U|A7&U!e@sYP%O;eTcPptCRmjp&vvwuIlcdec*`(wC0OHaK* zyFKCmT}Y7r{3dGOSPHNulwxR!2_1t+)?>+SGxi}L2b)?I8`e)XEa>da z2{G~uzh*Rlr0uR-DE;n#{{=ikr&Ojs`U+Bq?{B6C!)P>J_{cwpJ1p^bY8!{! z@zxca1054SJKev@gBIJ~6Tg&)*X5w>SbcH2v@y{4^4l@WQFZpnuhJ85I0HK4n(5S# zos8xUYJL5zZ=b~l?_F5+_H4V<&#n>0mKqm#KA!8qj0Md`Y*I!^ES7v7XSLa$PJ7&T zIu<2?Bg+n_aCy`Xq)T?J%bMbS%#;KBf;tk8S(HS|iXWgKz*ftp?(HH&9YX2Wc+g;@ zn7*Ke)F3M6KOa)nL0i#E8D6oC3OUN(-^=AF2AUi6>-La;S}70w zL};B45Gy%f?PZsoBuPe)2hw4jS9P_Z64W=cR{`{PWVybW_Wf~!e>Wq4T3!z~+|QiY zVoBxO6B>8f%DNxSY0l;E_)xJn*E-=v!-t6I@9oB7O&!FZ1A|Vw*i6D!K((xDho{t1Ipe9wq%ul;WRi#gxFe_YM!92VQ(KEpiXsMN-@sEeD+IbPd~bOFU$ z|A`X1@;tW~@xp@jMr`E~C2EoF#j6KT;GXFcR7p2Pc+nfy;0f57;l??KM91S4tMGOG#7j+$Xz~UW5=U0J=0+7L-gV*thqy0#$rmQ zS_AI&7N3}}Lbe)@Lo&DmU+1yYKvnZlgqAwex`^u_(y6E`3hd z^S0h_!C?bcoD5D2aKdI~gJs(zWxpBA^l|c+C8?cXz7vdr4wXN-a!Z-=DQT_p!-A3S ze5}+?!z!=}i^J3I$}e#Tnb!ATdMn~mgY%6y$-pyO{*x`_g|e7BWWI2DoYo_Be~dB( zlFZ)aaeGmDQz!D4Wr!>3r_jc$4nOx@&fT4foo{_Rn_q5$a4-6kGzSO8Xi11;`wDG3 zK)V)1f|s2Zpg;vWXTf7jdgNk2?A-~&n;c>o%`lyA80SI z7ZH{PDGAL&XO!kB!6_QJEy4)x=y$|dr)+OJv8aMY^<54IFp`7v1i$#%& zBK~ww23xNdPLx4cPcJ8hRGf-fYHNqYb=DkEuCA6IhK`BuXA zcGqtBGzhdB1q-cOzyy6F`k}79$xSXjnXv+F=^!Y)qP$6wOv5uWds?va)G8CWk$Zgl zqPO71k71gVMFNtBhx;Uifb!J_4@vL>{|L@aY)dG|P_|5lC!QRj{HEP1vpvN@I;9il zOj9+0IXY*mL$#!qYlMf0XSj|w?QGH=8q=Tc89W##opT3=^1(Af| zV%JJ~c$oKz=@1MCRIr!2w}9G2G96J*lkf)q*R{HTh!G$WuH4zqT;pJ6`eoBy^}p?P+r-u!#M;N@f;`nV^}nJ%c}KdQ~dcP*Od zEC-Di?|Sijo6zk#7kWz@M$UHzaFLT8!IRZn!BdjsziuqouJ%q#4-D_bE1tpLv4hLU zDRmFH8usFQXJ$SJ+_DH<{0RMwiHkLUlZPzUr!$S%ic*k$TYf{^Y0{qMtm$H|R;elW3HsiNY&qc-vM zrs?%8h?%?HiMM$!E&>T6c*0ydCMfQ;vi32&F+A&uebesVkU!ngM!5>Z|5B8?ONVPen=X{~i=CdeWXU7tVf(`)2MriX@ zs^9l4-=O!YA-kaM%dD9hXw%uQR6pzDa{_MfKZbA+w^Z5qk`Q$L<#OZpxV_TU1{`0t zOYKfasAFxFdmqWW-`6pSkEaA#Xd5iP7V+?qn6Gz92V{S{d$P1RGg?9<_7M6$_)jb8 zSyTm5W396B=k=gUCky*kP`|;}u_MdZ74HJ|;fWr*pb-ORkUVlFBdHK7eKl~4(|RCD zO=K4A^kcGbjCuaw+yLCXwIpr0d5J$!_=Z7n)iXSL0Qxf z8L<}JeO33Qxc=A}3!5@2gn%9TW@NMzCcF2iQc0zAxXq??X^JAgKvA-M6)+CF|c^MX&` z_*QTInQ=xkRdDwqEoM+GVO?&#{Jhi~lz!uEfA9H0KHf0tl$Zof$l{M3IsH2ss1h4!6veW%0d7tk?8x>h5+R?9w1Em_`AXF3uR<1UZ zi5;@`gEzEFZlihGjGSisma>7xdt7BD+8tVIcNROJmQ~i>oY`l4E#w0k-@dsi z+hVEW=R_gD66^fS>(_Hsg3zLchY9*W9v(yaO5WQCA~J5$rem7ByDn}P`3fB4$Uvc@ z|3hjCOW)!VS*#M(HZTUG5T8!V%-hnKHW)T`A6_jz#f>gUD24ju9LhzEgmwTv7HTq>P*Qscw5W6g+OY7r5B_ATotIbEIjR&Y}VH0 zSxGn^O*N#IbgDuY7QvmwB`&QAgFA5N;;k?&kC0rfR--bawlJveEt-}krqr4w7pjE`^@-xI^$;^~~Z9a~amasdt}#D2ajnn{`z*@m^zz@6A$1ny}0Ij8u$SM3C$Iyz!4{39{aJV>Bdv6#jCT+RbSeA8(h{azIISf``A@{b*Lm$PLu2_ z&KIL9FVM8v+#|ST+Gi&ESobHXYG?`{KOT-F?I#dK_X{V+5x~z8i@@)JSNF57{g#R4 z5eTXbmgG!zIBpXz$rQ?>nU+G}mSM$(T^iNri{(OgSyB<8A?U(l`J|Cy&LBoX=p?a- zC-TDWkM|l5eJJ8351Q??1m+SbylxadG`yaFW+3&a&KmGeMWKkpjRYb0V`e69I0r>x zaR_})!XuUxWD(&Vvwep5^oMBc)H91$$r!E!54j%hbsK>)t3!1+{6QlM%my0wcR-8R~|woFZWdC*Dnt_-GJAo_kfjx0cpmM$UfW+3)i9N*lH>ls$2n`iRpAC?g?;< zd!!w!O6pEAo3M}%nH<{i8T3}{hzCyW-(4WX3Ekf+yg%Sq6+H4JJ7DF559<4`dzq|@ zIm-8nCudAuo<+u9jNdrZL@91^wAcm)w#t|SDF{3bt}c=z0VDNv%R6P}>qPTi`;bXr z6}nFIdO?(m4L|EhmG9iU$*&&x9^Br*F84)n{7iz^<0`<>$d?6!jg0F%{;nS^zyg9b zero<#e;wsDzLwuJliYz`<#hSL|_pJ}t<@$YWAdAUgw-D{PUf_FY_Zl8G* zWrd|x)>1B%7Ji)!nElYph}g}_$}-IfplYxZY5mV-pd*IInL~-+u!o#?W(~pbcUSV5obJE+IB`>*U%DW@07%nHee`?#pvym zHiSD87LFYHm_PlpOWoYK;&N6ysou9-(1<B{~czKRTJmi6P@8TfI{O2`p z4$Ghio4@Q5@OeAv+jjGSwa`{|Gh9i3Pr)Yi38S^Yk!6@$0F=f4=M^lfN);mR1I`#%{BuB8ngS+1L< z6fRm^5YtcRC);Rb&|GS!*Lo6mVhVLtetGKeW{8=M2+hOS_NsZ@aJRhd(M*N>EHjC{ zf!nAUpVspkQG2)9C%f(bLrR!*;T;lND6*uei#u)EJ8OX^{a^b{?lO_GNEPn2wTSq(v3E!yy<$YaaC*~+-MHlu70+BkzD z{iamG|NFH0O#aO)r%-BGE>+O{VbJ(1nxV&%2w8V#s?_Y*7rIj(cB|Q7@zh@3LTS=L zH@nKXkGh07Ri0F^GN}q8HG)innKEl)f6y}O4g6jYJO%(R|fJgFi}^1WW6By$%li`AYXJv<=G z;Njed2oFE-XY@mmJJK9sN6eESsWxJyXOv-*VFDi)SagOChiX-)4C(0`!I|LW+`PVK7Mf)E?nc=18do_IVF9c1Kr!v<6Xec)sB)C!z zn(qECVf?XcKD%6Z<~n9SGZRj8ClHDF2ulxD;SYxlg|$KviA=}Qu*Co$@jn8p)^i}^ zYq4SwY+>C0M&D>m7zSO+g|xy9r$CuA6fUnIykfy2*;JEoqf#PVs?Z*RXWsvKK&39B z_K+(Hr}mHRTV$XOX%`J(7it@*sfnwB(;bpF+W&Z{pYBq6?DJ`P#reyQgI`TvfLuyK zUGzHqO9}2=sOIpzCW36r0AfNS1VEbtkQIZU{XIn`o~l10rCxFp!5pSW!0+LEHv|A4 zhqNA--W1&)ETD}4X+w%QdZ2FETIHgk3*Sh14Q_IBiLII%%X5U4K*U$apWAJWng*ag z=`{T~9<_d{Xc|)6t`e ztGKKby!Gd|k=TKb-+>_u_9`o_Zs-JgEOw)gn^_7KJBoT=)z%ilNU0$v!Ku2tr2eay*lb?L4PZshM9b?cew-Rb_A zHRv}s$QZWxndlS*#0+Jk9lSvrIUNCv&>7u-~fhrB#6mBF(CuL~p<#M}>HOscK+Wror| z(+eTjw(X_5<)6PSJ?#y)o)y>y1_mB%7)n=}il^#lj=YzAt$l+Oi`3E-jz|Ox8n39x zgJ0!>hfGQ-MtXzU3c+LNJACOr^-VE(R(E{OvU(H`nPj{p9<~mz!13^KCt-?`69v>C zalO*yF4W5ebc?=HZ6z>BNXor4unY=LRz>Pq!os^;Bvv$vB}G%Lh0jPtH5Y*cA{4VU zvnqnyN+}M?Sx@7G1ckHF4uX_^FOrSJY)OLd??XqC=Z^bK>k zg9m%#lxrY#4lmHYgU<2W_k2{DLam+u&WHBsIFFSdk%d;2_3-&8@QDu*2cJ3GBf~H# zD$gTTwP>zkem(mxycTWi^+RzcRwU*r&)&U(9SMtG=h<67KB30I6ne2_6WV{ZwH3sm zg|(uRCxukJJ1yu4V@3n{MPaZ`L`De_I}(-%^~>XHM_$4))7nG3%* zl14HRUwl>3*yv7ErfaCsw$gCBZ(<%orfl#Sf3X%rnus z@Fer!U4kFOcRMU=D8K#w*^Hh5EzSHggHPn_;11YT#~O*1`qx(nQ#t+qa{3LY1}wY} zs=oNUFND6#_~Gl)y#A3k{eEL(rs#eiZ7J?;%+ zrKTRmrp2IC%EVT9GpYJ@HAJ$$u6%cDSa~u2?W2vpif`kw>>OcZtcal zzDY3}oM`Z03>TuuZV(C=iY(dnm)T0nB6=92zkUs9EOyDJ+_gkcexY z^3D+miT%QE7dYmUllAN${1+;M!JMhAAXGqZ5w>rS5=FF;>S~%uEhLMuy4}d|C_;D< zC~{ccDfzgmfr6rcM$J|OJ-X%$y{T9aFo0mTcX0n@9s{M0W2CI=SpJ-ca*dSc}` zmFz%`7w4Yz!h(4(O0JspcfKs!Yb)Idt`8i|+lnE6yTn4FRS&62_jThC1|8@w*(P>6 z&#y}2n7YDuo#G`0e;X!%Z$o+4HAjA8XlZNs`%v%f{b9N0d4LvoHGF7g{Hp$UYul!F zBpA$pf%%VDRWZhm3Brq$h+>(bD%pIQ0!Z6?D-K7{eS+m5#G zai`RLQq+7N+=%)+KlNvmQeX9ieuXH(75Q)vcRcC42$m*NC z?_^1vcaM{4Uq62}ajdGs=}{9;tk%&=6@e$d;&zN%v4gZhKX70peyMhQ9Hb!vdvR9+ zyNm|2#XnR$5zAhAY5(S?^Y)*O6*tL3Vq}QYb%|j5 z$wY9!^GfgC!skU-k;3P|;qlHPqboCwB%0aIN3FeuA84AWuL=3Rqu${+zeWt%Iif#D zTga`x6T)a2Z={>w5_}`H^&I6Y@3|X7->m1UFnp|6At!)owY+Q}J1Vuds^uBFE+KY!7;b%I0>V(&SP4>G&MTWCYh5hx8Z+0<>s4>f+CtO}x9G zpV#k}@%-?0&8!oHrAd!_kQur<%>6#tE1R?q73+#1CGs!Bi+3*2RI>j0^0l5y#sBxmqvm7N}yg)Ei7KCX01;Hi+o1V#bY7mVD0{xpY} zh&7L#y0}I(UwG8dB^ zA)c$L$>J!mWPbmrq?ky;&Elup4n|#7aoRTh{gL>TPaeeai@~pZeOv%5-8K_BCc~uF zV#9A0emzDcS&z+)#DWjca!JFLOv{ss&KHVG5TcRzLQyN7PRo55`vAwI>iItU!CTIO zd!tHhCD(6Q{617K-YT!qywm)%#MZS{l zZ9X~8;axABtN)M5I5%cPcC?n?xY&Vz`gHyp_p$g=T8v{{)3RMq)_+-M9gnT9+8qG} z;NtCOavv$L_vLG-{-(%RieiV-coKaMDlE@8_?*v!FpV0ECi^uz5i1~mYY3NTIiM5c zcr{@wrVRqFCaHW432tUnEUUh=cJ)lrv`xR>lTZSNipA+w+r7b_FAP&fTUDnZ~B$cv1A~9$-ycTTrm?Du{h$NgQ(mD#PP};dHW^tv-&=WyQTo-Xv`*+{N zL}0kk>f$(VsEDvZG!?Xq08QYAJ>RQjFk?g;0>;E?PN%!>?b+g(f3C@k#g(ONW<}~| zakq^fLAXc}7uA*^YQ+5%aWsIY1~LrC%odTz6gEa89fpzqSR-$~IEyC25{1h6z!oj4 z^`ELHx<&kIUWKhr0_d3`Pzu%)f8DZ180fZ{)L7 zju7(#m+EG7IRiU4@|reiO^>u2S0(h7P2x?dD4$}{Jmlr?_|@;J0h>pRfA)4LTY(#9 zXn6dB|M!fh-77*cnrfISZfFtOnaR=G4R>vDcM7zUdD8#&Y{yg~7+!*XLpXE!lZ9+%|6{YWa}Gxe8^3}Cxr`DP{OHM^l}%FmbCb6HvMYK z%;Mfw4vxekxbuD9C`&Q0MgZ*SV;*HnDsip%Ubd`vrTb}b2aN><`Vpc>*Az4upKV7S zO1RhMxYRJ8^EXMb_nLkCyAOU?d4xJV{MkR*Y}>36PXFx^jg~?F{y_2p*VWACN~#Ng ztp17hj=Apfg|$Ee;r@QYzIXF2e^bb_Tq4vCE2=Jtu!ocm1;;P#Oymal_T?=9j=His z8F@HnGRxgU)?7ow{`sBsQA}V(5K!`_p!KyjOQNYxOMK<+gKMJrr;19MPX8e~Zzmib zbL0ES^iU~NJ;i9|XK8L2SQIJPt-grZoDr@5ySIElVNYw&KM{1=+TE>NxxJQ9OE?lV zj$7=XGY=hqdf{Kz2M3bWlQ@_&6G0k!vds;?hi4kjYi#UUDlrNR${t}Kj9G#GEO&zr#kIxnAVc;r`u(OKgqUc+mTe#mnP zGwBGwYtzwTToBI~z7a#HMWvPu*aVH#+m=fN)9^)JMEVCT-5Rbz!OO(yU(sLzU*8RI z4Gavi^V{n0TWns^tsPydh*Eo-sojFFo7(wAnRIHY%yvJ+Kz+Go^QYfiN9n! zw06}*e`t-UrHOzeYeR4g`jlZuhew%ZIeq(0A4tFI*Dr5vK3lp>$AxXywcP(hD<#=( zIor+P?N$bawjW1fNxvq>3J%YbAkCMa=Ul8sG83?2;L&7$2kOF1uBQ51BYvJiqcxR& z|CuBsn6+4*i{oK>DJWq5(`A>mJQZ~)3T&iPLc8SDyMM2ZnVxma@M&(9){YGZz}v7a z+Y57KKF`pcDd`C7qcs?E>a(#>3nJJ!#PY>OA(#ozoDsAK1!`SJK+wVCvBMC@*}D|B zR(ohW3YHI}bA4x9(Wlrt*S5Ta3n_;^FMaEg=IsFwtf#f#=vvsCYgp|S z#gM*BVJ~Al2g>)y#v8D2uU{an zrZNCC|Kr-P!L>u%w4dK~WM6&Y61yP@;p&o@PXCRcR!@vu%NVu9|6|rY&goltHScj1 z8XRTIGiyIqP6WD!=6aeT4#KD|yzh zK^mfuRAZk}cppWz5>(wBq~4f!$2Ux5c-SqNCSktH8c<( zjHry53Rp98aEfR_q!IZX$^ekbfZn2R-eV{&ifZVX=`coUztB*bqzw+#x1L`GJZ<_36__t=#rTjqxbax=bu~!^IK+@ zB^t`A2Qu1Ir1Xnphou@Q`SY`(YD-&|(V{G})mpq}uadfKTS)H2rWZUtEJLoFUGHnR*++qya)HC-7dybA}@wKXi94gG?)(O}wSwn)REcqsrFoz}!^3~5b?pjxAub-QlUX3)1 z*1M4p4rKFFk*~#HeW;EO`{y4xJw!hn{QNPx&%E`_=wM$6P}*w*echFe-1;(#Qc!R` zlV(Ivd686Re)VupE|3+lU@qt@zcLYCMgSOu%Baky6P}$^cm5sWFI7B6JWq6h%jWfC zt~X-t9KP^0OE!6`7Xh6Qq@^&YFhYYV0{)wUFB=i@LNl3J7j}z}UqdS-zr?hFuO|p> z#laS?Ht7M*V?otrgIxb>cW{D@RF9Jr!tDnmK*VE}r0J4bIJdE!O+X7So*F>MXJ4=J z&lvQD`E&Nchw78*7&!U3x)fTubY}IM&&cED-D)MU=qf?qj3&XtmjkzBzbP7+CQIqR zPGRQEmlSJ1GfNt51C++g_0i0h0sgEje#29LbYXQdGjlT&E#b^p6kaB&R8~kld~u&O z0iAU@c%s7?EvVq$LLS+QZP|+w+Um*O|4t7n%JjUlOx9NWam;S>)03t1>w)Zr9ev*l z9~C?teYs{TDEOpau#zL@bIMe|tjb&M3=3`Tp=_mkzXjgDAA?TMz|dlx-7wQjq(j~v zTfX6Y(Qim@5md6CW6Hd+O30>W^7kp0B|N%+^MOD$d@ubV_mT|kYiHchr%G>3K|S%{ z#v}f+=q_{DC%dh7YQdHDN^$dkblbb%q%H;SE?C^(WuL9qQj>h8L$6-^>8+IMHMWx& zb${|~=$J>#U`b1xM^itxcI;~J*G80B`0svcS+Ja5ftv++BunVjTl)Hw{KrZ4wk<2l z#81WC?e}NShVA_*p8Akj(Esw~GADZ&c&z#zn}6%K1nz&o<0qr6c;#(q6r3xSPvzOy z+X|jqw>eb6hIN!_+}!fe{|T&5FTy31hg4s`%Sv;+rH3L-e*IqMEveKhXD#Lmn#+F} zrK3_-e8%%KXP=ji{rP6)q{}xr1!K&ip|y#SN<8P2`0n`j-Q6jVq3&5?VtikOtP}&u z0D*ie^&Ygp>d}fL$^t|4fD~*!4^_?3R`=1MQ3pTO^HF9F0p1Z-Mqms=$6B$9{^;P0 zF(F{2M!BfcY<+DrO~>~?3GKm$@~ac(k&T_3Gi{N6hek1rHQW!7MPe)uut(sqNF6a2 z#R|*GaaTw^WH|t-Sbk2^HhY1a*P?racK1H*`T%EclvtWPP_xx{ziYFoz9k!Ka$Nmu|t*sY!Ci&ui2-&BRg9QGMam9 zc6)1*#1EYi@Ytv9^cTyWO&ATNemb1mM(cBJTl-PWGUb29?SVmrhCS6KBO|W+(@Lu7 z4cAZ)vL;i?t3m7Sz1vH@O}V;0i_P1Fnb_Tz%jLPhYuZOciW({U&8zxNJ^X)H$~&Fe zV-(xPB^$*c&w4bzvV&EGkAyM`bkvirwtQj2&wqR zr{?E2HTTcQOs{6ou>J2H#`pj5H%;)je9CO0fbOC%cRg;p#~p{8CwEMdTSKG{=$OqV zn}cDhs_7QkyiS4JZZa_QXiW+++uH)hNjA>f1hD`U+yjhq2Dja@Kaogu)osy&~vrlqTuHdc92En7zusv3d`|FCj+e&R7rQZ7) zb^jZG%kun4P`i29B(8aret+sj`%9vg=Via{Vs1E;>(q{pj+z%4V?Dk0r|tHzPi^Oc z_H=P?o!~ms*cj^2H}hM3$kFOlsV}j4qHwCHobncZYGJJTa^0nx#ceLq!22&8)z31| z3SFg8sH5?p%N|*oe+wuO&HzoUca3W3dBOWrm@vBSfCETt#XlT$q8^lqw=H|b?|J{H z4MZ2LkA@BzVyiwm8~pGOrdzQD$7}A7P|3OEA(cdT|%-lXf@Sh zCK@QS4i{IKP80zk=TP1&D6tVTEfDQ6nsqY1`$4MTyS1;asd2HZV~R?Juu(W0lA3g;wat1oHN}-6s`?8q*Va!8}w&vvnF&vsqpC5sv z>G}%;su6(Ft&)&MFO#Kt(IIKWWZ$eRiWC+>IT&}ECx*HBxHd=R-}m9`OPHf7?GPFq;8 z8}>+v$G%W-g&Av#RJAiBc-hsTBqFE$8HGN>nxbxB}8r{6Es9( z(gF%1oQC*J)7ExFFvfe^XECR!(c(cW)5Wcc)mpg(xyI&m#gT6KeKV+KwR_eDH{D%& zUqEb-$rPdrG*X5_JK2f5fZ&=ZlJteB)>#cROjzk>nep54q(bMyqD-$VL}Il}srGXt z(uTIv{Y=@0}_c3#l9sRj?F)7;=(z3frG+t{*GGG9(~@o@FH#eQkz-qcjCKUHyS zqa*vHQBY{SNpd1{akAMKdW$@aUa-58)xG6oy_7|6UR&Hwd_u#(bTwMMMk45<;L*~a z=g*1=Wy*fgA(>XI8^WNfPl@Tpn{|d@#(x`*|B@J|+l+6H;g(8mc#fIS+>7yslz@Vz zUu|toP=P+uT9LK}J_ULp`&qPFu8@F0S!$Hm*1>YWtuE5i?xIkQ{guFbIMqyN7q~BX zq=t}B3ogfxuiD@m8B6$ul!l}T7ARbJeM)PF{*Zd0oLD}4_{V3|3pH$ z>roNRntZ~@7s=8$pXS>(+?57LmwTxgGS5JpM@y53XFK%*3`{>nw(jmmUHN&HU%A~g z_~$h{*c(ny+iiV<+4S4enNo zySo&7)g?u|Kyy5ZtbHg-yR$W4Hg}Cba|LB2WmWuXPW;@zQ)IOMi;{vjb%rph_j6sT zObA_wHZQur9dv)nB5W=-C@|1=KEQ6}DwKBaHP;Ic%?4c*D7~4o@R3K=_c`isr6bg>b9|4IyF;_vp{xX{U|-TngBVx8o@2Bn zyDOnHni7EMUaxf}S%c+-ZWgw4$=H3hH6;Iax;>`#@o=Ty+MjoxEQpa>f z;-p@Q7dSH(989Ow&0S>&J!cT!pQ$ZLnwf>__IGquDyG93?yZxagXS+p8Kt|i#FV=vDCk*$IJjq-(77cvx^h7tH^-P&K-~7FX<#F6r zPm0iSbyzGi8CJiHE$X{XC8cx+4omrE6awQU{h&#B98-8^HO1WHHkB*%1T}WCpS06Y za=?xKTWp9GD0Fk5BLD5$4=ct|GME&t^uSkN- z^ol2rn?+0K6r$qH3oB(_!0;yjuUxkv83vh+W&SoaSY{?B_Az2~&4ekabinSzy6&)U zQZf>zJu-ptg9rm132F$6e7nUb}=~Jxgv9 zq>_DktMOg_!|5cXVW$E0;KND=Y1qdw+{QrRL)mAq*)M~ue}KyjrT+nfLoqiZV5F#b=gk)vw$k4xc7F)9 z2>P0X`*>RL-l(Hs_LTQ5w^!r*;;yHo&&&)zys26sNB42QX}!~~p~7w^cEJ4#*+$}x zXj`7dkK+JN^TK}pJGS&B(iW?OvK>{mAL!z;d^0j$i3bGN4O?PT?$4kY)UC=~W4i&~ z52TLGpMY_h+#LM`SZ4aqXk#K4HST||FUi+eJYSq2`^8N1TYy55b?G3)bo7$}D@Ucl z-eUGc8)Ff+SJLQ8>?wiY8bEmUUM&^qpeF)WPc6cBQ-G1QFFRg zSNc?a>uYO+CVDY9(VYVmb>u8%^D~;?DQ~}~j5-h+apH3u(b>s#`pv&zh9LDaZai}E z5g->W>h6wjo>iHP4qG`9)>k;!-!a8n8g;KDHFUGRX+s}aJ$uumLF3gjR{iISs-25v z;7(^%PL(dut1+NXg_D21RLWnm%vww+f=%|DpyT;4BnnRUW<~^*i@J~)`v|@R)qcjerVkLPX@4h zbMLg))dqoXw${HGD2YyIBYiUR16$L~{i+{{=<{g#@L{Bn>WbuL$;J?Z2!ox)OS4XT ziY%sj9sVp!=j*oTj7QR>a(=TLhs*|r)wW;RGOZmAp(ZQYbzMTCpgnuk5zrFBw32TV z@Anoz#m)~%XLcXYlzThSb6L+RDcvl*3J)}n1q{~RahM(6(t=yRqjvU$_7~ajEzz@; z{AN_fW>xGa#cW;hwss@LyA?r-kThc=znGCf_)tu#BZX`lVdz(^b%tl&K9rtKU$AXj z1)^aZ`%XB0_jkfxqD9DbDl|*1_J3Xq+k|i5vs#^UK+B$8(VzXggu$kub2jSQ)pqRJ zv0eLJ#ds$Fl(-B+BDN^{N7ed zYC}ak3{!}eKNDyeoul<^efO%%Z9qsm+1W&nAFas5p3fW1pfOWwBs`?BpuHL_k(pVU z_qzX?7BphjI7Tu^3^zE9F*d(2H07T5sJI{mE#gH+uw#nC2UI1@iKUICVMMkTppWCX#= z1C=CAIL5#WM6rnQnybLcar;MD;+1+54>PA(sTi!(G+_d#$@bg?;yj$^#3JHoM;L_P zeF!Y%M(As3)S&QPT`tOUm2y~R@Lj-A6e{rM`U&Q8RVs$&E|U3Q6du1=$}e~J8?*6q zn3|a<2>Fk$OARerhxvNoUMBpOHo4N8$fV;hvUdYIKVAYX>& zfAz@fGhVXb_yJRO35B$8P6^*Mf@`ic0BB&Td1<6zw{P&&!Jd%OHahpR}Itd|7Ce_3vO+TA`;b>hBj6z$UJFA%#Uz4h4-kGDVzbLnI%N?nW4nr4+X_Mt|T5# zRuLpiB(ub;vJ^D@gYnGpwoNue!Z;bQIuAt*GbB_B`p!q$tLC0+nHfIp`c<&3?I2q% zSkIuVk3QNbPr#s(WWFMG!=d>Bi%cz39y4Ky2q#CKzFuKr8M0eZ{4qvRX1L$nh;cWy zIF=u1s$V}hwr7k<+HM+5_gFnq^uBfXOlc>7q?WuH1a8J?QA)5 z(KT$Yc5kaZ7vzU44V|%v;0ZM6qVSm+sl~#h6OnOczH@JELTGQ<&US>TN#hBB*PZT0 z<&>GO!B-bE%f459>e#%=4<w?rxalyp0+FB7o{#N9}lRW7xuvWeM)e%IeRWF_e4@ zaXkvzR@?!fQP{KF_7*?)ahV3F6XMH(P5s7#6h|sQ3|HFPo5+p&i=U*OhihuZFx8gXsTm`WK#pPvEr zoj!3yzv)*=bMM9dKVB-E#l}j33yLX7;g9!v=+zethv)=-Q?<;-Z^Ijpz-9G!fwN-O zvV2I{iW+LSa9%9p!TmvQjbB@&>mqSlnogn;?#X3?X0oNCw^g2$3~a&DaE?%mD_&|S zle`7?Wr!S&`MD;fl)!ax=wA^8Hzz7dkL9DYMqXmKQ+d(C7Ulhf?3VAZA5Xm1mbQZ} zVtCBH1q7fnbw9n}&=FDpFWf{^JU=&x6#XsQ{4Au9_ZGU=C&dJJzwfp_l$3bksQoGa^q-wte(Ua9`PQMgIoj#-E)x0BbntpQ^{!q=r+^^)OK%24aCfa z6W_s4E(>+4U&9*Ltsu4H1-+8=n#%aLX~MmJ;LSYkxQ7}ik8qHcth!vPEeV1C{&&|GLZLEVkn(B9 zI>slf(Cr-lI#1qkP=O>&gI=l6WuZMWo~nO(5*p?gm75nkTYmL!t}N}2EiF$bghu~G z+Lqy#RIgl#`LB}WdJ-1urM=OK>ep{G+RIYqjTmLO%gRHuW$E-MH%r#iuP|JttY zs(ue0TaX&x@%Ex$3Y%~Rg8Kdjd2r#;{8s_n1`{2v1)&Q<%a66yCM1Fuq_j=r+GL{K z+{L2o-OW)rOt;zU+oNAEUL3Xf(y+=V`)n;l7*&S*-PzC0zMBb1ic%lDOEG|?{|B@CnY?%$`e7+1Q zmPWZL#dYVPkD4DXWi$7XVmtUxc*Wa9S_(X{d9A9gLfpYA+?RotH8eWy)VSnY;u*~tsx4Eg_u2aB;Mz!~EE+9zeHEZKt&<1W&ejV0PIYLjZe(byY-G$E zFP(RZtkL)mB*pafb@}*Kcvat=lIOZk%DSyL=;AyWBcYd~N4w#gr&p{gBAR#g8Q;}T zLXfxja_^Y?En{rfFc_NTXqZxpCk5?s@Rf;w0jZ&^+-4}iO#OxQgKII5`Oaw-XdXBz zaxwyW1myEN;fb2VyhzDtu?u{ z;2A_YW7HWKud3@DIKX@W0=Uwtx(HrJLG>$PlXkZ;h`4y}B3UZ=kv(6Vb%G%Owa&`v zG{I-~UtG{3?vTdq@-K`>GNG=AWBEBI>v<6;yPUaT&?*W?Wgf0uRhrE3!E>aTi)ucN z70=^)lgD@N>WN?a{#PyfPjol*Mm9jh{^BqFRRtFX7cCo8i+*_X_2={bifPC{_uPbS zzy#nrr=gP%&H7jB3?ReMImf95DON5<%scDj(AU&R0>*%j$a7{Er2h3s2DPinIlWVm zHJwWCoc`5c+(&?T2u431&Qbz};Avh{WV^<1Wn`}3*L&->D=<>+A__ z1HYVsU?Em|Av>&B4ZwjpPjXc^4~4DPj<2q%?U9x?j$hoIWDkapLBp-p`G?bWf{hn+ z3MFXg3(73a`3nVxfBn9bQ8+!pMRkj*@N=i|eed#7A#H!yy+Zi8HSzuX6W5W=#3K#f}04szfFI%_G`6xYAR&6B1&Z^z-|eDe?MsdXVCpw z_9wZDs=0JZZ`BXJfPfmae@Yad*><6FSAP^?F{JTzsqsnOu>F3uz1WuP_&|H*Zh3s! zyl=De@_{6IsX^R4(qgGC^8(KHiT#^KlZb;|*f@{V~ z<3CfkOW?7QEbd95)ksBFiA7h$_1WVk5>h%L4J2ZW>*dbf3flku3kGUaii@;U*9W$| zooh==ONZB56&)o1vVD=1gA`%RKRPH4^v;%_2@y-TCsTk zcBrd5vWh4H1jJh>tqbG1vI%fkZr874LG3i-mgPqtL8#iC`|~uMwquJT0WL+r@tH4g zTwkn?3L0x{@tN%JkQ*AqQEm8RyW_d7!dA7z*3lQ~Nf!e<*^FCgB-y27`KazngTu})C~g_UXwkkHK$BO5 zE;xN$fR|9_O7na}3Q0oWBAb+A#8rg#(=s|k{JAwag62kOeUbTl=Sf7qGkVG%{JT4h zzHxSU)p)-b=KWUX76dV*?w3K zgcIglTlMKN&i%;(4gfoQZgp1Bzq{3TjOmoHh*s) z>(Xt@R7wRxH=SVE;Cx-P4uoMj^~;4Xovq3rHJ9{B>*jH|QPbqjI|rmo9})P5rKjDq z9u?zj7+6ks1QyCreBEu?rlbk>nE6UJ$IM>yDnUOLybQHp7Ho<)?>NeY{edpyHmp*% z?pr5Z8U=~g(71O^P@3BU3SSKOz#0=xGMQP4+x{JBL3O|w(S{&!f~J@OM8G;aJi0mr zCKDi^=>a3?4Oc&x4P0M1)6R=&=v1*W0}kI&>$d$n-fNc)9e}Xo2zN@qjQ{2~t_PFj z+l2yKEBTGRtZ_{(GaC!5E@2KYl`DHjz1_FB%-cx<#(ldh+f_G)Q}1oC z)mjH(dQS9u60)V>E1=3hfw>Em9{CQ{KjqF4Eks{;qxh!3{f2N%zTtF(NBs<2!H=$# zoOkAg0cmJ4s~jnr4*9!#HkwjAI#mJ3ij1~Ocq?SQGK+cKJgngxR_ZUBH*=(n3VlT_z2@^>6rtvU!6EEK0eP+Md=bSrSVejGn#A}>9R$u ziZ1#^a(z1C@mINoA2=N$3o~({IDH+?GZ2^$9Hbmfta!@AjNnH;5aDSfb5=1RIl?1g zpf19q!I+wV0p_Oz8g@5g!kJ^l8N!o~-{wc^ieo!b;heWmKaCcSk2Cq_s-9u`QDHa= zRUjXzC#iqFoyZgZ_}$TDy-24%*+?EPM*R}$Kw7#swGB9t-*VI@zZWuuI0`5@lV}|!(qEaxcFW=HsJSQCS<0fIE&QEz2`hYC`lMyV%>tF8i@dZ48uEj8by@9+n0DZ^SQ(-=>t z*k-ldt+=%slaz0_dg94oEUoOzS))bk2LFmmVnqR0Y^i0^khNd;`f_Q@KD7mxo*FV2 z6jD^X)7Y*8cE2Td!9U+J?S2*5hVZsUsV<~!&P)c~pN9keA+Mc-2h05-KuWcEIF$(HP&~@+Nvm@k6dkeLZQtKO2<4^ z3_M(#rb9#7j#j&G8O4D2`u%r>v-15vABpr4=i>QaCfc3Q30KXvtMlG_lv!398ZW`1 zF~_5&!K};px#rblljJ|SS9B%5l-E;w1-S=0ovNv2cEBoK>6dxO!#sDZ3hO@k6O`qa*CwhCPghvegtrF;hPjT=#Z_7A+f;Ls!yq zUv0D2ht3*-{`b=U!o|HAk)hms&r|RI2%TNx*D5ADD&=lNyY@F=dQq~&@}Ag#OL7`< zwMtxT{M8YOXno`dBkkAt_wt~7Hq-9}gz!1Wt9rq^hC|7B4y9fg@twIf_u*MYq717T z$pz#G!rCm}Y9*$3D4G(`qB3>FT$6A&=PRj82-)hwx9nK8tN>?po;|or^7*G3_oWvR z?`|WbOG{~IRrW3dxP9iK+QQ30^Tws-ZI|jN{*aamd0jnR2=_^U?}`>%cAL`b_|0S~ z4a$|b?Gy(`KaXnW*kSGdv_W$T5qW&EQf(~?T1bKI*|loZ62|w*twMXi+zC0Peduow z^1Ms6pk&{Fj}z;<2x8D;*L+;#wo;O0360I94NZ|}Q`Z`(_0 zY>^lt>&qA{#IfXtvKyvT4iW!IwtVS?ywTp`(%!nzKB-)7-Pv~U5kKkt&@+Y6&~2N9 z(8|<}-SOS*cC|H9l-kd(`q*tAJid>RY;OMEg-ONd&)D>npp335=F2Z2)<_9YG`TSRm9nQf~CRNrWzU=es`c)g1dSb9Iu4m}n z4_j0_!Ov0VA}1j?usyQaRP;LLsgxYIC0kYjbA3dErKVd%c6Zx#W@m}2(@3X(ZfB7U zhHFTx@&p*aq9c6WnO)y7UFTHzQ8xG*y3CpkTZ5%hJ#PFG?z9=8mC4}k(Z=Zn^8;~6 z$2jDLXGo+{Wnx4&>w|YmNXkv-M6nJdBm?t#>CX`wNu>x`>}P)uH#q`|kd@@-pfb~c zg^-2jij-%37%$BB;mWi3ZEb{ZzX~Q4FUMoak8;tjl~`q3qY&^0 zM%_|wZu}28+Mq#{gmC>&j3tuk_Th^6j0h`6D-DDWE6aH%Mh$Wb)8~T--4B7R4x z@rn;XH_+IOVLtGe+Eb<}#R3gG@sJx++C2<2xaa2@oklcm; zoY5y}l}44S(9o>Ayf> zlzGvnt_EF3mB;(=wfD>siJ?@kQs-pG+oB)hF_s$qv21x+e1-E3sH2BckCxT1H|*}V z>Nlpsj|)%Xza<42FE8L1wD|jY4br*#zUky^X7UMppJ9GjY11If_Ds)u#KyL+q6J{q zs@5tqdF+-K6OPi^qnt}ZPYwaAaY{M`-8R6)b=RN89>b6O^XK;2htVy<{B|}f&0USu zCVY(R={bilUHRE2=USG2^k#eQtZP~0%*EWhU$2r#BmRAhk;FCA3&*RUojn1)^d}Ry z*W54eb45jMYj;*=cBgdu5dXN(9o~jk4kdN?iqE}J`2{<&v)6v*C84mc_;%yfAHE&Q zo)#y9Ut&WU_R8>v~%op#JvW8SnPz?tHSd4(q&DPMk||0|PQM z6QwG7lAzk)Kewy){hy&J@5Ql|70X=nY9hL<;7(snOKp%Fy;m`A<zn z!4DZLe2PI8Cud)S7R%cKU*00HMHd-oU*6mf+c;z#JZWybtzfrZnCTVVMynmiEm6vr z8ipN3Fji!ed>cXLyF6=c7bXdHX_lX#zg0fKCiF8%jOop|W;(8Uz9{TZ`%=>`!HuYT zALHkWdwDSc=jby@27pJ?dV@##=wJQZL`yE^SNE{muIdpKT#9QQW(s$5v`We=7;2R-u$t+I3glnv z7-u>mJH7Pevkv#P49f(p!jB&5QfMuaJ_Z(6I#=Pj(3tao2N|%?H*YL6YF&Mi=@qi@ zQYf@8Ox~#bTj9YZ4Q5H?yMxjeWCBEebf7{*Iod(MzPqj?k_8>>Qz8!{5RXlsGKqj% zDdP0&tKk(t67_UGkgKq|2r{Dy+@4ZT9!4(kT+pIa@nBb{$%FR>wbCptW^GD2SIQR7 zyPPE)r^Z^wo9RPWufGi1dCK+GcR$A$3EkVBbL0=@Opi{Mvhqk*Iy%*VMp@rP(&pbG z`@+G4X=r}A_SIyHXremmy3wpWzDpp=9&cMdSmGm)9Sy5d4=i7MS5})(MjAC z`L5&Y4NDFAX8-E(h@5r8bVKC|b#CI|896Hybut|(je>bk2kN^4HA(uz_mAqD-j?DB z{=`JNN)yFOUFuD7Mh**dBD^Mz8VibMD(e-%(!q#$SP9~(uTBX2M5f72859EO9uK%h z&L5F5tE$Mp?c}6`v6rS~Mfa8BQye=bM&lwiCEh@g7>3=Ay#qfRfQ)e+(opB}q0zx1 z!oNj#fSKU~R3i10^Z8cA8ca_7oyhY2($fS7 zh8AapwT4Y}SxVXK64U9jZx(9`$8EZ{)Bbh&mp{~U)w##5$L(hNP})%1z|YvNH|QJJ z05kw;SNJz1A^|<1#cHX+z!;%^B^ER)>YNATUct)roR}zt8skK0#gxRk!74Gw6-C0d zd+1DtToev>B9PASjIm9?Vz6JbGPsYp@&AMRiadFma#RBOAVO1IPcuTJpZTf|GgFcX zmIHB)OPGNy?4zdpAKx^%=vDtbWiPLe2Z>YAq6RJGa8kbFm65Q8(?TJwrv)b_e*Rtv zE$Gh_Tu#h3A6l?$*f`wsyCio*s;_WCM@&@6D2QDUr2(T%M# zPYfn!yv5&bzgMzlQgYmHv3Y!Zs>Kq6K?ncpm(e>XS}Dr$p+HAm&(mvtcc#f%|EDXy zeAE|jd%>c*41*ouFH`fODNv`}Z=K(wGzHB#^jxa-_?o43sF?};xAd#NlUAN>|tHk!oI^)Tl@Y_(Fy8VTR7B1Bh$Q%H%RZAE7}XZ~0%g--Y)yd&9^W&fqJbA_AX?AwJ?6^FBg+eUY-Wc4 z%pCOwNyPU-*~B_x_2%pLEAa0BIub+=9d$S!sx3X8MnZe=JkJ-e;%2z6gH(m%iFxiH zdeGQs-Ic!7& zH_mMxJ`t3=@#?IXCl*A7Yt+oc34L!%09moIU6idB^n(BIhK-1ISIAzizc!+=8k|+!6a=rnaMpG41((hNUb&s#8(6dzNtdMUt`s(VZd^)1Sl&NsZ^-wAa zDj7{=2gmsl$_hTk%^i#vF>g@uK-4b1ssCc#CONI}ctOoz)-Xls{^XBnxEQ~>T!M8M zVUZe=?1SX@q0+%lsCfukce!}2wt3y%`>=Q_XykyuO~Pr7wl-6wJ=MsGMVHJqcl{0y zx82q8EYxDC^Wo-O+pyg^wXKJ08xulX6EAmLwN)lf&l+bdq6J6&hKSnQhe`%|>Z?zX za$71|!d`!4yJSQEen@2lSn)rW&D&uSiv@jEi#IH6WHUV+8*{GUH!Z?`1O! zDf+-^*y*vm;zo3m$+co*e9YyBi0n(3Dk`Q}He&k5{!C`~_0*RYen7;mg;=xK2TyMC z3+H!ZRltA=gcoPb6rbbb6*GA`LFw=6AM)uLwbgDJ)01Tmf@1S12N zu)Ucm2nP}RI;@chD-AOpR-jU|=tqeEPebwd5e%IJE>6Y>EC?Mz&LI(@t|Oip7kA`| zi3MdW3)`h{s z0~*61+WPOQK8L-Ij-*wg6Vok`2&N>%VYf_7sUZb4RMl5Ck|F?~%!|k~sKvA@8eq?f zY53#2W<$pV9?XQ+um7m@NLUh}{=9VDX6P7bYj{5%(+Gce{R4vWG!RgMQT{*^o*m3Q zva&H|ad0lX?uOK5J(B3ge@&ks(MDNDL&o892)NOd`1rP}00GLwbd%2u3;T zgAa;<<93CJPc^@1-Nbd&NOFAE=j$k6(X&-Oe3TJ1KUEQ5IjuOY=*%aq`M9j@?ZuTc zOxLd&a4p=N{g;2ma}2`z7NS2m6mDp;xWAS>_igB>d%uYVTs+0xO(910R8PDj!bFD= zgW$(lF`wo@0B8b?G(@OATLKxRh5%_-?=X=nX7bZ;+n z5tb@!pLLUofJE|3AgJN$w?wY#+{Pqw3u7PBy5wI~Iy+L^uCo?ppENz1@FbZw6E(`% zJU{nU5gnhL5jaE#6m0GYx{2J`!lNXZMf4(~zt%pPaBok&H#bCFFKPLs-_+%}w^yE1 z6I2J4d>l|#ZS&)%*dbzof-C+S=sFAL2IS1r@DS!iv2Hb5KH*!JaA#Sf3VX{fLd(cUXAw= zm|3}hE516O;$B}?05xptYwhiASUtr950;kGxbgD@?#ImFf=}4~Y8rWr@@qR}a)UI! zJI!52TQf7JMMAy{b zdU?*D+OQQFAv#0YW_y_R&8Cf)g1)oa^qL-1N8Un=F5l_MXamV)srQ7)Bd7Fs z^sPjx0#MhG$pkhsO7l)en?0UnpkYStf4nBWuzAO?=S6@(gk70XSIHjc3tX3 z;6*8RIsr8^yQsYXVm{FGGG4K+X8eq{vq0fmNS4?6oDgbu-;GPhshtlC`T|rl8^8fG z7Kp*&Zk;L{x>kHlDYM#HQ^&f&n@}>Wg7d+7Ol?GW$Cn0kPz+=Zv8YU1jxw$S*BsmX zXsxn)^KIZd~1 z!K2>x*uTZRvT{}qRbmL)n-Sb`1}+2)m6{3Ugb`{Z;9ys%Ve9Q-A#;-j#MsnDfZ_ue zZ(?ahb!j)nYnxz2RqmX=JIZzm=IIH+-yRArzlgfBa1~;^-L+SKfPYIhU}pH!JwH`D zj1W~d^j8;jqh4FwgLBq$3V+lfD+9T5F~G{8m*@yTfstypp8H9HQ7_Cs{o7$}e*>OVk;NVi6Hi zm3U$Rok&-KR(P?(;QU&LW4ql%fnA6-kR(L#gGd&z^|ILOSDAk%b=5pgPXFw7Is#kt zw_iz3LdweZG1fB0UF8JWK7-7`-wH%UqKOVU9I1Yb_XtzC z9RI5YExXxJiM+BBLLBmdKWFvu0nn0mYiJ0YJPkr^c^K0K#;yGos>Bl0vF?Oyw>a*T zO4Sd1hNIuNF=rjjI#^YY_YcV!mRF#L`wSz*Ul|YWFoM`(Tl%}SC1|H)p;aKCSsue%Y`aZoeHRXdNTy5L=g92~N$oYUX5 zNwlA#x?zx!5vI3KONb))l?$Y6ywFyM5fQTH~?L4Ca%xp4TESW zE7l^mG|>Qs1}-g4;U2Bz{IZX4%WYU#kO%T$;ZGrZ26_5>p}j60*yUY{_oM7D7n2GK^s?X)IZW?ECmXe*b$q_qyjgw_{>H-_P^B z->+B7Y~@QCns2r`OBCMg(-U&)U;XXTW*-&Iax2cikU{W$;b07WL-X=OEI79g?Ptiq z@*E*S{=)_wADB(y?47z z4~xPRzkPzz>lB39zr|;6^`GSC7PH@fo=iY1lY1x`l*7HKPoMF-4Y-olVKz50yK^PW zjuQK9G5-C6JbPCg|6Z{=@EUiYQ9^&llNuXXX`zndep8D7y_o#opVi-L?wF1C3@VhH+ zGH*byVQ`)w03X1&{Th72KE(O~^55YmL%Y{OjG}l=wih&_9~g4-v3_mbXk@oNv)|gS z`@2b&Q*SNj^Q$7y4pD>TWI+BYPgz=2-grOg>RCu`pVP}j4-@ZZ zsiR8g z2r2lYNC;|)!9z_4Sr865Ge{NqVYb@!55YEaW1mfn#nV+(tdM>8OtNY2sNo6{FFzT7 z8-VCc%t=6sh2Nd*m>;O-AsDI&R9Z4$tOe6nQMZ^nYou{R)*aoU(~}8BK3G$6#B|K_ zNx_2+*Mm7o!y1h56pgQZoy8kq=B}PL)WMc<$Ni%S^iDJF%d+W}iN{mYCG1FPW-Zm! zY?YlB&`d5R9#i_m569t(n?fZ1S;qc|vuR9`b0#2{Qs>j7@1#jrtUq{+!U1(8Z?gcBzL&-5|_<_bLPkHYR^Y`Va zAHqUk#Usz(WLOX>Ki_U5P^+GU9rb%BHGZwkf9`eS&r2F=X~RDyd*pW0cy=DoEH(f$ zq;95bnZoH3K3_6EYp((62$hkw&~yK^S$_&g>hY^lK2nUdqpID;w>9dC5h}}!n1eov z)jua@mU8BUgjnLzi6$b=6%ELq+Ki|G!rNH(#6kzz$`|jYa-NV7B3W3qxMsu)hATIl zIquM-io6g@2OHqT+6v_TTt?(*pZLj)*&0_`bVrZ)p^-=wR=ZrR14qw5pO}DnWSu@6 z`h|w$7*4SHyy#G(nA>pcQO=O7W`-c)O*i>=J6Yg8+oRkc{i&b+mC|#dxqJG(uAHpy zWB%B$XISZOJYv*(Bq(-e$N7PU&!%%WQIt{9nWS$cFj-ml;f`&tB%kOPI4n_v^-9wyXJqB=)GN{*U!#z=w=S^@ zC+i}SBo3NDdXPgkYtj&Dh&Z#_iw;$5@-?yw!5z0RAyV)^Aa&c0h*r=YLf#qkq+bu9 zTdU=OLGYhhwVo(+1ak4tj%4{$EidA;aOTQW%LdoIKqd5ex~nA+0#kmy6tj!9Pj8_j zYL(4xh7;OyE^GS?7oo@92Os7i^9zAOzd81TDYEDE$a23u5KEb#{UInWnNUECAUkO3 z(QaXXu*mxkMxU%78pu6aEiU2BKGdWv+%z=*9xZ|Ex94))7K&_`+hb}L=9TV zMMDrSu-3d-TP$2&{@Q2oMY&W@r*8U|pr3CE@=~ufu9=N*W~-ofGtij7yA7M|0ei>x z2CS%*ynwlx{nl~nXlLVIr?X3so`5tK?I!an*Hkgcu|w1Yx$4u{i0K!zGls>`sYi-e zSrN{TuMykPq{UjdfOC@X+GLpC2JUCG3&*&+xQqpmC>DdkkGXP(2LlK|Y8gY#bHnoN zxPpbFeAFBIL|Y`Mxd41A-Q-7@^+C-3R+8_~Iaji0uk)rdC**n5iSzo5K74-KF zl%pLQ^~%ik4a4&m>Rb-omVW*DQ(#ad))HYuirFRQ4NsLxtP+id4PrX^^9m9~)SL?W zsME^^ivIgpY(Gpi`vyo$)gFE(INupxh56cRdbl$Q#pz1u+331nZk}iZ-<8oBai%=j zJOBDsina4Ij|rclwf!-sPI=bXL+z8?)lduCkvDdi6C$Q<}C2yDooxM&|UeAP@CN zqyGxNVN)Yu1+I9+S>wTzoliIk8pn2X`gL;))EUiE9%^?aR!+MkZ3->Uw-;dVN*1@f zbG){OM$hoEL+b8o*ZLqYNx{(3S**QGol)WSdaO%|LX`8tBMgWfSCiXeN4vM3dC-vw z5Rt}F!p1VmwJsZlRqK|Kzv>)vnpNLES4+_YDf=BchF-0$uc)u7*`Cb1zFmcxM-R@= zPFXF#g_2NH;Xv}&=Qi1>ion2$KTnbI6;hEcGPuJrZHvqkr=i?L=;{o5;giWf+T2Y` z2rZHsDpgh2k}YS}EqA%cs1_3Gjav!A)ctyUSHDRc9+aoI_eAsJE#B?FMH$8hemkQi zMMZ&h){hqBZ%xf~Z1bApv;Z?6|0*h@K`*Iiba~RDS|&4zE$FV(L!RiCFDYrf&!%%V zM$p#VlfvWfo|O<|F&4zS9l{Tcpdq_Ffl+^N>Qc_&)_xk3ClV7Ok~~d(C&(%$6Yc zwk99N;&3A+EH+==EW*X!u$L>-%I|pqC2U((7y;2VgT*e~IqcHiNj5f|m}uG?Br>+I z4bgiu*5NNws&T0~7@~{kU#~mX*OVQC=SAam1*MIFm(Yax{V>ROp)x~Xv1zu_Sh|N{ zAyEMfg;JJ7igNjr+_Ia^2@JIQ9Txc|hPN)}2Oq{^1n4?mF@QE0SOox7U^}YCM#IL& z%Eoa*=t-wcNaw`f;?J?BoxZUhHwBAfGafD`{N#n4+q7En$pTY$x=zaSsf)^fTan<9 z^P6x}5{hMf6z}kLpWfE#+Y7vrrnQYu0c^5NAHuD~u<%f0`^{U+wO8;b?PD2L@ad2hf~fe_^24jHB<7>Cx2! z^%XQ$05}&8+gwxoi+1@}06E9=Q%ANxIM$g&(~O91Yr6y^(qzlxyr~}$3Sllf#SRBA zf0Mj>wydUY`AdF1Re{nsWwc+f9^r6Lp(THH5es<_Q#E+H)+PIXU+;g7IOY7nVBX6t z##srso?z3dYk%$PMQCOIL_Yzzoz+?Y(cuL&!d{VczbuMMv}>#wa_yeq`0Ua>Kb>XP z6z>}jJ=7J$GK z`p{VDluE2B+hy2g?0hU%6HVX)YAsis5PDc>SK0G2*S3TM_T~IZdC$8-(v>~3C|2QLR-Sv9Ok)#Y>3yAq zo*c5s(<{|<_PeA$^e@HEwp0gf-}hY$d>y_89*G>$xW634dImVB*)34(}JKON!Q^>^coKX#x z6;_*0m4o>_rL_s>3+>j3rG-e-*sQNIPtKWR_8AMpKFI=g=cC1>%qjfckF^bE;>^32 z8X?C({vkCCtJ+T@cL58GM0Uk+kJq|Q?Ddot8Fk7$0ZC1(`Eb4W^6y}nWM_|UP{x0^ zak}ozW^PZF9N=92y0Uq9gEKc3Vtm5d16uB5NNE4f7+i7VY+{-mc+{$uqkrWS2+KEzy zJ&jzdo05Nu;XF%F_G#7InrHb0g-Az9H1HxI==nSNI+|b5iUvh}VAD)dC>~Uh1(mrf zKjVix^e_PC;^u*825v=cjwyUO)@awHxO3v%mero#?at6LN|acZme}}pOeGmmpV7DG zcl&zheCt1k*Y#RGYjkf3bb-xULUH5F*e=s1%C*+T$^IQD=jv_`#l>Y~Reeb1fii_q zCqdy(m&ducc;ziBW2m{uR6cmt3w$}M#X9F$<-V}h7yd9q!naPrjGkQm)wxUxJlLyI z-9_Z~9iQ=mVl_VP0VIM{@6De9psT?CcRQ7NV$-XHRJhW-jD5wz5gT;FBuFaD^P+&H zdW}>eoV_iW&EA8Zq=5B7p8dxX4gPyuzCJ;x6i#&(krfl6f1xQI%|`acVil~A|4Or$ z&llp!l6pl0#UkIEsL!}oYdKx6dra3B&$l^TXg``@^kOAH!QC0G`E$$EvOQ^X71gCAByz&Cgq)$F@TnH#N>l zm_J{DRj`fa!bNRLySqRZ3eeVB{YJYVjnYwe(?TO&IsIR3Jw#bqv4p6isG(^tbyKl4 zZ7%Vob3GQmt@od|GVjGQj}aAM=KR;JyTwaxOwtE32)E91U7y~EjB(I$rm(&I_7q6 zqSp2WSO}b7Uw4>y4`m}0dA5H*Sf8KyeEUsJ5%5wSI`LSIL;;ryl}MY8*ygx1L(gO! zWaBTn4?CoP5PNZFn3Xn>>n7vC1&b)7yQ=UG4}fq`O=*X*@Ug;CuU0l&H?U*r+^ zjb1A0lc_(O#wMteOb%Ap%*T8Ohdj?oJwV~jk>1iS1z454>|1U@j_ zFk+ZwP^Zx}f;5gOYYw4-a3~Y0GpY?OhK_mzp+SvNvF2ZAPF=w8!lkgg|GKWT(v;)V z&U=dHQH9V&Rdcd^Ro3x3URN`{@^yUr$R%m_YwSppemc?I`pZ#zqFCAC`p~qfy=BVV zTZV_{)UlA3rU^Gs87}T(=A@QqvSNdH->38Mi}Db%Rl1xv!~VCXm7V|o*u>rfn0hug zxEiTL@5-u+eKu+A567Wd&?ejQXY1#- ztO%c|;vc~C^MrM*YIz0({8)%Lz?E657M9P-5Uj2C7M8oOYcE&;5HMdG{>z;=FpvV{ zn3lPnM+!}>z-dsZh816_DBe(){d3$xginp3G=pF03rC=HB!vLWnN^5R>t5A!PBqmb z>D%j6b=g&QB@VHDLE(_N_)5}b*^^Yl=WC{x9=^w(gZ(S-Xn5i~Qvp+tVX>=MPrYys za@Nu(oo#;MOauL#QsaCPs2xJzzB1zy{&i(uWxNcKUHU48v`1CUFV`%;uc9G0QMr4o zt1=~0fuDkI=#NlZ$<ONB+s>>rbkZV-T3~b!FD?H^GviqMJ^y}->+9; zbU*+NkQ7G+U9yNzYVNw@v*GTG0)VA=mzJFfYzZuC{cP<2dtBuo+g4xX&@sM;iun-DcQZiJ3kvle_&!xV&$*A z{vZZF_qAuEX>28$^lsT@X$OH>-D7b-*qAIowzF0T zW~G$tR$bR-H_Vm}W!0cZfq~vm#Jo!lO5Sw(@@|7}Jgnxg#z@q5+nD)Ot|chABb_|t zO*v1s+=bdK?%mc_-XhX<%%i>L|B0vhvKnCyPeG}yJ2ZSs&inv=OJ`g%zuv9f(cIju zJ}(|GcQm^Gy6+D!x%yqd&tzW?l|4b_4GnP_?GNA)CPBT@_N!6 zwr|S84Xr+8{*7sYEZ#YF#5C=ama#`?`fEdht8dsi8J|?(#r(a!`+Khm&rjWPd?*&8 zYf}>4#xC4*ve4aiv+r?P=!F*F;c-QI)Lu}l)&7(fuL|nls~KnM;Hur({7p*F*~Xr5 zRE45dW#REV==JR1W=pYLJ-Kvc|K-IB1^w{!w)L`%ZVly?M4yT1JY}ju!0I6N_aNo~eM^YaZGar&!AS{Ql}#!$S~MWg~_O^%*@X%{a^UJ(2ifievDWm*2Nryn9ZK z2O*6h)ZTb3v0whad_*ObE!jZ{=RUWqj*ARMG3S0<;sU`&+jS)pnuz%Kls={!UkrZ+a8+x)x~g`fQKOkouE zDnJ=(QQ5nt{E2ORRm=+W`)k|u^ML9`^O8KE(k9ha}lP6X=OJa=nq{sJR1>Zmbp`z1h-oN;=0bup;f=ju&Ccd_I$rR@JVuB zn|FBR&p8VagAm$~PGh|~L#YD~?=@l7L`qpwj+R~(o2aC<`6rR)Bm&hly-EVF=tkXQ zu?07w<*_oRCh57TEOuJtd*V^j3-8>}&_kCs7}y#3tJ3eNR^-|0#^mNWkCaE@g}x=G zFob=pbmm-Ok?kKey2bC9|5{Zu;m&<%5{UhBl+#IR zt8c=4@%PS1>r}8#VPN3zZLz;+QAIL z>_G4p5TeyraOh6CL42Qo(e9$%d*!=RZqiZRDfoVAV>Sd4@dC=BH&AwVkKcF6sQ&Eh z94N(94y%~*h=hSY(E#V*iK4iT zM!yD@foCKQ7lMO$v^+^UOH_W01B z80U?4M4e6AXj!+5{Z9(gvmLRUp+5T1Q;~DD=XO=apJ-?J(94O36j46ZemhT{clBXc zZQs3hi#6F=amO&W%lsXO88|JYe7I4I20>n2_4o%qRepE?O1KlGYQ)F*FC(PN59bM* ze1PMJ02;fhnjwT!wP9(0TMWDtkW6M_>%Bz7&&e4WMbWkIGsSh4O(hKVi9ri~NE)wi zqew{{TF}kQK)uRIbV*?wwD8z@wDfCl@x7xuO(+3r&G{0xDy3o|etjWC6V~~!7Q;yd zO`MQGP$?c#&w;cFmne3o*NSvWm6dlF75z4#M_I7p@vG0@zFmgZAmDer)$g(x-z}X+ z`aUJ7AdDYS##L5wEX&he#gpa@b|ZUz(&R8LRhXnIs|=MvSCrRJ4be2S)qt}mga$6L z`)w$;ga#Umb1q^^8Ojx6?wj13Or7h3yt{vemG(P+C3ovs)kZ@$aQLl@Nzv=arX@fg zpia)lw@15v@FZo}S4BIIp{*NxKFYp4lVB8UdO_r#Axl0z>+8N&N9=`Y6H*?EI#+VA z*loEwAQ$7MvR|RH8?dy`1Bs=BrcC9<^Du;*>t6;e%1%^~@8IYR8qJI|5JObWM0B@~ zHT`UAqDCm~So^h1K=y01jBI8%SDWf`*;?bN?+-ouplo{lhaYVlZ8FjE6+^2-3tu~I z3@~l=KL-zWspZLo4yj;$XtS`w8H@5_2GJDgO_>4)-nfPUXs@DMwC;b8&-xP!ou)9qYBHre_GXc+v)Zuctjs0ghz8Lx+VH93@aOqqflMzT zb#penyP7B0T1Jh27WPU(S@blfC4<6f+%pcl3TneHDigKqzd42mO3;GqqGHwN<&y1{ z7~ig22sr>`=xFSQVDHPFu;+|sO5Cj@m!jt;2^sbh{Y6piav2g;-e7D@zXeV1-QSZ<~lsZ zM^%k%T`r+&xA<3tt~P6v**5-)EBJk$7@?-Y@So^FgjZ>Xrc@jZsO%CkN zw%Tj$JzR3&voeEqS^3J!YVPgM=~gA&z_D{-Bj<6Z%uje$i{3p5-eg{^b0(_Xmno2C z?Hur4=t|+_+4&aMYDH}whbd2b18TQ9*zXpAUt^J=_W<%)ro6v*DR8N0r$a_o67ohH z>b?4k1{gXb9{#(Nyl(jMwF440I8ZEMQDh-j@lY;vph05wA;ob`RvW@OG}c0Ju+R|s zVx?{$|F6IAx)PPq0GX0Qa7cwB#xWJRMO%u;^zjMM=p5EN4q-+{bf=AA8Y*<9ls(5m zOt^#1P?ewbO)O3IxPXurKTS{)$*X^`CX?0Qw*=lzkNR~JWB&<3e zZ}1Hz#=@5n&hku+mLY{+KtSk79E|W#7L?kCD~I0?32Zsw=Pt@&{&MsmA`b3(vq0~k z2KJHs^s{8bEi)#{qXDKwyyIw_R~o@4Iy)~6cF&0P>KZ*4_MxZoBsE0BR}m3!RL ze;!F9povSEcfh)I-ZP7$JbkJ$kKI?6<#JQ`)XPkH(++sllp=G`+6k95=Amuzud zU_N7G2-4=edFQwxyrkGPFV2VnzwGf;blR$m-~aB`(@&fZ|A{&~x?$H?KeUA0I6SWH z8nJ(H=e+!~UDlph+E~iYYqMgXn%J1=SY^Z6%+C_U@C6Yh6nN@*(5bVB^y3>r;X>9P z>bcIPrOuo;U=9%EjW|*2{#cNO^>W+|0lLx;Su8}zc(r|Sjz`(y5<$_IM`(lQ6A+yh z^qo`7f$i_)GAnaviLHZ@T7pYh4iX1!iIHTlJbi9OKNs}D(@$6@v8%LtaF>>1i97x1 z23z?}%}2rvEO9hnuMVAkK{=_V2|zFgHw3vrmNU=HsivC zm`>8WXBun!<5bFcJu#b?%2u*g9=8GIS2>vAS?)|(1(3HotT|NnuQvR;$h(}s>D{>b zG{jE9uu4Xa#MrXraIAj)rsZM8GSz1>3r?l=Z&3tD>A^ri%GqU z<6e2+)Bm&${IN6Yd1_P3*gDZPG2~G!YRzs>r{giinOa0tdh|~S$dg2!D z71rhk5dkno?J>^WiQGme_7J!(j&QUW+|?sLs4MqEvJU{rqR|%^8N@1o(qO>fkou*V zy)VoMzYVB;Ijb|{%NgU-1D0gj&5eyr>IbvNt%}C!4g>$T?y8Z`*!lxtv0~ zxHvgP^G>UML*dTe3ndsm^{Q;sCHJeJ`4mG4@#}2K&K_`7n4hjv-aZdm_rip}w^7}# zIT3z?qi*}y!OZQz@%?&yo<38{Fz$;3=LxN6k!Pp3(>n_w3m&$ zr#w@L1{@+QlV$3kVivuD6}1u6xIM(XL#=za5hUl6aew#ArcXQid7+##da!1EXI~|t zIli~yH_)?Mc-&j8_J`O#LMb+@oW)8ww1fP0$3$sbdmTQKP=|=#C4HeG?YbPiT2L%a z;3;CV%m?RmR6<-EDyTFl*P4THrH;`?M@{qWrEuwrM7H1%m6e;0&NX#%y4(BXo5qJr zWoEyHY@XG}G1vV^dvg55#W$G{(}r{pN+7BR>M_sd$GzV8sJx}mhp51%rLd?vm-?l? zv6TXYI=>nu3|rgHF{1_RYIX-ZCELgIVtVh3%_9lx`zufXIAX@fRu+`)iyM7v%nfdx z2<9}Tn@p6(|HyJg%-dINPfQr9>9$BN{hsU~pX;GOs@pUi`8t{4KtdS~k?Jea%fAD8 z)_z%YWxBVIrbToYr@_s=LY4$ioyZ$F=hE2nA>18ARa0U1KnFSR9Xv~7)~kh8eoILx zM^m02Xre?fwwq|f%*0(ueA*0et61w3V{^fyOzM7a`|{Q@d48%EOUONYq-vzTnzX(z z$h-Q7Qe+bn(&=zP@S|~DhD*^)sh8#0QJp$rgLl;cwAddm*&BvAnO|C!&lPFV8d9z6 zE%Qcmy9hM=k?gvfswp+5%p^s#7~jd3m}pevvQy*YV8HUA)%27lXogFyO4{zg5LZ12 zPgISQ)YoY)XAKe%pl3_b%GI;G&6sCa@j*A@4=BpJr&oimm-?uZ?(lr9pQ*4PmboLE zByPS{#=GA{Zb#XTK3B4%oRzaY_^)nBe*A*}xV@9UB!Z;aUK@abx38B7U=5_{CR}5x zv1B$uMI<}_$Q}Jlofr$A8lyr#q15G8gcHx+-}pi0t)+t%gtHaJY(tO=hKgh z-7n;HX_zel3><+V<$xlMo~w$^>?&~f^ztw{>rYXA#x(DaUV6k~ny<;Pnu|KZZY1_I z_ax(F<>{0}+jxgBk8Vio3&+`#Kt8HhvAqyx;6H4E9>1FAg(vQq9%>khSy~(!I^bcG zjsJ}Lo9Zs$y9BxiE!cr%#)WoPM%0>fLYIV#Xr2vapo`5a%qhvCe+8>&)bIx>+z}Xp z$L6z^AHmUrJm;=Xe<%xrjusIY%69Se19`$csxoyW=5_XfjNZvxJY3O*_Y{e|8yf@- zjg}_rPV;sPWZ~EP?b9)H+~=0AVJfS-M1#Zi3M@p=z(d)8p>+J}`QdJTspBDYju^ZmMtN zkz12l79|wqEMCESpP_^A$P3zka5w3YH&|GW)YOVB?mLRX1B0P4#7T&bl1uAhtf(BIBGtd`o2br>$B01{()G zkr<|VMK9GZHA;(9R3JK0gSm0rQ)Pa0Bc@Hu%p&g&j`7BWZ)|LIg0#fjZ1+VbD}@+I zaWss;f zZQ)(hF4_LhMs6CDpl%r`|F#ASQ$#)S+0tK+#x z7l28kFBG0)t!jO`>D)-ht{J`114PBQI#-R7FC>}FOIe&4GI~Ey+QVP*Ir|4_6$Wr>SfjQw zj#;kGJ1KZ>Q@qHeZ_68T5{s)yD@BvL6`urP*U7sBAGi z*(%%ffI=2@5*6cSHMxSdb7Fmi3bLyhYO~t}G*_LCS=yllXFUnCHX}h@k?>jG3(njv zvyyk8Uejr8*2xIizrR~Ceo)c7+a=*kh7&CbQ;@`!XRdFY`v(8;^zkDX({5fAcx#Nv zE6XdpSuqOBH5?hym2g=p%MOkCVMu_2|?p!z&Zm`hH=@4P!xwTTVrL6+Zko`W1 z{l3*=-i-G*h=~lXzFY?B*Swa0FaDhS`(9$>$ErOVv!j7o*R$MxyW71DmrXBWeQp&W zPY2gcd(2wkB(jt;9?`sz;`!k>p06 z;WtoLpSz-l1bKZr!-}E;v)?*eugO25Jht)MH8_|P6?Ux-&hOw*p9OK?FHugMART$_ zdA2KArkGUY*W>C8E9}OantI}hmb7-zWTK|p+Uja-t%kUwikKB${hbprXz4c%@m$KNHcQ2ODWM zJ~}qhOEK8~v>tO0Z_nAhfISVA#Nr`tY9*qPsI$1Z$Sam4AmrtrB<37K^A^1CAs=Gh zYoBz&E$smjCn+Gt7#b?$5F$|Ktll45M4@B{W_!$tTY8Lk)VVZn!XN&@C-`3O-T&0P zU%-3tzREWQ%`I)#Nfy?JR0y@X)i@7bYiinQq@62VRYc*|($LuTr<}I__s9hDRKbQ9 zqceM`52?}L53QtqSq4tVPdKpnqI> zkr#om<5y>7{7(d#H`l;eKU)0PafQ1uUc7^bXEd-;1} zIIWP@Q5HVye|}5zYl7Ndhu5bDM0#79->Z3tcG^y>&_u@EUUY1tC^SDs5HZRSiq)h?YDo9Os7 z2eFHcCpE+Q=w9WkUA#;W!hsk0vM|?4Xh2moY*}sfp&2}q@8mU=hx@j<_)j~7R1pQ5hLPJg)%W)n#k@mM*;I5D48^bh@&~l z#272o;h=>YPOR>F(WEsDzWG|&JS9DzJejG!riqnbzuv_7b0|zbJJ34#Td4?M7FOn( zDX+0fuQQJ1o%;dP_Mj%&cviAJhxY~6{qD<%nIzs_Dc*dX%RD~|E{&8BQKVk54mnsY zsZZ^QC;COFPZhdf$m=o@>1=tT&g}m;3bUCMQS$ z9~d}aWpD3N+lHSkC`eqFx9coU)a4ax=OWFjFj3$+P^`Yz*Z7U9Fmnkh&1 z$ljwVPA~ix6-Wc(S4j!1FQe`R2^)~_)(Olt{d`t`{aS5h<8@-DN#}k4fh0^C+IzJq z-b{rmsIq#j@xUIIk`nH#V$3^Xy!*kfd(%q+!||^5)5BoV<{ckSuOeKE!OOq#tPmGy zD+|8s$f)&W^T{reFikMY*Yp`5MK4)Y_xJ7um^eg-LTua0557)~5InJs|Gvg8(K0`( zQPF-x{nv;Cs532g7z>B2r+!8JvQ5p+uu-f_g2$OcE`LD!x5s3T)tCBB?2Ucuae4l? zyUuSnb9dWn<12746OUQ!@+?u$@@`O<*8YTytR0eyRd!D_ZUBSDPo{Og{-;ys*tLm) zH)$?@JN1L()gGl)=&MejX`BdM3Y$}ly0-WMw8jwuLQ(2rvueX;dqPn9> z)=WzhW{Zlpdo~EOPWmpcuH5GGspV!ox_O9mEx3bgIeh?m|7{- z%l;~pYt5Alorx}8GE&zVN7#ATXe!q30B=XIz95YZl?}8-GTce{lG-M!JpyZam(SB{ zpJO8GX6|eF!4H!YIkw1pQD6}gk)wJME zx3lAM+7v#hjhvUxNI_`MBDHb_RgaSx$VeP5>9!F7{oUxUp`P29mC0iQ&JEa)_~tG2 zZm0K-)h{)`eur1lf6n%vg)G#>{fi=WW;RDtzqxZX;o8fbxk*FB;fF=XB;~JOHKyIz zdHO^+U(a~<@n&;PV7;G#Ro%CVzatjC`PEmv%wvq(x|w~xW?L>uVK&<_m6n#!+GuwV z`U3BW1E#3aLq@kjK=ZirHRLRl~ZIX{%`XVS1bD=`t? zoJsmsUAlQvww<0h-38>SQZasGAe0)tQSJZlilN%C8?srq>0_DPpb#GApqqy9sdvPG zb(96uWP`VZ|6=n>Pu=Fy=gnWm6(O7E4=hKlmL&29l3R$uCZ%>c}_x%cx|! zfkf{77~A>@Am^H)zWaw^Kvq*JHA{ho#H%cZi5JYP6O z`}E_%74d%RnUeS*e!_RyEGjAbwT=ckC)?dsmLk@^KULYt#cYC~xXhgBy!3R$N`E&5 zChg|MB+1J3RI^&y@;6!+(sXmXKsOj2Zx%=Bzn;_H0mI_Rs4^*CO9KU&l6J03%<+Tq z?fuC-rutgBH)&XbE13{}{4z-Oj_a7*QOvq?87ufvJ8HPVWI+3__KcAzch0rr;eQ-K z_YQGx$din074-PMi=?!q83oKPHGO4AAB=O z2-rOr;9$yJvVOZnBjHff_R@$I- zY9zdqO-t$>A7C>{dz;Vgoa_R;*>v_vG3I(yjcK6csWYh_92(l6+T9;;V+Vc;@~r2F zG!R>~#j3^wQ2+IL0Z=gEL5ap0ep0x|W$Q?qe`utiUKl29{02|V()cW8Y|q_b&yN|} zwceYJ+a%0ZG4ECwB$}k~|G|sUbN$aG_hv>~Hv&){Urns!rX%3zYSE)Eq+K7`d(8?% zk?pPCk48k5Y+ROrpX_zGdCM6nc~Mg8_xGdvc=o>?6KygPeb6Flox~!k&)$KxN1147 z%ul(k^y^n7g>=RX%Uz8+!-fjVI!iA8Qx+5O4WAi6dhEe-CJpdNqJT9mFw~*7OCufY zWEFG^n}QTu-Z*W`{O6v+`tJb9eeAcI7&5kUyyS0R%=51;i#5A@Xv`pUzUm zl9jVt1@SqBY|zxZveH2o1{_95zj*CKXR(=xq1M$ItCfqEJAD&WSWiQ*M)nE25k2ev z^8hz*nNKFGKIqaqba%?tlFg$f&pU4wAEW{5I*ikG8?Qo*K>P1*ex50=Q=u3uulzGM z!;O=Jb^n~}!H(+z74OoBp6_?aYMj`aFKMK9?fm)Mu!gKkoiVMx!32onp$=LiAG4((6Wv zy(~N5?rv}IR7Ug$5{UcEC>ohb>IO{Tq4O0)8$nadW5jq7m0@g41m~ zhpywQ5bsdCL+tiFG^l?}I~lNv#vpRODGG05^x-$kOnKn|fxOeB^0Q`XYBxlhQ3?n)7FJnbHN%#{h&56?w_37FKzLc=7HDVZbL=R*lqE?n*<~ zmfVgo(db0z4&`oV8C=&Rdkv;5pnEg$bAN9#`}HSqu-|#C6ls{{`F-}OpZ%3(-x@f7 z$GdCOTxw^D8_VuoZ4UG`IT<-u!darTL<~=pWhmT~aZmDk8YxX>(?jK;6q3mItkwsX zYG#T@>vbvuq~@m$KiqhVSaQ5CuLHQgN<6}*M2rOnr0loK>FDP(=4^1;r`+N z=!}t};o&hA`O6juYk4EDw-euYtGPxIadtR)9{3)F+_i6B{dV%hcU3- zkVdM<=S4?7Gs7?cg~nEz7WJBAxD`g1`}33*CSrV7xHl=Mkj}`&=I4a&TF0se2^c3y zY$u)B4}{yhTj^gUTXSgeu-9-MwN|q&IzW2K7*Us zo}J>Qxlbh#4NFc1>NH2c1ksg79g%kIzKu^PQb?m+hy@{RY-p%yHuQE_0cLsVuRVU6 z|BwTHgY6RDrZaopyEGkQR%m(i5v$B`voZAYpOKt_oT=(6IONDb!H{Psf_=fDE~@#T zQN(E@!-CxWHP(!~>a4W&4fXc?~0JfMQzwa!xB1y zO`Xmx?(~_H9AJuNdGVz!4j&g+Dfm|&clP^T=i-|{xzd!v#cJoPy}+B>-7tbiaVlC0 zsz})=R)kCVjp`?9xra|erhQ%g(iG8(oSf2(cYQ>CP8L4fJldq+92F%}xCLpQf){V@ z-nmIfD?)RUF4FA+ACi++)hOs9BQjk-u;Z>)RV16gh$_FMrmm&^741TWTSS^rnp)Rgb4x1g=g*D( zI%VnSVd#FD&R$=SRa1Y)Q65*p{>QBbVOi4duB3kM)xgi#g3xl%;Z092o54BM5#PR3 zl;K{#SO*CI@%l>osxoYu7;{K#Rw0&)n_K*B+GtN$n&m>-r)U$6c{A5W$&Y3wZSGwz zmQ0(2YKcap<*18zaL@*63Gh+EvaHrPWH6=X*9*3)78zX?e;M9lcPy#niw@=OG@q z*Wj_a*FCN@C2P4k0Ie?!v`**bRMz&#kk!=(&m=bU1MKU>G>%+u?P!|N25u}g@0d6v z9;Q8est~2@Gg@Gl=}lUs{%o6W8>>GyI{j%Po$HL-r4S7bILlk8dlH$|=He$zPuZvx z{)fN~CpqYT6Upgc>}#!e=P+}cMVNIZ7A`Lgop^%tLfTg(wCXf`&EEa419j{wWeO;l z+}pX)qwA1~9&FsMYiz9X+FSDy?iusS{88Wp${DV-T+wiXh7H9AYv~o_Rn9APt zF{P*GMVT9GdEAS<14X9ia`f19*7m{oLOqQ4667OOdXOnK7`MNU05Aa(A!ZBVx{KIF zk2|R|%9+7sgr(M-`dg2=akiCbwUnI384{Rbtem*B`p7`_pCJMGy5I6+RQes1ZfkDrjB&KaS1>9P0d!<4A>8Aw|g52$dr- z2+>6DyG_lIV?r4B6>_vlk|X3kLdeP$Gj1y7K9*r-7)PZXjUjjL|EK?M&(l8p?BmGJ ze1G51=ly=Yw)Bky$IaaX{)<)t)XKV}5g6Kln;11}*Nu~EEU!r^^r3;)vdV{iiM-hqOb)dkkR zXshl@*8VAk9SkczS|v9=9M~$$#u`8D&ZcH&{yVY1wO2+TdY7$Acwk=Maof?p8CU@> zu+yY3#t;=wT)p{4iS7 zIeC51+42M#K$6aC3yX^*Z&pX&;ze8&P-TUpvQp-Gxbs&~^T`T?^>DYAuV*$F)FA0| zZ7#)SHu&sq+Irx^&RsfF34Zxg|BQSY{P4+`rahH~#o5Wi!U7#ZGEp8sdh-lgg{O;)t47L2byUhwQoaE-S5?Pbmy7rtT6XGT<^i3- z7ZtysRe0>sYo$_q(9Y2r=^`3w$iidzi$>=R?s?CwMaDQDKuPPX?TO&I^ebejv^h2N zxzI(wf0{>J?l&-FdF)ysOyrGlrRM2mrid{KuuU6qCwlO)XcdXsf+*R!Y}5;nF0G{8 zsRJRgz1oj1-;Jz z|1>v`MAO_JEtl`?s2{9$G_CcRWBJV4l67)qud1RaR}!@M_aN>MK1o544erlRU0d!g zz4p63yU!E7Ug%Kq@LiULZU5_=d5d3c<1>yXkvO>+hu8jbu-?OUTpzB%o{(&Q%tq zxMdZM$im&}Bn})A;>fVq`Ez=7aJSEM2bUE_ynY(SeDqzl{mlp)kc;C}`iGN8GaxmT zo{r)?%+JXp0&K^y%Xh%oo`^%qv7jCkpS;53h62;1&%P~w(H9`}04HdB@IVQDVh8RD zftJUK&U~?;d@NyPMajt}KJ(Dj(qgk^t&~#9Vp2Bb3}e+Qv5J;UGthp}{a4o!MjK4n z`)BX_<#j|)ikNUn2y5hpRf^;f^O?FRCOuHr72}@%P9ljx5(?(7Ojsa45?qCKb$M~` z(=U9C;|SwUtTNQpu}$(DwrkXT2iilXLnsEOL&6NByf}X0SYn<}HM3X*sF%;x`ivnt zxt?`$^)}w|arN#WFFbutGB$hO(|LNh2yqfJ&L3=4h))c{Be=cBj_AtT$4NO4%Gz6` z;e8Ij7iK`@=;}PP<2Yi#MCtVV=e01CES%NPtIUifyAT-iOO_EG+sezQFO=Dzf0Cdf zs;3#ta^@-g!|S_KeLGhbPP9FZxNP(M1unx?rOQiKCf?UTL|o^B3$XBud9${7_nA7~Led*T|_01&pgJoDwY4;RVz+*$};x@nWf`HJNiQ`{4%E^M+*yAS} zer&@FPh7CkfwoOEw!BJdU22)gbXWEMDwOm4zoS!YKpi+k{mS3;!Dau;iGy*WgVChP z^)l-nN|)g~#yh+=2M@H8-}u%Go*+#_=qb(J^&XlXE)`~wb#C)q(VVh~)X8UgFClx4 z0J4NftK|?r{;^GavaBI;Mq5~`li)#q3Gq9uW(i)i!_K9p#f2|wnX-(9@gCWApl&+D zTqWx04%yQG5w%5upS0P0Ju+Nr_>t+TI3M+%N7dRUowoo5?@-vHkYhlpgVGi%!Ao zkE*AxwV2cFrYZfy!ey`Qqhm*he+um`=C;5pbi79Oua$3Ky>M0DE5GX}4!zX)c|n}; zZ(*+{KK5?oolD654X4d@ekwl2lP}8%C(gl15Yv6fT2Er>+87-CP-U)iRGY@{-sBg0 z;DMce?HU<|BN)nJdSQK&1II(HQBKyc!nU^Qj@q4ae)0`T`z$jNjgN!~lsS`^gQPtl zNzu}uUf(=YaWECBgKZWkAY6O44oi(~QjSQ0~2hxuZ)$ zXO*Qm#hl4WAmtOa3-v$v-jxJX<&S((*KIlHHHTZCBok1tM9&H=2%SBvHaC;maCfs> z{ovS%maQ3!hxHb9w8chJ+l5;Zw|?C(Nk+NoHu#;o*yVH2n?B#V)6?2e*SKjWvu;-X zd3U$|Sg>^?8UaO14eq-~Dr0pSbh*;u>KVuKm_f%e+N`0o7ioynIUQ!gZHqg`T*&R9 zw(`>hPq|;Epnla-w0I95T7FxE{IGa~e8`bf0)~f8X7D*WNlrfXpOPDWX?{j9Up8+^-A;XJ^oeMNllpt^SAN z{x^buaGQ4S`Y9PeJI1N=Kd! z6JvlIAe$}mq~Ln!RX1yJ$v>a*C)J{8P!{^}~_vv)XulSvNo zo+DA?i#!VTG4VAx@Aa8bTx_}#m97N_MKgN^c?!2nok;#SR`GZJF4FJP*m0glfh$&csD3^G}dF)*@dYElYQ(0b8aPG_Q+k6dc7u!mPH3P?mXNnrym>a^@nDStX*n z8r*=uMtqk&&19SKo{g%ZLqT#;D3mbf1VZc;%vD1dqo6FWG~iXL)p)K1cK^{RN|C1r zov)&eOY{B+7rhi}+D0B$W=NlnZPcEg9IOnL7nCku|L;$lI_GvT_iS<-#kj z{NeWe5vXTRHQrrMyq`2L-!}ZDi`GRGiMmXsbRziEmAXE)w;y@@TGkeExU-YxR7n_4 zmcsi!h0|1Wym^ift+chh)D5?!x)@!%x3aX`r{DBj z|9I@gM1i?@e2{>*^A`zQ72@UGsgTWj?^zkuIdF}xg_pPP#O<`_y+lX-?Q#+&)?Je$ zFV>wXKplH+D5&j)UcgQHPwj6HZJDG$Aq~*BJpd=&>}*x?g@EP?>^AQgEYBX=e((l= zDHY2n0>d;zY|{Nsc}`b7UDkhpjBmxrEZfEJm#QC>)&{OBszRxSC$y`UV>Q#g-jlb3 zuz{QWp;R6>=A|~_-7x`gU1N890Y>IQQ~>864w4<}^rFmu-1^>!&*4WWd}fwIw|=Jv zM?;GCXYbO%vUP6#{8){*9O8QUl_=G#0*0(FJ=0QlqR!?GO$2RzhHWb>5SwOt|6J}j zy%fNXJ4Rt*#mSjV5KG%e&IxV23jG}=zFD3AtVo0y_g{@0C)fR+SAR_dvV@J(XLhkZ zP3pwP35%mNSoLbnFE(#liWG?yJ3)iE4j6{VrLD$BCj+4c{u9t5AwYp%e%f)(%W;-c znV}~+`VLQM4fPmMgQ(0{~ zZ@F@W!6Ou8y|h00+w6{?)HjLh>zy5{uie(F z(bpEIuYHT1`t2L~B`Ory6u)FDnim_A9F2^^FUO3+p`aA93+Jz2&!QSnL-*(E)c)K? zpOx>ViP~JXfZgBoM2vX+(yba*%P3Ty=L1f@+q4nq<~x^gMJ0uoDJkDIKT_J;o!+;1 z5?pn89}~;&im)nEojaXOUKb-TS(L61k~Z4$5ZI;?mzq{L8sn_J7e3a<@GLcZtcI6o z4$u~Zc~TmCTq=}DdNwEgY%{j8#m4I2P2-!Eub*gKoHP^W+~dy;ELvvbY~G zSNrSi3vSoW{nduJUcB5R^vTYv8A8^u~p9mbTnMqv*b>k zh`R)0+6nmTg9{8cf@l5w2}rTx*!Nr??^h#)F*iGr5OhCCI69@8CbU(R%Q-gwbIfa$ z)HXSJoxF+a&e{w%nuaH{^+M}~&r`qF?`_409t((KAkZ5(yY7AnHXp#Tb8W~ zGL7YvU|>o}I``3!pPz$iI)%_!E+DvIt>nL0#9uK%Njm_IXE(6rpf9#^!GFSg^Xmt> zTcQ!keP(ro=k?#I#S#PS|HTWa5LQ)M_cMK?%`z{4r@+R`a-mbv)padooD zNg?iIKBkYFQ8wi95@JMTVwT_4E9XRCOB~LU5)121=47dy7%w8N`(Do7v{Ekz^-kZc z>$@^f954(*ciO=-0dN!d6@B%sy+)qJ=J_YI6B`yPRB>`?6?+P|*cc^CH_);E9Uv)7=f-+;eZm&*IjUZ>y7f*$H4nL`D@uFXc?6Bkki(3*ncuiy&7RQbXLl$Obs@3RKqrw&OUFbnePGr& zP-kkw$oCqw6d<+pPOB9uYc+(vL)<;`s0}V_I~VDRPU6bF#)i z2@yAJP|RL@-*07lWi;`PIpctg(IL>D)sE{cdr?$KO?IND&<(P_usFYonbVULQ9i^f zYvefQ^f>dd-`H^vx#!By1Lkdfmu-UG+8C%?h> z>ZQLNN`;!Srslk}HEe_-B%OcJRKFw-{by|cbn-L>@h z8c}AZr(>jVBggKQ=)_NDeA>hO@yN0PN*KX>lQ%p8hm)(eC#+H4DFB@S8;Dab#9RgR zm(q{nrks@r4|YnO{FN64*>_5pJrvHeyDHcG_>UxI@n_|mGCj;ykie9{#Hgu*LV>b^ znaieHkQ%t+yfT

      e*fLI6D@n^ueYa47~4!bpfU<0V`I72m`dq^773jweZkkDgw1VWMb4| zNnmDT7EWN$7Y<8+kHGwtMTD8{j6N{AwW7_S-Iws1g-P6eX4Ko!`sZgMvz@zw3xZZn zzql$^R;v4?UPIaiBFj9Xn=2J7Ua(S~@}oAZZ(%|=IVts;_vhF-|EH zA;}P_7hSR?1l;{c1=@kVZEknVPVhN}8z^D^Z4b1}RmBHSP4JYrE@!x1>lta7n)9|y z-9kaidFS59D5)wvJz*z(Zg}9ro2fMR)Zfqq&;Ro)P)(OpizR${IKx#d?3A!* zzM;7xTCiyiE4X~2V)@zBx|+HlxtT|BwNv}AX^xj@)YmPCTEPxeVB?Gq`JM>)&JF<< zEB}eEE8>18lYXO@IH%Kw4Dr@1WKN{cF3lmi^3wudK#RFtR-P^t6`M6gyF3`Hi-k5;ZWR-7`&k z!3w=_>2}+zVeGw?uP1`Rr?tlx-|SP9Bha35inks463xSZtj8&wiS>*=3u_+p$&bRe z;ivTY^AaLOHT>e*0{O^!m$Z7;e?F)mql{lN&Dl*Z7L<;U%e^`|@DmCv?Hi=eF^xo} z$zQLaiaK{xh?>>J;Ym6pE2?1Nsagi-(CJ8@?1>$iejU0ufm$-(8-A(P^UURT9V zMkKrzj?jQLSF)1;xu;-jW_M`uGn9L2Bc}9cCc_$pvtk^6(kEo-OZV!2)t;A>*$qXlI-zl7b!RT z+PrxXoJvi5UGBS2Dh}ji*17yA0&4Y5rwXOOwWn9Yg?IL?tHoC-g?#%|b+Y4mv6E=R zF#5_FD;);r!gw?!slWnEOToB}D-%E(yrUu>CltDF5wH$6q>3lL5?RTjtisPOos`xx z&95K13#UlvhGQrw0@lIr^-jAKiZZ5b989B1C{7LvYqDsiCS6Zbiw$w8E}6ku%Jf+R zsy#6)&Wr&O8J57^Z4i!PD?Ir%#cE25py)hh+=d9KQto&&tbcSTbVo6Chf`?FR#E-; zjL^XccQtqtEHNh&-cVJ<$uwW}C9zbq=OX$eA0|J0ssYeCeze)AB*ji#)b(`@`;qs& zFI=Df`Z?!urvj!Ol(FZHIm^ittDE$N1X;vo7%e3`fx{W2OBdY zYmjap*bR}`g!>pX9aJZ$rsf|mml?cq=Ie-Z<8O1~ht2YH*He#6PlRk{?=@9er5DYE zkTKwwl%g^5H3Ss$!RvZEA^p5(5e=w?4<_1zaJtIA2RAyzdc?6Po7pIwgDbJY>~wXA_hn3P<6WL$i-vNE_Y6;aYqHbZ z)1yzBX)-*y-0XJk&Iz6qDUDI3;eWpH^MHAJJ%KhVJ1Zy%JuRmU&1ADvoTl855t6Wy z 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%0DXXZrpKDQlf{?}o&Np6)q1=?- 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%0Dn86jWF>*wlmxO;PJg=I6JH1R-e)T2mQ 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 E! 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

      {e z90?J$dIIcZZ{+z|SyFN5z{cX~4RIHj8#%1HDafc7BW$e0%{?WkqQ|K z<>{%nBRK)OPh%C+(AUMHqrk1urCZ2)sa;=`L5zo+ISQ%gepwvB^G#2zQ2I*BZC#dV zMc}9g*HJ)})sJe`O?ky-$Zy2b`bf72$}OeaZ{>0;-)U0okO~NL8DT$UY)2I45Fo%WHu@Fjz=T~vb^VWXD-I+xpXWiHQ~2EH}q8N2xnnKV_Qmiv|!Elu8$ z#xSF^4^?nM;kyPAix(ZY$MD1(A1cT^4)!R@GGUi2`4~VoT%T;CbG--7XBZ3xP(ITR z;37|-$(Ve^zWNVQt%?fwem5nvj}wGTzq7gnkd0Oa*!xm1bqp=r^`Gg26q5@_%QDU` zzeZ+y>&o;;89LszdoAQ!`O(gzg9ZL5D10@@ana2YAV+tGGS-@Cb3}^QtxB{*Wyv0> zFH8B?ssCD1vgfXrLJkUzLQW+(eU0J$*YNQ@vg=` z64Yq%qXbAoUw1FwB+IX9%}bY^^>_gdeEoI4?$)Q?tNr!Ac36uWH$KDunIvtfuHBj+ zIPfA|ue}?3GPf40EU4YANG8hGmP>o^d25{15_Y$*u z$*$B6Jp56A+#`3qt*yB?=D6(UwCyH*^rJ*`zW(Hp#z*ev%}#`x=~c@x09%lqr=0+x zVw=b@LEMu2X(D$IX{D(}19;Xzk~vv5;K?Ta_y+?>4 zZF!EKwDXj)P0k3y6Q^!pIbN33U%pAtqnU%P9NgnsnGXy+WvKRYIKIrMO;lrmIv3|s znAATHXmY=rvTh1#;~JY4X9&SYi6JovgE!VschD-z_s23m`~dJq;XGe5TC%cnIZMDx zeMH&?wFomb)0_Le5 zH?zFWqm+0Z!=6hrNTU=)ukO>!3^nE4<{4J-RSW_l9@S>3kb*e-*t~=@l2d`1b23GK z@ESu3r}?SxR;P6G`rT_=>TfWlJY@%g-FPV%ynldga?$l7JaWpP_l@7M zds!#i-VpV0_gB_^ual#OuHoV6jV5`E#I%Y?|6_){VV%VC!=LmN2lWBYQ0+D8!G?v~ zDyDPeC=Rb%j-4M_N*IiATu>$*=_vANu)?VyT+5C4eMd-{y{wi#1w(C4R%Zk^X5c|d z=?{HnzfXC>{^a|ad{w`&h@cZ-hiO@EQ_%vwo~CVSix&EThF8PhwM?e}!d&N_PrlD} zQmEc7ArV2e_C}P2BMO2$TFsuZ9S3y`V27B*=G6Ic5`{%0DPVu||c;D+w#-qNa z<4(QLdG%4E$6k&u9JZNB2p!gvtgpn%Lh)(C!zoo475FtAOt46hr2bN@XUH;k8RU^u zE|-jFwQw}_J=O=;!pk@#@h@KQFt?1(pAi31xBewoKLut@#s&hLDcjzLMM>z ztyB~{R0b)KV=fAO0XIRNBKl4{%jx#Q3*zGJhTP7lzzr1AH8m*W3ULJ|tSjUOM%Ri3 zp&=1z3X~-pBRa*maSFMZWz$!~HDf8IjYMmOI>8awrXstPo*t=lBES~L?d-}UB5)^5 zDU;cVfpHjj6UZ;YzSM){e2R?~!O5=xh(S085Mz3Jl@)UK1;)Pc4B4g)9<- z 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�OmluTot8Ce%|51U`j}#!$xK!lw$r6 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

      on6nA#a$@T9-^k1U@y?=_wGd;$@uo5IaJ53bii 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

      Y6M9Xi-eh| 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