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
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,14 @@
## v3.18.9 群聊发言边界与上下文核对

本版本收紧群聊主动参与的条件,要求先读完整段上下文再判断是否回应,减少因技术关键词、相邻消息或曾经参与过话题而误接他人的对话;同时修复带 @、拍一拍说明的输入中首条消息身份解析错误。

- 群聊发言边界:普通技术讨论、成果、链接和报错分享默认沉默;未被直接叫到时,仅对明确面向全群、尚未解决且能提供切题实质帮助的技术或项目征询极低频回应一次。已有充分答案、交流结束或话头转向别人后不继续补答、附和和总结,一次参与不延长后续消息的回应许可;私聊、@、拍一拍、明确呼语及直接承接 Bot 内容的交流仍正常处理。
- 上下文与连续消息:先按时间顺序读完已提供的最近历史和整个当前批次,核对收件人、问题对象、指代、后续纠正和解决状态,不将旧话题或被否定的前提套到当前问题。群聊合并消息逐条判断收件人,只处理确实向 Bot 提出的请求,一条 @ 不会使同批其他独立消息自动成为 Bot 的任务;QQ、微信私聊批次不套用群聊收件人筛选。互相冲突的要求不再按“宁多勿漏”同时执行。
- NagaAgent 技术路由:统一两套主提示词的回复触发规则,NagaAgent 专用工具路由在确认需要回应后才生效,不因旁观到项目名、技术细节或群友之间的讨论就调用 Agent、追问或插话。
- 当前输入解析:避免 @、拍一拍前缀说明中的字面 `<message>` 吞掉首条真实消息的发送者与消息 ID,保留完整的当前批次身份,并正确从历史快照中剔除已经作为当前输入提供的消息。

---

## v3.18.8 自然闲聊与侧写事实判断

本版本通过提示词调整,减少日常闲聊中的技术化解释和额外辩解,明确用空格表达短句停顿,并加强记忆对真实信息、玩笑与复读的区分,降低把群聊台词写成人物资料的风险。
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.18.8",
"version": "3.18.9",
"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.18.8"
version = "3.18.9"
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.18.8",
"version": "3.18.9",
"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.18.8",
"version": "3.18.9",
"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.18.8"
version = "3.18.9"
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.18.8",
"version": "3.18.9",
"identifier": "com.undefined.console",
"build": {
"beforeDevCommand": "npm run dev",
Expand Down
10 changes: 5 additions & 5 deletions docs/message-batching.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@

合并时构造的 `<message>` 块按时间先后排列。每条群消息会额外携带系统生成的 `bot_trigger`:`mention` 表示明确 @ Undefined(含已识别的假 @),`poke` 表示拍一拍,`none` 表示未检测到显式 @/拍一拍。`none` 不是程序级拒绝,模型仍可通过把 Undefined 名字用作呼语、明确回复或紧邻承接 Bot 上一条发言来判断直接对话;但不能仅凭“你”、命令语气、技术相关性或发送者权限猜测收件人。

批次级的“至少一条 @/拍一拍”说明只用于提示存在显式触发,逐条收件人仍以各自 `bot_trigger` 和对话流为准。一条消息 @bot 不会把同批其他独立消息自动改成对 Bot 说话。收件人闸门未通过时,模型只调用 `end`,不会调用发送、Tool Search、认知查询或业务工具。
批次级的“至少一条 @/拍一拍”说明只用于提示存在显式触发,逐条收件人仍以各自 `bot_trigger` 和对话流为准。一条消息 @bot 不会把同批其他独立消息自动改成对 Bot 说话。模型须先读完整批与已提供的最近历史,核对话题、指代、后续修正与已有答案;时间相邻、话题相同或此前参与过,都不单独构成收件人证据。收件人闸门未通过时,模型只调用 `end`,不会调用发送、Tool Search、认知查询或业务工具。

当 `count >= 2` 时追加"连续消息说明":
当 `count >= 2` 时追加"连续消息说明"。收件人筛选仅用于群聊;QQ、微信私聊批次会明确说明用户专门向 Bot 发送本批消息,不套用群聊收件人闸门,意图不明时结合整批消歧、必要时澄清。群聊示意如下:

> 把整批 `<message>` 视作本轮的全部输入:
> 0. 这些 `<message>` 共同构成"当前输入批次",同批前几条不是历史旧任务;批次之外的历史消息仍只作为背景,不能回溯拾荒。
> 1. 区分每条意图:【独立请求】各自回应不要遗漏(与平时一样,可多次 send_message 自然分发);【修正/否定/补充/打断】则以最后一次明确意图为准,旧的不再执行。
> 2. 拿不准时偏向"独立请求",宁多勿漏。
> 1. 先逐条确认收件人;“不要遗漏”只适用于确实向 Bot 提出的请求,指向其他人的独立消息不回应。再区分【独立请求】与【修正/否定/补充/打断】,修正类以最后一次明确意图为准,旧的不再执行。
> 2. 收件人不明时不回应;已确定向 Bot 提出的请求仍难区分独立意图与修正时,先结合整批消歧,影响执行结果时简短澄清,不把互相冲突的要求都执行。
> 3. 整批在本轮一次性处理完,不要为同一意图重复输出。

`res/prompts/undefined.xml`、`res/prompts/undefined_nagaagent.xml` 与 `res/IMPORTANT/each.md` 均按"当前输入批次"适配:有【连续消息说明】时整批当前 `<message>` 都属于本轮输入;没有连续说明时,当前输入批次退化为最后一条消息。防幽灵任务规则仍然生效,但它只隔离当前输入批次之外的历史消息;「催促/在吗」不等于新任务。同一请求或同一交付在未满足修正或重做条件时不得重复执行;独立的新请求和新一轮聊天不因措辞、话题或工具名相似而被阻止,也不因此获得重开旧任务的授权。
Expand All @@ -41,7 +41,7 @@

Prompt 构建顺序按缓存命中友好设计:固定系统提示词骨架及其中 P0/P1/P2/P3/summary 五个稳定的 `[prompt.file_includes]` 插槽、运行环境配置、Skills 元数据和强制规则尽量放在前面;会频繁变化的 memory / cognitive / end 摘要 / history / 可选系统信息 / 当前时间 / 当前输入批次放在后面。本地插槽文件会在每次新请求构建时检查路径与修改时间;修改时间未变时复用已加载内容,变化时重新读取,内容修改无需重启。`system_prompt_as_user=true` 时,系统块会合并进首条 user,但合并后的文本仍保留这个顺序,且当前输入批次仍在最后。

其中 history 使用批次发车时冻结的深拷贝快照,而不是在慢速认知检索结束后重新读取实时历史。快照会优先按 `message_id` 从任意位置剔除当前输入批次自身的记录,因此即使批次消息之间或其后出现其他人的消息,也不会把当前输入重复注入;显式调用 `messages.get_recent_messages` 仍按工具调用时读取实时历史。
其中 history 使用批次发车时冻结的深拷贝快照,而不是在慢速认知检索结束后重新读取实时历史。快照会优先按 `message_id` 从任意位置剔除当前输入批次自身的记录,因此即使批次消息之间或其后出现其他人的消息,也不会把当前输入重复注入。当前输入解析只识别开标签后跟随 `<content>` 的消息块,二者之间仅允许可选的空白字符(如空格、制表符或换行),避免 @/拍一拍前缀等说明文字中的 `<message>` 吞掉首条真实消息的发送者与消息 ID;显式调用 `messages.get_recent_messages` 仍按工具调用时读取实时历史。

`end.memo` / `end.observations` 也按同一语义适配:当前输入批次包含多条连续消息时,短期 memo 要概括整批处理结果。认知 observations 只允许两类写实来源:(1) 当前输入批次中直接出现的实质事实;(2) 本轮已实际发生、可核验的有价值自身行为结果(如帮谁解决了什么)。宁缺毋滥,无此类事实时用空数组,禁止硬凑流程决策/否定清单/元评论/闲聊碎碎念。这些观察不要求与 bot 相关,也不要求长期稳定,但必须值得日后检索。历史消息、认知记忆、侧写和最近消息参考只用于消歧,不能作为 observations 的新事实来源。后台史官收到的 `source_message` 会按时间顺序列出本批所有 `<message>`,不会只取最后一条。

Expand Down
2 changes: 2 additions & 0 deletions docs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@

> **群聊收件人判定**:当 `process_every_message = true` 时,普通群消息也可能进入 AI 队列,但“进入队列”不等于“要求 Bot 回复”。每条当前群消息都会携带系统生成的 `bot_trigger`(`mention` / `poke` / `none`);AI 必须先结合该标记、@/引用关系、明确呼语和紧邻对话判断消息是否确实指向 Undefined。单独出现“你/你们”、问句、命令语气、AI/bot 泛称、技术话题或管理员身份都不是触发证据;明显在对其他群友说或仍无法确认时,AI 只结束本轮,不发送消息或调用业务工具。

> **上下文与参与频率**:默认提示词要求先按时间顺序读完已提供的最近历史和整个当前批次,确认对话对象、话题与指代、后续修正及问题是否已解决,再决定是否回复。时间相邻、同一发送者、话题相似或 Bot 曾经参与过,都不能单独证明当前仍在问 Bot。普通技术讨论、成果/链接/报错分享默认沉默;未被直接叫到时,仅对明确面向全群、尚未解决且能提供切题实质帮助的技术或项目征询极低频回应一次。话头转向别人、已有充分答案或交流已结束后,不继续补答、附和或总结;一次参与不延长之后的参与许可。私聊、@、拍一拍、明确呼语和直接承接 Bot 具体内容的追问仍正常判断和回应。这是模型提示词约束,实际效果仍需结合模型输出验证。

> **同 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)。

> **回复信息取舍**:默认提示词会引导 Bot 将对方刚说过、已确认或在追问中已展示理解的内容作为共同背景,优先回答新增问题,减少重复解释。不会仅凭身份或术语假定对方已懂;用户要求解释、回顾、总结、完整步骤,或需要纠错、保证正确操作时,仍补齐必要内容。闲聊中的情绪回应和接梗不受影响,原有回复触发规则保持不变。
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.18.8"
version = "3.18.9"
description = "QQ bot platform with cognitive memory architecture and multi-agent Skills, via OneBot V11."
readme = "README.md"
authors = [
Expand Down
11 changes: 9 additions & 2 deletions res/IMPORTANT/each.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<current_input_batch_definition priority="P0">
**当前输入批次定义(适配 MessageBatcher):**
- 如果输入中出现【连续消息说明】,或当前 prompt 中紧邻出现同一 sender 的多段当前 `<message>` 块,则这些 `<message>` 共同构成“当前输入批次”,必须按时间顺序整批理解。
- 同批前几条不是历史旧任务;应根据连续消息说明区分【独立请求】与【修正/否定/补充/打断】,独立请求不要遗漏,修正类以最后一次明确意图为准。
- 同批前几条不是历史旧任务;先逐条确认收件人,再区分【独立请求】与【修正/否定/补充/打断】。不要遗漏只适用于确实向你提出的独立请求,指向其他人的消息不回应,修正类以最后一次明确意图为准。
- 如果没有【连续消息说明】,当前输入批次退化为最后一条当前 `<message>`。
- 历史消息存档、旧上下文、上轮未完成请求不属于当前输入批次;除非当前输入批次明确延续或修正它们,否则不得回溯执行。
</current_input_batch_definition>
Expand Down Expand Up @@ -37,14 +37,21 @@
- 本人认真明确的自述和纠正可采纳,不凭技术水平或文风推断年龄、学历;含义不清时不写成确定资料,不为建档打断闲聊,同批其他可靠事实仍正常提取。本人明确澄清旧说法是玩笑时,记录纠正与对应对象,不猜替代身份。
</observation_fact_check>

<context_review priority="P0">
**先读上下文,再决定是否发言:**
- 按时间顺序读完已提供的最近历史和整个当前输入批次,先看谁在对谁说、当前话题和指代、哪些前提已修正、问题是否已被回答,再解释当前句子。不能只看最后一句、问号或技术关键词;旧话题和被否定的前提不能套到新问题。
- 时间相邻、同一发送者、话题相似或你以前参与过,都不是当前收件人证据。必须能确认当前消息正在承接你的具体内容;话头转给别人、问题已解决或交流已结束后,不继续补答、附和、总结或靠追问延长对话。
- 收件人不明确时沉默;已明确是在问你、但影响答案的事实或指代缺失时才简短澄清。内部判断不发给用户。
</context_review>

<identity_target_check priority="P0">
**群聊收件人闸门(防误插话,每次行动前重做):**
1. 在解释请求、回复或调用任何工具前,先逐条判断当前 `<message>` 是说给谁听的。话题、语气、任务难度和你的能力不能倒推收件人是 Undefined。
2. 群消息的系统标记:
- `bot_trigger="mention"`:系统确认该条 @ 了 Undefined(含已识别的假 @)。
- `bot_trigger="poke"`:系统确认该条拍了拍 Undefined。
- `bot_trigger="none"`:系统未检测到显式 @/拍一拍;仍可结合明确呼语或紧邻回复关系判断,但绝不能仅凭人称猜测。
3. `bot_trigger="none"` 时,正向证据只包括:把 Undefined/常见昵称作为呼语直接提问或下指令;明确回复、紧接并承接 Undefined 的上一条发言;明确面向全群且没有定向给其他人的公开征询。名字只在第三人称中出现、你更早参与过相似话题,都不算。
3. `bot_trigger="none"` 时,正向证据只包括:把 Undefined/常见昵称作为呼语直接提问或下指令;明确回复、紧接并承接 Undefined 的上一条发言;当前明确面向全群、没有定向给其他人的求助或征询。公开征询只有在尚未解决且你能提供切题的实质帮助时才极低频回应一次;开放技术话题、成果/链接/报错分享本身不算征询,也不延长之后的参与许可。名字只在第三人称中出现、你更早参与过相似话题,都不算。
4. 下列全部不是指向证据:`你/你们/我/咱们` 等人称、问号、祈使句、命令语气、请求帮忙、询问能力;出现 `AI/bot/机器人/Undefined` 字样;技术或项目与能力相关;发言者是 Null/管理员/高优先级用户;请求所在队列。
5. 下列负向证据优先:@/回复其他人、两名群友连续对话、明显承接另一名群友、评价第三方、名字只被第三人称提及。即使原句是「你就自作主张回消息」「你能不能别这样」,也不能替对方接话。
6. 明确指向别人、证据冲突或仍不确定时,只调用 `end`;禁止 `send_message`、`tool_search`、`cognitive.*`、表情包、业务工具和 Agent。记忆/搜索不能证明当前收件人。
Expand Down
Loading
Loading