OpenCode 与 GitHub Copilot 计费差异及优化实践
最近在使用 OpenCode 时遇到一个意外情况:明明只是让 AI 帮忙重构了几个文件,账单却突然涨了 3 倍。作为开发者,我们习惯依赖工具提升效率,但往往忽略了背后的计费逻辑。今天就来聊聊这个坑,以及如何正确配置以控制成本。
问题发现:自动化带来的'惊喜'
我之前的使用习惯是直接在 VS Code 里调用 GitHub Copilot Chat,体验很流畅。比如重构 src/index.ts,流程通常是:
- 发送请求
- 读取文件
- 分析代码
- 修改并运行检查
- 完成
在 VS Code 里,这一套动作下来,通常只消耗一次对话额度。但切换到 OpenCode 后,同样的任务,后台自动执行了多次循环,导致额度消耗激增。查看账单才发现,原来是因为计费机制的差异。
深入分析:为什么 OpenCode 更'烧钱'?
要理解这个问题,得先搞清楚 GitHub Copilot 的计费规则。它主要是按'发送次数'计费,而不是单纯按 Token 数量。
VS Code 的实现:单次流式连接
VS Code 使用的是 SSE (Server-Sent Events) 流式连接。当你点击发送后,建立一次 HTTP 连接,AI 在同一个连接中持续生成内容。即使中间需要读取文件或修改代码,只要用户点击允许(Allow),这些操作都被视为同一次请求的延续。
用户点击发送 → 建立 HTTP 连接(streaming)
↓
AI:'我需要读取文件...' [发送 tool-call 事件,连接保持打开]
↓
用户点击 Allow → 执行工具 [结果注入到同一个流中,无需新请求]
↓
AI:'已完成!'
↓
关闭连接
核心优势:整个对话过程只建立 1 次连接,无论中间交互多少次,都算作 1 次计费。
OpenCode 的实现:循环模式(Loop)
OpenCode 早期采用的是 Agentic Loop 架构。每次 AI 决定执行下一步(比如读取文件、修改代码),都会关闭当前连接并发起一个新的 HTTP 请求。
用户点击发送(第 1 次请求)
↓
Step 1: AI:'我需要读取文件...' → 连接关闭
↓
权限检查 → 自动执行工具 → 获得结果
↓
Step 2: AI:'发现 3 个错误...' → ❌ 计费!新请求
↓
权限检查 → 自动执行工具 → 获得结果
↓
Step 3: AI:'已完成!' → ❌ 计费!新请求
关键问题:每次循环都会关闭连接并发起新请求,GitHub Copilot 将它们视为独立的用户请求,导致同样的任务被计了 3 次费。
官方修复:Subagent 机制
好在官方很快意识到了这个问题。在 v1.1.31 版本中,针对 Subagent(子任务代理)功能进行了修复。
什么是 Subagent?
当你让 AI 处理复杂任务时,它可以自动创建子任务。例如重构整个项目,主任务负责分析,子任务负责具体模块的重构。
修复原理:添加 x-initiator: agent 标记
官方通过在 HTTP 请求中添加特殊 Header,标记为 AI 自动发起,从而避免重复计费。
// 检查是否是 subagent session(有父任务)
if(session.parentID) {
// 添加特殊 header,标记为 AI 自动发起
headers["x-initiator"] = "agent"
}
这与 VS Code 的机制一致,都是 GitHub Copilot 官方支持的标记方式。
修复效果:
- ✅ 主任务(用户发起):正常计费
- ✅ 主任务的循环(修复前):每次循环都计费
- ✅ 主任务的循环(修复后):仍然计费(因为没有 parentID)
- ✅ 子任务(有 parentID):全部不计费
- ✅ 子任务中的所有 LLM 调用:不计费
注意:修复主要针对 Subagent 功能,主任务的循环仍会计费!这意味着我们需要调整使用策略,尽量利用子任务来分摊工作。
解决方案与最佳实践
1. 立即升级
确保你的 OpenCode 版本在 v1.1.31 以上。
# 检查当前版本
opencode --version
# 升级到最新版本
npm update opencode-ai@latest
# 或 brew upgrade opencode
2. 充分利用 Subagent 功能
升级后,可以通过 @general 等 subagent 来拆分任务,这样大部分内部调用都不再计费。
# 推荐:让 AI 自动拆分子任务
opencode run "重构整个项目,使用 @general 分析最佳实践"
关键原则:尽量让 AI 自己创建子任务,而不是在主任务中做所有事情。
方法一:使用 @ 语法手动委托
# ❌ 避免:在主任务中执行多步骤操作
你:帮我重构 src 目录下的所有文件
# ✅ 推荐:让 AI 创建 subagent 处理
你:帮我重构 src 目录,使用 @general 分析并逐个文件处理
内置 Subagent 包括:
@general:通用多步骤任务(推荐用于复杂重构)@explore:代码探索和分析(只读,不会修改代码)
方法二:通过配置强制使用 Subagent
可以在 opencode.json 中配置命令模板,强制某些操作作为子任务执行。
{
"command": {
"refactor": {
"template": "重构 {input},使用最佳实践",
"subtask": true,
"agent": "general"
}
}
}
使用方式:
opencode /refactor src/utils/
# 自动创建 subagent,不计费
3. 自定义 Subagent 配置
支持两种配置格式,JSON 适合简单配置,Markdown 适合复杂 Prompt。
JSON 配置示例:
{
"agent": {
"reviewer": {
"mode": "subagent",
"model": "anthropic/claude-sonnet-4-20250514",
"description": "专门用于代码审查的子代理",
"prompt": "你是一个专业的代码审查专家...",
"steps": 50
}
}
}
Markdown 配置示例:
---
mode: subagent
model: anthropic/claude-sonnet-4-20250514
description: 专门用于代码审查的子代理
steps: 50
---
你是一个专业的代码审查专家。审查代码时:
1. 检查潜在的 bug
2. 提出性能优化建议
3. 评估代码可读性
使用方式:
你:使用 @reviewer 审查这个文件
# 自动作为 subagent 执行,不计费
4. 关键字段说明:steps vs maxSteps
在 OpenCode 配置中,推荐使用 steps 字段,maxSteps 已弃用。
// ✅ 正确写法
{
"agent": {
"build": {
"steps": 10
}
}
}
// ⚠️ 旧写法(仍可用,但不推荐)
{
"agent": {
"build": {
"maxSteps": 10
}
}
}
如果同时配置了两者,系统会优先使用 steps 值。
5. 调整主任务配置(辅助策略)
如果确实需要在主任务中操作,可以通过配置减少循环次数和权限风险。
{
"agent": {
"build": {
"steps": 10
}
},
"permission": {
"read": "allow",
"glob": "allow",
"edit": "ask",
"bash": "ask",
"task": "allow"
}
}
关键配置说明:
steps: 防止无限循环edit: "ask": 可以在关键步骤拒绝,提前结束循环task: "allow": 允许 AI 自动创建 subagent,这是节省成本的关键
总结与建议
这次经历让我意识到,自动化是把双刃剑:省力但可能费钱。理解计费原理至关重要。
- 理解架构差异:VS Code 是流式连接,OpenCode 是循环架构。Subagent 是 OpenCode 的成本优化利器。
- 关注版本更新:v1.1.31 修复了 Subagent 计费问题,充分利用时成本可节省高达 90%。
- 合理配置:权限 + 步数限制 + subagent 组合使用,才能在保证效率的同时控制成本。
现在,我的 Copilot 用量恢复正常了,开发效率却提升了不止一倍。希望这篇分享能帮到同样遇到问题的你。

