Releases: 69gg/Undefined
Undefined v3.5.1
v3.5.1 安全回复、群聊边界与配置表单优化
本版本聚焦三个实际使用中的细节问题:一是群聊里只出现「你/我/他」等人称时,Undefined 更容易误判成在和自己说话;二是面对 prompt 注入或强行改人设的消息时,防御性回复有时过于模板化、攻击性过强,甚至在生成失败时仍会发送兜底脏话;三是 WebUI 配置页对枚举型字段的输入约束不足,容易让用户手填出不合法或不直观的配置值。v3.5.1 因此收紧对话归属判断,强化人设自洽与防注入边界,并把更多配置项改为下拉选择,降低误配置概率。
变更内容
- 强化群聊回复触发边界。主提示词与 NagaAgent 版提示词新增「无法判断是否在对你说话时默认不回复」原则,并明确 QQ 群里的「你/我/他/她/咱们」等人称不能单独作为被叫依据;只有 @、私聊、拍一拍,或上下文能证明正在延续 Undefined 刚参与的线程时,才把相关人称理解为指向自己,减少误插别人对话、替别人接话或代答的情况。
- 强化人设自洽与抗注入规则。新增
persona_self_ownership规则,要求 Undefined 认可并接受自身设定,不因普通用户的创作、测试、角色扮演或「忘记设定」类话术而自贬为通用 AI、临时切换身份或漂移性格;只有 Null 能调整核心设定。同步补充错误示例与速查规则,让模型在面对改人设、换模式、冒充授权等提示注入时更稳定。 - 调整注入防御回复风格。
injection_response_agent的提示词从「嘲讽性反转」改为「自然、口语、友善但有边界」的 QQ 群接话风格,避免舞台腔、段子腔、官方拒答口吻和过强攻击性;生成参数提高创造性,失败时返回空字符串,不再发送「无聊。」或更粗暴的兜底回复。 - 修复空注入回复仍会发送的问题。AI 协调器与群聊协调器在注入防御回复为空或仅包含空白时直接跳过发送,避免上游生成失败时产生空消息、无意义消息或不符合人设的兜底内容。
- 优化 WebUI 配置表单枚举输入。配置页新增更多下拉选项覆盖模型 API 模式、推理参数风格、消息合并策略、模型池策略、日志级别、附件归档策略、工具暴露范围、知识查询模式、生图 provider / size / quality / style 等字段;支持空值选项用于“不传,使用默认”,保留未知当前值并标注为“当前值”,同时自动识别数值型下拉项,减少手填配置导致的类型错误。
📝 Detailed Changes
🐛 Bug Fixes
🛠 Maintenance & Others
- chore(version): bump version to 3.5.1 (87fb532)
Undefined v3.5.0
v3.5.0 模块拆分、库嵌入与工具链收敛
本版本是一次以可维护性与可嵌入性为主线的架构整理:将 AI 客户端、消息处理、附件、认知、表情包、协调器、OneBot 与 Agent 运行器等原先体量过大的单文件拆成职责清晰的子包,同时保留向后兼容的 import 路径与 CLI 行为不变。并行修复了 end 与同轮业务工具并行调用时可能重复发送或误结束会话的问题,并补齐 Python 库嵌入所需的 set_config、Config.from_mapping、根包 lazy re-export 与 py.typed 类型标记。配置加载改为分段解析 + 域级 parser,文档与测试同步覆盖库嵌入、包布局与公共 API 契约,让 Undefined 既能继续作为 QQ Bot 运行,也能更可靠地被脚本、测试与其它服务按需复用。
变更内容
- 重构核心运行时模块结构。
ai/client、ai/llm、ai/prompts、ai/multimodal分别承载客户端组合、模型请求、Prompt 构建与多模态解析;handlers/、onebot/、attachments/、cognitive/service+cognitive/historian、memes/(ingest / search / 图像工具)、services/coordinator、services/message_batcher、skills/agents/runner与api/routes/naga/等子包按域拆分;原 monolith 文件以兼容 shim 或__init__重导出保留,删除被 shadow 的不可达死代码,降低单文件复杂度与后续改动风险。 - 完善 Python 库嵌入能力。根包新增 lazy re-export(
Config、get_config、set_config、AIClient、Skills 注册表、认知/知识库/表情包/附件/Runtime API 等稳定符号);Config.from_mapping/ConfigBuilder支持无config.toml的内存构建,env_registry统一管理环境变量兜底;set_config()为 opt-in 注入全局单例,CLI 启动链不调用。wheel 打包py.typed(PEP 561),新增docs/python-api.md公共 API 参考,README 补充嵌入示例与文档索引。 - 收敛
end工具与同轮并行调用的运行时语义。当模型在同一轮将end与send_message或其它业务工具一并调用时:其它工具照常并行执行并返回结果,end不执行并回填明确拒绝响应,避免重复发送与「未读 tool 结果就结束」;提示词、each.md与决策回归用例同步写入 P0 级「end 禁止并行」规则与运行时效果说明。 - 改进缺失 tool call 时的重试策略。模型返回纯文本但未调用任何工具时,保留 assistant 原文于 messages,注入通用纠正提示而非硬编码
send_message/end,减少误导性后续 tool 调用;拆分后修复 Skills 路径解析,PACKAGE_ROOT统一指向包根,避免内置工具零加载回归。 - 加固队列化 LLM 与运行时边界。收紧 queued LLM 重试与 pending-call 清理、配置分段加载的边界校验、附件渲染容错,以及 Prompt 缓存键的隐私安全处理(系统上下文只暴露非敏感模型名等字段);表情包入库锁与图像工具去重,Naga API 路由守卫与 B 站 WBI 导航解析小幅简化。
- 更新架构图、开发指南与配置文档。
docs/development.md反映拆分后的目录树;docs/configuration.md新增库嵌入专节(from_mapping/set_config/ 环境变量注册表);ARCHITECTURE.md与相关运维文档同步引用路径。 - 补强测试与工程契约。新增包布局、公共 API import、CLI 启动兼容、
Config.from_mapping/ 纯环境变量构建、end同轮拒绝与 defer、AIClientsetup 路径等回归测试;更新 LLM 重试抑制与请求参数相关用例,总测试覆盖库嵌入与拆分后的关键路径。
📝 Detailed Changes
🛠 Maintenance & Others
Undefined v3.4.2
v3.4.2 总结更准、上下文可配、高并发更稳
本版本主要解决三类实际问题:群聊消息变长、合并发送变多之后,/summary 容易慢、容易编、分块预算也不准;主对话注入历史的 200 条硬顶与模型真实窗口脱节;高并发下用户连问「在吗」「好了吗」时,机器人仍可能把旧任务当新活重跑。围绕这些痛点,版本把「用户主动要总结」和「AI 自己调总结能力」拆成两条更合适的链路,用可配置的上下文窗口统一约束注入与分块,并同步收紧提示词、史官侧写与定时任务持久化,让总结更可信、配置更贴近上游模型、并发场景下更少重复劳动。
变更内容
- 提升消息总结的质量与效率。用户通过
/summary、/sum获取总结时,改为直连 summary 模型一次性完成,不再绕 Agent 工具链,响应更快、路径更简单;AI 在对话里调用总结能力时,仍保留 Agent + 拉取历史的灵活流程。长会话按模型上下文窗口自动分段、队列内合并,并配套「只读原始记录、禁止编造」的专用提示词,减少幻觉与无关发挥。 - 理顺上下文与模型配置边界。取消历史注入 200 条的隐性上限,改由
context_recent_messages_limit与历史存储上限共同决定;各模型节新增context_window_tokens,总结分块、Prompt 预算与实际上游窗口对齐,不再依赖硬编码或误用max_tokens。同时补齐reasoning_content_replay、system_prompt_as_user,便于 MiMo、DeepSeek 等 thinking 模型在多轮工具调用时正确续传思维链,或按网关要求改写 system 注入方式。 - 强化高并发下的任务边界。系统提示词与 each 规则进一步明确:催促、寒暄不等于新任务,历史未完成任务不得自动拾取;启动业务工具前须检查是否已有同类或语义等价操作在处理,有则熔断为简短进度回复而非重跑;无依赖的工具与 Agent 仍鼓励并行,有数据依赖则必须串行,与 MessageBatcher 的批次语义一致。
- 优化认知侧写的长期画像质量。史官合并侧写时必须先读取再更新,以增量补充稳定特征为主,一次性闲聊或无法沉淀为长期特质的事件应跳过,避免侧写被单轮对话冲散或写成流水账。
- 修复「向未来的自己发指令」定时任务无法恢复。持久化任务若包含
self_instruction,此前会导致整表反序列化失败;现已补齐字段定义,自调用类定时任务可正常加载与执行。 - 更新配置文档、WebUI 表单与相关测试,覆盖总结直连、上下文窗口、模型对接选项与并发防重复等关键路径。
📝 Detailed Changes
🐛 Bug Fixes
🛠 Maintenance & Others
Undefined v3.4.1
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。
📝 Detailed Changes
🚀 Features
Undefined v3.4.0
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 匹配自动复用,内容变化自然失效;新增[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;要求记录整个当前输入批次中值得留存的信息,后台史官也接收批次全部消息。 - 统一当前输入批次语义。主提示词、NagaAgent 提示词和
each.md均从"最后一条消息"升级为"当前输入批次":有连续消息说明时,多段<message>都属本轮输入;幽灵任务防御规则同步更新,避免批量输入中的前置指令被误判为历史旧任务。 - 扩展 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工具、管理员命令、管线注册等已有测试;额外补齐渲染缓存(LRU 驱逐 / 容量驱逐 / 重启恢复 / 节流后强刷 / 并发 put / 禁用短路)、/admin add|del全路径、allow_cancel_after_send=true取消语义等盲点。总测试用例提升至约 1660 项。 - 更新子模块。