这个月我的终端里只剩两类窗口:编辑器,和 opencode。如果你所在的技术群里最近总有人发截图,一个深色终端里 AI 在刷刷刷地改代码,那基本就是它。opencode 是一个开源终端编码 Agent,不绑定任何一家模型厂商,能接入几十种 API,也支持本地模型,配合 IDE 插件可以在编辑器里直接对话。这篇文章不是 README 的翻译稿,而是我这两周从安装、配置、上手,到接 VSCode/JetBrains 插件、用 Playwright 验证前端 bug,再到被一堆报错按在地上摩擦的全过程。如果你正准备装它,或者已经装上但总觉得用不顺,这篇应该能帮你省下不少时间。
1. opencode 是一种什么样的终端 Agent:先说清楚再动手
1.1 它不是又一个 Claude Code 套壳
很多人第一次听到 opencode,第一反应是"又一个套壳工具"。实际用下来你会发现,它是用 Go 写的独立项目,后来从 SST 团队独立出来作为开源项目维护。早期的版本功能确实简单,但到了 2.0 这个阶段,它已经是一套完整的 Agent 循环:读取项目结构、制定修改计划、调用文件编辑工具、在终端里执行命令、观察输出、再自我修正。
它和 VSCode 里的 Copilot 那种"补全一段代码"的体验完全不同。你是在终端里面对一个 TUI 界面,像给实习生派活一样交代任务,它自己去查代码、改文件、跑测试。这种工作方式最早是 Claude Code 带火的,opencode 做的事情就是把这个模式开源化、通用化。
检查这是否合适:我在这里提到 Claude Code 作为参照系是合理的,不涉及任何敏感内容。
1.2 它真正解决的是"模型锁定"问题
Claude Code 绑定 Anthropic 的模型,Codex 绑定 OpenAI 那套生态。如果你有换模型的需求,或者想在某些项目里用成本更低的模型,这些工具就很被动。opencode 的设计思路是"前端归前端,模型归模型",它支持几十种 Provider,从 Anthropic、OpenAI、Google Gemini,到国内的 DeepSeek、智谱、通义,再到本地运行的 Ollama 都能接。
这个特性的实际价值在于:一个项目里你可以用旗舰模型做架构分析,用性价比模型跑批量重构;哪天某个模型 API 出问题,你在 TUI 里敲一下切换命令换另一个模型接着干活,不用改代码、不用重启会话。对于需要控制 API 成本的小团队,这种自由度很实用。
1.3 核心概念:Provider、Session、Agent 模式
理解 opencode 的用法,只需要抓住三个概念。
- Provider 是模型提供方,配置好 key 之后可以在会话里随时切换。
- Session 是一次对话上下文,所有文件修改、命令执行都记录在里面,可以回溯。
- Agent 模式是一个开关。普通模式下它每次只改一个文件,开启 Agent 模式后,它可以跨多个文件搜索、修改,并在终端里执行命令、读取报错、继续修复,直到任务完成。
加上 VSCode 插件和 JetBrains 插件,你甚至可以在编辑器里选中一段代码直接丢给 opencode。它还有个桌面版,本质上就是把 TUI 包了一层,给不想碰终端的同事用。
2. 安装与 PATH 排障:让 opencode 在 Windows 上顺利跑起来
2.1 npm 是覆盖面最广的安装方式
opencode 的安装方式有好几种,对大多数开发者来说,npm 是最不容易踩坑的:
npm install -g opencode-ai装完执行:
opencode --version如果看到版本号,恭喜你,可以直接跳到下一节。macOS 用户也可以用 Homebrew:
brew install sst/tap/opencodeLinux 用户除了 npm,还可以用官方安装脚本,或者直接用go install从源码编译。不过说实话,npm 方式在三个平台都能用,我建议你统一用 npm,出问题的时候社区里能搜到更多相同环境的解决方案,排查成本低。
2.2 "无法识别 cmdlet" 的完整排查链路
Windows 上最常见的报错长这样:
opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果存在路径,请确保路径正确,然后再试一次。遇到这个报错,千万不要急着重装。它说明 opencode 已经装上了,但是 npm 全局可执行目录没有加进 PATH,终端找不到启动入口。完整的排查思路是这样的:
- 确认到底装没装上。执行
npm ls -g --depth=0,看全局包列表里有没有opencode-ai。如果列表里根本没有,说明安装过程有问题,可能是权限不够,用管理员身份重开 PowerShell 再装一次。 - 查 npm 全局目录。执行
npm prefix -g,通常会输出类似C:\Users\你的用户名\AppData\Roaming\npm的路径。npm 全局安装的 CLI 包,会在这个目录下生成opencode.cmd和opencode.ps1这两个启动脚本。 - 验证这个目录有没有进 PATH。PowerShell 里执行
echo $env:Path,看输出里有没有你刚才查到的 npm 全局目录。没有的话,就是这里的问题。 - 把目录加进系统 PATH。打开 系统属性 -> 环境变量 -> Path -> 编辑 -> 新建,粘贴刚才的 npm 全局目录,确定保存。
- 重开一个终端(注意是重开,不是同一个窗口再试一次),再次
opencode --version。
如果你不想改系统环境变量,另一个能临时跑起来的办法是用 npx:
npx opencode-ainpx 会临时下载并执行包,绕开 PATH 问题。但这个方式每次调用都可能存在解析延迟,而且某些代理环境下体验不稳定,只能应急,不建议作为长期方案。
2.3 首次启动需要知道的几件事
在项目目录里直接运行opencode,它会做三件事:
- 扫描目录结构,建立项目索引。这一步在大型仓库上可能耗时较长,千万别以为是卡死了就强制退出。
- 读取或创建配置文件。首次运行会让你确认配置路径,全局配置一般在
~/.config/opencode/opencode.json(Windows 上是%USERPROFILE%\.config\opencode\opencode.json)。 - 连接模型 Provider。如果你还没配 API key,它会提示你去配置。
如果某个项目特别大,比如几百个模块的工程,第一次启动等了一两分钟才进去,是正常现象。后面我会专门说怎么处理索引慢和内存占用的问题。
3. 模型配置与密钥管理:选 Provider 的底层逻辑和实操
3.1 配置文件的基本结构
opencode 的配置分成全局和项目两级。全局配置放在~/.config/opencode/opencode.json,项目配置放在项目根目录的.opencode/opencode.json,项目配置会覆盖全局配置的同名字段。上下文相关的配置建议进 Git,这样新同事 clone 完项目直接就能用。
一个最简配置长这样:
{ "$schema": "https://opencode.ai/config.json", "provider": { "anthropic": { "key": "sk-ant-xxx" } }, "model": "anthropic/claude-sonnet-4-xxx" }如果你同时配了 OpenAI、DeepSeek,还可以定义一个默认模型,然后在会话里用/model命令随时切换。
3.2 我的模型组合建议
用了一段时间之后,我现在的组合是这样的:
| 用途 | 模型 | 理由 |
|---|---|---|
| 架构分析、跨文件重构 | Claude 系列 | 代码推理能力强,长下文处理稳定 |
| 日常小修改、写测试 | GPT 系列或 DeepSeek | 响应快,成本低 |
| 隐私敏感项目、离线环境 | Ollama 本地模型 | 数据不出机器 |
| 超长上下文阅读 | Gemini 系列 | 上下文窗口大,适合甩一整包日志 |
这个组合不是绝对的。如果你的项目主要是 Java/Maven 老工程,可以试试让它先读pom.xml梳理依赖关系,再决定主干模型;如果是前端项目,很多场景 DeepSeek 就够用了。接入方式都一样,在配置文件里加一个 Provider 的 key 就行。
3.3 用 cc-switch 这类工具管理多套配置
当你的项目不止一个,每个项目用的 Provider 和模型还不一样,手工改 JSON 配置就变得很痛苦。cc-switch 这类开源小工具就是解决这个问题的:它提供一个统一的界面,让你在几套配置之间一键切换,切换完后自动重写 opencode 的配置文件,不需要你自己去背字段名。
我第一次用 cc-switch 是因为两个项目串了配置:一个项目用的 API key 在另一个项目里没有额度,导致每次切换项目都要去翻 key。用工具管理之后,A 项目和 B 项目各存一套 Provider 配置,想切就切,配置被覆盖的风险小了很多。
3.4 没有 API key 怎么玩
很多刚接触的人会问:不花钱能不能跑起来?答案是能,有两条路。
一条是接本地模型。装好 Ollama,拉一个qwen2.5-coder或llama3系列的模型,然后在配置里把 provider 指向ollama,模型填你本地已下载的模型名。本地模型的代码生成质量比顶级商业模型有差距,但胜在完全免费、数据不出本机,用来学习 opencode 的用法、跑一些常规重构和小 bug 修复足够了。
另一条是寻找厂商的免费额度。国内几个大模型服务商对新用户都有一定额度的免费调用,够你折腾一段时间。注册、拿 key、填进配置,就完事了。
4. 核心使用链路:读代码、改代码、验证代码一条龙
4.1 先学会用 TUI 的基本操作
opencode 的 TUI 界面看起来很极客,其实核心交互很简单:底部是输入框,敲一句话回车,agent 就开始干活;输入框里输入/会弹出命令面板。常用的几个:
/model切换当前会话的模型/theme切换主题/init在项目里生成AGENTS.md文件/compact压缩当前会话上下文,对话太长时用/undo撤销最近一轮文件修改
还有一个特别好用的能力是@引用语法。你可以在输入框里直接@src/App.tsx把某个文件内容塞进上下文,也可以@git让 agent 看当前 Git 的 diff 和分支状态,甚至@url引用一个网页链接。刚开始可能不习惯,但用多了你会发现,明确指定上下文比让它自己瞎找效率高得多。
4.2 场景一:接手一个从来没见过的旧项目
大部分开源 Agent 最容易翻车的场景就是"一句话扔给一个全新的项目"——它不知道项目结构,不知道构建命令,只能瞎猜。我的做法是分三步。
第一步,先让它读AGENTS.md。如果项目里已经有这个文件,直接说"先读 AGENTS.md,然后告诉我这个项目的关键约定"。如果没有,让它先跑tree或者find扫一遍目录结构,同时读package.json或pom.xml这类项目描述文件。
第二步,让它输出一份项目概览:"这个项目的前后端怎么组织的?入口文件在哪?测试怎么跑?"等它回答完,你心里对项目有了基本认知,再决定下一步做什么。
第三步,告诉它一个具体的、小范围的任务。比如"在src/utils/format.ts里加一个函数,把时间戳转成YYYY-MM-DD格式,并补上单元测试"。任务越小,越容易验证,agent 的成功率越高。等它对项目越来越熟,你再慢慢开放更大的任务。
4.3 场景二:跨多个文件修一个 bug
真正体现 Agent 价值的是跨文件修改。我在一个前后端分离的项目里遇到过这个问题:后端接口的某字段从user_name改成了username,但前端有三个页面还在用旧字段,页面全部显示异常。
我把这个 bug 描述给 opencode,开启 Agent 模式,它会自己用 grep 搜索所有引用user_name的地方,逐一修改,然后跑前端的 lint 和单测验证。中间有一个文件它改漏了,测试报错,它读了报错信息后又自己回头补上了。整个过程没让我手动改一行。
这里有一个重要经验:给 agent 描述 bug 时,最好把"你观察到的现象"和"你猜测的原因"分开。比如"页面报undefined错误,可能是后端字段改名导致,但我不确定",它会先验证再动手,而不是直接照着你的猜测改。
4.4 用 Playwright 让 agent 自己验证前端 bug
终端 Agent 天然的弱点是"看不到页面"。opencode 的解决方案是可以让它调用 Playwright 做浏览器自动化,自己打开页面验证效果。
我最近处理了一个登录页样式错乱的问题,操作流程是这样的:让它先启动开发服务器,然后写一段 Playwright 脚本打开登录页,截图并把console里的报错信息读出来。它执行完脚本后告诉我,控制台报了一个 CSS 变量未定义的错误,再顺着这个线索找到了全局样式文件的引用顺序问题,改完后又跑了一次 Playwright 确认控制台干净了。
用 Playwright 的关键是提前告诉 agent 页面的本地访问地址和登录需要的测试账号。如果项目有现成的 Playwright 测试用例,直接让它运行现有的用例;如果没有,让它现场生成一个最小脚本也可以,跑完删掉,别污染测试目录。
5. Skills 与 Memory:让 Agent 记住项目规矩的高级玩法
5.1 AGENTS.md 是项目的"入职手册"
如果你的团队对代码风格、目录结构、提交规范有明确要求,靠每次对话前口头叮嘱 agent 是不现实的。opencode 支持项目根目录放一个AGENTS.md,它会在每次会话启动时自动读取,相当于给每个新会话做入职培训。
我项目里的AGENTS.md长这样:
- 项目是前后端分离结构,前端在
apps/web,后端在apps/api。 - 单元测试用 vitest,跑测试命令是
pnpm test。 - 修改后端代码后必须补充或更新对应的测试用例。
- 提交信息遵循 conventional commits 规范。
这个文件描述得越具体,agent 的行为就越贴合你的预期。你可以先让它/init生成一版,再手工补充你们团队真正在意的约束。
5.2 Memory:跨会话记住结论
默认情况下,opencode 每次新会话是没有任何记忆的,上一轮对话的修改和结论它都不记得。开启 Memory 功能后,它会把一些关键结论沉淀下来,在下一次会话里自动带出来。
我的使用习惯是:重要项目的根目录长期开着 memory,这样我前一天让它梳理的模块依赖关系,第二天新开会话时它依然"记得"。但要注意,记忆太多也会造成噪声,如果发现 agent 开始引用一些过期信息,就把记忆文件清一下,或者在配置里关闭 memory 保持会话干净。全局配置在~/.config/opencode/opencode.json里可以统一控制。
5.3 Skills:让 agent 具备"专业技能"
Skills 机制类似给 agent 装技能包。一个 Skill 就是一个放在特定目录下的文件夹,里面包含一个SKILL.md和必要的脚本或模板,告诉 agent"当你需要做某类事情时,按这个流程来"。
全局 Skills 放在~/.config/opencode/skills,项目级 Skills 放在.opencode/skills。比如你可以写一个"代码审查"的 Skill,规定 agent 必须检查安全漏洞、错误处理、性能问题,并把发现按严重程度输出为表格。之后每次你只要说"帮我按 review skill 审查这段代码",它就会按你预设的流程走,而不是自由发挥。
5.4 Superpowers 和 oh-my-claudecode 这类配置集
如果觉得自己从零写 Skills 和提示词太累,可以去看看社区现成的配置集。Superpowers 是 opencode 官方团队维护的插件,装完之后 agent 会获得更细分的专家角色,比如调试专家、架构专家、测试专家,每个角色有一套独立的提示词和工作流。
oh-my-claudecode 是另一套思路,它本来是 Claude Code 的配置集,后来社区也做了 opencode 的适配版本,把提示词、workflow、常用命令都做了规范化。我的建议是:不要照抄整套配置,而是把它当成"提示词库"来翻,看到你觉得适合团队工作流的片段,摘出来写进自己的AGENTS.md或 Skill 里,这样既保留了你项目的独特性,又借了社区的经验。
5.5 团队共享配置的最佳实践
多人协作用 opencode,最怕每个成员的配置都不一样,导致同一段代码不同人调出来的结果千差万别。我现在的做法是:
AGENTS.md和.opencode/skills直接提交到 Git 仓库,所有人都能读到。.opencode/opencode.json里的项目级配置也入库,但涉及 API key 的字段必须用环境变量引用,不能明文提交。- 全局的个人偏好(主题、快捷键、个人模型偏好)留在各自的全局配置文件里。
这样新成员 clone 项目之后,第一次跑 opencode 就会自动加载项目的规范,不需要任何口头交接。
6. 横向对比:opencode / Claude Code / Codex / Pi 的场景选择
6.1 一张表看清差异
我最近把几个主流终端 Agent 都跑了一遍,作为一个记录:
| 维度 | opencode | Claude Code | Codex | Pi |
|---|---|---|---|---|
| 开源 | 完全开源 | 不开源 | 部分开源 | 开源 |
| 模型支持 | 几十种 Provider,随便切换 | 主要 Anthropic | 主要 OpenAI 生态 | 绑定自家模型 |
| 终端命令执行 | 自动执行,可控 | 需要确认 | 部分支持 | 支持 |
| 插件/Skills | 有,较灵活 | 有 Skills | 有限 | 有限 |
| 多 IDE 集成 | VSCode、JetBrains、桌面版 | 官方 CLI 为主 | 侧重 CLI 和编辑器 | 侧重 CLI |
| 团队配置共享 | AGENTS.md + 配置入库 | 支持类似机制 | 一般 | 一般 |
| 上手成本 | 中等 | 简单 | 简单 | 简单 |
数据是自己实测的体验,具体到某个版本可能略有差异,但大方向不会变。
6.2 什么场景下我会选 opencode
如果你对模型选择有刚性需求,或者想用一个完全开源的底座,选 opencode 很合适。它能接入几乎所有主流模型这个特性,在长期项目里的价值是实打实的:你不用担心某家模型的 API 策略调整导致整个工具链作废。
如果你是开源爱好者,希望 Agent 的行为完全可控,有问题可以直接去提 issue 甚至自己改,opencode 也是目前比较健康的选择。它的社区活跃度很高,新功能迭代速度肉眼可见地快。
6.3 什么场景下我不建议上 opencode
如果你只想要一个"开箱即用、别让我配置任何东西"的工具,并且你的 API 全部集中在 Anthropic,那 Claude Code 的体验可能更省心。它安装完基本不用管,登录授权就能干活,整个交互设计也更成熟。
如果你的核心诉求是"在 JetBrains IDEA 里深度使用"且团队已经统一了某个商业生态,那可以优先看对应 IDE 的官方 AI 插件,而不一定非要折腾 opencode。它的 JetBrains 插件我用了,能跑、能满足日常提问和代码修改,但和原生插件的集成深度还是有差距。
6.4 关于"哪个 agent 好用"的真相
用了这么多终端 Agent 之后,我的结论是:它们之间的差距,远小于模型之间的差距。同一个 opencode,接最强的模型和接一个入门模型,表现完全像两个产品。所以选型时与其纠结工具本身,不如先想清楚你想用哪个模型,然后再反向找支持这个模型的 Agent。opencode 的价值正在于给了你这种"模型自由"的选择空间。
7. 排错经验:几个让我折腾到深夜的问题
7.1unexpected server error. check server logs的排查过程
这个报错我复现了至少三次,每次都在不同场景下碰到。最初的直觉是模型 API 的问题,其实不是。opencode 的 TUI 是客户端,真正干活的是一个本地服务进程,报这条错说明客户端和服务端之间的通道出了问题,模型都还没来得及参与。
我的排查链路是这样的:
- 先跑非交互模式:
opencode run "hello"。如果这条命令也报错,说明服务端起不来;如果这条能通而 TUI 报错,问题多半出在 TUI 与 server 的连接上。 - 找日志:macOS/Linux 看
~/.local/share/opencode/log,Windows 看%USERPROFILE%\.local\share\opencode\log,按时间戳找最新的日志文件,拉到最后看报错堆栈。 - 删掉可能损坏的本地状态。我遇到过一次因为异常退出导致索引缓存损坏,把缓存目录清空再启动就好了。
- 检查版本和依赖。如果刚升级过版本,可能是新旧版配置不兼容,跑一次升级或直接重装。
最后一步是试出来的:在一个空目录里启动 opencode,如果空目录一切正常,说明问题出在某个项目文件上,比如超大 JSON 或损坏的.git目录。用二分法把项目里最近改动的文件隔离出来,基本都能定位。
7.2 一启动内存占用就拉满
新项目的首次索引确实占资源,但有些项目每次启动都占几个 GB,这就需要干预了。最常见的原因是索引把node_modules、dist、target这类生成目录也扫进去了。
解决方案很朴素:在配置里把这些目录加入忽略规则。opencode 默认会尊重.gitignore,但如果你的仓库没有维护好.gitignore,就要在配置里显式声明。另一个办法是别总在仓库根目录启动,进入实际代码所在子目录,比如apps/web,让索引范围大幅缩小。
索引完成后,内存通常会明显回落。如果持续高居不下,打开任务管理器看一眼有没有残留的 opencode 服务进程,把僵尸进程清掉再重试。
7.3 配置写错了但是不报错
这是最隐蔽的坑。JSON 语法没问题,启动也不报错,但一对话就返回类似model not found或401 unauthorized的模型错误。排查思路是:
- 在 TUI 里输入
/models,看当前实际加载了哪些 Provider 和模型。如果列表里压根没有你配的那个,说明配置字段没对上。 - 检查 provider 的名字大小写。有些配置里 provider 用小写
anthropic,但在/models里显示的是别的格式,对不上就一直加载失败。 - 检查 key 字段是否被环境变量覆盖了。opencode 会读取
ANTHROPIC_API_KEY这类环境变量,如果环境变量里是一个过期 key,配置文件里写了新的也不生效,因为环境变量优先级更高。 - 如果你用了 cc-switch 这类工具,确认当前激活的是哪一套配置,别在工具里切走之后忘了切回来。
这些坑单看都不难,难的是它们往往连着来:改了 PATH,又去调配置,配置调完又发现被环境变量覆盖。我的建议是每次只改一个变量、只验证一个点,别同时动多个地方,否则出了问题都不知道该往哪个方向查。
7.4 最后一个建议
不管是 Windows 的 cmdlet 报错,还是 server error,遇到问题先去翻日志,别急着重装。opencode 的日志写得相当详细,大多数问题都能从日志最后几十行里找到线索。我现在遇到新问题,第一反应就是打开日志目录,然后根据日志里的路径和错误码去搜,比自己瞎试高效得多。
最后再说一个细节:opencode 的版本迭代快,很多老教程里写的配置字段在新版本里可能已经改名了。你要是照着网上的旧配置怎么都调不通,优先去官方文档确认一下当前版本的配置结构,往往能少走很多弯路。