最近大半年,我把主力编程环境从IDE的AI插件,慢慢挪到了终端里的AI Agent上。前后试了Claude Code、Codex CLI,最后日常用得最多的反而是opencode。这项目是SST团队开源的,在GitHub上叫sst/opencode,主打一个“终端里的AI结对工程师”。它能读代码、改代码、跑命令、查日志,也能以Agent身份完成整个流程的任务,比我之前用的传统聊天框工具实用了不止一个量级。
这篇文章会把我从安装到日常调优踩过的坑和验证过的玩法整理出来,重点覆盖环境配置、模型接入、Skills/Memory、以及怎么用它接手一个陌生项目并修掉前端bug。适合刚听说opencode、想从零上手的开发者,也适合已经装了但用不溜、老被配置问题绊住的人。我尽量少说空话,多给可以直接照着操作的东西。
1. opencode 到底是什么,为什么值得把它放进工作流
1.1 它不是又一个聊天框,而是会动手的 Agent
opencode的定位是编程代理(coding agent),不是一个只会问答的工具。它跟你平时在IDE里用的Copilot、通义灵码这类“补全+聊天”工具有本质区别:你给它一个模糊目标,它会在你的工程上下文里自己看package.json、找入口文件、读代码、改代码、执行命令,然后通过终端TUI把整个过程完整展示出来。我实际用下来最直观的感受是“它真的在工作”——经常是它自己打开文件、定位函数、改完跑测试,全程我在旁边审改动。
拿传统AI assistant对比,聊天框专注“回答”,opencode专注“执行”。对一个老项目,我让它修复某个模块的功能异常时,它会先看目录结构,再查调用链,接着改文件,最后跑测试验证。你只需要在关键节点点头确认。这种“人审阅+AI干活”的模式,确实把我从琐碎的代码劳作里解放了不少。
1.2 和 Claude Code、Codex CLI 放在一起怎么选
我把这几个主流方案放在同一张表里对比过,选型的时候可以从这几个维度看。
| 维度 | opencode | Claude Code | Codex CLI |
|---|---|---|---|
| 是否开源 | 开源,MIT协议 | 闭源 | 开源 |
| 模型绑定 | 多模型通用 | 主要为Anthropic模型 | 主要为OpenAI模型 |
| 交互界面 | 终端TUI,体验好 | 终端CLI | 终端CLI |
| Skills/记忆 | 有Skills、Memory机制 | 有类似能力 | 偏轻量 |
| 插件生态 | VSCode、JetBrains等 | 官方扩展 | 官方扩展 |
| 本地模型支持 | 支持Ollama等 | 支持有限 | 暂无 |
| 上手成本 | 配置略多,可控 | 官方封装好但贵 | 依赖OpenAI账号 |
从结果来看,opencode最大的优势是“不绑死一家模型”。OpenAI的模型贵、Anthropic在某些代码场景强、本地模型又便宜,我经常一个项目里换来换去。opencode把这一层做了很好的抽象,key、模型、provider都可在配置里切换。另一个优势是Skills和Memory:这两个机制解决了AI工作流里最致命的两个问题——每次新会话忘记上下文,以及不遵守团队规范。
如果你预算充足、只想少折腾,Claude Code体验确实丝滑;但如果想要自由度、要能控制模型和成本、要能从终端优雅地管理多个AI供应商,opencode值得花半小时配置起来。
2. 先把环境捋顺:安装、运行时和 PATH 问题一条龙
2.1 安装之前先确认三件事
装opencode之前,我建议先确认三样东西:
- Node.js 版本大于等于 20。opencode是基于Node生态开发的,版本太低会出现各种奇怪报错。用
node -v看一下,不满足就先升级。 - Git 已安装且可用。很多操作依赖Git工作区,比如查看diff、回退代码,没Git会少很多功能。
- 至少一个可用的大模型 API Key。可以是Anthropic、OpenAI、OpenRouter,也可以是本地Ollama。
我遇到过不少新手一上来直接npm install -g opencode-ai,装完却发现连opencode --version都跑不了,最后排查发现是Node版本太老。所以第一步别省,先确认版本。
2.2 三种安装路径挑一个
opencode的安装方式看平台和个人习惯,我列三种最主流的:
- npm 全局安装(最通用):
npm install -g opencode-ai装完执行opencode --version验证。模块名带-ai,是因为npm上“opencode”这个名字已经被别的包占了,注意别装错。
- macOS 用 Homebrew:
brew install sst/tap/opencode这种方式的好处是升级方便,brew upgrade opencode一条命令就完事。
- 官方安装脚本:opencode官网提供一键安装脚本,适合Linux服务器这类环境。
另外多说一句,opencode现在也有桌面版和相关IDE插件。桌面版更像一个带界面的终端封装,日常我还是推荐原生TUI,响应速度和快捷键体验更好。
2.3 “无法将 opencode 项识别为 cmdlet、函数、脚本文件”怎么破
这是Windows上最经典也最劝退新手的问题,报错原文通常是这样:
opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。原因几乎都是同一个:npm的全局安装目录没有加到系统PATH里。npm install -g装完的可执行文件放在某个目录,PowerShell找不到它,就报了这种错。
解决分三步走:
- 查看npm全局安装路径:
npm config get prefix在Windows上,这个路径通常是C:\Users\你的用户名\AppData\Roaming\npm。
- 把这个路径加入环境变量PATH:
- 按
Win + R,输入sysdm.cpl回车,打开“系统属性→高级→环境变量”; - 在“用户变量”里选中
Path,点“编辑”,新增一行,粘贴上面的npm路径; - 确认保存。
- 关掉当前PowerShell窗口,重新开一个,先看
Get-Command opencode能不能找到,再执行opencode --version。
macOS和Linux也会有类似问题,只是报错变成了command not found: opencode,处理思路相同:找到npm全局bin目录,一般是$(npm prefix -g)/bin,确认它在PATH里。
提示:如果不想动PATH,临时快速验证可以用
npx opencode-ai直接跑,但这种方式每次都会经过npx解析,正式用还是建议把全局路径配好。
3. 模型接入与切换:官方API、聚合平台、本地模型怎么选
3.1 官方 Anthropic / OpenAI 最省事
opencode默认对几家主流厂商做了适配,接入官方API其实很简单,本质就是设置环境变量。
在PowerShell里:
$env:ANTHROPIC_API_KEY = "sk-ant-xxxxxxxx"在macOS/Linux的终端里:
export ANTHROPIC_API_KEY="sk-ant-xxxxxxxx"设置完启动opencode,在TUI里输入斜杠命令/models,就能看到可用的模型列表,选中某个模型开始对话即可。如果你希望每次启动默认就用某个模型,可以在配置文件里固定,后面4.1会讲。
OpenAI同理,设置OPENAI_API_KEY就行。这里有个小建议:环境变量不要写在全局profile里长期暴露,尤其是共享机器或会把配置文件同步到Git仓库的情况。
3.2 用 OpenRouter 这类聚合平台降低成本
我现在的主力方案其实是OpenRouter。它一个key可以访问Anthropic、OpenAI、Google以及一堆第三方模型,模型降价或下线也能随时切换。设置方式:
export OPENROUTER_API_KEY="sk-or-xxxxxxxx"然后在opencode里切到openrouter provider对应的模型,比如openrouter/anthropic/claude-sonnet-4。这类格式的好处是:provider和模型名连在一起,一眼就清楚走的是哪条通道。
OpenRouter上还有很多免费模型,名字里通常带:free后缀,适合体验或跑一些小任务。我试过几个,生成速度不快,高峰时期还会限流,但是用来验证opencode的流程完全够了。
注意:免费模型源不稳定是常态,网上常有人讨论的某个免费模型服务经常传出“下线”传闻。临时体验可以,正式项目要么用官方API,要么用聚合平台的付费模型,别把生产流程绑在免费源上。
3.3 Ollama 本地模型,断网也能跑
本地模型方案我推荐Ollama,因为它安装简单、模型管理方便。装完Ollama后拉取一个编码模型:
ollama pull qwen2.5-coder:14b然后在opencode的配置文件里,provider指定为ollama,模型名填qwen2.5-coder:14b。这样opencode就会走本地模型。体验上,14B级别的模型在复杂任务上跟Claude这类大模型差距明显,但胜在免费、隐私、无需联网。我的习惯是:简单重构、代码解释、单元测试生成用本地模型,复杂架构设计和高难度bug定位用云端强模型。
3.4 多套 Key 交给 ccswitch 管理
这里要提一下热词里经常出现的ccswitch。它本身不是opencode的组件,而是一个用于管理和切换不同模型供应商配置的小工具。
我一般同时备着几套API配置:公司项目的Anthropic key、个人项目的OpenRouter key、本地Ollama。如果每次手动改环境变量,很容易搞混。ccswitch这类工具可以把这些配置命名好,需要时一键切换。使用思路类似:
ccswitch set work-anthropic opencode先切配置,再启动opencode。这个流程看起来蠢但实际很稳,推荐写到终端别名里,比如oc-work、oc-personal,一键起对应环境。
提醒:无论用不用ccswitch,都不要把真实API key写进opencode的配置文件,或者至少用环境变量引用,避免误提交到Git仓库。
4. 进阶玩法:配置文件、Skills、Memory 和 MCP
4.1 opencode.json 是核心配置,先把字段摸清
opencode的配置集中在opencode.json里,可以是全局配置,也可以是项目级配置。项目级配置放在项目根目录,优先于全局配置。我个人的习惯是:全局只放通用内容,项目级放该项目的专属设置。
一个比较完整的示例:
{ "$schema": "https://opencode.ai/config.json", "provider": { "anthropic": { "models": { "claude-sonnet-4-20250514": {} } }, "openrouter": { "models": { "openrouter/anthropic/claude-sonnet-4": {} } }, "ollama": { "models": { "qwen2.5-coder:14b": {} } } }, "model": "claude-sonnet-4-20250514", "instructions": "遵循项目README中的代码风格,不要随意改动公共接口", "mcp": { "playwright": { "type": "local", "command": ["npx", "@playwright/mcp@latest"], "enabled": true } } }字段不复杂,核心就是三块:
provider:定义每个供应商的模型列表;model:指定默认模型;instructions:系统级指令,所有会话都生效,相当于给AI立规矩;mcp:挂载外部工具服务。
instructions字段我强烈推荐用起来。我遇到过很多次“AI改着改着就跑偏”的情况,后来把项目的关键约定写进instructions,比如“禁止手动修改生成的迁移文件”“组件库风格保持一致”,整体守规矩很多。
4.2 Skills 技能:让 Agent 按你的规范干活
如果说instructions是“口头叮嘱”,Skills就是“给AI一本工作手册”。Skill本质上是一个包含SKILL.md的目录,里面描述某个场景下的操作方法、步骤、注意事项,AI在遇到对应场景时会自动读取并照做。
opencode的全局skills目录一般在~/.config/opencode/skills/,项目级skills放在.opencode/skills/。我举个例子,创建一个“提交信息规范”的skill:
.opencode/skills/commit-message/SKILL.mdSKILL.md里写清楚技能适用范围和规则:
--- name: commit-message description: 当需要生成或修改git commit message时使用 --- - 格式统一为:type(scope): subject - type 取值为 feat/fix/refactor/docs/test/chore - 正文按动词开头,不超过72字符 - 每次提交只包含一个逻辑变更这样做的好处很直接:团队规范从“口头传达”变成“可执行的技能包”。新成员clone项目后,opencode自动就有了对应的行为约束。
网上也有现成的skills库可以下载安装,比如之前踩过的第三方增强包 superpowers,它收集了一批工程化skill,覆盖代码审查、重构、测试等场景。安装方式一般就是clone到skills目录,再用opencode里的/skills命令确认是否加载成功。社区版的skill质量参差不齐,建议先人工读一遍SKILL.md再决定要不要用。
4.3 Memory 记忆:告别每次从头叮嘱
AI Agent最大的痛点之一是新会话没有记忆。每次开opencode,它都不知道你昨天让它干嘛了,也不知道你在项目里默认“不要用any类型”。opencode的Memory机制就是为了解决这个问题。
日常使用里,你可以在TUI里通过/memory相关命令查看和编辑记忆。全局记忆会沉淀你的个人偏好,项目级记忆则记录该项目特有的约定和背景。我自己习惯在项目启动时用一句话交代重点,比如“这个项目用了pnpm workspace,公共类型在packages/types目录”,然后让AI把这些信息写入记忆。下次会话它会自动读取。
项目级记忆文件一般放在.opencode/目录下,可以直接手动编辑。我强烈建议把这类文件纳入版本管理,这样整个团队都能共享“AI对项目的理解”,比维护几十页wiki实在。
4.4 Agents 与 MCP:把工具链交给 Agent
opencode的Agent模式可以理解为“不同人设的专业助手”。日常默认的build agent适合改代码,你可以按需切换其他agent类型,比如更偏向做严格审查的reviewer风格。这个设计解决了一个问题:不要让同一个prompt既负责冲刺写码,又负责挑刺审查,分角色效率更高。
MCP(Model Context Protocol)是另一个关键能力。它允许opencode接入外部工具服务,相当于给AI“长出手脚”。我目前最常用的两个MCP Server:
- Playwright MCP:让AI自己打开浏览器、点击页面、截图、看console报错,做前端回归验证;
- GitHub MCP:让AI直接查issue、提PR、看分支状态,辅助做项目维护。
MCP配置写在opencode.json的mcp字段里。启动opencode后,通过/mcp命令可以查看当前挂载的MCP服务状态。
注意:MCP很强大,但也要控制权限范围。我见过有人把生产数据库的MCP直接挂给Agent,稍不留神就是事故。本地开发或测试环境随便玩,生产操作务必做好review和审批。
4.5 在 VSCode / JetBrains 插件里协同使用
终端TUI是opencode的完全体,但很多程序员还是更习惯在IDE里看代码。opencode官方和一些社区维护者提供了VSCode和JetBrains插件。
在VSCode里,安装OpenCode相关扩展后,可以选中代码片段直接发送给opencode,AI的改动结果会以diff形式呈现,方便逐行审查。JetBrains的插件体验类似,IntelliJ IDEA、WebStorm、GoLand全家桶基本都支持。
我自己的使用习惯是:日常小改动直接在IDE插件里让AI改,涉及跨文件重构或整功能开发就切到终端TUI里用Agent模式跑。插件适合“局部AI辅助”,TUI适合“整体AI代理”,两者互补而不是替代。
5. 实战记录:接手陌生项目并修一个前端 bug
5.1 冷启动:先建认知再动手
拿到一个从没见过的项目,别急着让opencode去改代码。我习惯先花5分钟让它“认识项目”。在项目根目录启动opencode,直接发指令:
请阅读项目README、package.json、目录结构,整理一份项目概览:技术栈、启动命令、目录职责、常用脚本。不要修改任何文件。
这一步看似浪费token,其实非常关键。Agent如果在不清楚项目结构的情况下乱改,往往会“过拟合”代码片段,改完能过测试,却破坏了整体设计。让AI先输出对项目的理解,你还能顺便检查它有没有理解偏。
5.2 定位 bug 的过程
用我自己碰到过的一个前端场景举例:某个表单页,点击提交后按钮loading状态不消失,但接口实际上已经返回了。
我让opencode先复现问题,然后定位原因。它做的动作大概是这样的:
- 读取相关组件代码,搜索loading状态管理;
- 检查表单提交函数,发现
setLoading(false)只在接口成功回调里执行; - 查看catch分支,发现异常时只打印了error,没有重置loading;
- 给出修复建议:在finally里统一重置loading状态。
我确认方案后,它直接改了代码并在终端里展示diff。整个过程,我不需要自己打开文件一行行找,只需要审阅它找到的问题是否成立。
这里要说个实操原则:一次只让Agent改一小块,改完立刻review。别让它一口气重构五个文件,出了问题你会后悔的。
5.3 结合 Playwright 做前端回归验证
修复bug只是第一步,关键是验证。我现在的流程是让opencode结合Playwright自动跑回归。
opencode接入Playwright有两条路:
路线一:让Agent控制Playwright MCP在opencode.json里配好Playwright MCP后,直接对它说:
用Playwright打开表单页,填写测试数据,点击提交,等待接口返回,检查loading状态是否消失。出现任何异常就截图并查看console报错。
Agent会自己启动浏览器、操作页面、收集信息。这个方式最适合“复现bug”。
路线二:让Agent写并执行Playwright测试脚本适合把它当测试代码生成器。比如:
写一个Playwright测试用例,覆盖表单提交成功的场景,断言按钮从loading恢复为可点击状态。然后运行一次,告诉我结果。
它会创建测试文件,执行npx playwright test,把结果回报给你。好处是测试脚本能沉淀到项目里,形成长期回归资产。
我个人的体会是:前端bug用Playwright辅助验证比纯靠AI“看代码猜问题”靠谱得多。很多交互类bug不在运行时根本发现不了,这一步省不了。
5.4 把“AI干活”变成团队协作流程
用得多了以后,我逐渐形成一套稳定的协作流程:
- 新任务先从opencode这里产出方案草稿;
- 人工确认方向后,让它拆解成若干小步骤逐个执行;
- 每个步骤完成后,用Git diff和测试结果double check;
- 最终提交前,让Agent按项目的commit规范生成提交信息,再人工复核。
这套流程在接手的第一个陌生项目上就发挥了很大价值。很多历史代码技术债,靠人肉翻太耗时,AI能快速梳理调用链和业务入口,帮你省下大量熟悉项目的时间。前提是你的review关卡要设计好,AI给代码、你给判断,效果远好过盲目放手。
6. 高频问题速查与踩坑记录
6.1 安装和运行类问题
| 问题 | 原因 | 处理方式 |
|---|---|---|
| 无法将opencode识别为cmdlet/命令not found | npm全局目录不在PATH | 配置PATH,见2.3 |
| 安装时报EACCES权限错误 | npm全局目录权限问题 | 不要直接sudo,建议用nvm管理Node版本 |
| 启动后界面残缺、中文乱码 | 终端字体/编码问题 | 换Nerd Font,终端编码切UTF-8 |
| 版本太旧,功能缺失 | 没及时升级 | npm全局更新为npm update -g opencode-ai |
6.2 模型调用和服务器类问题
| 问题 | 原因 | 处理方式 |
|---|---|---|
error: unexpected server error. check server logs | 服务端异常或API key失效 | 先检查key有没有过期,再看网络状态,最后看opencode的日志文件 |
| 429 rate limit | 请求超限或免费模型限流 | 降低请求频率,或切换到付费模型 |
| 模型不存在 model not found | 模型名写错或provider不支持 | 用/models查看当前可用的准确模型名 |
| 上下文超长、报错or被截断 | 会话内容太多 | 新开会话,把关键背景浓缩后重新说明 |
特别说下unexpected server error这个报错。它在Windows上出现的频率比较高,很多是API key配置不对导致的,server端无法响应,opencode就会把原始错误抛出来。遇到时先用排除法:直接拿key在浏览器或curl里手动请求一次接口,看是不是key本身的问题。如果key没问题,就去检查服务商那边是否在升级维护。
6.3 使用习惯和管理类问题
| 问题 | 原因 | 处理方式 |
|---|---|---|
| Agent乱改公共代码 | 没在instructions里约束范围 | 在instructions里写明禁止改动范围 |
| 会话记忆丢失 | 没启用或没沉淀Memory | 用/memory查看记忆,关键约定主动写入 |
| 项目多了配置混乱 | 配置文件不分项目 | 项目级opencode.json各放各的,全局只留通用项 |
| 隐私担忧 | 代码发送到第三方API | 敏感项目用Ollama本地模型 |
| 忘记当前用的是哪个模型 | 多模型切换后迷糊 | TUI里看状态栏或用/models查看当前选择 |
这里提醒一个很多人忽略的点:opencode在项目里会产生.opencode/目录,里面有memory、skills等文件。如果团队没有约定,建议在README里说明这个目录的用途,避免新同事误以为这是冗余文件直接删掉。
7. 最后分享几个被忽略但很实用的细节
先说说opencode run这个非交互模式。不是所有场景都需要打开TUI,有时我只是想让AI跑个一次性任务,比如“检查这三个文件的类型错误并修复”,完全可以用opencode run "具体指令"在脚本里执行。我甚至见过有人把它接进CI流程里做自动化代码审查,虽然这个玩法还不成熟,但思路是对的:opencode不只是交互工具,也能当自动化Agent来调度。
另一个我踩过几次坑后总结的经验是:预算和token消耗要真看。在某次大批量重构中,我让Agent同时处理几十个文件,表面看效率很高,月底账单出来才发现Token消耗不低。现在我都会拆分任务,小步提交,每阶段明确目标,既省token又不容易翻车。
指令层面的小技巧也值得提一下:与其每次打一大段prompt,不如把团队规范和常用命令沉淀到项目级instructions和skills里。第一次配置可能多花半小时,但之后每次会话都省时省力,这笔账怎么算都划算。
关于opencode 2.0之后的版本演进,我的感受是它在从“一个终端工具”慢慢变成“一套Agent工作流基础设施”,比如更完善的agents机制、更丰富的MCP生态、以及对不同IDE的支持。对一个开源项目来说,这种进化速度已经相当可观。
如果你正准备从IDE聊天框切换到真正的Agent工作流,我的建议很直接:先拿一个非核心的小项目练手,安装、配模型、建一个最简单的skill,让opencode帮你修一个无关紧要的bug。整个过程跑通了,你自然会知道该把它放在工作流的哪个位置。我自己的体会是,工具这东西,好不好用只有亲手折腾过才知道,opencode值得你为它花掉一个下午。