今年代码助手的圈子是真的热闹,Codex CLI 开源之后,Claude Code 又火了一把,社区里还冒出来一个叫 opencode 的终端 Agent。我本来是抱着试试看的心态装的,结果连续用了一个多月,现在每天打开终端第一件事就是敲 opencode。这篇文章就把我这段时间的使用经验完整记录下来:从安装、配置、模型接入,到 Skills、Memory、LSP 这些进阶功能,再到 VSCode/IDEA 插件和桌面版怎么配合用,最后把我踩过的坑和报错解决方案一并列出。如果你正在选型 AI 编程助手,或者刚把 opencode 装好却不知道怎么配置,这篇应该能帮你省下不少时间。
1. 为什么是 opencode:它和 Codex、Claude Code 的定位差异
1.1 终端 Agent 到底在解决什么问题
先说终端 Agent 这类工具的定位。它跟你在 IDE 里装个 Copilot 完全不一样:Copilot 是"你写一半,它帮你补全";而终端 Agent 是"你把任务交给它,它自己读代码、改代码、跑命令、看报错,然后给你交付结果"。opencode 的交互基本都在终端里,启动后是一个交互式 TUI 界面,左边是会话历史,右边是当前任务的对话流,你能看到它每一步在干什么——读了哪个文件、执行了什么命令、改了什么内容。
这种形态最大的好处是,你不用把上下文来回复制粘贴。它可以直接访问项目目录,自己定位相关文件,自己跑测试来验证修改是否正确。说白了,它把"写代码"这件事从补全键变成了"提需求 + 验收"。一开始我也觉得这玩意儿是不是噱头,但真正跑了一个重构任务之后,我意识到终端 Agent 的价值不在于"自动补全得有多准",而在于它能替你完成"读代码—理解—动手改—验证"这个完整闭环。
1.2 和 Codex、Claude Code 的核心差异
当时我手上同时装了 OpenAI Codex CLI 和 Claude Code,对比着用了几天,最后长期留下来的是 opencode,原因很具体:
| 维度 | opencode | Codex CLI | Claude Code |
|---|---|---|---|
| 模型绑定程度 | 多模型可切换 | 主要围绕 OpenAI 系列 | 围绕 Claude 系列 |
| Skills 自定义 | 有,用 Markdown/脚本定义 | 有但生态成熟度一般 | 支持插件 |
| Memory 跨会话 | 支持 | 有限 | 依赖项目内约定 |
| LSP 接入 | 支持 | 近期加入 | 支持 |
| 编辑器插件 | VSCode/IDEA 都有 | 依赖外部 | 官方 IDE 扩展 |
| 配置复杂度 | 中高,灵活 | 低 | 中 |
后面几节会具体展开。这里我想强调一个观点:选哪个工具,本质上不是比"谁更聪明",而是比"谁更适合你的工作流"。Codex 的优势是跟 OpenAI 生态无缝,Claude Code 的优势是 Anthropic 模型本身的编码能力,而 opencode 的优势则是"我不绑定你的模型,你想接哪家接哪家,想做技能就做技能,想记长期记忆就记"。
我用 opencode 接 Anthropic 的模型时,基本能获得和 Claude Code 接近的编码体验,但同时又能在同一个工具里切到 OpenAI、本地 Ollama,甚至一些聚合网关提供的模型。这种灵活性对我这种"哪个模型好用就用哪个"的人来说,比单一厂商深度绑定更舒服。
1.3 适合什么人用
按我自己的体会,这几类人最适合用 opencode:一是手里有多家模型 API(比如 OpenAI、Anthropic、Google,或者本地模型)的人,因为可以在一个会话里动态切模型;二是团队里希望把代码规范、提交流程这类东西沉淀成 Skills 的人;三是喜欢终端工作流、不想被 IDE 绑住的开发者。
反过来,如果你完全不想读配置、不想折腾,只想要一个开箱即用的助手,那 opencode 的默认配置会让你有点懵,因为它默认不绑定任何厂商模型,你得先配一个 provider。换句话说,opencode 给你的是"全套工具",但"调校"这件事它也交给了你。用好了它是利器,用不好你就只会觉得"怎么配了这么久还不能跑"。
2. 安装 opencode 的几种方式,以及 cmdlet 报错的根源
2.1 安装方式与版本选择
安装这事看起来简单,其实有坑。opencode 的版本迭代非常快,不同版本对 Node 版本的要求也不一样,我建议优先看官方仓库 README 里最新的安装命令,但一般来说有这么几种方式:
- npm 全局安装:
npm install -g opencode(某些版本包名是 opencode-ai,以 README 为准) - Homebrew 安装:
brew install opencode(macOS 上比较省事) - 直接下载二进制:从 GitHub Releases 下载对应平台的可执行文件,解压后加入 PATH
我的习惯是用 npm 装,因为后面升级方便:npm update -g opencode一条命令搞定。用二进制的话,升级就得重新下载替换,稍微麻烦一点。但 Windows 上如果 Node 环境本身比较乱,直接下二进制可能更省心,至少不会出现"npm 全局目录到底在哪"这种问题。
另外提醒一句,opencode 的 2.0 版本和早期版本在配置结构上有不少变化。网上很多教程截图还是老版本界面,所以你在搜资料的时候,最好确认对方用的版本和你一致,否则照着抄可能配不出来。
2.2 Windows 下 "无法将 opencode 项识别为 cmdlet" 的排查
这是搜索热词里出现频率很高的问题,我自己也遇到过。现象是在 PowerShell 里执行 opencode,报:
opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。这个报错的根源,90% 是"命令文件存在,但终端找不到"。拆开来说就两层原因。
第一层,npm 全局安装的 bin 目录没有加到系统 PATH 里。很多人以为npm install -g之后命令就全局可用了,实际上 npm 会把可执行文件放进类似%APPDATA%\npm的目录,这个目录必须在 PATH 里,PowerShell 才会去搜。检查方式是在 PowerShell 里执行npm config get prefix,拿到全局目录,再确认这个目录在 PATH 环境变量中。
第二层,安装完成之后没有重开终端。PATH 环境变量在终端启动时就读取了,安装完命令后你需要新开一个终端窗口,或者执行下面这行命令手动刷新当前会话:
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")如果这两步都做了还报错,再用npx opencode --version验证一下包本身有没有装好。能输出版本号,说明只是 PATH 问题;如果 npx 也报错,那就是安装本身失败了,需要检查 Node 版本和 npm 日志。
2.3 安装后第一件事:认证
opencode 不像 Codex 那样默认绑定登录账户,它需要你主动配置认证信息。不同模型商的认证方式不同,一般有两种:
- 通过
opencode auth login交互式登录,适用于 OpenAI、Anthropic 这类支持 OAuth 的厂商。 - 在配置文件中直接写 apiKey,或者设置环境变量,适用于大多数第三方 API。
我第一次用的时候直接跳过了认证步骤,结果启动后每个模型请求都报 401,还以为是软件坏了。所以装好之后,先花一分钟把认证搞定,再开始玩其他功能。这里也顺便回答热搜里"opencode 是哪家公司的"这个疑问:它不是一个商业大厂的产品,更多是开源社区驱动,所以在使用方式和文档上都有点"极客"气质,别指望它有商业软件那种新手引导。
3. 一份能跑通的配置:模型接入与免费模型的取舍
3.1 配置文件放哪
opencode 的配置约定类似很多现代 CLI:全局配置放在用户目录的~/.config/opencode/下,项目级配置放在项目根目录的.opencode/下,项目配置会覆盖全局配置。这个设计非常实用,尤其当你同时在几个项目里用不同模型组合的时候。
我在公司接了一个老项目,用的是 Java + Maven,另一个个人项目是 TypeScript + pnpm。如果只靠一个全局配置,每次切换项目都要改半天。有了项目级配置,我可以在各自的.opencode/目录里放不同的模型偏好和 LSP 设置,互不干扰。
3.2 config.json 的基础结构
我当前项目的配置结构大致是这样的(具体字段名会随版本变化,以你实际版本为准):
{ "provider": { "openai": { "apiKey": "{env:OPENAI_API_KEY}", "model": "gpt-4.1" }, "anthropic": { "apiKey": "{env:ANTHROPIC_API_KEY}", "model": "claude-sonnet-4" }, "ollama": { "baseUrl": "http://localhost:11434", "model": "qwen3-coder" } }, "default": "anthropic", "lsp": { "enabled": true }, "memory": { "enabled": true } }先别急着照抄,因为 opencode 的配置字段经常调整,我见过好几个版本用 provider、model、lsp、memory 这些键,但也见过用 models 数组的写法。所以最稳妥的路径是:装好之后先跑一次opencode,让它生成默认配置文件,再基于默认配置去改,而不是从网上复制一个可能已经过时的配置。这样你至少能知道"当前版本认识哪些字段",改起来心里有底。
3.3 免费模型:能用,但别期待太高
热搜里有很多人问 opencode 免费模型,说明大家确实希望零成本跑起来。目前社区里提到的免费渠道大致有三类:一是部分云厂商提供的免费额度 API;二是本机跑的 Ollama 开源模型;三是某些平台送的试用积分。我的实际感受是:
- 免费额度类:适合写脚本、改小 bug、回答技术问题,但通常有每分钟请求数限制,跑长任务时容易断。
- 本地模型类:完全免费且没有频率限制,但编码能力跟商用模型有明显差距,尤其是大仓库重构这种任务,经常改着改着就丢了上下文。
- 试用积分类:适合短时间体验,不适合作为日常主力。
我自己现在的方案是:日常主力用付费 API,本地 Ollama 作为备用,免费额度只用来做一次性咨询。如果你真的想完全免费跑 opencode,我建议接受"它只适合做辅助编程,不能全托管"这个现实,否则体验落差会很大。
3.4 模型切换的日常姿势
opencode 的 TUI 里一般支持会话中切换模型,快捷键通常是Ctrl+M或者/models命令,不用重新启动。这个功能对我来说很重要,因为"让 agent 读代码、梳理逻辑"用便宜模型就行,"改一段复杂算法"再切到更强的模型,能省不少 token 费用。
打个比方,这就像你不可能天天开着货车去上班,但在搬家那天你肯定会租一辆。opencode 把"选什么车"这件事完全交给你,而不是规定你每天都只能开同一辆。对我来说,这是它最值钱的地方。
4. Skills、Memory、LSP:opencode 最值得花的三个进阶功能
4.1 Skills:把团队规范变成可复用技能
Skills 是 opencode 里我很喜欢的一个设计。简单说,你可以把一些固定的操作流程、代码规范、提示词模板,做成一个"技能包",让 agent 在对应场景自动或按需调用。
比如我在团队里遇到最多的场景是"提交代码前要跑 lint 和单测,并且遵循 commit message 规范"。以前在 Claude Code 里我会在会话里反复粘贴这段要求,而 opencode 里我可以写一个 skill:
- 在
.opencode/skills/precommit/下建一个SKILL.md - 里面写清楚触发条件和使用步骤:当用户提到"提交"或"准备 PR"的时候,先执行
pnpm lint,再执行pnpm test,最后按 Conventional Commits 格式生成提交信息。
实际用下来,这个 skill 的稳定性比我手动粘贴提示词高很多,因为 agent 会在相关节点主动去读这个文件,而不是只靠一次上下文的记忆。写 skill 有几个小技巧:
- 触发词要写明确,模糊的触发条件会让 agent 有时候用有时候不用。
- 步骤尽量编号,避免让它自由发挥。
- 每个 skill 只聚焦一个目标,别把一堆规则塞进一个文件。
我见过有人把"公司代码风格"和"部署流程"写在同一个 skill 里,结果 agent 在改代码时跑去执行部署命令,差点酿成事故。所以技能一定要单一职责,宁可多建几个目录,也别贪心。
4.2 Memory:跨会话的长期记忆
Memory 解决的是"昨天聊过的东西,今天不要再解释一遍"。opencode 的 memory 会把一些长期信息持久化,下次会话自动加载。比如你可以告诉它:"这个项目的测试框架是 Vitest,不要用 Jest",它会记下来,下次会话再让它加测试时,它就不会默认生成 Jest 的测试。
用法上,我喜欢在会话开始时直接说"记住:...",也可以主动查看/编辑 memory 文件。不过要提醒一点:memory 默认是项目级的还是全局级的,不同版本设计不同,如果你发现记忆串项目了,检查一下配置。我有一次在 A 项目里让它记住了"不要动 public 目录",结果切到 B 项目它也在守这条规则,搞得我排查了半天。
4.3 LSP:让 Agent 从"猜代码"变成"读代码"
LSP(Language Server Protocol,语言服务协议)本来是给编辑器用的,opencode 把它接进来之后,agent 就能像 IDE 一样获取更准确的代码语义。具体体现为:跳转定义、查找引用、获取类型信息。以前 agent 改代码经常靠正则和文本扫描,改了 A 文件忘了 B 文件的引用;接了 LSP 之后,它能拿到真实的符号关系,修改前会先找到所有引用它的地方,漏改的情况少了很多。
配置上主要是确认 config.json 里lsp.enabled为 true。不过有一点要注意:LSP 需要项目里装好对应的语言服务,比如 TypeScript 项目要有 node_modules 里的 typescript,Java 项目要有对应的 LSP 配置,否则开了也白开。我见过有人开了 lsp.enabled 之后抱怨"怎么没效果",一看项目里连语言服务都没装,那当然不起作用。
5. 从终端到编辑器:VSCode / IDEA 插件和桌面版的实际体验
5.1 VSCode 插件:终端的 Agent 进到编辑器
虽然 opencode 的主力场景是终端,但写代码这件事最终还是落在编辑器里,所以 VSCode 插件很有价值。我在 VSCode 里装好 opencode 插件后,主要用三个功能。
一是选中代码后让 agent 解释或重构。在编辑器里选中一段复杂逻辑,右键发送给 opencode,它能结合整个项目的上下文来分析,而不是只看选中片段。这个能力比单独把代码贴给 ChatGPT 要强很多,因为 agent 能自己去找相关的接口定义和调用方。
二是修改建议以 diff 形式呈现。和终端里的无差别输出相比,编辑器里的 diff 预览我可以直接逐个 hunk 接受或拒绝,不会出现"改了一大堆不是我要的"的失控感。这个交互方式我觉得是所有插件里做得比较舒服的。
三是把当前文件路径作为上下文自动带上。这个细节很实用,省得在终端里还要手动写文件路径。如果你经常在 "这个文件逻辑给我讲一下" 和 "帮我在这个文件里修个 bug" 之间来回切换,插件的便利性是终端没法比的。
5.2 IDEA 插件:Java/Kotlin 项目的接入
JetBrains 系插件我也用过一阵。IDEA 里 opencode 插件的功能和 VSCode 版基本对齐,但在 Java 项目上有个额外的好处:IDEA 本身对 Maven/Gradle 项目的语义分析很完整,插件能把项目模型信息传给 agent,再做改动的时候,对 pom.xml 或者 build.gradle 的修改会靠谱很多。
热点词里有人问 opencode mvn 配置,其实就是想在 IDEA 里让 agent 能读懂 Maven 项目的依赖关系。这个需要注意:在 IDEA 里如果项目是 Maven 结构,最好先让插件同步一下项目配置,否则 agent 看到的是文件系统层面的目录,而不是依赖解析后的模型。比如 agent 想加一个新依赖,它可能不知道应该用哪个版本最合适,因为那需要查 Maven 仓库元数据。IDEA 插件如果能把本地仓库已有的版本信息同步给它,这个问题会好很多。
5.3 桌面版:给不想碰终端的人一条退路
opencode 还有桌面版客户端,界面和终端 TUI 不一样,但底层是同一套引擎。对完全抗拒命令行的同事来说,桌面版友好很多:装好后选模型、填 API key、打开项目文件夹就能聊。桌面版还支持多窗口,一个项目开一个窗口,互不干扰,适合同时处理多个小需求的场景。
不过我的个人体验是,桌面版在长会话下的稳定性不如终端版,可能是还在快速迭代。如果你只是想做轻量代码问答,桌面版够了;如果要做大量代码修改,我仍然推荐终端版,各种快捷键和上下文控制更顺手。
6. 踩坑记录:从启动报错到 Playwright 测前端 bug
6.1 "unexpected server error. check server logs" 的定位思路
这条错误在热搜里也出现了,报错形式类似:
opencode error: unexpected server error. check server logs.看到这个第一反应不要重装,先按顺序排查。第一步,确认 API key 是否有效,尤其是免费额度用完的 key,经常报 "unexpected server error"。第二步,确认配置的 baseUrl 是否可达。如果你用的是第三方服务或本地代理,网络不通也会包装成这个错误。第三步,看 opencode 的日志。一般在~/.local/share/opencode/log/或项目.opencode/log/下,里面会有真正的原因。很多时候是上游返回了 5xx,而 opencode 只是把错误统一包装了。
这个方法其实也适用于其他类似的通用报错。AI 编程工具为了不把技术细节糊在用户脸上,经常会把上游的一堆错误合并成一句“unexpected server error”,所以你要做的不是对着这句提示发呆,而是想法子往上游看:先去日志看请求到底有没有发出去,再确认发出去之后响应是什么,问题往往出在认证或网络层。
6.2 "this model is not available in your country" 是什么情况
这个报错文字很容易让人误会是网络问题,其实它通常是服务商侧的模型地域限制。也就是说,你账号所在的区域或你请求的 IP 所属区域,不在该模型允许的服务范围内。
我的建议是三件事:不要在配置层面硬绕,因为它不是配置错误;先换一个在当前区域可用的模型,比如报错的是某个地区的专用模型,那就换通用模型;再检查一下账号绑定的区域信息,有时候是账号地区和请求地区不一致导致的。该报错不影响其他模型的正常请求,所以在配置里把默认模型换成可用模型,是最快的解。
6.3 配置改了不生效
很多人改了 config.json,发现 opencode 行为没变化。常见原因有两个。
一是改了项目级配置,但当前工作目录不在项目根目录下,agent 没读到。opencode 一般会自动检测项目根,但如果你在子目录启动,可能不会主动向上找。我习惯在项目根目录启动 opencode,这样至少能保证项目级配置被正确读取。
二是改了全局配置,而项目里存在一个低优先级的配置把它覆盖了。建议先用 opencode 的配置查看命令确认实际生效值,不确定就先用小实验验证。比如你改了一个模型参数,就在会话里问一句“你当前用的什么模型”,看看它答的是不是你想配的那个。如果答出来的不是你配的,再去查覆盖关系。
6.4 用 Playwright 驱动 opencode 查前端 bug
这个用法我觉得很值得单独说。opencode 可以通过 MCP 或内置能力接入 Playwright,也就是说,你可以让 agent 自己打开浏览器、复现 bug、截图、再把控制台报错带回来分析。我实际遇到过一个前端样式错乱问题,纯看代码一直找不到原因,后来让 opencode 用 Playwright 打开本地开发服务器,把页面关键操作录了一遍,拿到截图之后,它发现是某个异步组件渲染时,父容器的高度计算把错位了。这个排查过程如果让我自己来,至少得开 DevTools 反复看半天,agent 几分钟就给了一个可验证的结论。
使用上要注意:给 agent 的指令要明确"先复现,再分析,不要直接改代码"。否则它很容易跳步:还没复现清楚就动手改,改完又无法验证。我现在的习惯是把它当成一个"带眼睛的调试员",先让它把复现步骤和截图贴出来,我再决定要不要让它继续改。
另外,如果你想要 opencode 查 bug 更顺手,可以在操作指令里写清楚"打开 URL 后等待多少秒,点击哪些元素,把 console 和 network 的报错一并抓回来"。这样它给回来的信息会更完整。Playwright 这块其实也是很多人的知识盲区,因为大家平时只把它当测试框架用,忘了它本质上是一个"浏览器自动化遥控器",结合 AI Agent 之后,它能帮你做视觉回归、交互流程验证、异常复现,潜力比单纯写测试用例大得多。
最后再说一点个人体会。从 Codex CLI 到 Claude Code 再到 opencode,这些工具的能力上限越来越接近,真正拉开差距的其实是工作流适配:你能不能把自己的规范沉淀成技能,能不能让它记住项目的长期上下文,能不能让它自己打开浏览器验证结果。opencode 给我的感觉是,它愿意把这些能力都开放给你,而不是替你做决定。如果你正在找一个能长期磨合、越用越顺手的终端编码 Agent,我建议给它一周时间,配好 Skills 和 Memory,再对比回其他工具,你会感觉到差别。