先说明一下。OpenCode 这个东西,最近在终端党里讨论度越来越高。它不是又一个 Copilot 式补全插件,而是一个跑在终端里的 AI 编码代理(coding agent),能自己读代码、搜文件、改东西、跑命令,甚至调用浏览器和语言服务器做测试。如果你已经受够了“AI 只帮你写个函数片段,剩下全靠人肉整合”的工作方式,想试试让 AI 真正进入你的开发循环,那这篇指南应该能帮你少踩很多坑。我会从安装、配置、常用玩法一直讲到报错排查,尽量把我实际用下来觉得最关键的点都摊开讲。
1. OpenCode 是什么:终端里的编码代理到底在做什么
1.1 它不补全代码,它替你跑完整个任务闭环
很多人第一次听到 OpenCode,会习惯性地把它归到“代码补全工具”那一类。其实不是。GitHub Copilot、Codium 这类工具解决的是“给当前光标位置补下一行”,而 OpenCode 解决的是“给你一个自然语言描述的需求,自己想办法完成”。
打个比方:补全工具像一个很懂你的输入法,你打几个字它帮你接下去;OpenCode 更像一个坐在你旁边、能用你的电脑干活的新人工程师。你跟它说“帮我查一下为什么登录接口在 Safari 里偶发 401”,它会自己去翻路由、找接口文件、看鉴权逻辑,然后定位到问题、改掉代码,再跑一遍相关测试给你看。这个“自己动手”的过程,就是 coding agent 和传统补全工具的差异所在。
实际使用中,OpenCode 的核心机制是:它拿到你的任务后,会自己规划步骤,然后循环调用一组工具(读文件、搜索、执行 bash 命令、编辑代码等)来完成任务。你可以看到它在做什么、用了什么命令、改了什么文件,也可以在任意一步喊停、纠正方向。这种透明可控的模式,比那种“黑盒生成一坨代码丢给你”的方案靠谱得多。
1.2 开源背景和项目定位
OpenCode 是一个开源项目,最早的代码来自 Charmbracelet(就是做 Bubble Tea、Glamour 这些终端 UI 库的团队)内部孵化,后来独立成 opencode-ai 组织在 GitHub 上维护。因为完全开源,社区参与度很高,迭代速度非常快,几乎每周都有新版本。
它有 CLI 命令行版,也有桌面版(Desktop App),并且提供了清晰的插件和配置机制。你可以在终端里直接敲opencode启动交互式会话,也可以用opencode run "..."在脚本里调用,还能通过配置文件管理不同的模型供应商。相比一些闭源的商业工具,OpenCode 最大的优势是透明——它的提示词、工具调用逻辑、配置规则你都能看到,出了问题知道去哪里查。
1.3 适合谁,不适合谁
适合的典型画像有三类:一是已经习惯用终端开发、不排斥命令行的后端/全栈工程师;二是需要同时对接多个大模型 API(Anthropic、OpenAI、本地 Ollama 等)的人,OpenCode 的多 provider 配置比在 IDE 插件里灵活得多;三是喜欢折腾、愿意自己写 Skills 和自定义工作流的进阶玩家。
不太适合的人也有三类:一点命令行都不想碰、只想在编辑器里点点点的纯 GUI 用户,OpenCode 的体感会显得太“硬核”;希望 AI 100% 不出错、对每个动作都要人工审批的人,会觉得它步子迈得太大;以及这也不允许那也不允许、网络和模型访问环境受限的生产环境用户,配置成本会比较高。
2. 安装与环境准备:三分钟跑通完整链路
2.1 安装方式:npm、脚本、还是直接下包
OpenCode 的安装对主流平台都算友好。最常见的三种方式,按推荐程度排序:
npm 全局安装
npm install -g opencode-ai装完之后执行opencode --version确认版本。这种方式的好处是以后想升级,一条npm update -g opencode-ai就行。注意包名是opencode-ai,不是opencode,早期很多人装错了包。
curl 安装脚本
curl -fsSL https://opencode.ai/install | bash走脚本安装适合不用 Node 环境、或者不想往系统里塞 npm 全局包的场景。脚本会在你的用户目录下放一个可执行文件,然后把路径加进 shell 配置。
直接下发行版
GitHub Releases 页面提供了各平台的预编译二进制,Windows、Linux、macOS 都有。桌面版也是从这里下载,桌面版本质上是把 CLI 包了一层图形界面,核心能力没区别。
我自己的习惯是 macOS 上用 brew 装:
brew install sst/tap/opencodebrew 的 tap 更新及时,卸载也干净。Windows 用户建议优先用scoop install opencode,比手动下 zip 舒服得多。
2.2 配置模型与认证:找到自己的 API Key 怎么填
装好之后第一件事,不是急着敲代码,而是先把模型认证配置好。OpenCode 支持非常多的模型供应商,Anthropic、OpenAI、Gemini、Ollama、OpenCode Go 等等。第一次运行opencode,会进入一个交互式会话,你可以直接输入/models打开模型选择面板。
在模型面板里,你既能看到当前 provider 的模型列表,也可以手动添加新 provider。对于海外主流大模型,认证方式两种:
- 用命令行登录:
opencode auth login,按提示选择供应商、填入 API Key,OpenCode 会把这个 key 保存到本机配置,以后不需要重复填。 - 用环境变量:OpenCode 会读取常见的
ANTHROPIC_API_KEY、OPENAI_API_KEY这些变量,如果你已经在 shell 里 export 过,它会自动识别。
很多人忽略的一点是:OpenCode 的配置是分层的——命令行参数、环境变量、配置文件、默认值,优先级从高到低。也就是说,即使你在配置文件里写了一个 key,如果 shell 里恰好有一个同名环境变量,实际生效的是环境变量。这个特性容易导致“我明明改了配置文件怎么没生效”的疑惑。
2.3 订阅服务与模型切换工具:OpenCode Go 和 CC Switch 是什么关系
这阵子热词里出现了不少“OpenCode Go 套餐”“CC Switch 配置 opencode”的搜索。用大白话说一下这块的生态:
OpenCode Go 是一个模型订阅服务,本质上是帮你聚合了多个大模型 API(Sonnet、GPT 等)的访问额度,你买一个订阅,就能在 OpenCode 里切换不同的模型,不用分别找各家注册、充值、管理多个 key。它对想低门槛体验多种模型、或者懒得给每个模型单独付费的人很友好。
CC Switch 则是一个模型切换管理工具。它不直接提供模型,而是把各家 API 地址和 Key 集中管理起来,你在一个面板里点一下,就能把 OpenCode、Claude Code 等工具的“当前生效模型供应商”切到另一家。配合 OpenCode 使用,相当于给 AI 编程工具装了一个远程控制台,今天想用 Sonnet 就切 Sonnet,明天想用 GPT 就切 GPT。
实操中,配置方式是在 OpenCode 的配置文件里添加一个自定义 provider,把 baseURL 指向 CC Switch(或 OpenCode Go)提供的 API 地址,填上订阅得到的 Key。以 JSON 配置文件为例:
{ "$schema": "https://opencode.ai/config.json", "provider": { "opencodego": { "npm": "@ai-sdk/openai-compatible", "name": "OpenCode Go", "options": { "baseURL": "https://opencode.ai/api", "apiKey": "你的订阅Key" }, "models": { "gpt-5": { "name": "GPT-5" }, "claude-sonnet-4": { "name": "Claude Sonnet 4" } } } } }这里有几个细节值得注意。npm字段指定了用哪个 SDK 包来兼容这个 provider,OpenAI-compatible 协议是适用范围最广的,因为大多数聚合服务都实现了 OpenAI 的 API 格式。baseURL一定要以https://开头,末尾不要带/v1,很多聚合服务文档里给的地址带/v1,而 OpenCode 内部会自动拼接,你填进去了反而会出现 404。模型 ID 也不是随便写的,必须在订阅方给出的模型列表里,写错了启动时看不出来,一跑就报 model not found。
套餐响应速度的问题,我实测下来受两个因素影响:一是上游模型服务商本身的状态,二是聚合服务做不做二次转发。同一家订阅,早上和晚上的响应波动都可能不一样。想长期订阅之前,建议先用短周期套餐压测一下你惯用的几个模型,看看高峰期能不能接受。
如果你不想花钱,也不是没法用。OpenCode 支持 Ollama 本地模型,装一个ollama,拉个 qwen2.5-coder 或者 llama 系列,然后把 provider 指到http://localhost:11434,就能获得完全免费、没有地域限制的本地模型体验。当然,本地模型的代码能力跟云端大模型还是有差距,适合追求隐私或网络环境受限的开发者。
3. 核心玩法:从“能跑”到“好用”
3.1 启动方式与常用命令:三种姿势各有用处
OpenCode 的日常使用,我用得最多的是三种启动姿势。
第一种:交互式会话
opencode直接进入一个类似 REPL 的对话界面。在这里可以连续多轮对话,OpenCode 会维护整个 session 的上下文,你上一轮让它改了 A 文件,下一轮说“再把 B 文件里对应的类型也更新一下”,它能理解指的是同一个任务。适合边看代码边改的探索式开发。
第二种:一次性指令
opencode run "给 src/utils/date.ts 补充单元测试,覆盖闰年和时区边界情况"这种模式适合明确的、不太需要来回沟通的任务。跑完命令,OpenCode 自己分析、改代码、跑测试,然后把结果打印出来。这个模式还能配合--print参数只输出最终改动摘要,省得看一堆过程日志。CI 场景里,甚至可以写进脚本做自动代码审查。
第三种:计划模式
opencode --plan启动后,模型会先输出一个访问计划,告诉你它打算看哪些文件、改哪些文件、怎么验证,等你确认了才动手。对于影响面大的重构,我强烈建议用 plan 模式。因为 coding agent 一旦改嗨了,可能波及你根本没想到的文件,有个人工确认的“闸门”非常必要。
常用的斜杠命令,我整理一个速查表:
| 命令 | 作用 |
|---|---|
/models | 打开模型选择器,切换当前会话使用的模型 |
/skills | 查看已加载的技能包(Skills) |
/share | 生成当前会话的分享链接/快照 |
/undo | 回退最近一次 AI 的代码修改 |
/cost | 查看当前会话的 token 消耗估算 |
/lsp | 打开语言服务器辅助功能 |
/config | 打开配置文件编辑入口 |
3.2 如何导入一段已有程序代码并让 AI 修改完善
这个问题是热词里的高发搜索,也是很多人对 OpenCode 最大的误解——以为要像喂给 ChatGPT 那样把代码复制粘贴进去。其实不用。OpenCode 是直接在项目目录里工作的,它自己能看到文件系统。
正确的打开方式:
cd your-project opencode进入会话后,你需要做的是“用好上下文引用”。比如项目里有一个user-service.ts和与之配套的user-service.test.ts,你想让 AI 重构其中一个接口并同步更新测试,可以这样输入:
重构 @src/services/user-service.ts,把 getUserProfile 拆成 getUserBasic 和 getUserSettings 两个方法, 同时更新 @src/services/user-service.test.ts 里所有相关测试。这里@符号是关键。当你在输入框输入@,OpenCode 会弹出文件选择器,支持按文件名模糊搜索。选中后,这个文件的完整内容就会被作为上下文注入到当前请求里。也可以直接@一个目录,比如@src/services,告诉 AI“这一块代码都是相关上下文”。
我自己的经验是:上下文提取得越精准,AI 的改动质量越高,副作用越少。别偷懒只给一个文件,也别贪心把整个仓库都塞给它。你要改的是一个接口,那接口定义、调用方、测试文件,这三类文件是最小上下文集合。如果你不确定它需要看哪些,可以先问一句“为了完成这个任务,你需要看哪些文件”,让 AI 自己列清单。
导入“外部代码”的场景也常遇到。比如别人发了一个在线代码片段、或者你在别的仓库里看到一段实现,想带到当前项目里用。可以先把代码存成一个临时文件放进项目目录,再用@引用;或者直接用/read之类的指令让 AI 从指定路径读取。最笨的方法是把代码直接贴在对话里,但这样会丢失原始文件的上下文,后续 AI 修改时很难精准定位,不推荐经常这么干。
3.3 用 Skills 打造专属工作流:OpenCode 最有想象力的部分
Skills 是 OpenCode 很值得花时间研究的功能。简单说,它是一套“预置指令+系统提示词+工作流模板”的机制,你给 AI 定义了一个“角色技能包”,之后在任何项目里都能一键调用。
Skill 的存放位置是项目里的.opencode/skills目录,或者用户全局配置目录。每个 skill 是一个子目录,核心文件是SKILL.md,里面用 Markdown 写了这个技能的目标、适用场景、执行步骤。
举个例子,我想让 AI 在每次改动完代码之后,自动帮我做一轮代码审查。我可以建一个code-reviewskill:
.opencode/skills/code-review/SKILL.md --- name: code-review description: 对当前改动做一轮代码审查,关注安全性、性能、可维护性 --- # Code Review Skill 当用户请求 code review 时,按以下步骤执行: 1. 用 git diff 获取当前分支的改动 2. 针对每个改动文件,检查潜在 bug、安全隐患、性能问题 3. 输出审查报告,包含风险等级(高/中/低)、问题描述、修改建议 4. 如果存在高风险问题,直接给出修复方案并询问是否应用存好之后,在 OpenCode 会话里输入/code-review,它就会加载这个 Skill 的提示词,按你的规则执行审查。
社区已经有不少现成的 Skill 可以借鉴,比如热词里提到的“前端设计开发一体的 skill”——它整合了从设计稿分析、组件拆分、样式实现到响应式适配的一整套前端开发流程,非常适合全栈项目里“AI 直接产出页面”的场景。还有“Playwright 测试 skill”,后面第 4 节我会专门讲。
4. 进阶场景实操:LSP、Playwright 与前端开发一体化
4.1 用 LSP 提升跨文件修改的精准度
LSP(Language Server Protocol)这个能力,是 OpenCode 区别于“能跑命令的普通 agent”的关键之一。有了 LSP,AI 不只是文本级地抓关键词,而是真正理解代码的符号、类型、引用关系。
在 OpenCode 中启用 LSP,需要先安装对应的 language server。以 TypeScript 为例:
npm install -g typescript-language-server typescript然后在会话里输入/lsp,就能列出当前项目可用的语言服务器。启动之后,AI 在修改代码时可以调用textDocument/definition、textDocument/references这类接口,去定位一个函数在哪里定义、被谁引用,而不是全靠正则匹配。
这对跨文件重构的帮助非常明显。比如你重命名一个函数,没有 LSP 时,AI 很可能在别的地方漏掉一处调用;有 LSP 时,它能拿到真实的引用列表,改动完整度大幅提升。不过 LSP 是耗内存大户,项目特别大的时候建议按需启动,别一直开着。
4.2 用 Playwright 做前端 Bug 的自动验证
前端 bug 之所以烦人,是因为很多问题不是逻辑错,而是“页面表现不对”——样式偏了、交互卡了、某个按钮点了没反应。这种问题,纯靠 AI 读代码很难发现。OpenCode 的解决办法是:让它直接操作浏览器验证。
通过 Playwright 工具,AI 可以打开页面、点击元素、输入文本、截图,然后根据截图和 DOM 状态判断问题在哪。热词里“opencode playwright 怎么测试前端 bug”就是这么来的。
实际用法,我先在项目里安装 Playwright:
npm install @playwright/test npx playwright install chromium然后在 OpenCode 对话里直接说:
启动开发服务器,用 Playwright 打开 http://localhost:5173 的登录页面, 尝试用错误的密码登录三次,观察是否有防爆破提示,并把页面截图给我看。OpenCode 会自己执行npm run dev启动服务,写一个临时的 Playwright 测试脚本,运行它,截图,把结果反馈给你。整个过程你不需要手工写一行测试代码。
我踩过的一个坑是:OpenCode 用 Playwright 时,默认是无头模式(headless),有些 bug 只在有头模式下能复现,比如依赖摄像头、特定渲染行为的场景。遇到“AI 说没问题但人眼一看就有问题”的情况,可以让它用 headed 模式重跑,并且多截图对比。
4.3 前端设计开发一体的 Skill:让 AI 从设计到页面一步到位
热词里“opencode 前端设计开发一体的 skill”这个搜索,反映了很多人想要的一种体验:不再零星地让 AI 写单个组件,而是把“设计规范 → 页面拆分 → 组件实现 → 样式验证 → 响应式适配”整个流程做成一个可复用的 Skill,一次触发,AI 自动走完全流程。
我自己搭了一个简化版,给大家一个参考结构:
.opencode/skills/frontend-builder/SKILL.md --- name: frontend-builder description: 从需求描述产出完整页面,包含组件拆分与响应式适配 --- # Frontend Builder Skill 1. 先分析需求,确认页面由哪些区块组成 2. 设计组件树,标注每个组件的 props 和 state 3. 按照项目现有样式规范(Tailwind/CSS Modules)实现组件 4. 为每个区块补充响应式断点(mobile/tablet/desktop) 5. 如果项目配置了测试框架,为关键交互补充测试 6. 最后输出改动文件清单,并列出需要人工确认的设计决策点用的时候,只需要说一句:
/前端开发 帮我做一个用户设置页,包含头像上传、昵称修改、通知偏好三个区块这个 Skill 的价值在于:它把 AI 的工作方式“框”在了一个稳定的流程里。没有 Skill 时,AI 可能只写了组件代码,忘了样式;可能只做了桌面端,没做移动端。有了明确步骤约束,产出稳定性会高很多。
5. 常见报错与排查实录:从报错信息定位根因
5.1 API Key 类报错:invalid api key
这个报错应该是最常见的了。看到invalid api key,优先按这个顺序排查:
第一,Key 本身是否正确。很多聚合服务的 Key 是sk-开头的长字符串,复制的时候很容易漏掉尾巴。建议先回服务商控制台重新复制一次,确认没有多余空格。
第二,Key 是否写到了正确的地方。检查环境变量和配置文件是否冲突。记住前面说的优先级:环境变量 > 配置文件 > 默认值。你可以跑一下命令:
opencode debugdebug模式会打印出当前生效的配置来源,一目了然。
第三,Key 是否绑定到了正确的 API 地址。有些 Key 只能访问特定的 baseURL,你填错了端点,也会被判定为 invalid。
5.2 模型不可用:this model is not available in your country
这个报错的热度很高,而且会让人有点慌。先明确一下本质:这通常是模型服务商根据你的出口 IP 归属地做地区策略限制,也可能是你用的订阅服务本身对某些模型做了区域锁定。
遇到之后,我的处理顺序是:先确认到底卡在哪一层。如果是本地模型(Ollama)报这个,基本不可能,因为它不走外部 API。如果走的是官方 API,那就检查网络出口的归属地是否支持该模型。如果走的是订阅聚合服务,大概率是订阅方和上游之间的区域策略,直接找服务商客服确认比苦查配置更有效。
处理手段上有几条路,都不涉及绕限制:一是换一个对当前地区开放的等价模型,比如某个模型不可用时,切到同能力级别的其他模型;二是用本地模型替代,完全不受外部策略影响,适合对隐私要求高的任务;三是检查你使用的 API 端点是否填写正确,有些时候你填了一个错误地区的端点,也会触发这个报错。总而言之,在线模型的可用性,本质上是服务商策略问题,不是 OpenCode 本身的问题,别在配置上死磕。
5.3 400/404 错误:多半是 baseURL 和模型 ID 的锅
400 Bad Request最常见的原因是模型 ID 写错了,或者请求体里带了服务端不支持的参数。404则九成是 baseURL 不对,尤其是用聚合服务时。
我建议所有自定义 provider 的用户都养成一个习惯:把 baseURL 记成“不带版本号的根地址”。OpenCode 会在请求时自动拼/v1/chat/completions之类的路径,如果你自己加了/v1,它就可能拼成/v1/v1/...。另外,当你换了一个模型,记得去看一眼models配置里的 ID 是否和当前 provider 提供的完全一致,一个空格、一个连字符都不能差。
5.4 Linux 下修改 JSON 配置的注意事项
Linux 上 OpenCode 的配置文件默认在~/.config/opencode/opencode.json。不少热词里搜“opencode linux 修改 json”,说明大家在这里卡过。
常见坑有三个。一是 JSON 格式严格,不允许注释、不允许尾逗号。很多人习惯在 JSON 里写注释解释某个字段,结果 OpenCode 直接解析失败。二是改了配置文件以后,正在运行的会话不会自动加载新配置,需要退出重进。三是$schema字段一定保留,它能让你在支持 JSON Schema 的编辑器里获得自动补全和校验,大幅降低写错字段的概率。
我提供一个 Linux 下最小可用的配置模板:
{ "$schema": "https://opencode.ai/config.json", "provider": { "ollama": { "options": { "baseURL": "http://localhost:11434" }, "models": { "qwen2.5-coder:7b": {} } } }, "theme": "dark" }配置好之后,用opencode run -m qwen2.5-coder:7b "输出 hello world"验证一下能不能通。
6. 长期使用下来的一些体会
写到最后,分享几个我用 OpenCode 大半年沉淀下来的心得。
第一个心得是,不要让它输入输出无限膨胀。一个 session 里任务越堆越多,上下文越长,AI 的改错率会明显上升。我的习惯是做完一个相对独立的需求就退出重进一个新会话,保持上下文清爽。成本上也划算很多,长上下文每轮对话的 token 消耗是指数级上升的,/cost看一下就知道我在说什么。
第二个心得,权限和确认机制该开就开。如果你用的是桌面版或在重要分支上开发,建议开启文件修改确认,甚至命令执行确认。OpenCode 默认为了效率会连着跑命令,万一它执行了一个git push --force,或者在测试数据库上跑了清空脚本,那场面会很刺激。虽然这种情况极少,但一次事故就够你后悔了。
第三个心得,Skills 是拉开体验差距的关键。我是从一个小 skill 开始写起的——让 AI 改完代码以后自动跑 lint 和单测。之后慢慢加了代码审查、commit message 生成、接口文档同步等。每加一个 skill,OpenCode 在我工作流里的利用率就上一个台阶。社区的“oh my opencode”项目就汇集了一批这类配置集合,相当于 oh my zsh 之于 zsh,拿来直接用再改改,会省很多事。
最后再说一个小技巧。如果你经常在多个项目间切换,每个项目的.opencode目录下都会生成独立的会话记录和配置,不要嫌麻烦把它们加入 .gitignore。因为不同项目的依赖、语言、框架差异很大,给每个项目单独维护它的 OpenCode 工作区,比一个全局配置到处跑要稳定得多。反正我已经离不开这套工具了,希望这篇指南能让你少走点弯路。