OpenCode 2.0 把编码代理拆成常驻服务与代码模式

OpenCode 2.0 把编码代理从一个随终端窗口生灭的命令行工具,改成了常驻本机的后台服务。终端界面、网页界面和桌面应用连的是同一个进程,会话因此不再属于某一个窗口。工具调用的组织方式也换了,模型可以写一段 JavaScript 交给内置解释器,把多个工具串成一次往返跑完。后台子代理和后台 shell 命令让主代理不必停在长任务上干等。

这篇面向正在用终端编码代理的开发者,以及打算把它接进团队流程的技术负责人。

常驻本地服务对会话归属意味着什么

客户端与服务端分离的模型在 1.0 就存在,只是默认没启用,用的人不多。2.0 让这个服务在后台自动跑起来,同一台机器上只有一个进程。你开哪种界面,连过去的都是它。用 @opencode/client 写的脚本会自动发现本地服务,定时任务这类场景不用再手工指定地址;命令行里也有 opencode api 子命令可以直接调。服务还能暴露给别的主机,用 /pair 或者 opencode pair 把其他应用配对上。

关掉界面不等于任务结束,换一个客户端接着看就行。

Code Mode 一次往返能做完多少事

@opencode/codemode 包里装了一个极简的 JavaScript 解释器。它把 MCP 服务器和 OpenAPI 端点转成代理可以调用的函数,代理写脚本调这些函数,脚本在本地原生执行,不需要 Node.js 虚拟机,也不用嵌入 QuickJS 这类方案。

脚本可以对一批结果做映射,再拿映射结果去调另一个工具,整条流水线在一次往返里走完,不必一个工具一次往返。2.0 里所有 MCP 服务器默认进入 code mode,接很多服务器也不会把上下文撑得很大。

后台子代理与后台命令怎么并行

主代理可以把一部分工作交给另一个代理,自己继续往下走。这个动作可以自动触发,也可以手动发起,甚至可以指定另一个模型来跑。shell 工具同样支持异步调用,长时间运行的命令不再阻塞主代理,跑完会收到通知。前台有命令或者子代理跑得比预期久,按 ctrl+b 就能把它挪到后台,然后接着输入。

并行的代价是冲突面变大。两个后台任务同时改同一个文件,结果取决于谁后写。

插件与 SDK 交出了哪些控制权

1.0 有插件系统,但一直没得到足够的维护。2.0 换了做法,把几乎所有功能都实现成内部插件,现在有 80 多个。这样一来插件接口必须保持可用,否则自己先崩。TUI 插件从实验状态转为稳定,底层是 OpenTUI。整套东西支持热重载,代理可以在会话中途给自己写一个插件,写完立刻用上。

@opencode/sdk 是驱动命令行工具的那份代码,可以裁剪之后跑在服务器或者 Durable Objects 这类环境里,再用任意 OpenCode 客户端连上来,因为它说的是标准服务端协议。SDK 还有一个可选的 Effect 风格接口,目前仍在开发。

开始一项新工作时把当前会话移进一个 git worktree,靠的就是内部调用,涉及的方法名有 worktree_create、session_rename、session_move、session_list、session_context、session_interrupt、session_prompt 和 tab_close。

升级前必须知道的破坏性变更

1.0 的插件在 2.0 里不能用。服务端接口与之前完全不同。tui.json 配置文件挪到了 json。其余改动向后兼容。命令行升级要先停在最新的 1.x 版本上,再执行 opencode upgrade --major。

哪些团队适合现在跟进

  • 已经在用终端编码代理,并且希望多个界面共享同一个会话,值得升级。
  • 有大量 MCP 服务器要接,上下文已经吃紧,code mode 带来的收益比较明显。
  • 流程里写死了 1.0 插件,或者自己封了旧的服务端接口,先评估迁移量再动。
  • 打算把服务暴露到其他主机之前,先确认配对流程和访问边界。

常见问题

Code Mode 会取代逐个工具调用吗? 两种方式并存。单个动作仍然可以直接调。

常驻服务会不会一直占着工作目录? 进程活着期间它就能访问你交给它的目录,暴露给其他主机时走配对流程,权限范围要自己确认。