修复 opencode 命令运行时报错 TypeError fn3 is not a function
2026-04-27 tech opencode homebrew nodejs troubleshooting 11 mins 3987 字

最近在使用 opencode 时遇到了一个奇怪的报错:
$ opencode
TypeError: fn3 is not a function. (In 'fn3(input)', 'fn3' is an instance of Object) at <anonymous> (src/plugin/index.ts:87:28)
但 opencode --help 和 opencode debug 却能正常运行。排查下来发现是版本过旧 + Homebrew upgrade 失效导致的问题,后续又牵连出一系列插件配置问题。记录一下完整的排查过程。
问题排查
确认环境
$ node --version
v18.20.8
$ npm --version
10.8.2
$ which opencode
/opt/homebrew/bin/opencode
$ opencode --version
1.1.50
发现版本不匹配
怀疑是版本问题,尝试 brew upgrade opencode,但升级后版本仍然是 1.1.50。进一步查看:
$ brew info opencode
==> opencode: stable 1.4.10 (bottled)
AI coding agent, built for the terminal
https://opencode.ai
Installed:
/opt/homebrew/Cellar/opencode/1.1.50 (4 files, 101.5MB)
Tap 源已经有 1.4.10,但本地还停留在 1.1.50——brew upgrade 没有生效。
原因分析
我最初安装 opencode 时,它还未被收录进 Homebrew 官方核心库(homebrew-core),而是通过第三方 tap anomalyco/tap 安装的。后来 opencode 被官方收录,但本地环境依然优先读取旧的第三方 tap,导致版本停滞在旧版本。
可以通过 brew info 的 “From” 行来确认来源:
# 旧的第三方 tap 来源
From: https://github.com/anomalyco/homebrew-tap/blob/HEAD/opencode.rb
# 新的官方来源
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/o/opencode.rb
解决方案
1. 卸载旧版本
brew uninstall opencode
2. 移除旧的 Tap 源
这一步是关键,将 anomalyco/tap 从本地库中移除:
brew untap anomalyco/tap
3. 更新并重新安装
brew update
brew install opencode
这一次系统会从 homebrew-core 拉取最新版本:
🍺 /opt/homebrew/Cellar/opencode/1.4.10: 12 files, 101.3MB
4. 验证修复
$ opencode --version
1.4.10
$ opencode --help
# 正常显示所有命令
$ brew postinstall opencode
# 确保 post-install 步骤执行完成
重新安装后,CLI 模式正常工作,TypeError 报错消失。
后续:插件配置问题
升级版本后,CLI 模式已经正常,但使用 Web 界面时又遇到新错误:
unknown certificate verification error
实际排查后发现,真正的原因是 API 验证错误:
{
"error": {
"code": 34,
"message": "request validation errors",
"errors": [{
"type": "Extra inputs are not permitted",
"loc": ["body", "tools[0]", "eager_input_streaming"],
"msg": "Extra inputs are not permitted",
"input": true
}]
}
}
定位配置
opencode 的配置文件不在 ~/.opencode/,而是在:
$ ls ~/.config/opencode/
opencode.json oh-my-opencode.json.bak
发现问题插件
查看 opencode.json 后发现:
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["oh-my-openagent@latest"]
}
这里配置的 oh-my-openagent 插件向 Minimax API 发送了不支持的 eager_input_streaming 参数,导致验证失败。
临时解决
将插件列表清空:
{
"$schema": "https://opencode.ai/config.json",
"plugin": []
}
禁用插件后,opencode run "你好" 可以正常收到 AI 回复。
关于 oh-my-opencode 插件
opencode 本身只是一个框架,真正的能力来自插件。oh-my-opencode(后改名为 oh-my-openagent)是 opencode 的插件集合,提供多种专业 agent。
安装
bunx oh-my-opencode install --no-tui --skip-auth
--no-tui 参数可以跳过图形界面交互,适合非交互式环境。
模型配置
安装后可能会遇到模型验证问题:
Agent atlas's configured model opencode/glm-4.7-free is not valid
解决方法是更换为有效的模型,例如 opencode/big-pickle 或 opencode/gpt-5-nano。
包名变更
2026 年 3 月发生了一个重要变化:
| 项目 | 旧名称 | 新名称 |
|---|---|---|
| npm 包 | oh-my-opencode | oh-my-openagent(v3.11.0, 2026-03-07) |
| 配置文件 | oh-my-opencode.json | 保留不变 |
| Schema 文件 | oh-my-opencode.schema.json | 保留不变 |
配置文件名称有意保留旧名以保持向后兼容:
# 两种配置名都能工作
~/.config/opencode/oh-my-opencode.json # 传统(推荐)
~/.config/opencode/oh-my-openagent.json # 新式
Agent 体系
oh-my-opencode 中包含一套完整的 agent 协作体系:
| Agent | 角色 | 说明 |
|---|---|---|
| Sisyphus | 执行者 | 负责任务分解、代码实现 |
| Prometheus | 规划代理 | 通过 /start-work 激活,负责生成执行计划 |
| Metis | 预规划咨询 | 在规划阶段识别歧义和隐藏意图 |
| Momus | 计划评审 | 对执行计划进行清晰度和完整性审查 |
opencode vs openclaw
之前也有人问 opencode 和 openclaw 的区别:
| 特性 | opencode | openclaw |
|---|---|---|
| 类型 | AI 编程助手 | AI 控制器 |
| 核心 | 终端 IDE | 远程控制 |
| 通道 | 本地为主 | WhatsApp/Telegram |
| 定位 | 编码工作流 | 远程任务管理 |
两者定位不同,没有必要互相替换。
总结
| 问题 | 解决方法 |
|---|---|
TypeError: fn3 is not a function |
卸载旧 tap 源,从 homebrew-core 重新安装最新版 |
eager_input_streaming 验证错误 |
清空 plugin 配置或更换兼容插件 |
| 配置目录找不到 | 记住在 ~/.config/opencode/ 而非 ~/.opencode/ |
几点经验教训:
- 遇到奇怪错误,先检查版本:很多问题就是版本太旧导致的
brew upgrade不一定可靠:如果升级后版本没变,可能需要先untap再重装- 第三方 tap 要注意迁移:当项目被 Homebrew 官方收录后,旧的第三方 tap 可能不会自动更新
- 错误信息要看完整:
unknown certificate verification error是误报,真正的错误在 API 响应体里 - 插件配置要核对:确保插件名称与实际安装的包一致