修复 opencode 命令运行时报错 TypeError fn3 is not a function

opencode

最近在使用 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 --helpopencode 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-pickleopencode/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/

几点经验教训:

  1. 遇到奇怪错误,先检查版本:很多问题就是版本太旧导致的
  2. brew upgrade 不一定可靠:如果升级后版本没变,可能需要先 untap 再重装
  3. 第三方 tap 要注意迁移:当项目被 Homebrew 官方收录后,旧的第三方 tap 可能不会自动更新
  4. 错误信息要看完整unknown certificate verification error 是误报,真正的错误在 API 响应体里
  5. 插件配置要核对:确保插件名称与实际安装的包一致

Mac 下 QwenPaw 安装记录 - 从零配置 OpenRouter MiniMax 模型 macmon - Apple Silicon Mac 的性能监控利器