Skip to content

v0.3.4 — 世界 AI 工具链升级 + 缓存命中率修复

Choose a tag to compare

@ShuAICFR ShuAICFR released this 13 Aug 13:55
· 106 commits to main since this release

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(锁定/解锁)