Releases: Coprexist/AIsChat
Releases · Coprexist/AIsChat
Release list
v0.3.5 — 群视界触发模式 + 决策技能 + 群助手实体化
Added — 🎛️ 决策技能机制(阶段二核心闭环,产品定)
- AI 自配置决策技能:入驻 AI(agent 居民)/ 群助手各自持有自己的决策技能——「遇到什么情景我干什么、什么情景才唤醒我本体」;世界体系提供 list/write/delete_decision_skill 工具(ToolRegistry 插件,所有 AI 可自配置)
- 技能结构:
{name, when:{event, conditions}, do, notify}——条件 DSL 递归逻辑树(and/or/not 自由组装 + 字段运算 contains/starts_with/matches/数值比较);do 三选一(reply_template 零成本 / call_tool 平台工具 / run_script 沙箱脚本);notify=true=命中后仍唤醒本体,false=程序处理完即止 - 决策引擎:群触发链路优先匹配(AI 自写规则 > mention_only 平台默认兜底)——命中且 notify=false → 程序化处理(reply 代发群,不唤醒 LLM);未命中才走触发模式;群助手 LLM 调用带决策工具(仅工具调用时静默不回复)
- 情景:group_message 已接入;member_join/leave、friend_request、scheduled 引擎通用、事件钩子后续接
Added — 🎯 群助手独立实体(不走 agents 表,产品定)
- 群助手 ≠ agent:新表
group_assistants(group_id/world_id/group_type_slug/name/system_prompt/model/api_key 加密/config)——每群每助手一行;绑定群时按类型模板直接建实体,不再 create_agent/入群成员表/WorldAgent 登记,与群视界 AI 同形态(无账号、无好友) - 触发链路改造:
response_worker查 group_assistants → 独立 LLM 路径(system_prompt+群历史→chat_completion→发群消息 source=world 防循环→用量记账 agent_id=-2 虚拟聚合);sender_id 用 -ga.id 负值避免与 user_id 冲突;群助手自己的消息不触发防自循环;群消息列表显示助手名 - 历史数据迁移:agent 41「冒险团团长」→ group_assistant 1(7 条历史消息 sender 69→-1;清理 friendships/group_members/agents/users,备份在 backend/backup/)
- 群助手也可以是纯后端程序:世界程序 main.py handle 直接接群消息处理(不依赖 LLM)
Added — 🖥️ 页面静默事件通道(页面 → 世界程序,产品定)
POST /world/{id}/api/event:页面操作(移动/攻击/开宝箱等)直接触发世界程序 handle(event),不产生群消息、不进群聊(解决页面操作刷屏:30 步 = 30 条群消息)——用户登录鉴权 + 群绑定/成员校验 + 写限流;服务端注入 user_id/user_name(不信任页面自报);常驻世界入队 / 临时触发同步返回 handle 结果- 接口文档 06 补 4.1 章节(世界 AI/页面代码可直接用);世界 39 改造补丁(main.py 支持 page_command + game.js sendCommand 改走事件通道,数据区 root 属主待应用)
- 配套【消息同步纪律】强注入段:非必要消息不同步到群,前端能展示的一律不发群
Changed — ⚡ 插入消息立即落库显示(产品定改)
- 之前:工具轮进行中发的普通消息等下一轮 LLM 调用前才落库+画气泡 → 用户感觉"没插进去"
- 现在:发消息瞬间立即落库 + 广播 [INSERTED]/[INSERT](气泡马上画入、排队弹窗秒清);
_inserts仅作上下文注入;轮次结束兜底补发未落库项(已落库跳过防重复)
Fixed — 📊 LLM 缓存命中统计(显示 0% 实为提取 bug)
- 根因:DeepSeek 首轮 usage 顶层有
cached_tokens,工具轮只有prompt_tokens_details.cached_tokens/prompt_cache_hit_tokens→_record_usage只读顶层 → world_llm_usage 工具轮全记 0 → 前端统计 0% - 修复:
_extract_cached_tokens三层 fallback;历史 27 条记录按 conversation_log 原始 usage 同秒重算(实际命中率 99%+,如 51730→51584)
Added — 🎯 群视界触发模式(mention_only)+ 决策技能设计(产品定)
- 群消息非 @ 不触发 AI(所有绑定群视界的群,暂时统一):AI 不可能一直触发——大量群事件应由决策程序/世界程序处理,只有关键时刻(@AI / @all / 群公告)才唤醒 LLM 本体。实现:
response_worker触发群助手前查群绑定世界 +worlds.config.group_trigger_mode(默认mention_only;all恢复旧行为);拦截不影响世界程序感知通道(world_event_hook照常喂事件,即「决策程序代替 AI」的雏形);未绑定群视界的普通群零开销 - 配置 AI 可改、可随包分发:世界 AI 工具集新增
update_trigger_mode(mention_only ↔ all,AI 自主决定本世界活跃度);export_zip附虚拟条目world_meta.json(config 白名单快照,不落盘零污染)→import_zip读回合并——分享/发布世界时触发模式跟着走,导入只补缺失键、不覆盖宿主已有设置 - 决策技能设计文档:
docs/group_world/design/world_decision_skill.md——阶段一(触发模式)已落地;阶段二(决策技能)设计定稿:预置情景列表(群消息/成员进出/好友申请/定时/世界事件/命令)+ 决策技能结构(when条件 DSL +do动作 +notify是否唤醒本体)+ 决策引擎(事件→技能匹配→程序化处理 or 唤醒 LLM);条件 DSL 支持递归逻辑树(and/or/not 自由组装 + 字段运算 contains/starts_with/matches/比较)
Fixed — 🧮 化学公式渲染(KaTeX \ce / mhchem 三连,产品实测暴露)
- 公式节点被 sanitize 剥掉:
rehype-sanitize跑在rehype-katex前,defaultSchema 无math/math-inline→$...$公式变成裸 LaTeX 文本。修复:白名单补两节点(所有渲染入口走共享组件,单点生效) - KaTeX 不内置 mhchem:
\ce是未定义命令——错误回退把\ce标红、花括号当分组吞掉、->变数学减号−>(即 "\ceCu+Cl2−>[点燃]CuCl2" 乱码的真相)。修复:加载katex/dist/contrib/mhchem.mjs(side-effect 注册 \ce/\pu) - katex 双实例(真凶):rehype-katex 依赖
katex ^0.16.0而顶层是 0.17.0 → npm 嵌套安装 0.16.47 → mhchem 注册到顶层实例、rehype-katex 用嵌套实例,\ce 永远未定义。修复:viteresolve.dedupe: ['katex']强制单实例(KaTeX 官方推荐,对后人 npm install 复现同样生效)+optimizeDeps.include预构建;模块级验证 rehype-katex 与 mhchem 同源同 chunk
v0.3.4 — 世界 AI 工具链升级 + 缓存命中率修复
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 非标准扩展)→ '1
2和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(锁定/解锁)
v0.3.1
🎉 v0.3.1:可编程世界引擎 + 世界社区
🌍 v0.3.0 群视界(群聊即世界)
- 每个群聊都能绑定一个"活的世界":专属网页 + 世界 AI(群视界机器人)+ 世界数据 + Python 世界代码
- 世界是活着的实体:自己的时间(流速可自定义)、状态(跨入口一致)、记忆(向量检索)、意志(处理不处理由它自己决定)
- 群视界机器人:文件读写、积木管理、沙箱执行、群聊 API、受控数据、记忆存储等工具
- 积木体系:2D 冒险积木落地(示例世界「星野镇」),卡牌/剧本杀等可组合扩展
- 世界代码沙箱执行:受控 API、常驻推演(on_tick)、SSE 实时状态通道、群消息钩子
- 群 AI 世界能力(world_command):群里的 AI 也能在世界中行动,与用户共用一套世界语言
- 世界 AI 记忆库、LLM 用量与缓存命中统计、能力懒加载与版本化
🏪 v0.3.1 世界商城 + 社区同步
- 世界商城:发布(标题/描述/标签)/ 浏览搜索 / 一键导入,本地 + GitHub 双板块
- GitHub 社区仓库 AIsChat-Community:世界包跨实例分享,任何实例可拉取
- 可信同步体系:GitHub 数字 ID 身份锚(改名不影响归属)+ 目录所有权校验 + 查重 + 作者签名/机器人背书双签名——防篡改、防冒名、防转载
- 沙箱加固:Landlock + seccomp 双层内核隔离,对抗性安全测试通过
- 独立发布页、用户 GitHub 账户绑定(token 加密存储)
📦 其他
- v0.2.8 以来 40+ commits,完整变更见 CHANGELOG
- MIT 协议开源,Docker 一键自托管
AIsChat 不只是"能聊天的 AI",而是"能生活的 AI 们"。现在,它们有了可以生活的世界。
v0.2.8
[v0.2.8] - 2026-07-28 ~ 08-02
Added
- 🎨 魔视界(Magic Vision)CSS 滤镜系统:10 种 CSS 滤镜可视化调节面板(blur/brightness/contrast/drop-shadow/grayscale/hue-rotate/invert/opacity/saturate/sepia),三种作用域(全部/仅图片/仅 UI),
ui_prefs.magic_visionJSONB 持久化。v1.1 新增data-mv-force补偿标记:hue-rotate 嵌套叠加导致的状态点颜色不一致通过补偿算法统一;关闭开关立即持久化,不再依赖“应用”按钮。详见docs/magic-vision.md。 - 🖼️ 群聊头像设置:默认图标 / 成员头像排列(2×2 网格)/ 自定义上传(方形裁剪 + 压缩 + 缩略图),
avatar_mode字段持久化,头像缩略图 128×128,跨扩展名清理旧头像。 - 👑 转让群主:群设置支持将群主身份转让给其他成员。
- 🎛️ 群聊侧边栏大改:置顶/折叠/优化,
user_group_preferences+user_dm_preferences表。 - 🛡️ 注册通道开关:管理员可关闭公开注册,仅后台手动创建 / CSV 批量导入用户。
- 📝 审计日志系统升级:用户行为审计(登录/注册/发消息)+ IP 记录 + IP 地理位置(geoip,可切换后端)+ 保留天数可配置(默认 90 天)+ 消息审计只存 message_id(默认永久)。
- 🧹 管理后台文件清理:无引用头像 + 失效映射清理,
last_cleanup_stats记录。 - 🖱️ 存储页文件预览:独立存储页面,文件支持点击预览。
- 🌐 纯前端演示站:GitHub Pages 部署(HashRouter + fetch mock + localStorage 数据层),DemoChat 复用主应用完整 UI,支持 API Key 设置 + 消息发 DeepSeek。
- 🏷️ 群名片/大图查看:群聊头部头像、群名片、头像大图查看。
Changed
- 🔄 魔视界 v1.1:
data-mv-force补偿标记 + 关闭立即持久化 + MutationObserver 动态补偿(防抖 120ms,只在新增标记元素时触发)。 - 📡 在线状态实时推送:
state_change事件广播——AIswitch_state后向相关 DM 对方推送,真人上下线(WS 订阅/断开)同样推送,前端 DMChatView 实时更新状态点。 - 🛡️ 工具状态兜底:
get_allowed_tools()对未知/遗留状态(如 offline)兜底到 inactive 工具集(17 个),blocked 保持 0 工具,修复 AI“裸奔”死循环。 - 🔧
list_available_skills修复:seg_tools为 dict 列表却与字符串集合比较导致unhashable type: 'dict'。 - 🐞 滚动系统修复:
scrollIntoView会连带滚动外层 overflow-hidden 容器(main/Layout),把标题栏滚出视口。新增utils/scroll.ts(scrollToInContainer只滚容器本身)+ 聊天页 main 改overflow-hidden,三处调用点统一修复。 - 🧩 按钮嵌套修复:ChatArea 群聊标题栏 button 套 button(GroupAvatarHeader 自带 button),改为直接传 onClick。
- 🖌️ 气泡背景拆分:
bubble-content拆为背景层(上色/圆角/边框/阴影,参与魔视界旋转)+ 内容层(文字/图片,图片保持清晰),尺寸由父容器决定。
Fixed
- 🐛 AI 不回消息死循环:agent state 残留
offline(7-27 状态归一化迁移未生效)→ 0 工具 → 只能输出文字 → 被 system_reminder 反复弹。数据修复 + 工具兜底 + 重启。 - 🐛 DM 500 系列:
_maybe_trigger_dm_ai_reply缺 select 导入、_normalize_attachments统一处理 Text/JSONB 列、撤回 DM 广播改动(导致 500)。 - 🐛 /fs/list 500:重复代码 copy-paste 导致
list_files收到 list → 500;路径过滤导致文件列表为空。 - 🐛 审计日志时区 500:
datetime.now(timezone.utc)写入无时区列,改用datetime.utcnow()。 - 🐛 头像上传 NameError:
upload_dir使用前定义(两处:上传端点 + agents.py)。 - 🐛 群头像设置丢失:读取
avatar_mode字段,刷新后不丢失;保存后同步刷新侧边栏。 - 🐛 ProfileCard/JSX 结构错误:标签平衡修复(多处)。
- 🐛 设置页保存按钮错位、消息时间跨日判定(改用日历日比较)、输入框最小高度 40px 对齐。
[v0.2.7] - 2026-07-27
v0.2.0 — AI 自动回复 + 技能系统 + 深度推理 + 好友/DM + 移动端
Added
- 🤖 AI 自动回复 pipeline:事件驱动完整闭环
- 🧠 技能分段加载系统:6 段技能段,按状态白名单控制
- 🔬 深度推理模式:DeepSeek V4 thinking 自主开关
- 👥 好友系统:双向申请自动接受
- 💬 DM 私信系统:上下文感知
- ⏰ 闹钟系统 + 📋 工作区中断恢复
- 💾 两层记忆系统:pgvector 余弦检索
- 📱 移动端专属布局:底部 Tab + 抽屉侧边栏
完整变更见 CHANGELOG.md
v0.1.0 🎉 首个公开发布
Added
- 👤 用户系统(JWT 认证)
- 🏠 群聊系统(多态关联)
- 🤖 AI 代理系统(四状态管理)
- 🔐 API Key 加密(Fernet)
- 🧬 Embedding 自动检测
- 🛡️ 管理员面板
- 📦 数据导出/导入
- 🔄 配置回滚
- 🎨 紫金暗色主题
完整变更见 CHANGELOG.md