Skip to content

v2026.10.06.1

Choose a tag to compare

@westsource westsource released this 06 Oct 13:42
· 6 commits to main since this release

v2026.10.06.1 — 模型名不再同步:会话的模型选择是设备本地字段

客户端 + 服务端发布:CLIENT_VERSION 2026.10.02.1 → 2026.10.06.1(mcp/updater.py、server/client_update.py,另含 mcp/server.py 与 6 个适配器、server/sync.py),各端经 /api/client/manifest 自动更新、Agent 重启后生效。无 schema 变更(sessions.model 列保留,历史值原样留着,只是不再被同步读写)。服务端 /push /pull 有配套改动:已部署 236(提交 f5be193,10 个文件预检/回读/编译全通过,8 项线上核对全 PASS)。

背景:为什么模型名必须退出同步

model 原先既是 canonical 会话字段、又在服务端按 derived/LWW 处理(无字段级并发保护),而 sync_full 是先拉后推——于是设备上刚切好的模型会在同一轮里被服务端旧值回写覆盖。更糟的是各 agent 的落地并不一致:omp / dsh / reasonix 从不把本机模型上行(omp 读文件时忽略自己的 model_change 条目、dsh 只用它给 assistant 消息盖 source 戳、reasonix 根本没有该字段),而 opencode / hermes / workbuddy / openclaw 是双向同步。同一份"会话"在不同设备上表现为"模型会同步"或"模型不会同步",取决于哪个 agent 打开它。

模型本就是"这台机器这次选用什么"——它是设备级设置,不是共享对话内容。本次把它明确定义为本地字段(local-only),彻底切断两个方向。

Changed

  • 契约:mcp/adapters/base.py 新增 LOCAL_ONLY_SESSION_FIELDS = ("model",),CANONICAL_SESSION_FIELDS 移除 model;通用 SQLiteAdapter._map_cols 跳过该列,1:1 列透传的适配器(hermes)不再把它读进 canonical 载荷。
  • 客户端:新增 _strip_local_only()。推送侧在推送指纹计算之前剥离 model 及消息级副本——切模型既不进服务端、也不再算"内容变更"(不会触发重推);拉取侧在交给适配器写库前剥离——旧服务端/旧对端即使带着它,也盖不掉本机选择。
  • 适配器:opencode 不再读 session.model 与消息 model、不再写 model 列(删除 _model_db;本机已有值原样保留,新建外来会话该列留空);workbuddy 不再读写 model 列(_upsert_session 去掉 model 参数);openclaw 索引不再读写 model,新建 transcript 的必需 model_change 事件写 unknown 占位;dsh 的 assistant source 戳改为 unknown/unknown(删除 _model_parts);omp 不再写 model_change 条目(读时仍容忍真实 omp 文件的该条目);scripts/import_doubao.py 删除 --model。
  • 服务端:push_sync 丢弃载荷中的 model(INSERT/UPDATE 均不写该列),pull_sync 在返回前剥掉。既有行里的历史值保留不动(Web/API 仍可读到,只是不再更新)。
  • 版本:CLIENT_VERSION 2026.10.02.1 → 2026.10.06.1(mcp/updater.py、server/client_update.py)。

测试与验证

  • 客户端 mcp 套件 212 项 OK;服务端 server 套件 292 项 OK / 2 skipped。
  • 新增回归:客户端剥离与指纹隔离、pull 不写回;opencode / workbuddy 本地 model 保全;服务端 push 不写列(INSERT 与 UPDATE 两条路径)与 pull 不下发。
  • 真机冒烟(真实 mcp/server.py + stub HTTP 服务 + hermes 形态 SQLite 库):push 载荷键为 id/agent_type/cwd/started_at/title/message_count/messages/field_meta(无 model),pull 落库新消息后本地 sessions.model 仍是本地值。
  • 236 部署核对 8/8 PASS:manifest(agent=omp&v=2026.10.02.1) → 2026.10.06.1 且 update_available=true、包内 manifest.json 版本一致、包内 mcp/server.py 含剥离代码且 sha256 与清单相符、adapters/base.py 含 LOCAL_ONLY_SESSION_FIELDS、adapters/opencode.py 已无 _model_db。
  • 236 线上功能核对:/pull 不下发 model —— DB 中 631/1012 个会话仍持有 model 值,线上拉一页 15 条(其中 3 条 DB 里确有值),返回载荷中带 model 键的为 0 条;/push 不落 model —— 把一个真实会话按客户端方式重推并注入 model="PROBE-should-not-be-stored",列值仍为原 deepseek-v4.1-flash(209 条消息全部去重、updated=1)。

兼容性

  • 已装客户端会在下一次更新检查(每小时一次,或 Agent 重启后 60 秒)自动拉取新版本,重启 Agent 后新逻辑生效。
  • 升级前的老客户端仍会推 model:服务端已忽略,不会写入;老客户端拉取时服务端已不下发,因此不会再覆盖本机模型。
  • 服务端库里 631 个历史 model 值保持可读(Web/API),仅不再更新。

生产状态:236 已部署(代码提交 f5be193,记录提交 bee8d78,tag v2026.10.06.1)。