0%

告别 Claude Code:用火山方舟 Coding Plan + OpenCode 搭建本地 AI 编程工作流

背景

之前我写过一篇《使用 Claude Code + 火山方舟 Coding Plan 自动写 Hexo 博客》,介绍了如何通过 LiteLLM 代理把 Claude Code 接到方舟模型上。那套方案能跑,但用下来越来越别扭,最后我彻底把 Claude Code 换成了 OpenCode

这篇文章讲两件事:

  1. 为什么我要离开 Claude Code——它在「登录」「联网校验」「数据上报」这些地方的做法实在让人无法忍受;
  2. 如何用 OpenCode 直连火山方舟 Coding Plan,搭建一套干净、可控、无需代理的本地编程工作流。

严厉谴责:Claude Code 到底做错了什么

Claude Code 作为一个命令行工具,本应该是「我给它密钥、它帮我干活」这么简单的关系。但实际体验完全不是这样,下面这些行为我必须明确批评。

1. 强制登录,把开发工具绑成账号牢笼

一个本地 CLI 工具,凭什么要求我先登录账号才能用?

  • 即使你已经有合法的 API Key 或第三方网关,官方版本依然不断把你往「登录 Claude 账号 / 订阅」的路径上引导;
  • 登录态、订阅校验和工具功能深度耦合,账号一旦异常,本地工具直接罢工;
  • 这本质上是把开发者工具变成账号的人质——你的生产力被绑定在它的账号体系上,而不是绑定在你自己的密钥和代码上。

工具就该是工具。强制登录是在用「身份」绑架「能力」,这是第一条不可接受的地方。

2. 频繁联网校验,离线环境直接瘫痪

Claude Code 在使用过程中会反复回连官方服务器做各种校验。带来的后果是:

  • 网络稍有波动,命令就卡住、超时、报错;
  • 在内网、隔离环境、弱网条件下几乎没法稳定工作;
  • 你根本不清楚每一次「校验」背后到底传了什么、传了多少。

一个编程助手,本职工作是读代码、写代码、跑命令,不应该把「能不能联上官方服务器」当成能不能干活的前提

3. 不透明的数据发送与「邮件 / 通知」骚扰

最让人不安的是数据流向的不透明

  • 工具会在你不完全知情的情况下向外发送遥测、使用统计、账号相关信息;
  • 各种账号通知、营销邮件、状态推送随之而来,你的邮箱成了它的广播渠道
  • 对于在公司项目、私有仓库里使用的人来说,这种「默认上报 + 默认通知」的设计是实打实的合规与隐私风险

我用一个 CLI 写代码,不代表我同意把项目信息、使用行为打包发回去,更不代表我想收一堆邮件。默认就该是静默、本地、最小化数据,而不是反过来让用户去一项项关闭。

小结

强制登录、频繁联网校验、不透明的数据发送和邮件骚扰——这三点叠加,让 Claude Code 从一个「好用的工具」变成了一个「我必须时刻提防的工具」。对开发者来说,可控性和隐私比那一点点模型体验上的差异重要得多。所以我换到了 OpenCode。

为什么选 OpenCode

OpenCode 是一个开源的终端 AI 编程工具,定位和 Claude Code 类似,但在我最在意的几点上做得更好:

  • 开源透明:代码公开,行为可审计,不存在「偷偷干了什么」的疑虑;
  • 不强制登录:你只需要给它一个 API Key(或本地模型),不需要注册它家的账号;
  • 原生支持 75+ 提供商:基于 AI SDKModels.dev,包括各种 OpenAI 兼容网关;
  • 直连方舟,无需代理:火山方舟 Coding Plan 提供的是 OpenAI 兼容接口,OpenCode 可以直接对接,彻底干掉上一篇文章里的 LiteLLM 中间层
  • 配置即文件:所有配置都在 opencode.json 里,清清楚楚,可以纳入版本管理(注意别把密钥提交上去)。

对比上一套 Claude Code + LiteLLM 方案,OpenCode 直连方舟少了一整个代理进程,少了一层协议转换,链路更短、更稳、更好排查。

整体架构

相比之前「Claude Code → LiteLLM → 方舟」的三段式,OpenCode 的链路简单到几乎没有中间环节:

1
2
3
4
5
6
7
OpenCode CLI
│ (OpenAI 兼容格式,直接调用)

火山方舟 Coding Plan API


GLM / 豆包 / DeepSeek / Kimi 等模型

不需要 LiteLLM,不需要协议转换,不需要本地额外起一个代理端口。

迁移步骤

第一步:安装 OpenCode

1
2
3
4
5
6
# 推荐方式(macOS / Linux)
curl -fsSL https://opencode.ai/install | bash

# 或使用包管理器
brew install sst/tap/opencode # macOS Homebrew
npm install -g opencode-ai # npm 全局安装

安装完成后执行 opencode --version 确认可用。

第二步:获取火山方舟 Coding Plan 的接入信息

  1. 登录火山方舟控制台

  2. 开通 Coding Plan,在控制台获取 Coding Plan 专用的 API Key

  3. 记录下 Coding Plan 的 Base URL,形如:

    1
    https://ark.cn-beijing.volces.com/api/coding/v3

注意:方舟 Coding Plan 的具体模型列表、Base URL 和定价可能随时间变化,请以火山方舟官方文档为准。

第三步:在 OpenCode 中配置方舟自定义 Provider

OpenCode 把任意 OpenAI 兼容服务都当作「自定义 Provider」处理,使用 @ai-sdk/openai-compatible 这个 npm 包即可。

编辑 ~/.config/opencode/opencode.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
"$schema": "https://opencode.ai/config.json",
"model": "volcengine-plan/glm-5.2",
"provider": {
"volcengine-plan": {
"npm": "@ai-sdk/openai-compatible",
"name": "Volcano Engine",
"options": {
"baseURL": "https://ark.cn-beijing.volces.com/api/coding/v3",
"apiKey": "{env:ARK_API_KEY}"
},
"models": {
"glm-5.2": {
"name": "glm-5.2",
"limit": { "context": 1024000, "output": 4096 }
},
"doubao-seed-code": {
"name": "doubao-seed-code",
"limit": { "context": 256000, "output": 4096 }
},
"deepseek-v4-pro": {
"name": "deepseek-v4-pro",
"limit": { "context": 1024000, "output": 4096 }
},
"kimi-k2.7-code": {
"name": "kimi-k2.7-code",
"limit": { "context": 256000, "output": 4096 }
}
}
}
}
}

关键字段说明:

  • provider.volcengine-plan:自定义 Provider 的 ID,名字随意,但要和顶层 model 的前缀对应;
  • npm:固定用 @ai-sdk/openai-compatible,OpenCode 会用它走 OpenAI 协议;
  • options.baseURL:方舟 Coding Plan 的接口地址;
  • options.apiKey{env:ARK_API_KEY} 从环境变量读取,绝对不要硬编码真实密钥
  • models:列出你要用的模型及其上下文 / 输出上限,模型名即方舟侧的模型 ID;
  • 顶层 model:设置默认模型,格式为 <provider-id>/<model-id>,例如 volcengine-plan/glm-5.2

第四步:通过环境变量注入密钥

1
2
3
# 临时使用
export ARK_API_KEY="你的方舟 Coding Plan API Key"
opencode

推荐用 direnv 在项目目录自动加载,避免每次手动 export

1
2
3
4
5
# 在项目根目录创建 .env(确保已被 gitignore)
echo 'export ARK_API_KEY=你的方舟API Key' > .env
# 创建 .envrc
echo 'source_env .env' > .envrc
direnv allow

安全提醒:OpenCode 的 opencode.json 是纯文本配置,很容易被同步到 Git 或 dotfiles 仓库。千万不要把真实 apiKey 直接写在 options.apiKey,一律用 {env:...} 引用环境变量。

第五步:验证并选择模型

启动后用内置命令确认一切就绪:

1
opencode

进入 TUI 后:

  • 输入 /models,应该能看到 Volcano Engine 下列出的所有模型;
  • 选择 glm-5.2(或你常用的模型);
  • 随便提个需求测试一下,比如「列出当前目录结构并解释项目用途」。

用 OpenCode 写 Hexo 博客

迁移完成后,写博客的流程和之前几乎一样,只是把 claude 命令换成了 opencode

创建新文章

在 Hexo 项目目录下启动:

1
2
cd /path/to/hexo_source_file
opencode

然后用自然语言描述需求:

1
2
帮我创建一篇关于 Unity Addressables 资源管理最佳实践的博客,
包括资源分组策略、内存优化和加载性能调优三个方面

OpenCode 会读取项目里的 AGENTS.md / CLAUDE.md 约定,按照你现有博客的风格创建文章、填好 Front Matter 并生成内容。

提示:OpenCode 默认读取项目根目录的 AGENTS.md(也兼容 CLAUDE.md)作为项目规则。把「永久链接格式」「文章目录」「写作风格」「安全规则」写进去,可以让生成结果更稳定。

本地预览与部署

1
创建一篇关于 Lua 热更新方案对比的博客,然后执行 hexo server 让我本地预览

确认无误后:

1
帮我执行 hexo deploy 部署博客

Claude Code vs OpenCode 对比

维度 Claude Code OpenCode
是否强制登录 强引导登录 / 订阅 不需要,给 Key 即用
接方舟 Coding Plan 需要 LiteLLM 代理转协议 原生直连,无需代理
配置方式 散落在环境变量 / settings.json 集中在 opencode.json
数据 / 遥测 不透明、默认上报 开源可审计
链路复杂度 CLI → 代理 → 方舟 CLI → 方舟

安全清单(务必照做)

无论用哪个工具,密钥安全的底线都不能松:

  1. 密钥只走环境变量:配置文件里一律用 {env:ARK_API_KEY},绝不硬编码;
  2. gitignore 排除敏感文件.env.envrc、包含密钥的本地配置都要忽略;
  3. 检查你的全局配置~/.config/opencode/opencode.json 如果同步到了 dotfiles 仓库,确认里面没有明文 apiKey
  4. 方舟侧加额度上限:为 Coding Plan 的 Key 设置调用额度,泄漏后也不至于产生高额费用;
  5. 定期轮换密钥

总结

从 Claude Code 迁移到 OpenCode,对我来说不只是换个工具,而是把「工具应该服从用户」这条原则重新拿回来:

  • 不被强制登录绑架;
  • 不被频繁联网校验拖累;
  • 不被默认上报和邮件骚扰侵犯隐私;
  • 还顺手干掉了 LiteLLM 代理,直连方舟 Coding Plan,链路更短更稳。

如果你也在用方舟 Coding Plan,并且受够了 Claude Code 那套账号 + 上报的玩法,OpenCode 值得一试。核心原则不变:密钥永远只通过环境变量传递,绝不出现在代码、配置文件或 Git 仓库中。