11 月 10 日 18:33 发了 v2.2.7 正式版(npm 推包时间,北京),latest 已经指向它。发布说明标了两处破坏性改动,用 SDK 或直接调包的升之前先看一眼。
这次更新了什么
桌面与终端
- Copilot 账号带 Auto 池时,模型选择器会多一个 Auto,由 Copilot 挑这次会话用哪个模型,按 Auto 折扣计费。挑不出来就退回账号默认的聊天模型
- 侧栏标签右键能关掉右侧的标签。侧栏开着时
⌘W关侧栏标签,⌥⌘W(Windows 是Ctrl+Alt+W)才关会话标签,⌘⇧T把刚关的恢复原位 - 标签、首页行、项目行和收件箱卡片都能标记已读或未读,收件箱卡片还能改名
- 终端对话框的按钮能用左右方向键和 Tab 切换,模型选择器的 Usage 动作挪到了
/usage - Windows 和 Linux 上
Ctrl+Shift+R不再刷新窗口,重新用来切换审查面板
接口与扩展
@opencode/ai删掉了图像响应上指向数组第一项的快捷属性- 插件还在加载时,
agent.list只给已加载的条目,integration.list、usage.limits、vcs.init、rpc.call和artifact.*不再等插件加载完 session.generate除文本外还返回 tokens 和 cost,credential.updated带上登录变化的 integrationID 和 credentialID- decision 的 predicate 问题支持可选的
criteria: { true?, false? } - ACP 客户端能用
_session/steering给正在跑的回合改方向,能力写在 initialize 的_meta.steering.supported里
登录与计费
- 远程 MCP 服务器轮换 refresh token 时,几个客户端同时刷新不再互相挤掉登录。刷新时短暂失败也保留凭据,下次接着试
- 工具返回值和自己的 output schema 对不上,不再把已完成的调用报成失败
- 刷新 prompt 列表失败时,原有 prompts 还在
- Copilot 会话成本按实际扣费算,不再用目录估价
- Copilot 套餐变了,下次刷新模型就切到新的 API 端点,不用重新登录
文件、shell 与缓存
read支持负 offset,-50就是末尾 50 行。offset 越过文件末尾会返回最后几行和总行数,找不到文件时还会按大小写、扩展名、拼写给几个相近的名字- 失败的 shell 结果末尾统一写
Exit code: N,被信号杀掉显示信号名,超时会说等了多久并建议把超时调大 - zsh 里没匹配上的通配符会照原样传给命令。Windows 上从 Microsoft Store 装的 PowerShell 7,多行命令不再丢掉第一行之后的内容
- 会话预热默认按模型的
cache.ttl定时,模型没给 TTL 才每四分钟一次 - MCP 工具增减时,Code Mode 只把变化的那几条发给模型
另有一批小修:会话导出改存当前目录、emoji 不再被 read 截半、会话标题不带模型旁白、git 装插件失败能看见 git 自己的报错、description 带 [Beta] 这种前缀的 Markdown agent 也能加载。
少了一个属性,也少等五秒
删掉的是个 getter,以前把数组第一项再返回一次。数据还是那些数据,只是少了个属性。发布说明只点名了直接 import 这个包的代码。
另一处是插件加载时的等待。以前服务端每接一个请求都要等插件全加载完,最多卡五秒,超时就返回 503。一个装得慢的插件,能让 TUI、桌面端和 run 连模型列表都拿不到。现在一部分端点改成插件在后台加载,客户端收到插件加载完的事件再补上它提供的条目。模型、provider、generate.*、voice.* 和 websearch.query 还是得等,这几类请求本来就要用插件给的模型和能力。
掉登录不是网络问题
ElevenLabs 这类远程 MCP 服务器会轮换 refresh token:每次刷新发一把新的,旧的一被重用就把整个授权吊销。以前只在单个进程里共享刷新动作,TUI、桌面端、后台服务和各个项目目录可能同时拿同一把旧 token 去换。谁先花掉,其余的就被判 invalid_grant。进程内那把锁还松得太早,响应头一到就放开,新 token 还没写回存储,另一个调用者读到的仍是旧的。
现在刷新走 Credential.lock,这是 provider 凭据一直在用的跨进程文件锁。从读存储、发请求到写回结果,全程都锁着。写回时还要比对,只有存储里仍是发出去的那把 token 才落盘。临时性失败也分开了:超时、网络错误、429 和 5xx 以前被 MCP SDK 当成登录丢失,直接发起新授权,连接就被标成 needs_auth,只能重新登录。现在报成 temporarily_unavailable,连接状态是 failed,凭据留着,下次调用或重连再试。只有服务器明确拒绝授权时才清掉登录。
作者也在提交里写明,真正的多进程测试不好做,验证是用两个 Credential 实例共用一个数据库文件代替的。这个并发场景我没在本机复现过,所以别当成所有服务器都验过了。
Auto 不是新模型
这个池由带 billing.auto_discount 的模型组成,界面上显示池里最小的上下文窗口。第一次请求会拿最后一条用户消息去问 Copilot 的 /auto 接口,选中的模型和配套的 session token 记在这个会话上,压缩之后、token 快过期或换账号才重新挑。生成标题始终走免费的 utility 模型,不碰路由。session token 只对签发它的那个模型发送,配别的模型 Copilot 会拒。
底下加了个 experimental.model.resolve 钩子:请求解析模型时,插件能看到 kind(primary / compaction / title / generate)和 agent,把 target 改成同一供应商下的另一个模型,连选择器里没列出的也行。跨供应商的目标直接判为不可用。PR 作者在 Free OSS 账号上实测,Auto token 让那几次请求的费用低了 30%,这是他一个账号、几次流程跑出来的数,不是通用结论。
怎么升
官方页列了五条安装命令,重跑当初装的那条就是升级,没有 update 子命令。升完用 opencode --version 核一下是不是 2.2.7。
两处代码得跟着改:读 response.image 的地方换成 response.images[0],用 SDK 拉 agent、integration 这些列表的,改成收到 *.updated 后再刷一次,别指望一次请求就能拿到插件提供的全部条目。发布说明里没列新的默认关闭开关,也没要求改配置文件。
升完先连一次你常用的远程 MCP,看几个窗口同时开着时还会不会被要求重新登录。你们那边是桌面端和终端一起开,还是只跑一个?






