Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -542,7 +542,7 @@ jobs:
path: release-downloads
merge-multiple: true

- name: Build release notes
- name: Build release notes with detailed changes
shell: bash
run: python3 scripts/release_notes.py notes --tag "${{ github.ref_name }}" --output release_notes.md

Expand Down
5 changes: 2 additions & 3 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,6 @@ sequenceDiagram
OH->>OB: WebSocket API
OB->>U: 显示回复
end
end
end
```

Expand Down Expand Up @@ -901,6 +900,6 @@ description: 从 PDF 文件中提取文本和表格,填写表单。当用户

---

**架构图版本**: v2.15.0
**更新日期**: 2026-02-23
**架构图版本**: v3.4.1
**更新日期**: 2026-05-10
**基于代码版本**: 最新 main 分支
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
## v3.4.1 附件缓存治理、隐私安全防线与B站管线重构

本版本围绕三大主线展开:一是附件系统的缓存容量治理与 URL 引用回退机制,防止本地缓存无限制膨胀;二是系统提示词新增 P0 级隐私与危险动作边界规则,从源头约束 AI 对敏感信息和安全请求的处理行为;三是 B 站自动管线全面重构——移除外部下载依赖、内联实现 API 客户端与 WBI 签名、新增弹幕获取并以合并转发形式发送提取结果。同步新增 `/feedback` 反馈命令、恢复发布说明中的分类提交详情,并修正提示词优先级体系。

- 新增附件缓存容量管理。`[attachments]` 下新增 `attachment_cache_max_mb`、`attachment_cache_max_records`、`attachment_url_reference_max_records`、`attachment_url_max_length` 四种配置,分别控制本地缓存总大小、缓存记录数、URL 引用记录数和 URL 长度上限;超出容量时自动淘汰最旧记录;`remote_download_max_size_mb` 现支持热重载。`send_message` / `send_private_message` 工具调用时自动登记关联附件 UID,AI 客户端发送消息前校验本地路径有效性,文件缺失时自动回退到 URL 引用。
- 新增 P0 级隐私与危险动作边界规则。系统提示词新增 `<privacy_and_safety_controls>` 规则块,分层约束:隐私方面禁止泄露好友/群/成员列表、完整 QQ 号等敏感信息,对外默认脱敏,第三方信息查询需授权;危险动作方面拒绝涉黄、涉政、违法、骚扰、人肉、社工等请求,不做解释也不给绕过方案;时序方面明确隐私/敏感话题不改变回复时机,必须先满足回复触发逻辑。附加 3 条 P0 硬性约束覆盖隐私泄露、危险动作和触发时序。
- 新增 `/feedback(/fb)` 反馈命令。支持 `add` / `view` / `del` 三个子命令,`add` 和 `view` 为 public 权限,`del` 为 superadmin;声明式子命令推断按 ID 格式匹配优先 `view`,其余 fallback 到 `add`,无参数默认 `view`;私聊可用,显示在 help 列表。
- 重构 B 站视频下载链路。移除对 `oh-my-bilibili` 外部 Python 包的依赖,内联实现同步 API 客户端(`api_client.py`)、下载核心(`download_core.py`)、WBI 签名模块(`wbi.py`)与错误模型,所有请求在 `asyncio.to_thread` 线程内执行,降低依赖复杂度与跨版本兼容风险。
- 增强 B 站自动提取管线。新增弹幕获取模块(`danmaku.py`),基于 protobuf wire 格式解析分段弹幕数据;自动提取结果改为以合并转发节点形式发送,单条包含视频信息卡片与弹幕预览片段;`MessageSender` 扩展合并转发本地附件递归登记,确保转发中的图片/文件能正确注册为会话附件 UID。
- 恢复发布说明详细变更列表。`scripts/release_notes.py` 新增 `build_detailed_change_sections` 与 `render_detailed_changes`,从 git log 按 feat / fix / other 自动分类提取两个版本间的提交,与 CHANGELOG 条目合并输出完整 Release notes。
- 修正提示词优先级体系。明确所有 P0-P3 规则均可被 Null 明文指令覆盖,创造者权限作为绝对最高优先级可覆盖所有规则(含隐私与危险动作边界);同步更新 NagaAgent 版提示词的对应表述。
- 补强测试覆盖。新增附件缓存配置、容量淘汰、URL 回退和文件分析 UID 注册测试;新增反馈命令全路径测试(add / view / del / 推断 / 权限);更新 B 站下载适配器测试;同步更新系统提示词约束验证。
- 更新架构图与文档。
- 新增附件 UID ↔ URL 双向查找工具。`AttachmentRegistry` 新增 `get_url_by_uid(uid)` 和 `get_uid_by_url(url)` 两个异步方法,并注册为 skills 工具 `attachments.get_url_by_uid` 和 `attachments.get_uid_by_url`。

---

## v3.4.0 同sender消息合并、数字人格精炼与系统治理

本版本核心解决"用户一口气连发几条消息时,机器人过早开工或只理解最后一句"的问题。新增同 sender 短时消息合并器,将同一会话中连续的多条消息合并为一个"当前输入批次"发送给 AI,由 AI 整批理解哪些是独立请求、哪些是补充或修正。同步支持可取消的投机预发送以降低感知延迟。围绕消息合并,提示词、幽灵任务防御、记忆记录和关闭流程都做了同步适配。此外,精炼了数字人格设定、明确了项目归属边界、重构了管线与命令体系、加入了 HTML 渲染缓存,并增强了 AI 工具调用的稳定性。
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
</div>
<h3>项目简介</h3>
<p>
<strong>Undefined</strong> 是一个基于 Python 异步架构的高性能 QQ 机器人平台,搭载<strong>认知记忆架构</strong>,采用自研 <strong>Skills</strong> 系统,内置多个智能 Agent,支持代码分析、网络搜索、娱乐互动等多模态能力,并提供 <strong>Management-first WebUI</strong> 在线管理,以及可连接同一管理服务的 <strong>Desktop / Android App</strong>。
<strong>Undefined</strong> 是一个基于 Python 异步架构的高性能 QQ 机器人平台,搭载<strong>认知记忆架构</strong>,采用自研 <strong>Skills</strong> 系统,内置多个智能 Agent,支持代码分析、网络搜索、娱乐互动等多模态能力,并提供 <strong>WebUI</strong> 在线管理,以及可连接同一管理服务的 <strong>跨平台 App</strong>。
</p>
</td>
</tr>
Expand Down
4 changes: 2 additions & 2 deletions apps/undefined-console/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion apps/undefined-console/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "undefined-console",
"private": true,
"version": "3.4.0",
"version": "3.4.1",
"type": "module",
"scripts": {
"tauri": "tauri",
Expand Down
2 changes: 1 addition & 1 deletion apps/undefined-console/src-tauri/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion apps/undefined-console/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "undefined_console"
version = "3.4.0"
version = "3.4.1"
description = "Undefined cross-platform management console"
authors = ["Undefined contributors"]
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion apps/undefined-console/src-tauri/tauri.conf.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Undefined Console",
"version": "3.4.0",
"version": "3.4.1",
"identifier": "com.undefined.console",
"build": {
"beforeDevCommand": "npm run dev",
Expand Down
24 changes: 24 additions & 0 deletions config.toml.example
Original file line number Diff line number Diff line change
Expand Up @@ -831,6 +831,21 @@ group_analysis_limit = 500
# zh: 远程附件自动下载并缓存的最大大小(MB)。超过上限或设为 0 时只保留 URL 引用,不下载文件内容。
# en: Max remote attachment size (MB) to download into cache. Above the limit, or 0, keeps only a URL reference.
remote_download_max_size_mb = 25
# zh: 附件缓存文件总大小上限(MB)。0 表示不按总容量清理;达到上限时优先删除最旧的本地缓存副本,若记录有 URL 则保留 UID 与 URL 以便后续回源。
# en: Total attachment cache file size limit (MB). 0 disables total-size pruning; when exceeded, oldest local cache copies are removed while URL-backed UIDs keep their URL for later re-download.
cache_max_total_size_mb = 0
# zh: 附件登记记录最大数量。0 表示不限制数量。
# en: Max attachment registry records. 0 disables record-count pruning.
cache_max_records = 2000
# zh: 附件本地缓存最长保留天数。0 表示不按时间清理;有 URL 的记录只删除本地副本并保留 UID/URL,无 URL 的老记录会被删除。
# en: Max local attachment cache age in days. 0 disables age-based pruning; URL-backed records keep UID/URL while their local copy is removed, records without URL are deleted.
cache_max_age_days = 7
# zh: 仅 URL 引用的附件记录最大数量。0 表示不限制。
# en: Max URL-only attachment reference records. 0 disables URL-reference-count pruning.
url_reference_max_records = 2000
# zh: 允许登记的远程附件 URL 最大长度。0 表示不限制长度。
# en: Max remote attachment URL length. 0 disables URL length checks.
url_max_length = 8192

# zh: Skills 热重载配置(可选)。
# en: Skills hot reload settings (optional).
Expand Down Expand Up @@ -1013,6 +1028,15 @@ max_file_size = 100
# zh: 超限策略: "downgrade"=降低清晰度重试, "info"=发送封面+标题+简介。
# en: Oversize strategy: "downgrade"=retry at lower quality, "info"=send cover+title+description.
oversize_strategy = "downgrade"
# zh: 是否在自动提取合并转发中附带弹幕。
# en: Include danmaku in the auto-extraction merged-forward message.
danmaku_enabled = true
# zh: 每个内层弹幕合并转发包含的弹幕条数。
# en: Number of danmaku messages per nested forward group.
danmaku_batch_size = 100
# zh: 最多提取多少条弹幕,0=不限。
# en: Max danmaku count to extract. 0=unlimited.
danmaku_max_count = 0
# zh: 自动提取功能的群聊白名单(空=跟随全局 access.allowed_group_ids)。
# en: Group allowlist for auto-extraction (empty = follow global access.allowed_group_ids).
auto_extract_group_ids = []
Expand Down
16 changes: 15 additions & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -451,8 +451,13 @@ Prompt caching 补充:
| 字段 | 默认值 | 说明 |
|---|---:|---|
| `remote_download_max_size_mb` | `25` | 远程附件自动下载并缓存的最大大小(MB)。超过上限时只登记 URL 引用;设为 `0` 可完全禁用远程附件下载 |
| `cache_max_total_size_mb` | `0` | 附件缓存文件总大小上限(MB)。`0` 表示不按总容量清理;达到上限时优先删除最旧本地缓存副本,有 URL 的记录会保留 UID 与 URL 以便后续回源 |
| `cache_max_records` | `2000` | 附件登记记录最大数量。`0` 表示不限制数量 |
| `cache_max_age_days` | `7` | 附件本地缓存最长保留天数。`0` 表示不按时间清理;有 URL 的记录只删除本地副本并保留 UID/URL,无 URL 的老记录会被删除 |
| `url_reference_max_records` | `2000` | 仅 URL 引用的附件记录最大数量。`0` 表示不限制 |
| `url_max_length` | `8192` | 允许登记的远程附件 URL 最大长度。`0` 表示不限制长度 |

外部接收的远程图片或文件默认会先下载到附件缓存再生成 UID,避免后续 URL 失效;大文件超过阈值时,UID 仍会生成,但绑定的是 URL 引用而不是缓存文件,AI 可在上下文中看到原始 `source_ref`。
外部接收的远程图片或文件默认会先下载到附件缓存再生成 UID,避免后续 URL 失效;大文件超过阈值时,UID 仍会生成,但绑定的是 URL 引用而不是缓存文件,AI 可在上下文中看到原始 `source_ref`。如果本地缓存因总容量或时间清理被删除,但记录仍保留 URL,后续需要文件内容时会优先按 URL 回源下载。

### 4.10.2 `[message_batcher]` 同 sender 短时消息合并

Expand Down Expand Up @@ -628,9 +633,18 @@ Prompt caching 补充:
| `max_duration` | `600` | 最大时长(秒),`0` 不限 | |
| `max_file_size` | `100` | 最大体积(MB),`0` 不限 | |
| `oversize_strategy` | `"downgrade"` | 超限策略 | 仅 `downgrade/info`,非法回退 `downgrade` |
| `danmaku_enabled` | `true` | 是否在自动提取合并转发中附带弹幕 | |
| `danmaku_batch_size` | `100` | 每个内层弹幕合并转发包含的弹幕条数 | `<=0` 回退 `100` |
| `danmaku_max_count` | `0` | 最多提取多少条弹幕,`0` 不限 | `<0` 回退 `0` |
| `auto_extract_group_ids` | `[]` | 功能级群白名单 | 空时跟随全局 access |
| `auto_extract_private_ids` | `[]` | 功能级私聊白名单 | 空时跟随全局 access |

自动提取行为:
- 命中 B 站链接、BV 号或 AV 号后,自动提取会发送一次外层合并转发,固定包含三个节点:视频信息、视频文件或视频状态、弹幕列表。
- 弹幕通过 Bilibili protobuf 接口分段拉取;项目内置了解码逻辑,无需安装 `protoc` 或额外生成 protobuf 代码。
- 弹幕列表节点会按每 100 条弹幕生成一个内层合并转发;每条弹幕对应内层合并转发中的一个节点,便于在客户端逐条查看。
- 视频文件下载、清晰度、时长和体积限制仍由本节配置控制;自动提取的转发消息也会通过统一发送层写入历史,供后续 AI 回复读取。

---

### 4.20.1 `[arxiv]` 自动提取
Expand Down
8 changes: 7 additions & 1 deletion docs/pipelines.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@

命中自动处理管线的消息会继续进入 AI 自动回复,让 AI 基于用户消息和刚写入的自动处理结果判断后续行为。

## 内置 Bilibili 管线

Bilibili 自动提取管线命中 B 站链接、BV 号或 AV 号后,会发送一次外层合并转发,外层固定包含三个节点:视频信息、视频文件或视频状态、弹幕列表。

弹幕使用 Bilibili protobuf 接口分段拉取,解码逻辑随项目代码提供;部署和开发时无需安装 `protoc`,也不需要手动生成 protobuf 文件。弹幕列表节点会继续拆成内层合并转发,每 100 条弹幕一个内层合并转发;每条弹幕作为内层合并转发中的独立节点发送。

## 目录结构

```text
Expand Down Expand Up @@ -102,4 +108,4 @@ handler.py 需要导出 `detect` 和 `process` 两个顶层异步函数。

热重载每 2 秒(可配置)检查 `config.json` 和 `handler.py` 的 mtime + size 快照,检测到变更后等待 500ms 防抖再重载。新增或删除目录也会在重载时生效。

`PipelineRegistry` 监视 `config.json` 和 `handler.py` 的变更。如果只改 `README.md` 不会触发重载。
`PipelineRegistry` 监视 `config.json` 和 `handler.py` 的变更。如果只改 `README.md` 不会触发重载。
26 changes: 26 additions & 0 deletions docs/slash-commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,31 @@ Undefined 提供了一套强大的斜杠指令(Slash Commands)系统。管
- `/faq del 20241205-001` — 删除 FAQ(需管理员)

#### 6. 排障与反馈
- **/feedback [add|view|del] [内容或ID]**(别名 `/fb`)
- **说明**:公开意见反馈板,群聊和私聊均可提交与查看;超级管理员可查看完整审计信息并删除反馈。
- **子命令**:

| 子命令 | 用法 | 权限 | 说明 |
|--------|------|------|------|
| `add` | `/feedback add <内容>` | 公开 | 提交一条反馈 |
| `view` | `/feedback view [ID]` | 公开 | 无 ID 时列出最近 20 条反馈;有 ID 时查看详情 |
| `del` | `/feedback del <ID>` | **仅超管** | 删除指定反馈 |

- **自动推断**:
- 无参数 `/fb` → 查看反馈列表(view)
- 参数为 ID 格式(如 `20260509-1000`)→ 查看该反馈(view)
- 其他文本 → 提交反馈(add)
- 显式子命令优先,不会被推断覆盖
- **可见范围**:
- 普通用户列表和详情只显示反馈 ID 与公开内容,不显示提交者 QQ、群号、私聊用户 ID、创建时间等元数据。
- 超级管理员列表和详情会显示完整审计信息。
- 反馈保存到 `data/feedback/feedback.json`,ID 格式为 `YYYYMMDD-N`,同一天从 1 递增,不限制 999。
- **示例**:
- `/fb` — 查看最近 20 条反馈
- `/fb 希望增加夜间静默模式` — 提交反馈
- `/fb 20260509-1` — 查看指定反馈
- `/feedback del 20260509-1` — 删除反馈(需超级管理员)

- **/bugfix \<QQ号1\> [QQ号2...] \<开始时间\> \<结束时间\>**
- **说明**:从群历史记录中抓取指定用户在指定时间段内的消息(包含文字、图片的 OCR 描述),交给 AI 进行分析并生成 Bug 修复报告,结果自动存入 FAQ 库。
- **参数**:
Expand Down Expand Up @@ -300,6 +325,7 @@ src/Undefined/
├── help/ # 内置命令:基础帮助
├── copyright/ # 内置命令:版权与免责声明
├── faq/ # 内置命令:FAQ增删改查
├── feedback/ # 内置命令:公开意见反馈板
└── my_custom_cmd/ # 👈 你新建的自定义命令目录(需要包含 config.json 和 handler.py)
```

Expand Down
15 changes: 15 additions & 0 deletions docs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ Bot 支持在运行时维护一个结构化的群专属 FAQ 知识库,可通
| `/copyright` | `/about` `/license` `/cprt` | 公开 | ✅ | 查看版权信息与 MIT 许可证声明 |
| `/stats [天数] [--ai]` | — | 公开 | ✅ | 查看 Token 使用统计图表;附加 `--ai` 启用 AI 智能分析报告 |
| `/faq [子命令] [参数]` | `/f` | 公开 | ❌ | FAQ 管理:列表/查看/搜索/删除,支持自动推断子命令 |
| `/feedback [子命令] [内容或ID]` | `/fb` | 公开(del 需超管) | ✅ | 意见反馈:提交、查看和删除公开反馈,支持自动推断子命令 |
| `/bugfix <QQ号> [起止时间]` | — | 管理员 | ❌ | 基于目标用户近期发言生成娱乐性 Bug 修复报告 |
| `/admin [ls\|add\|del] [参数]` | — | 管理员/超管 | ✅ | 管理员管理:ls(列表,管理员+)、add(添加,仅超管)、del(移除,仅超管);无参数默认 ls |
| `/naga <bind\|unbind>` | — | 公开 | ✅ | 绑定或解绑关联的 NagaAgent 实例;bind 仅群聊,unbind 需超管 |
Expand All @@ -357,6 +358,20 @@ Bot 支持在运行时维护一个结构化的群专属 FAQ 知识库,可通
- 附加 `--ai`(或 `-a`)时,向 AI 发起分析请求;若分析超时,系统会先返回图表与摘要并附带超时提示。
- 普通用户频率限制为每 3600 秒一次;管理员与超级管理员无限制。

### `/feedback` 说明

```
/fb # 查看最近 20 条反馈
/fb 希望增加夜间静默模式 # 提交反馈
/fb 20260509-1 # 查看指定反馈完整内容
/feedback del 20260509-1 # 删除反馈(仅超级管理员)
```

- 群聊和私聊均可提交反馈;反馈会保存到 `data/feedback/feedback.json`。
- 普通用户可以查看公开反馈内容,但不会看到提交者 QQ、群号、私聊用户 ID、创建时间等审计字段。
- 超级管理员查看列表和详情时会显示完整审计信息。
- 列表默认渲染为图片;渲染失败时自动回退为纯文本。

### 扩展自定义指令

系统支持热插拔机制,创建对应目录结构并保存文件即刻生效,无需重启服务。详细的开发步骤与参数说明请参阅 [《命令系统与斜杠指令》](slash-commands.md)。
Expand Down
3 changes: 1 addition & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "Undefined-bot"
version = "3.4.0"
version = "3.4.1"
description = "QQ bot platform with cognitive memory architecture and multi-agent Skills, via OneBot V11."
readme = "README.md"
authors = [
Expand Down Expand Up @@ -45,7 +45,6 @@ dependencies = [
"psutil>=7.2.2",
"pyyaml>=6.0.3",
"pypinyin>=0.53.0",
"oh-my-bilibili>=0.1.2",
"chromadb>=1.5.5",
"numba>=0.61.0",
]
Expand Down
Loading
Loading