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 进程到底继承了哪一层环境变量。