Releases
v0.3.4
v0.3.4 — 世界 AI 工具链升级 + 缓存命中率修复
Compare
Sorry, something went wrong.
No results found
Fixed — 🔔 系统通知链路 + ⚙️ 12h 空闲压缩(用户 API Key 失效场景暴露)
系统通知静默丢失(三层 bug) :AI 的 API Key 失效(401)时,降级通知和最终错误通知都没送达用户——
① get_or_create_dm_session 返回 dict 但 executor 用 .session_id 访问(AttributeError)
② 系统用户 0 与用户非好友,新建 0_X 会话被 _require_friendship 拦截
③ 通知直接写 DMMessage 不更新会话 last_message → 侧边栏预览/排序不刷新
修复 :通知复用 send_dm_message(skip_friendship_check=True, message_type='system')(统一处理 last_message/未读标记),
chat_api 包装方法补齐透传(原来 skip_friendship_check/message_type 被吞)
12h 空闲压缩不触发 :原逻辑在工具循环内(LLM 调用成功后)——key 失效等早期失败根本执行不到,
且判定只看"最后消息距今"(12 天没聊但今天刚发消息时历史堆积不压缩)
修复 :压缩前移到首次 LLM 调用前 + 增加"对话跨度"判定(首条→最后消息 > 12h 也压缩),
效果:137→22 条(-83% token);当天对话不误压缩
12h 空闲压缩优先级 (产品定):API 通 → LLM 总结压缩(保要点);API 不通/总结失败 → 内联截断兜底
Added — 🛠️ 世界 AI 工具链升级(2026-08-13 下午,AI 工具调用体验 + 前端展示)
普通消息插入工具轮 (产品定):AI 工具轮进行中用户发普通消息→不打断,在下一轮 LLM 调用前自然注入(drain → 落库 → 发事件 → 拼上下文);只有命令(/compact 等)等整轮结束。两段式协议:[INSERTED] 信号清排队弹窗 + [INSERT] 真实 id 画气泡(断联后 loadChat 位置正确)
工具轮+收尾轮流式化 :正文/思考逐 chunk 显示(不再等整次调用结束一次性出)
工具状态事件 [TOOL_UPDATE] :同 tool_id 多状态气泡(running 正在执行 XX → update 进度 → done 完成原地更新);run_world_code 分阶段(创建脚本→运行中→返回结果);落库按 tool_id 去重只留最终态;WorldChatMessage 加 tool_id 列
思考/正文独立气泡 :思考用思考 id、正文用正文 id(顺序递增);无正文不占位(去「(…)」);思考默认 2 行+渐变淡化+点击展开;工具长摘要折叠+展开/收起
file_grep + file_read 分页 :AI 看文件先 grep 定位(命中行+行号)再 offset/limit 分段读,不再整文件全读(对齐 OpenClaw read 设计)
i18n 命名空间化 (对齐 i18next):新增 i18n/tool.ts 独立分区(zh/en/ja),translations 两级结构 {lang:{common,tool}},getTranslation 支持 'ns:key' + {var} 插值;现有 t('xxx') 完全兼容;未来分区同模式加文件、支持 addResourceBundle 补充
stream_world_chat 大函数拆分 :545→370 行(_prepare_world_chat/_execute_tool_round/_inject_pending_user_messages 收口)
Fixed(2026-08-13 下午,AI 工具调用连环失败系列)
DeepSeek 流式分片 :name 分片带 id、arguments 分片不带 id → 按 id 区分导致分离。修复:id 主 key + index 桥(index_to_id),两者结合不再二选一
DeepSeek DSML/XML 格式 :模型有时把工具调用输出成 XML 文本()而非标准 JSON——参数全丢、AI 连环失败(20+ 次)。修复:_parse_dsml_tool_calls 兼容两种 XML 格式
工具轮 [DONE] 误发 :_stream_llm_once 每轮 yield [DONE] → 前端收到即退出订阅,第二轮之后不显示。修复:[DONE] 只由主流程整轮结束时发
工具轮 400 :thinking 模式 assistant 消息必须回传 reasoning_content(首轮+后续轮都补)
单波浪线被当删除线 :remark-gfm 默认 singleTilde=true(GitHub 非标准扩展)→ '12和23' 被渲染成删除线。修复:singleTilde:false,只有 ~~ 才是删除线(全局共享组件单点修复)
迁移 revision 撞号 :a1b2c3d4e5f6 已被占用 → 改为 b1c2d3e4f5a6
Added — ✨ 前缀内容版本化(锁)+ 群类型无限 + Skill 分层注入 + 世界直开
🔒 前缀内容版本化(所有进前缀的内容保证缓存命中) :用户可改提示词(world-prompt-{id})、强注入段(forced-prompt)、昵称(world-name-{id})、主站 agent 提示词(agent-prompt-{id})统一走 capability_versions 版本链(known 告知 / effective 生效)——用户改提示词、系统更新强注入、改名都是正常操作,不再断前缀缓存 ;变更只动态尾部注入 changelog 告知;compact / clear(= 新对话)解锁后正式生效;锁定态尝试应用变更 → 拒绝 + 后端报错记录(guard_apply_change 防御)
🔒 强注入段从用户可改中提出 (产品定):平台强约束(工具约定/能力边界/接口文档/记忆约定/UI/群类型/侧边栏/路径/编号/运行规范)不再是散装拼接,独立为 FORCED_PROMPT_SEGMENTS + forced_prompt 字段返回前端只读展示;群类型约定强化(写世界类型 + AI 加入类型,关键剧本角色可用角色名/职位名做类型名);新增【AI 侧 skill】(按类型分层注入)与【入口场景响应】(私信/群聊/直进不同 index 响应)强注入段;昵称正式注入对话(之前 AI 不知道自己叫什么)
🗂️ Skill 分层注入 :manifest 支持 types 字段(省略/["*"] = 所有类型通用;["blacksmith"] = 仅铁匠类型可用);build_world_tools_for_type 按绑定类型过滤;群 AI 能力清单按 agent/群绑定类型取并集注入(world_chat_service / llm.py 双入口)
∞ 群类型 bind_limit=-1 = 无限 (不是极大值凑):默认类型群聊和 AI 数目都无限;前端显示 ∞、满员判断跳过 -1、新建类型输入支持 -1
👁️ 世界列表「打开」按钮 :/world/{id}/preview 新窗口进沉浸界面——只绑定 AI(entity_type='agent')的世界也能直接进去看,不依赖群聊
Changed
设置页提示词 UI 重做 (WorldCreatorConfig):群视界机器人名字默认收起 + 🖊 图标点击可改;系统提示词默认收起 + 🖊 点击展开输入框;新增「平台强注入提示词」深灰只读展示(🔒 不可修改);对话生命周期区块移至模型与参数上方;删除重复的 LLM 缓存命中率块
群视界定义更新 (docs):从仅聊天,到可编程、可视化、AI 可入驻的世界——造物主(世界 AI + 用户)/ 原住民(用户 + 用户的 AI);设计文档补 8.5 群类型系统 / 8.6 世界运行不强制绑定群 / 4.3 入口场景响应 / Skill 分层注入三·六
强注入段瘦身 4129→3326 字符(-20% token) :删【工具约定】段(工具描述已通过 function calling 传,重复);记忆约定 607→129 只留结构化记忆核心;新增【注意事项】(含糊主动确认/不重复工具输出/建议要阐述/收尾实质内容)与【设计美学】(配色/层级/留白/移动端/动效/加载空状态/引导,占一部分控制 token)段;世界运行规范与接口文档导引保留
强注入段新增【内容提炼与动态加载】原则 (产品 2026-08-12 定):剧情/大量按钮列表/大量设定等内容不准写死在渲染中 ——能提炼为文档/列表/数据文件的提炼掉,页面动态加载(fetch/import);不固定数目;资源同理;同构多实例(NPC/卡牌/角色)每个实例一个文件 (如 npcs/lihua.json),改内容/新增实例都不碰渲染代码
Added(续)
🧠 记忆管理增强(世界 + 主站对齐) :manage_records / sr_* 新增 rename(category/sub_key/field 任一级改名)与 move(整组或单条跨目录移动)动作;记忆工具描述补 user 个性分类约定(偏好/风格/审美/习惯/关系);新增 build_memory_map 缩进树记忆地图(只注入有内容的路径,空目录不出现),新会话/clear 后自动注入、普通延续对话不注入(省 token + 缓存稳定);⭐(重要)/❗(硬约束)软锚定——value 前缀标记在地图上提到名字前,产生 Attention 特征峰值引导 LLM 优先处理;主站 format_db_records_for_prompt 重写(瘦身 + 软锚定 + 去 emoji),两套记忆行为统一
Fixed — ⚡ LLM 缓存命中率修复系列(世界 AI 工具轮 + 前缀稳定)
工具轮 payload 漏 max_tokens :首轮手写流式带 max_tokens: 64000,_stream_llm_once(工具轮)漏了 → DeepSeek 前缀缓存 key 不同 → 工具轮永远 miss 首轮缓存(命中率 99%→0%)。修复:补 max_tokens 对齐首轮
payload 字段顺序敏感 :字段顺序不一致也会让缓存 key 不同 → 工具轮 payload 字段顺序对齐首轮(彻底排除顺序敏感)
世界时间在 system 前缀内 :活跃对话每轮时间变化 → 前缀 hash 变 → 缓存全 miss。修复:世界时间移出 system 前缀
usage 收集依赖 choices :DeepSeek usage 块可能带非空 choices → 用量/缓存统计漏记。修复:fetch j.get("usage") 独立于 choices 判断(命中率统计 110→118 次)
命中率不随对话刷新 :普通对话(非工具场景)完成后不更新缓存统计 → 前端累计命中率越看越低。修复:普通对话完成也刷新
思考折叠收尾 :preview 凑满两行即固定(无换行长思考也固定,不再显示最新);折叠简化为渲染层截断(一个对象,收起只渲染前两行);残留插入消息在 turn 结束时补发(前端气泡不再丢失)
Docs(2026-08-12 新增)
7.6 触发与并发调度:群 AI 走红黑树(MAX_CONCURRENT=3)受排队影响;世界 AI 拉模式(HTTP 流式)不受;世界程序节流合并通道不受
Skill 设计准则(产品定):可操作性 / 简便性 / 效果最大化——AI 用最少次调用完成用户意图 = 好 skill(含反面例子 add_item/remove_item 应合并为 give_weapon)
适时拆分文件原则:文件大了/不利维护就拆成职责单一的小文件
内容提炼与动态加载(6.2)、前缀版本化 mermaid(锁定/解锁)
You can’t perform that action at this time.