解决「终端 opencode 能正常与 AI 对话,但 IDE 插件报错
Error from provider (Console): Upstream request failed: Endpoint is unavailable.」的问题。
现象:终端直接输入 opencode 可以正常对话;在 IDE(VSCode 等)的 opencode 插件里对话报 Endpoint is unavailable。
根因(三层):
opencode serve 子进程,该子进程只继承 IDE 进程的环境变量,不继承终端环境。~/.zshrc / ~/.bashrc,只读取系统 launchd 会话级环境。OPENAI_BASE_URL 等在 IDE 插件子进程里全部缺失 → 插件连不上模型端点 → 报错。一句话:终端能用的变量,IDE 插件读不到。
把 ~/.zshrc 中 opencode 需要的关键环境变量,提升到系统 GUI 会话级(launchctl setenv),并加一个 LaunchAgent 开机自动注入。这样任何 IDE(VSCode / Cursor / Windsurf …)只要在变量注入后启动,其插件子进程都能读到,与终端环境一致,无需逐个 IDE 配置。
编辑 ~/.zshrc,文件末尾追加:
# === 系统代理(供 IDE 插件后台子进程读取) ===
# START PROXY
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export ALL_PROXY=socks5://127.0.0.1:7890
# opencode 官方要求:本地 server 连接必须绕过代理,防止路由循环
export NO_PROXY=localhost,127.0.0.1
# END PROXY使其生效:
source ~/.zshrc端口 7890 是 *** 系代理客户端的默认混合端口,请按你的实际代理端口修改。
launchctl setenv HTTP_PROXY "http://127.0.0.1:7890"
launchctl setenv HTTPS_PROXY "http://127.0.0.1:7890"
launchctl setenv ALL_PROXY "socks5://127.0.0.1:7890"
launchctl setenv NO_PROXY "localhost,127.0.0.1"
launchctl setenv OPENAI_BASE_URL "https://ai.tokencloud.ai" # 按需验证:
launchctl getenv HTTP_PROXY关键点:launchctl setenv 只对之后新启动的 GUI 应用生效;正在运行的旧应用不继承,需要完全退出重开。
新建文件 ~/Library/LaunchAgents/com.user.opencode-env.plist,内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.opencode-env</string>
<key>ProgramArguments</key>
<array>
<string>/bin/zsh</string>
<string>-lc</string>
<string>source ~/.zshrc 2>/dev/null; launchctl setenv HTTP_PROXY "$HTTP_PROXY"; launchctl setenv HTTPS_PROXY "$HTTPS_PROXY"; launchctl setenv ALL_PROXY "$ALL_PROXY"; launchctl setenv NO_PROXY "$NO_PROXY"; launchctl setenv OPENAI_BASE_URL "$OPENAI_BASE_URL";</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>加载自启任务:
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.user.opencode-env.plist该任务每次登录时自动从 ~/.zshrc 读取最新值并注入 GUI 会话。以后修改 .zshrc 的代理值即可,无需改 plist。
Cmd+Q,不是关窗口),再重新打开。opencode,在插件设置里把 binaryPath 指向 ~/.opencode/bin/opencode,或确保 opencode 在系统 PATH。# 1. 验证终端变量
source ~/.zshrc && echo $HTTP_PROXY
# 2. 验证 GUI 会话变量(对之后启动的 GUI 应用生效)
launchctl getenv HTTPS_PROXY
# 3. 验证自启任务已加载
launchctl list | grep opencode-env# 1. 卸载自启任务并删除文件
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.user.opencode-env.plist
rm ~/Library/LaunchAgents/com.user.opencode-env.plist
# 2. 清除 GUI 会话变量
launchctl unsetenv HTTP_PROXY
launchctl unsetenv HTTPS_PROXY
launchctl unsetenv ALL_PROXY
launchctl unsetenv NO_PROXY
launchctl unsetenv OPENAI_BASE_URL
# 3. 删除 ~/.zshrc 里的 # START PROXY 段(含 NO_PROXY)127.0.0.1 通信,必须绕过代理,否则形成路由循环。provider (Console) 的话:可能是 opencode 的 "Console" provider 服务端临时故障(2026-08-26 已有大量用户反馈同样报错),在插件模型选择器里手动切换到 opencode/* 模型即可;或等待 opencode 修复。