最近一个月,我几乎把日常写代码的主战场搬进了终端,主力工具从 Claude Code 换成了 opencode。如果你还没听过这个名字,可以把它理解成一个开源的 AI 编程代理(coding agent):它不是一个单纯的 IDE 插件,而是能直接跑在你项目目录里的命令行助理,能读代码、改代码、执行命令、跑测试,甚至打开浏览器帮你复现前端 bug。很多人第一次接触它是在技术社区看到“opencode 安装”“opencode 使用教程”这些热搜词,但真正把它用顺手的并不多。
这篇文章我不打算念文档,而是把从安装、配置、模型选择到 skills、LSP、Playwright 调试这些我实际走过的路整理出来,给大家一份能直接照着走的实战笔记。适合这几类人看:经常在终端里写代码的人、被商业 AI 编程工具的价格和限制劝退的人、需要接手陌生项目的人,以及想把 AI 编程助手真正接进现有工程的团队。
1. 先搞清楚 opencode 是什么,以及它和 Claude Code、Codex 的差别
1.1 从“聊天机器人”到“能动手改代码的代理”
很多人第一次打开 opencode,会误以为它又是一个终端版 ChatGPT。但实际上,这类工具和普通问答式 AI 最大的区别在于:它能直接看到你的项目文件,能在你的机器上执行命令,能调用语言服务器拿到类型和诊断信息,再基于这些信息真正动手改代码。
举个例子,你让它“把这个接口的鉴权逻辑抽取成独立中间件”,它不是给你一段示例代码让你自己去粘,而是会先读你的项目结构,定位到相关路由和鉴权代码,理解现有风格之后,直接在你的工程里创建文件、修改引用、运行测试,最后把改动结果汇报给你。
opencode 是 SST 团队开源的一个项目,不是哪家商业公司的主营产品,代码、配置和模型接口都是开放的。它默认支持 OpenAI、Anthropic、本地模型等一大堆 provider,所以你用它的时候,模型选择是自由的,不会被某一家厂商绑死。这一点对我来说很重要,因为项目里不同任务我会轮换着用不同模型。
1.2 与 Claude Code / Codex CLI / Pi 怎么选
网上关于“opencode codex claude code”“opencode codex pi 哪个 agent 好用”的讨论很多。我三种都用过一段时间,简单说下差异:
| 工具 | 开源 | 模型绑定程度 | 特点 | 更适合谁 |
|---|---|---|---|---|
| opencode | 是 | 多 provider,自由切换 | 开源、可配置性强、支持 skills 和 LSP | 喜欢折腾、需要接入多种模型或本地模型的人 |
| Claude Code | 否 | 主要绑定 Anthropic 模型 | 与 Claude 深度结合,改代码能力强,闭源 | 愿意用 Claude 生态、不太关心配置自由度的人 |
| Codex CLI | 否 | 主要绑定 OpenAI 模型 | OpenAI 官方出品,和 GPT/Codex 模型配合好 | 深度使用 OpenAI 模型的人 |
| Pi | 取决于具体项目 | 多模型 | 社区项目,有些轻量场景表现不错 | 想找 opencode 替代品、做对比测试的人 |
我的体感是:如果团队里已经有固定的模型供应商,选对应的 CLI 最省心;如果你希望一个工具能吃下不同模型、能自定义技能、能接 LSP 和浏览器自动化,那 opencode 当前是最灵活的那个。下面所有内容,都以 opencode 为主线来讲。
2. 安装 opencode:命令、平台差异和两个高频报错
2.1 环境检查和安装命令
opencode 本质是一个 Node.js 编写的命令行工具,所以安装前你先确认机器上有没有 Node.js。我个人建议至少在 18 以上,最好用 20 或 22 的 LTS 版本,实测更稳。
node -v npm -v安装方式官方给了两条线:一条是 curl 安装脚本,一条是 npm 全局包。我两种都试过,curl 脚本适合 macOS 和 Linux,npm 方式在 Windows 上也通用:
# 方式一:官方脚本(macOS / Linux) curl -fsSL https://opencode.ai/install | bash # 方式二:npm 全局安装 npm install -g opencode-ai安装完成后,命令行执行:
opencode --version如果能正常输出版本号,说明安装成功。如果提示找不到命令,大概率就是 PATH 问题,我后面会专门讲。
安装这一块的重点不是“敲命令”,而是想清楚你打算在哪些环境用。我自己是公司电脑装一套、个人电脑装一套,顺带在 Linux 服务器上也装了一份,用来处理线上日志和配置排查。它们共用一个配置文件体系,换机器成本很低。
2.2 无法识别 cmdlet 的排查流程
很多人在 Windows 上遇到这个经典报错:
opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
我第一次在 PowerShell 里遇到这个报错时,第一反应是“没装成功”,后来才发现安装其实完成了,只是命令所在的目录没有加入 PATH,或者终端没有重新加载环境变量。
解决路径分三步走。第一步,先确认可执行文件到底装到哪了。如果用的是 npm 全局安装:
npm prefix -g这个命令会输出全局 node_modules 的路径,可执行文件一般就在对应目录下。比如输出是C:\Users\你的用户名\AppData\Roaming\npm,那opencode.cmd就存在这里面。第二步,手动把这个目录加到系统环境变量 PATH 里,然后重新打开一个终端窗口。第三步,如果你是在 VS Code 的集成终端里跑的,注意重启 VS Code 或者重新加载窗口,否则它读到的还是旧的环境变量。
如果你没走 npm 而是用安装脚本,Windows 上的脚本一般会装到用户目录的某个 bin 文件夹下,同样加 PATH 就行。还有一个小技巧:临时急用的时候可以用npx opencode-ai直接跑,绕过 PATH 问题,但只是应急,长期用还是把 PATH 配好。
2.3 unexpected server error 的排查思路
还有一个很常见的启动报错:
opencode error: unexpected server error. check server logs
第一次看到这个我有点懵,因为信息太少,完全不知道哪里出了问题。后来翻了源码和日志才搞清楚,opencode 启动时会拉起一个本地 server 进程,负责处理模型请求、文件读取、插件通信这些事。如果这个 server 起不来,或者请求中途挂了,CLI 就会抛这个通用错误。
排查思路是:先看日志,直接找 opencode 的日志目录。我这边日志路径在~/.local/share/opencode/log下,不同平台可能略有差异,也可以通过终端先跑一遍opencode --debug看详细输出。
经验上,这个报错最常见的原因是配置写坏了,比如 opencode.json 里 provider 的字段不合法,或者某个 model 名写错;其次是网络问题,比如模型 API 超时、公网不通;偶尔是本地端口冲突。我自己的处理顺序是:先打开日志文件看最后几十行,如果有“fetch failed”就查网络,如果有“invalid json”就去改配置,如果日志里是权限错误就检查文件目录权限。大部分问题都能靠这个顺序定位。
3. 模型提供商、订阅套餐与配置文件拆解
3.1 opencode.json 配置文件到底在配什么
安装好之后,第一个要面对的就是配置。opencode 的主配置是一个 JSON 文件,一般放在项目根目录,或者用户配置目录下。网上很多旧教程会让你改 opencode.toml,那是老版本的东西,现在基本统一成opencode.json了。我第一次接触时恰好看到旧资料,照着改了半天,后来才发现版本差异。
一个基础的配置文件大致长这样:
{ "provider": { "default": "anthropic", "anthropic": { "model": "claude-sonnet-4-5", "apiKeyEnv": "ANTHROPIC_API_KEY" }, "openai": { "model": "gpt-4o", "apiKeyEnv": "OPENAI_API_KEY" } }, "skills": ["~/.config/opencode/skills"], "lsp": { "typescript": ["typescript-language-server", "--stdio"], "go": ["gopls"] } }注意,openopencode 的字段在不同版本里会有微调,你最好以当前版本opencode --help或者官方文档为准,我这个是 2.x 时代的常用结构。核心思路是:你把用到的模型服务商都注册进来,然后指定哪个是默认的。API Key 我强烈建议不要直接写在配置文件里,而是通过环境变量引用,这样即使配置文件不小心提交到仓库,也不会泄露密钥。
实际使用中,我一般是项目根目录放一份 opencode.json,专门给这个项目配置模型和 skills;用户目录再放一份全局配置,给所有项目兜底。这样团队里其他人拿到项目后,不需要额外配置太多东西就能跑起来。
3.2 opencode go 订阅/免费模型怎么选
这两年很多模型服务商都推出了订阅套餐,搜索引擎里“opencode go 订阅模型选择”“opencode go 套餐”热度不低。这里我给你一个选型框架,别光看总 token 数量。
第一看上下文窗口。你让 opencode 修改一个大型函数的时候,它需要把相关文件内容塞进上下文。如果模型上下文只有 32k,面对稍微大一点的代码文件就很吃力,经常出现“改了前面忘了后面”的情况。我自己的门槛是:主力模型至少要 128k 上下文,做跨文件重构的时候甚至要 200k 以上。
第二看速率限制,也就是 RPM 和 TPM。免费模型或低价套餐经常限速很厉害,连续问几个问题就开始转圈。这种模型适合简单问答、生成测试用例,但让它在一个大模块里反复修改,体验会非常折磨。想要稳定干活,至少要选一个不那么容易触发限流的套餐。
第三看团队共享能力。如果你是个人用,无所谓;如果是团队一起用,最好选支持组织级控制台、能统一看消耗量的套餐,不然月底账单对不上特别头疼。
顺带说一下“opencode go 需要配合 cc switch 等工具”这个说法。cc switch 这类工具本质是帮你快速切换本地的 API 配置,不是 opencode 自己必须依赖的东西。你只需要确认三件事匹配:baseURL、API Key、模型名。三者对不上,神仙工具也救不了。至于“opencode 免费模型”,我的建议是可以用来做草稿、做解释、做小范围改动;真正要动核心代码,还是用稳定一点的大厂模型或者按量付费模型,省下来的时间比省的钱值钱。
3.3 “this model is not available in your country”怎么处理
这个报错我在换模型服务商时踩过一次:
This model is not available in your country.
第一次看到它时我以为是 opencode 的问题,后来排查了一圈才发现是模型服务商那边的地域限制。不同 API 服务商,或者同一服务商的不同区域站点,支持的模型列表并不完全一样。你配置的模型名在那个地区/域名的服务里根本没有被开放,所以服务商直接拒绝请求。
解决方式不是去折腾什么“曲线救国”的方案,而是老老实实做两件事:一是去你用的模型服务商官方文档里查“models by region”或“supported models”列表,确认你当前账号所在区域到底支不支持这个模型;二是如果你的配置里填了自定义 baseURL,确认这个 endpoint 和模型名是匹配的。实在不行,就换个支持你所在区域的模型。
现实里很多人一看到“not available in your country”就本能地想找歪路子,但作为一个做工程的人,我劝你优先走正规流程。换地区服务商、换模型、看官方文档,这些都是有据可查的方案,不会给你带来额外的合规风险。
3.4 Linux 下改配置的实操
很多后端工程师会在 Linux 服务器上装 opencode,用来排查线上问题。Linux 下改 opencode 配置有两点要注意。
第一是文件路径。项目配置放项目根目录,全局配置一般在~/.config/opencode/opencode.json。如果你不确定当前生效的是哪份,可以在项目目录里跑:
opencode --print-config它会输出合并后的最终配置,一眼就能看出当前模型和 provider 是什么。
第二是 JSON 格式。opencode.json 是严格 JSON,不支持注释。很多人习惯在 JSON 里写注释,写完直接启动就报 server error。Linux 下我一般用小技巧:先写一个opencode.json.template带注释的模板文件,改好之后再手动生成没有注释的 JSON,或者用 jq 处理:
jq '.provider.default = "openai"' opencode.json > temp.json && mv temp.json opencode.json注意 jq 这种覆盖写法会丢掉文件格式和原有注释,改动前最好先备份。如果只是想临时切换模型,其实不用改文件,直接在 opencode 交互界面里用/model命令切换就行,我后面会讲到。
4. 把 opencode 用起来:接手项目、Skills 与 LSP
4.1 用 opencode 快速接手一个陌生项目
“opencode 接手开发项目”这个话题,在我看是 opencode 最实用的场景之一。刚进一个新团队或者被分配到一个遗留项目时,第一反应通常是恐惧:代码几千个文件,文档还不全,根本不知道从哪里下手。
我现在的习惯是,在项目根目录直接启动 opencode,然后先用几个固定问题让它帮我建立地图:
- “读取 README 和项目文档,总结这个项目是干什么的,用了什么框架”
- “列出项目的核心目录结构,标出入口文件、路由、数据模型的位置”
- “查看最近的 git log,告诉我最近几次提交改了什么,项目当前处于什么阶段”
opencode 会自己去翻文件,然后把成果整理成结构化摘要。这一步能把“盲人摸象”变成“先看地图”,效率提升是肉眼可见的。接下来如果有一个具体报错要修,我会把完整堆栈丢给它,并明确上下文:“这是线上环境的一个报错,发生在某个接口调用后,帮我定位到对应代码并分析原因。”它能把错误栈映射到具体代码行,甚至直接给出修复补丁。
这里有个非常重要的实操原则:不要让 AI 一次改太多文件。我的经验是,AI 在多文件修改时,很容易在某个文件里漏掉一处引用,导致编译错误或者运行时行为不一致。所以我会要求 opencode“一次只改一个模块,改完跑一次测试/编译再继续”,这样即使出问题,也容易定位。
4.2 Skills:把团队经验变成可复用的技能包
opencode 有一个我非常喜欢的功能:skills。你可以把它理解为“AI 的技能包”或者“插件”。团队里很多经验是可以结构化的,比如代码规范、数据库操作流程、部署检查清单、新人常见陷阱。这些内容如果每次都在对话里重新描述,又啰嗦又不稳定,而 skills 可以把它们沉淀成 opencode 能主动加载的固定知识。
典型的 skills 目录结构是这样的:
~/.config/opencode/skills/ └── code-review/ ├── SKILL.md └── review.pySKILL.md 里用 Markdown 描述这个技能什么时候该用、具体怎么做、有哪些禁忌。我写了一个很简单的 code-review 技能,大致内容是这样的:
--- name: code-review description: 当用户要求 code review 或审查代码时使用 --- # Code Review 流程 1. 先读取本次改动涉及的 diff 文件,确认改动范围 2. 按顺序检查:业务逻辑正确性、边界情况、错误处理、安全风险 3. 对每一条问题标注严重级别:blocker / major / minor 4. 汇总输出时,先列 blocker 和 major,再列 minor 5. 不要直接改代码,只输出评审意见配置好 skills 目录后,当你在对话里请求 code review,opencode 就会自动加载这个技能,按照你定义的流程执行。这比每次口头叮嘱“你要先看 diff 再给出严重级别”要可靠得多。
我个人建议团队可以把几个高频场景固化成技能:代码评审、数据库迁移检查、发布前检查、日志排查。一个 SKILL.md 加上一两个辅助脚本,就能把老师傅的经验复制给整个团队。
4.3 LSP 集成:让 AI 不再“瞎猜”编译错误
LSP 是 opencode 另一个杀手级特性。不了解的人可能觉得它很抽象,其实用一句话解释:LSP 让 AI 在改代码的时候,能拿到编辑器同级别的类型信息、语法诊断和符号定义,而不是对着纯文本瞎猜。
比如你用 TypeScript,配置了 typescript-language-server 后,opencode 在修改某个函数参数时,能立刻知道调用方有哪些地方会报类型错误,然后主动去修复这些连带的调用点。没有 LSP 的时候,它改完代码经常会留下一堆类型错误,你还得手动跑tsc去发现;有 LSP 之后,它会像一个人借助 IDE 写代码一样,实时看到红线。
配置方式大致就是在 opencode.json 里加 lsp 字段,把语言服务器命令填进去:
{ "lsp": { "typescript": ["typescript-language-server", "--stdio"], "go": ["gopls"], "python": ["pyright-langserver", "--stdio"] } }注意,你本机必须先安装对应的语言服务器,否则 opencode 只是启动了一个不存在的命令。以 TypeScript 为例,你需要先保证typescript-language-server在 PATH 里;Go 对应gopls;Python 对应pyright-langserver。装完语言服务器后重启 opencode 就能生效。
实际体验中,LSP 对“重构”类任务帮助最大。有一次我让 opencode 把一个工具函数从utils.ts迁移到lib/format.ts,它通过 LSP 找到所有引用点,迁移后还把 import 全部更新掉了,我跑了一遍编译,零报错。这个体验在没配 LSP 之前是想都不敢想的。
5. 用 Playwright 让 opencode 自己复现并修复前端 bug
5.1 为什么前端 bug 最适合交给浏览器自动化
前端 bug 是最难口头描述的:“页面上有个按钮,有时候点了没反应”“这个弹窗在某些情况下不显示”“表单校验偶尔报错”。这种问题听的人崩溃,AI 也容易一头雾水。但 opencode 内置了浏览器自动化能力(基于 Playwright),可以让 AI 自己打开页面、操作界面、收集控制台报错,然后分析复现路径。
这个思路本质上不是让 AI 凭空猜,而是给它一套“眼睛和手”:它能看到页面真实渲染结果,能点击、输入、跳转,甚至截图给你看。比传统人肉复现 bug 高效得多。
我这里说的 Playwright 能力有两种接入方式:一种是 opencode 内置的浏览器工具,另一种是单独挂一个 Playwright MCP 服务。不同版本的 opencode 对 MCP 工具的支持方式略有调整,你在交互界面里输入斜杠命令看有没有@playwright或mcp相关的列表就能确认。
5.2 一次完整的前端 bug 修复流程
我建议你按下面这个流程使用,别跳步,我在最后一步吃过亏:
第一步,启动 opencode 后,明确告诉它当前项目的前端启动命令。比如“项目是 Vite + React,npm run dev启动在 5173 端口”。它会自己把开发服务器跑起来,或者告诉你需要先手动启动。
第二步,描述 bug 现象要具体。比如“登录页输入正确账号密码后,点击登录按钮没有任何反应,控制台也没有报错”。然后要求它“用浏览器工具复现这个问题”。
第三步,它会写一个 Playwright 脚本,打开浏览器、访问页面、输入内容、点击按钮、收集 console 日志和网络请求结果。你可以看到它实时操作浏览器的输出,也可以让它截图保存到项目目录。
第四步,根据复现结果,它通常能定位到问题根源。比如某个事件绑定写错了选择器,或者某个接口请求被拦截。这时候再让它修复,它脑子里有“真实发生过的错误信息”,不是凭空猜测,修得会准很多。
第五步,修完代码后,重新让它跑一遍同样的 Playwright 流程,验证 bug 是否真的消失。这一步不能省,我上次让 AI 改完后没验证,结果它改对了 A 场景却弄坏了 B 场景。
5.3 浏览器调试的注意事项
用 Playwright 跑前端测试,有几个坑要提前说。
第一,浏览器二进制一定要装。你光装了 npm 包还不够,还得执行类似npx playwright install chromium的命令,把实际的浏览器下载下来。不装的话,AI 一启动浏览器工具就会报错。
第二,headless 模式和带界面的模式各有用途。我调试时喜欢让它在有界面模式下跑,这样我能亲眼看到页面变化;如果只是 CI 回归验证,可以用无头模式,速度快。
第三,如果项目里有登录鉴权,直接让 AI 打开页面往往会跳转到登录页。你可以在描述里把测试账号给它,或者让它读取你本地已有的登录态。千万注意别把密码写进公开的配置和 SKILL.md 里。
第四,前端 bug 不一定都在控制台报错里能看出端倪。有时候页面显示异常是 CSS 样式问题,控制台完全没报错。这种时候要让 AI 截图给你看,你用人眼判断一下视觉效果,再告诉它怎么调整。
6. VS Code、JetBrains 插件与桌面端选哪个
6.1 插件只是“遥控器”,核心还是本地 CLI
现在 VS Code 和 JetBrains 里都有 opencode 插件,网上搜“vscode opencode 插件”“idea opencode 插件”的教程也很多。我两个都试过,结论是:插件本质上是一个“遥控器”,它把 opencode 的能力搬到了 IDE 面板里,实际干活的核心还是你本地的 opencode CLI 和 server 进程。
VS Code 插件安装后,侧边栏会多出一个 opencode 面板,你可以直接选中一段代码,右键发送给 opencode 让它解释、优化、补测试。JetBrains 插件的工作方式类似,适合 Java、Go、Kotlin 等重度 IDEA 用户。
选择建议很简单:如果你日常大部分时间在 VS Code/IDEA 里写代码,装插件能减少切换终端的频率。但如果你要处理跨文件重构、跑测试、操作浏览器这些复杂任务,我还是推荐切回终端用 CLI,因为终端下的交互流更完整,输出信息也更全。
6.2 我的 IDE 使用习惯
我自己目前的节奏是“双轨并行”:日常小改动,比如写个函数、补个注释、写单测,直接在 VS Code 的 opencode 面板里完成,省得切窗口;一旦涉及多文件重构、排查线上问题、跑 Playwright 复现 bug,就打开终端用 CLI,让 opencode 按计划一步步改。
还有一点要提醒:IDE 插件和终端 CLI 共用一个配置和会话体系,你在插件里配置好了模型,终端里也能直接用。但反过来,如果你在终端里改了 opencode.json,记得重启 IDE 插件或者重新加载窗口,否则它可能还拿着旧配置。
至于 opencode desktop,桌面客户端我也装过,它把终端交互变成了一个独立窗口,视觉上更像聊天软件,适合不太习惯命令行的朋友。但对我来说,桌面端多一层进程,占内存,平时还是用 CLI 最多。
7. 常见问题速查表
最后把网上热搜里出现频率最高的几个问题整理成速查表,方便你遇到问题时直接查。
7.1 报错类问题
| 报错现象 | 常见原因 | 解决方式 |
|---|---|---|
| 无法将“opencode”项识别为 cmdlet | 可执行文件目录没加入 PATH,或终端未重启 | npm prefix -g找到目录,加入 PATH 后重开终端 |
| opencode error: unexpected server error | 配置文件非法、网络超时、端口冲突 | 打开~/.local/share/opencode/log日志看堆栈,按定位处理 |
| This model is not available in your country | 模型在所选区域/端点未开放 | 查服务商官方模型清单,换支持区域或换模型 |
| Playwright 报错找不到浏览器 | 浏览器二进制未安装 | 执行npx playwright install chromium |
| LSP 一直转圈不返回 | 语言服务器未安装或不在 PATH | 确认typescript-language-server、gopls等已安装 |
7.2 使用习惯类问题
| 问题现象 | 我踩过的坑 | 现在的做法 |
|---|---|---|
| AI 改的面目全非 | 一次让 AI 同时改多个模块,结果每处都改一半 | 一次只改一个模块,改完跑测试再继续 |
| 长会话后半段回答质量骤降 | 上下文窗口被占满,模型“忘了”开头的约定 | 定期用新会话继续,每次开头重申关键上下文 |
| 密钥泄露风险 | 曾经把 key 写进 opencode.json 并提交到仓库 | 全部改用环境变量,并在 .gitignore 里排除配置 |
| 模型明明很强,输出却很水 | 默认模型选错或 temperature 过高 | 切换模型、调整配置里的温度参数 |
这里再补充一个公开文档里不太会写的技巧:opencode 在交互界面里支持很多斜杠命令,比如/model随时切换模型,/new开启新会话,/export把当前会话导出成文件。遇到上下文太长、模型开始“发昏”的时候,直接/new开新局,把关键背景重新描述一遍,比硬撑到最后一本正经胡说八道要省时间。我自己现在已经养成了习惯:长任务绝不从头到尾只开一个会话,做到一个里程碑就切新会话,让模型保持新鲜上下文。
另外,如果你有多个服务商的 API Key,我强烈建议用环境变量的方式管理,而不是放在配置文件里硬编码。在终端里临时设置一次:
export ANTHROPIC_API_KEY=sk-xxx export OPENAI_API_KEY=sk-xxx然后启动 opencode,它就能自动读到。这样既安全,又方便切换不同服务商的套餐。
最后聊两句我自己的使用体会。以前用 AI 编程助手,我总担心它“乱改”“改错”,所以事无巨细都要盯着。用 opencode 这段时间下来,我最大的转变是学会了“让 AI 先出方案,再动手”。哪怕是一个很小的改动,我也先让它列出计划、标明要动的文件和涉及的风险,确认没问题后再让它执行。这个习惯帮我挡住了很多次本来会发生的“AI 式破坏”。
如果你现在刚开始接触 opencode,我的建议是:先别急着配一堆花哨的 skills 和 LSP,先用最基础的安装 + 一个可靠的模型,跑通一个小任务的完整流程;等熟悉了它的交互节奏,再去接 LSP、写 SKILL.md、上 Playwright。这个工具能给你带来的上限很高,但前提是你得先学会怎么安全地驾驭它。