Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
## v3.12.0 斜杠命令查询、四段侧写与对外发言边界

本版本让主 AI 能查询斜杠命令并按视角过滤,把用户/群侧写拆成评价、正文、锐评并改进 `/profile` 出图;同时收紧对外说话方式,避免客服腔、内部工具名和假装能改实现。安全模型在可重试 HTTP 错误时沿用现有重试次数。

- 主 AI 系统提示注入当前发送者可用的斜杠命令摘要;新增 `commands.search` / `commands.get`,默认查全集(纯文本匹配,不接 RAG),也可按群或用户视角过滤。介绍命令时注明权限,不代替用户发送斜杠命令。
- 侧写文件改为四段:`---元数据---评价---正文---锐评`。史官 `update_profile` 用评价、正文、锐评三个独立字段写入;锐评要毒、准、短,不能写成第二条评价;缺段、空段或格式不合规时必须重写,不能 skip。
- `/profile` 默认图片改为 YAML 键值表、独立评价块、锐评和 Markdown 正文;锐评紧挨评价、在长正文之前。
- 对外按 QQ 群友说话:单条消息少空行,禁止客服式接工单和「按你的要求改」;对方没先说内部工具名就不要抛。这些是自己调用的能力,只能填参数,实现来自开源仓库。闲聊默认不提起创造者或仓库所有者;被问及时说明开源协作,代码不一定全是仓库所有者写的。
- 需求明确时直接调用已暴露的工具,不再征求「要不要用工具」;不回复时只调用 `end`,禁止把闸门结论和规则自检发到聊天。
- 静默填写 `end.memo` 时,拒绝话术不再把发消息当成默认动作:该回则先发,不回则 `force=true`,禁止为通过检查去补发。
- 安全模型的注入检测、Naga 审核与注入回复遇到 HTTP 429/5xx 时按 `[core].ai_request_max_retries` 重试;注入检测在重试耗尽后仍失败则按检测到注入处理。

---

## v3.11.1 史官记忆质量与流式调用指标

本版本围绕认知记忆质量与 LLM 可观测性做了针对性优化:史官侧写以最新事实为准并克制膨胀,事件改写提炼为带时间锚点的独立事实,`end.observations` 只保留值得日后检索的写实内容;流式模型调用额外记录首字延迟与生成吞吐。
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ Console 和 Chat 都需要连接到已经运行的 Undefined 服务。首次部
- **主 Prompt 本地自定义**:通过 `[prompt.file_includes]` 将身份、权限或人格补充文件插入 `p0`、`p1`、`p2`、`p3`、`summary` 五个稳定位置,无需修改仓库内的主提示词;配置路径和文件内容均支持热更新,推荐使用受 Git 与构建忽略规则保护的 `config/prompts/*.local.*` 文件。详见 [Prompt 本地文件插槽](docs/configuration.md#4112-promptfile_includes-主-prompt-本地文件插槽)。
- **三层分层记忆架构**:创新的分层记忆系统,模拟人类记忆机制——
- **短期记忆**(`end.memo`):每轮对话结束自动记录便签备忘,最近 N 条始终注入,保持短期连续性,零配置开箱即用
- **认知记忆**(`end.observations` + `cognitive.*`):核心层,AI 在每轮对话中主动提取写实新观察(用户/群聊实质事实及有价值的自身行为;宁缺毋滥),经后台史官异步改写为带时间锚点的独立事实后存入向量数据库;支持语义检索、时间衰减加权排序、MMR 多样性去重、跨群记忆联动与用户/群聊自动侧写(合并时注入历史事件与当前时刻、按克制扩写去冗),前台零延迟
- **认知记忆**(`end.observations` + `cognitive.*`):核心层,AI 在每轮对话中主动提取写实新观察(用户/群聊实质事实及有价值的自身行为;宁缺毋滥),经后台史官异步改写为带时间锚点的独立事实后存入向量数据库;支持语义检索、时间衰减加权排序、MMR 多样性去重、跨群记忆联动与用户/群聊自动侧写(四段:元数据 / 评价 / 正文 / 锐评;合并时注入历史事件与当前时刻、按克制扩写去冗,不合规侧写会强制重写),前台零延迟
- **置顶备忘录**(`memory.*`):AI 自身的置顶提醒(自我约束、待办事项),每轮固定注入,支持增删改查
详见 [认知记忆文档](docs/cognitive-memory.md)。
- **Management-first WebUI**:继续保留 `uv run Undefined-webui` 一键入口;即使 `config.toml` 缺失或未配完,也能先进入管理态补配置、看日志、校验并启动 Bot。
Expand Down
4 changes: 2 additions & 2 deletions apps/undefined-chat/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-chat/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "undefined-chat",
"private": true,
"version": "3.11.1",
"version": "3.12.0",
"type": "module",
"scripts": {
"tauri": "tauri",
Expand Down
2 changes: 1 addition & 1 deletion apps/undefined-chat/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-chat/src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "undefined_chat"
version = "3.11.1"
version = "3.12.0"
description = "Undefined native chat client"
authors = ["Undefined contributors"]
license = "MIT"
Expand Down
2 changes: 1 addition & 1 deletion apps/undefined-chat/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 Chat",
"version": "3.11.1",
"version": "3.12.0",
"identifier": "com.undefined.chat",
"build": {
"beforeDevCommand": "npm run dev",
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.11.1",
"version": "3.12.0",
"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.11.1"
version = "3.12.0"
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.11.1",
"version": "3.12.0",
"identifier": "com.undefined.console",
"build": {
"beforeDevCommand": "npm run dev",
Expand Down
11 changes: 10 additions & 1 deletion docs/cognitive-memory.md
Original file line number Diff line number Diff line change
Expand Up @@ -238,9 +238,18 @@ tags:
updated_at: "2026-02-22T10:30:00"
source_event_id: abc123_0_1740218400000
---
Null 是一名 Python 开发者,专注于异步架构设计。曾在 Python 群中多次讨论 asyncio 最佳实践,对 QQ 机器人开发有深入研究。
技术判断扎实、沟通直接,对配置细节近乎偏执;偶尔把讨论拖进实现细节,对看不懂的方案容易不耐烦。
---
- 在校学生/业余开发者,做技术取舍会权衡时间、算力与预算。
- 独立维护开源项目,关注 AI 应用与 Agent 工程化落地。
---
把『差不多』听成宣战,配置差半格能记你三年。
```

文件固定为四段:`---元数据---评价---正文---锐评`。评价是 YAML 与正文之间的独立段落;锐评在正文之后单独成段。两者都不写入 frontmatter,也不并入正文条目。旧文件若只有一对 `---`,其后全部视为正文(评价与锐评为空);若只有两对 `---`,则中间为评价、末段为正文(锐评为空)。缺评价或锐评时,下次史官合并应重写补齐。

史官只通过 `update_profile` 写入侧写,评价、正文、锐评是三个独立必填字段,禁止把锐评或评价塞进正文。锐评要毒、准、短:损友式嘲讽、一针见血,宁可过锐也不要圆滑,不能写成第二条冷静评价;禁止脏话辱骂与隐私。`skip=true` 仅当现有侧写已符合当前撰写规范 **且** 本轮没有可沉淀的新稳定特征;格式不合规(缺段、空段、段内出现单独成行的 `---` 等)必须重写,不能跳过。`/profile` 默认出图时按「YAML 元数据 → 评价 → 锐评 → Markdown 正文」渲染,锐评紧挨评价、在长正文之前;存储文件仍是正文后锐评。

每次更新前自动备份到 `data/cognitive/profiles/history/{type}/{id}/{timestamp}.md`,默认保留最近 5 个版本。

### 文件队列三态
Expand Down
3 changes: 2 additions & 1 deletion docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ model_name = "gpt-4o-mini"
| `process_private_message` | `true` | 是否处理私聊回复 | 关闭后私聊只记录历史,不回复 |
| `process_poke_message` | `true` | 是否响应拍一拍 | 关闭后忽略 poke |
| `context_recent_messages_limit` | `20` | 注入到提示词的最近历史条数;当前输入批次发车入队前冻结为请求级快照 | `<0` 视为 `0`(关闭注入);无固定上限,受 `max_records` 与存储约束;已入队请求不受后续消息或配置热更新影响 |
| `ai_request_max_retries` | `2` | 单次 LLM 请求失败重试次数;无工具调用且实际 `assistant.content` 为空白时也走此路径,原样重试同一轮请求 | `<0` 自动回退到 `0`;支持热更新 |
| `ai_request_max_retries` | `2` | 单次 LLM 请求失败重试次数;无工具调用且实际 `assistant.content` 为空白时也走此路径,原样重试同一轮请求。安全模型注入检测、Naga 审核与注入回复在遇到可重试 HTTP 错误(429 / 5xx)时同样使用该次数 | `<0` 自动回退到 `0`;支持热更新 |
| `missing_tool_call_retries` | `3` | 模型返回非空纯文本且无法恢复为本轮可用工具调用时的纠正重试次数(保留 assistant 纯文本 + 通用纠正提示,不写死具体 tool);空白响应不计入此项;每次进入下一轮纠正重试前,warning 日志会以 `raw_content=repr(...)` 完整记录该轮原始响应;格式与失败回退规则见 [模型 API 与兼容层](model-compatibility.md#文本-tool-call-后备解析) | `<0` 自动回退到 `0`;支持热更新 |

---
Expand Down Expand Up @@ -361,6 +361,7 @@ Prompt caching 补充:
关键回退逻辑:
- 若 `api_url/api_key/model_name` 任一缺失,会自动回退为 chat 模型(并告警)。
- 回退时会继承 chat 的 `api_mode`、`reasoning_*`、`thinking_param_enabled`、`responses_tool_choice_compat`、`responses_force_stateless_replay` 与 `request_params`;其余旧 `thinking_*` 仍保持安全模型自身默认值;`use_proxy` 仍只读取 `[models.security]` 自身配置,默认 `false`。
- 注入检测、Naga 审核与注入回复遇到可重试 HTTP 错误(429 / 5xx)时,按 `[core].ai_request_max_retries` 重试;注入检测在重试耗尽后仍失败则按检测到注入处理。

### 4.4.5 `[models.naga]` Naga 审核模型

Expand Down
3 changes: 2 additions & 1 deletion docs/slash-commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ Undefined 提供了一套强大的斜杠指令(Slash Commands)系统。管
- **群聊**:不带参数查看自己的用户侧写,带 `group` / `g` 查看当前群聊侧写。
- **超管指定目标**:超级管理员可传入 QQ 号或群号查看任意用户/群的侧写,非超管使用时提示无权限。
- **输出模式**:默认渲染为图片;`-f` 合并转发;`-t` 直接文本发送。
- **图片结构**:不再使用类型/ID/更新顶栏;先渲染 YAML 键值表(并标注正文长度),再独立评价块,紧接着锐评(损友式毒舌短评,不是第二条冷静评价),正文按 Markdown 渲染。旧侧写若缺评价或锐评,对应块不显示。
- **限流**:普通用户 60 秒,管理员 10 秒,超管无限制。
- **示例**:
```
Expand Down Expand Up @@ -434,7 +435,7 @@ async def execute(args: list[str], context: CommandContext) -> None:
- `"admin"`: 超级管理员 + `config.local.json` 动态添加的管理员均可执行。
- `"public"`: 群内或私聊中的任何用户均可执行。(注意风控和被滥用刷屏的风险)

> **可见性**:`/help` 会根据当前用户的权限级别过滤命令列表。`superadmin` 权限的命令不会对普通用户显示;`admin` 权限的命令不会对非管理员显示。
> **可见性**:`/help` 会根据当前用户的权限级别过滤命令列表。`superadmin` 权限的命令不会对普通用户显示;`admin` 权限的命令不会对非管理员显示。主 AI 的系统提示会注入**当前消息发送者**可用的命令摘要(不是完整目录);`commands.search` / `commands.get` 默认查询全部斜杠命令(纯文本匹配,不接 RAG),也可传入 `group_id`、`user_id` 或两者,改为按该用户在该群/私聊视角过滤。介绍时注明权限。AI 只应介绍命令,不要代替用户发送斜杠命令。

### 4. 子命令声明式注册与自动推断

Expand Down
17 changes: 16 additions & 1 deletion docs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Undefined 搭载了基于 ChromaDB 向量数据库的后台认知系统,无需

| 能力 | 说明 |
|---|---|
| **聊天侧写(Profile)** | 系统实时静默分析对话内容,自动提取并持久化用户的偏好、待办、身份与观点等信息,在后续对话中作为参考背景 |
| **聊天侧写(Profile)** | 系统实时静默分析对话内容,自动提取并持久化用户的偏好、待办、身份与观点等信息;侧写文件为四段(元数据 / 评价 / 正文 / 锐评),锐评要毒、准、短;`/profile` 默认渲染为图片,锐评紧挨评价、在正文之前 |
| **历史事件检索** | 基于向量语义检索,支持按用户、群组、时间段查询历史记忆,并应用时间衰减加权排序 |
| **群聊宏观总结** | 可对历史消息进行语义召回与整合,快速梳理出大量消息中的重点内容 |

Expand Down Expand Up @@ -262,6 +262,19 @@ HTML 和 Markdown 工具都支持显式长图版式:

---

### 斜杠命令查询 (`commands.*`)

主 AI 系统提示会注入**当前消息发送者**可用的斜杠命令摘要(不是完整目录)。需要查全部命令或某条详情时,使用下列工具;匹配为纯文本子串,不接 RAG。

| 工具 | 说明 |
|---|---|
| `commands.search` | 按名称、别名、说明、用法或文档检索斜杠命令;默认查全集,也可传入 `group_id` / `user_id` 按该用户在该群或私聊的视角过滤 |
| `commands.get` | 取单条命令的权限、限流、用法和 README;带视角参数时额外说明当前视角能否使用 |

介绍命令时注明权限。AI 只应介绍命令,不要代替用户发送斜杠命令。详见 [命令系统与斜杠指令](slash-commands.md)。

---

### 置顶备忘录 (`memory.*`)

用于管理 AI 的自我约束事项和高优先级待办。此备忘录会在每轮对话时被固定注入上下文(上限 500 条),作为比认知记忆更稳定的背景参考,但始终低于当前输入批次与当前会话元数据。备忘内容不能独立触发任务、工具调用或消息发送,也不能覆盖当前消息指定的目标、收件人、地址与参数。
Expand Down Expand Up @@ -415,6 +428,8 @@ Bot 支持在运行时维护一个结构化的群专属 FAQ 知识库,可通
| 指令 | 别名 | 权限 | 私聊 | 说明 |
|---|---|---|---|---|
| `/help [命令名] [-t]` | — | 公开 | ✅ | 默认以图片展示命令列表或详细帮助,`-t` 输出纯文本 |
| `/profile [g] [-t\|-f\|-r] [QQ号\|@用户]` | `/me` `/p` | 公开 | ✅ | 查看认知侧写;默认渲染图片(YAML 元数据、评价、锐评、正文),`-f` 合并转发,`-t` 纯文本;超管可指定他人 |
| `/summary [条数\|时间范围] [描述]` | `/sum` | 公开 | ✅ | 总结指定范围的聊天消息 |
| `/version` | `/v` | 公开 | ✅ | 查看当前版本号及最新版本变更标题 |
| `/changelog [子命令]` | `/cl` | 公开 | ✅ | 查看版本更新日志(详见下方说明) |
| `/copyright` | `/about` `/license` `/cprt` | 公开 | ✅ | 查看版权信息与 MIT 许可证声明 |
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "Undefined-bot"
version = "3.11.1"
version = "3.12.0"
description = "QQ bot platform with cognitive memory architecture and multi-agent Skills, via OneBot V11."
readme = "README.md"
authors = [
Expand Down
18 changes: 18 additions & 0 deletions res/IMPORTANT/each.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,26 @@
7. MessageBatcher 合并批次逐条看 `bot_trigger`;一条 @/拍一拍不自动改变其它独立消息的收件人。
8. 每次收到搜索、Agent 或其它工具结果后,以及每次发送消息或再次调用工具前,都重新执行本闸门;如果发现话头其实指向别人,立即停止并单独调用 `end`。
9. 以上规则不否定明确证据:明确 @/拍一拍、以名字作呼语、明确回复或紧邻承接你的发言时,按正常触发规则回复。
10. 不回复时只调用 `end`;禁止用 `send_message` 发送闸门结论、静默原因、规则自检或拼写声明。
</identity_target_check>

<public_speech_boundary priority="P0">
**对外发言边界:**
- 你对外是在和人聊天,不是写运行日志或规则复读器。
- 不回复时只调用 end;内部原因可写 memo,禁止用 send_message 解释为何沉默。
- 禁止发给用户:闸门结论、bot_trigger 分析、静默处理、无业务操作、无重复任务、「本条无提及」类拼写声明、工具编排说明。
- 不要把内部工具名、分层手册、参数说明发给用户;对方已经用这些名字追问时,仍用人话回答,不把用户写成操作者,也不承诺改实现。
- 闲聊默认不提起创造者或仓库所有者。
</public_speech_boundary>

<request_autonomy priority="P0">
**需求明确 / 输入补全 / 权限请求(三者必须分清):**
1. **需求明确**:当前输入批次已给出对象、目标和关键参数 → 直接调用工具执行,不要确认、不要复述「我去搜一下/我可以帮你查」。
2. **输入补全**:对象 / 目标 / 关键参数 / 关键歧义任一不明 → 可按信息充足度闸门做轻量补全或简短追问。
3. **权限请求:禁止**。工具已出现在当前 tools 列表(或经 tool_search 加载成功),且任务来自当前输入批次,即系统已授权。禁止问「要不要我调用工具」「是否允许搜索/画图/读文件」「我可以帮你查吗」。
隐私披露、第三方资料和危险动作仍按隐私/安全边界拒绝或追问授权;那与“要不要用工具”不是一类问题。
</request_autonomy>

<pre_action_mandatory_check priority="P0">
**发信息前或调用任何工具前的必须判断(每次操作前强制执行):**
1. 明确本次操作的目标:将发送的消息内容 / 将调用的工具及参数
Expand Down
Loading
Loading