OpenCode Desktop 开启 WebSearch:通过 launchctl 注入 Exa / Parallel 环境变量


在使用 OpenCode Desktop 时,我遇到一个比较影响体验的问题:Agent 可以使用 webfetch,但没有 websearch 能力。

这会导致一个很明显的差异:

  • webfetch 更适合“已经知道 URL,然后读取页面”。
  • websearch 才适合“我只给出问题,让 Agent 自己去互联网搜索资料”。

如果没有 websearch,很多本来应该类似 Codex 的使用方式,会变成手动找链接再让 OpenCode Fetch,不仅麻烦,而且 webfetch 还可能遇到 Cloudflare、反爬、网络代理等问题。

问题现象

OpenCode Desktop 中直接询问 Agent 当前可用工具时,它明确表示没有 websearch。

即使在 opencode.json 中配置:

{
  "permission": {
    "websearch": "allow"
  }
}

也不能解决问题。

原因是 permission.websearch = allow 只代表:

如果 websearch 工具已经注册,则允许 Agent 调用。

它本身并不会创建或者启用 websearch 工具。

最终有效的解决方案

在 macOS 终端执行:

launchctl setenv OPENCODE_ENABLE_EXA 1
launchctl setenv OPENCODE_ENABLE_PARALLEL 1

然后使用 ⌘Q 完全退出 OpenCode Desktop,再重新启动。

实际验证后,这两条命令可以让 OpenCode Desktop 获得 WebSearch 能力。

为什么使用 launchctl,而不是 export

平时在终端里设置环境变量,经常会这样写:

export OPENCODE_ENABLE_EXA=1

但这种方式通常只会影响:

当前 Shell
  ↓
由这个 Shell 启动的子进程

而 OpenCode Desktop 通常是从 Dock、Finder 或 Spotlight 启动的 GUI App,它并不是当前 Terminal 的子进程,因此未必能读取终端中的 export 环境变量。

launchctl setenv 则是把环境变量设置到 macOS 当前登录会话的 launchd 环境中,使后续启动的 GUI 应用也能读取:

macOS launchd
  ↓
OPENCODE_ENABLE_EXA=1
OPENCODE_ENABLE_PARALLEL=1
  ↓
OpenCode Desktop
  ↓
注册 WebSearch 工具

这也是为什么对 Desktop 应用来说,launchctl setenv 比单纯 export 更合适。

检查环境变量是否生效

可以执行:

launchctl getenv OPENCODE_ENABLE_EXA
launchctl getenv OPENCODE_ENABLE_PARALLEL

正常情况下应该分别输出:

1
1

然后彻底重启 OpenCode Desktop。

可以让 Agent 直接测试:

搜索一下 OpenCode 最近有哪些更新,不要使用 webfetch。

如果工具调用列表中出现 websearch,说明已经生效。

如何取消

如果以后不再需要,可以执行:

launchctl unsetenv OPENCODE_ENABLE_EXA
launchctl unsetenv OPENCODE_ENABLE_PARALLEL

再重新启动 OpenCode Desktop。

WebSearch 和 WebFetch 应该怎么分工

开启 WebSearch 后,更合理的 Agent 网络访问流程应该是:

用户提出问题
    ↓
WebSearch 搜索互联网
    ↓
获得候选结果 / URL
    ↓
挑选可信来源
    ↓
WebFetch 阅读具体页面
    ↓
整理答案

而不是:

用户提出问题
    ↓
模型猜一个 URL
    ↓
WebFetch
    ↓
失败后继续猜 URL

因此二者不是替代关系:

工具适合场景
websearch不知道具体页面,需要在互联网中发现信息
webfetch已经知道 URL,需要读取页面正文

对于 Cloudflare、登录态、强动态网页等情况,即使有 websearch,后续的 webfetch 仍可能失败。这类场景再考虑 Playwright / Browser MCP 更合适,不需要把浏览器工具作为所有搜索请求的默认方案。

最终配置

我目前实际有效的配置就是:

launchctl setenv OPENCODE_ENABLE_EXA 1
launchctl setenv OPENCODE_ENABLE_PARALLEL 1

设置后完全退出并重新启动 OpenCode Desktop,即可获得更接近 Codex 的“Agent 自己搜索互联网”的体验。

这次排查最重要的经验是:Desktop GUI 应用的环境变量和 Terminal Shell 的环境变量不是一回事。遇到 CLI 能生效、Desktop 不生效的问题时,优先检查 GUI 进程到底继承了哪一层环境变量。