1. 为什么opencode突然火起来了
最近AI编程助手圈子里,opencode这个名字出现的频率越来越高。如果你关注过Claude Code、Codex CLI,大概率也刷到过它——一个开源终端里的AI编程agent,用Go语言写的,支持接入大量模型,而且对免费模型极其友好。GitHub上有好几个同名项目,热度最高的那个由独立开发者创建,没有大厂背景,却靠着“干净、够快、不锁模型”这几个点迅速圈了一波粉。
我先说结论:opencode不是要替代谁,而是给终端AI编程提供了一个更开放、更轻量的选择。它的核心卖点很直接:
- 多模型随便切,OpenAI、Anthropic、DeepSeek、GLM、本地的Ollama都能接,而且支持配置免费模型;
- 内置Skills机制和Memory,能跨会话记住项目状态;
- 有TUI交互界面,在终端里体验不输给桌面IDE插件;
- 官方迭代快,VS Code插件、JetBrains插件、桌面版都在推进。
这篇博文我把从安装、配置到实战、排坑的完整路径写清楚,覆盖Windows和macOS场景,新手可以照抄,老手可以看第三节的Skills实战和第四节的任务编排思路。
2. 安装与启动,先把坑踩平
2.1 一行命令安装
opencode提供了好几种安装方式,我实测下来的优先级如下。
macOS/Linux用install脚本最省事:
curl -fsSL https://opencode.ai/install | bashWindows用户用Scoop或直接下载二进制压缩包:
scoop bucket add opencode https://github.com/sst/opencode.git scoop install opencode如果你装了Go环境,也可以直接编译安装:
go install github.com/sst/opencode@latest这一步我特别提醒一下:install脚本默认装到~/.opencode/bin(macOS下是~/.local/bin),如果你用的是zsh或bash,脚本不会自动把路径写进PATH。很多新手装完吓一跳——输入opencode提示找不到命令,其实不是没装上,而是shell不知道去哪找它。
2.2 Windows下最常见的报错:无法识别cmdlet
热搜词里有一条非常典型:“opencode: 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称”。这个报错的原因基本就是PATH没配上。
解决分两步:
- 找到opencode安装路径。用Scoop装的通常在
%USERPROFILE%\scoop\shims\opencode.exe,手工解压的看你自己放哪个目录; - 右键“此电脑” → 属性 → 高级系统设置 → 环境变量,在用户变量Path里新增该目录,然后重开一个PowerShell窗口。
另外一个容易忽略的点:Scoop下载opencode时默认走代理,如果你的网络环境需要代理才能访问GitHub,建议先配置好HTTP_PROXY/HTTPS_PROXY再执行安装,否则下载会卡在99%或者报“unexpected server error”。官方文档还提到,Windows下的PowerShell执行策略可能阻止脚本运行,如果遇到running scripts is disabled,执行一下:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser不要直接用-Scope LocalMachine,没必要,而且容易把系统策略改乱。
2.3 首次启动需要登录吗
opencode不是SaaS产品,它本身不托管模型,更像一个“终端的模型调度中枢”。首次运行会引导你配置Provider,配置文件写在~/.config/opencode/(macOS/Linux)或%USERPROFILE%\.config\opencode\(Windows)。
你要做的核心事情就是告诉它:“我的API Key放哪、模型叫什么名字”。如果你用的是OpenAI或Anthropic官方API,它可以直接读取系统环境变量OPENAI_API_KEY、ANTHROPIC_API_KEY,不需要额外设置。
但国内用户大概率会用中转站或者国产模型,这时候就需要手动写配置文件了。
3. 模型配置,别被默认参数坑了
3.1 配置文件的正确写法
opencode的模型配置基本都写在opencode.json里,项目根目录放一份,全局放一份,全局配置会作为所有项目的兜底。我在~/.config/opencode/下的全局配置长这样:
{ "$schema": "https://opencode.ai/config.json", "provider": { "deepseek": { "npm": "@ai-sdk/deepseek", "name": "DeepSeek", "options": { "baseURL": "https://api.deepseek.com/v1", "apiKey": "{env:DEEPSEEK_API_KEY}" }, "models": { "deepseek-chat": { "name": "DeepSeek V3" }, "deepseek-reasoner": { "name": "DeepSeek R1" } } } } }这里有个关键点:npm字段决定opencode以什么方式加载模型SDK。opencode基于Vercel AI SDK 3.0封装了Provider机制,每个Provider其实是一个npm包抽象层,在Go程序里通过内置的JS运行时动态加载。如果你照抄别人的配置但没有安装对应的npm包,启动时会卡在“provider not found”。
我踩过的坑是:用本地Ollama时,options里必须写baseURL指向http://localhost:11434/v1,但某些版本还需要加一行"model": "qwen2.5-coder:7b"放在请求参数里,而不是只写在models映射里。配置完先跑一次opencode models确认列表里有你想要的模型,而不是直接进对话——前者报错更直白。
3.2 免费模型怎么接
热搜词里“opencode免费模型”“hy3-free下线了吗”值得单独说。opencode本身不提供免费模型,但你可以把支持免费额度的服务接进去,比如OpenRouter(有Free额度)、Groq(有免费速率限制),以及某些社区维持的中转模型。
OpenRouter接入配置:
{ "provider": { "openrouter": { "npm": "@openrouter/ai-sdk-provider", "name": "OpenRouter", "options": { "baseURL": "https://openrouter.ai/api/v1", "apiKey": "{env:OPENROUTER_API_KEY}" }, "models": { "meta-llama/llama-3.3-70b-instruct:free": { "name": "Llama 3.3 70B Free" } } } } }个人经验:OpenRouter免费模型稳定性还行,但发起长任务时容易触发速率限制。opencode的自动重试机制默认只重试3次,如果连续报429,建议在配置里调高重试次数,或者改用其他模型兜底:
{ "automaticRetries": 5, "timeout": 300000 }3.3 多模型切换与CC Switch
opencode支持在对话过程中动态切换模型,快捷键是Ctrl+Shift+M(macOS是Cmd+Shift+M),会弹出一个模型列表直接选。这个设计很实用——写代码用推理模型,处理琐碎重构用轻量模型,成本直接降一个量级。
那CC Switch是什么?它是opencode官方推荐的一套“模型服务商切换工具”,本质上是把oht-*这类动态代理参数写入环境变量,让opencode每次请求都走不同的中转服务(比如oht-xxx开头的keys)。在GitHub上的opencode讨论区和开源圈里,“opencode go 需要配合 cc switch 等工具”是一条高频FAQ。说白了,就是把中转站提供的分流、负载均衡能力以环境变量形式注入opencode进程。
配置流程大致是:
- 安装CC Switch,添加服务商(填Base URL、API Key、支持模型列表);
- 在CC Switch里选一个配置,点“复制环境变量”;
- 把环境变量注入opencode的启动shell,比如
.zshrc里加一行export CC_SWITCH_ACTIVE=xxx; - 重启终端,跑
opencode models确认新模型列表已加载。
如果你用Windows PowerShell,环境变量注入方式是$env:CC_SWITCH_ACTIVE="xxx",注意格式和macOS不一样。
4. Skills机制,这才是opencode的灵魂
4.1 Skills是什么
如果你用过Claude Code的skills或Kilo Code的skills,那对这个概念不陌生。opencode的Skills本质上是一组“带指令的上下文包”,它可以是一段system prompt、一组示例代码、若干个MCP工具,打包成一个可复用的技能。
举个例子:让opencode“检查前端页面跨域问题”时,如果有一个写好的skills包,它会自动带上:
- 诊断跨域的Checklist;
- 浏览器Console报错的常见模式;
- 本地代理配置的推荐写法。
没有skills,它就只能靠通用知识硬猜,效果忽上忽下。opencode的Skills目录默认在~/.config/opencode/skills/(Windows下对应%USERPROFILE%\.config\opencode\skills\),每个技能是一个子目录,包含SKILL.md,可能有配套的脚本和参考文件。
4.2 手写一个Skills的完整模板
下面是SKILL.md的基本结构,我用一个“按TDD节奏开发Python函数”的skill举例:
--- name: python-tdd description: 按测试驱动方式实现Python函数,每次先写失败测试再写实现 version: 1.0.0 --- # Python TDD Skill ## 触发场景 用户要求“用TDD方式实现函数”“先写测试再写代码”时触发。 ## 执行步骤 1. 分析需求,拆解输入输出边界; 2. 先用pytest编写期望行为和边界case,运行确认失败; 3. 编写最小实现,运行测试全绿; 4. 重构代码,保持测试通过。 ## 注意事项 - 不跳步,不在没跑测试前直接写实现; - 对异常输入必须设计用例; - 测试文件固定放在项目根目录tests/下。写完保存好,重启opencode,Skill就自动生效了。你可以通过/skills命令查看所有已加载的技能,系统会自动把匹配的skill注入当前会话的上下文(注入是静默的)。有经验的用户会给模型提前注入一个“项目习惯多轮确认”的skill,大大减少助手猜需求的概率。
4.3 用Skills解决前端Bug排查的实战
有一个热搜词“opencode playwright 怎么测试前端bug”让我眼前一亮,这个方向我实际跑过。
思路是这样的:把opencode当作测试编排大脑,Playwright当作执行手脚。你不需要自己写一整套E2E测试用例,而是用自然语言告诉opencode“帮我验证这个按钮在移动端是否可点”,opencode调用skills里的playwright步骤,自动生成临时脚本、运行定位、截图反馈。
我用的skill片段如下(这是打包在skil包里的辅助脚本片段,不是完整代码,重点是演示opencode会让模型怎么组织排查顺序):
# 1. 启动本地开发服务器 npm run dev -- --port 5173 & sleep 3 # 2. 用playwright跑冒烟脚本 npx playwright test --headed --grep "button-mobile-smoke" # 3. 收集截图 find test-results -name "*.png" | xargs -I {} cp {} ./bug-report/skill描述里注明“前端bug排查时,优先复现路径,不直接改代码”,这样opencode在调试时就不会贸然给你大改业务逻辑。
个人体感:这种“对话式debug”效率高于直接在IDE里写用例,特别适合非前端专项的联调场景。不过也要注意,它生成的Playwright脚本偶尔有选择器不稳定的问题,建议在skill里强制加一条“所有选择器优先使用>opencode
它会在启动时扫描当前目录,读取.opencode.json、AGENTS.md(如果存在)、常见框架的配置信息。这时候你可以让它生成一份项目总结,通常是运行完自动落到一个tmp文档里。我一般不直接让它写代码,而是先问三个问题:
- 这个项目的技术栈和目录结构是什么?
- 入口文件在哪里,数据流大致怎么走?
- 有没有明显的设计缺陷或潜在的坑?
只要模型质量还行,这几轮问答基本能把项目脉络捋清楚。等它回答完,我会用/memory命令让它把关键结论记入项目记忆,之后每次会话它都会知道“这是一个Go的CLI项目,测试用testify,历史决策记录在docs/adr/”。
这里有个使用心得:不要让opencode一开始就读超大仓库(几万文件的monorepo),它是循环读取索引的,文件太多容易在启动阶段浪费大量token。遇到大仓库,建议先在项目根目录创建.opencodeignore,把node_modules、vendor、dist、.git这类目录排除掉,或者明确告诉他“只关注src/和tests/”。实测下来src目录在5000~8000个文件内,启动和上下文控制都还在舒适区。
5.2 核心任务:让它独立完成一个功能模块
我在一个测试项目里让它加一个带缓存的HTTP客户端。给的指令是:
“在internal/httpclient/下实现一个带超时、重试、内存缓存的客户端,参考http.Client的上下文取消机制,缓存工具使用hashicorp/golang-lru/v2,测试代码用stretchr/testify的assert。”
opencode的典型输出是:先列计划、再改文件、最后跑测试。实测用Claude模型时,一次通过率约七成;用弱一点的开源模型时,经常出现“API签名对不上”或“缓存过期策略没写”的情况。我的习惯是第一步只让它出实现计划和接口定义,我自己过一眼,再让它动手写——这个“把关两步走”比一口气让AI直接生成到完成,成功率高得多。
5.3 Agent模式与多任务编排
opencode的agent模式不只是简单问答,它支持同时并行处理多个子任务。在TUI里你可以开多个tab(快捷键Ctrl+T新增),每个tab是独立的对话上下文。我常用它做任务拆分:
主tab:全局设计 + 任务分配 tab2:实现用户认证模块 tab3:实现支付回调模块 tab4:写数据库迁移脚本每个tab用不同的模型都行,比如主tab用强推理模型,tab4用便宜快速的模型。这样组合下来,成本和效率都比较理想。opencode执行长任务时会走“task队列”,你可以用/status查看每个任务的状态,有失败的任务会单独标红。
5.4 与IDE插件配合使用
opencode可以在VS Code里装官方插件,JetBrains系的IDEA插件也在完善中。安装后,你在IDE打开项目,直接在侧边栏跟opencode对话,它会读取当前打开文件的内容作为上下文,也可以直接在编辑器里插入代码。这个体验介于“终端全自动agent”和“AI补全插件”之间,适合不习惯终端操作的人。
VS Code插件需要注意一点:插件默认使用同全局配置,所以模型、skills、memory都跟终端一致,不需要重复配置。IDEA插件由于JVM环境限制,启动加载模型列表稍慢,建议先进一次设置页点“Refresh Models”手动刷新,否则首次对话可能报找不到模型。
6. 常见报错与排查技巧实录
6.1 “unexpected server error. check server logs”
这个报错在Windows下特别高频。触发原因有很多,但最常见的是:
- 模型provider的baseURL写错,比如多加了
/v1或者写成了/api; - 环境变量没传入opencode进程,PowerShell用户尤其容易遇到;
- 本地代理拦截了请求,返回了非标准JSON。
排查建议顺序是:先跑opencode models确认模型加载是否正常,再跑一次opencode -v看有没有更详细的错误日志(或加环境变量OPENCODE_LOG_LEVEL=debug),日志文件位置在~/.local/share/opencode/log/。如果日志尾部出现dial tcp: lookup xxx: no such host,那基本就是网络DNS或代理的问题,跟配置无关。
Windows环境下还有一个特殊诱因:后台开着某些安全软件,会对opencode的进程做网络行为拦截,表现为“偶发unexpected server error,重启后短暂恢复”。这类问题在日志里能搜到tls handshake timeout关键字。
6.2 模型输出乱码或中途断掉
如果你在Windows终端看到中文乱码,先按Ctrl+Shift+2切一下终端的文本编码,或者改用Windows Terminal而不是老旧的conhost。oppencode的TUI基于现代终端组件,老版Windows自带的控制台窗口对Unicode支持不全,显示会乱。
中途断掉最常见的原因是模型上下文长度超过限制,或者本地内存不足。可以在配置里限制最大输出token:
{ "model": { "maxOutputTokens": 8192 } }6.3 免费模型被限流怎么办
用免费模型时,OpenRouter等服务的限流策略比官方API严格得多,表现为“请求偶尔成功,偶尔429”。opencode的自动重试只能解决瞬时抖动,如果限流是分钟级甚至小时级的,建议备两个方案:
- 在全局配置里给免费模型加一个“备用provider”字段,当主模型失败时自动切换;
- 用TUI快捷键手动切到付费模型。
我实测的兜底组合是:高并发任务用OpenRouter的Llama免费模型,涉及代码生成的关键任务切DeepSeek或GLM,成本几乎可以接受。另外提醒一下:“hy3-free”这类长期维护的社区免费模型,生命周期不稳定,今天能用明天可能就下线,遇到“模型返回空响应”时先确认是不是服务端已经挂了。
6.4 常见问题速查表
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 启动提示无法识别cmdlet | PATH未配置 | 把opencode所在目录加入系统PATH |
| unexpected server error | provider配置错误或网络代理异常 | 检查baseURL/API Key,开debug日志 |
| 模型列表为空 | npm依赖未安装或服务商不可用 | 重跑provider安装,用opencode models验证 |
| 对话中途停止 | 上下文超限或免费模型限流 | 限制maxOutputTokens,或切换付费模型 |
| 中文乱码 | 终端编码不支持 | 换Windows Terminal或切换文本编码 |
| 找不到skill | skills目录路径不对 | 确认~/.config/opencode/skills/存在且SKILL.md格式正确 |
| Playwright脚本不稳定 | 选择器定位差 | skill里强制data-testid优先原则 |
7. 它跟Claude Code、Codex CLI、PI怎么选
很多人在“opencode codex claude code pi哪个agent好用”这个话题上纠结。我的看法是:没必要“选一个”,更值得关注的是“场景匹配”。
Claude Code的优势是Anthropic模型深度集成,Subagent机制成熟,处理超长上下文和复杂架构重构很稳,但模型绑定较重,换其他模型体验明显打折。Codex CLI胜在OpenAI生态和GPT-5系列的支持,代码生成质量高,但它更偏向“独立开发流程”,和IDE的配合相对弱一点。PI(正面印象里指的是Perplexity的API agent方案)更偏研究问答,重度开发场景用得少。
opencode的差异化在于:
- Provider插件化设计,理论上你能接任何兼容OpenAI协议的服务;
- 完全开源的终端UI,定制自由度高;
- 纯本地配置和记忆存储,隐私性更好;
- 支持Skills,能沉淀团队和个人工作流。
简而言之:重度依赖某一家模型能力、追求最优代码生成,选Claude Code或Codex CLI没问题;想自由切换模型、沉淀自己的调试和开发流程,opencode更合适。如果你本来就用VS Code,opencode插件版可以零成本先试起来。
8. 一些实在的使用建议
最后分享几个我实测下来比较有价值的习惯。
第一,不用一股脑把所有模型都配上。我见过有人配了十几个Provider,结果切换时UI列表很长,选模型反而费劲。留3~4个常用的就够了:一个强推理模型做架构设计,一个快模型做重构和简单任务,一个本地模型做离线兜底。
第二,Memory功能要主动用。opencode的/memory命令可以把关键项目信息(技术栈、约定、已知问题)持久化到项目目录下的.opencode/memory/,下次启动自动加载。很多人没用这个功能,导致每开个新会话都要重新描述项目背景,白花token。
第三,处理复杂任务时多拆步骤。与其一次让它“把这个模块做完”,不如分三步:先出计划、再逐文件实现、最后统一测试。我发现这是让开源模型也能稳定完成中大型任务的关键操作,表面上看多花了几次交互,实际上重写和返工的成本低得多。
第四,注意安全和合规。如果接入了第三方中转服务,敏感信息不要写进系统提示词或项目记忆里,所有涉及密钥的东西尽量走环境变量。生产环境慎用免费模型处理隐私数据,这个不需要我多解释。
opencode现在还在快速迭代阶段,功能变化快,配置格式也可能微调。如果你按这篇博文操作时发现某些命令不对了,优先去官方文档确认最新格式。工具本身就是“开放性”的,多试、多配、多总结,才能找到最适合自己那套玩法。