1. 远程服务器上跑 OpenCode 到底卡在哪:Antigravity 模型接入的真实场景
很多人第一次在远程服务器上装 OpenCode,目标很明确:把 Google Antigravity 模型接进来,让服务器上的编码助手能直接调用。OpenCode 本身是一个终端里的 AI 编码工具,能读代码、改文件、跑命令,适合放在长期在线的服务器上做自动化。而 opencode-antigravity-auth 这个插件,就是专门给 OpenCode 补上 Antigravity 模型鉴权和模型定义的。听起来链路很短,但真正动手时,问题往往不在安装,而在鉴权和网络回调。
我见过最多的场景是这样:你在本地笔记本上 SSH 连到一台云服务器,装好 OpenCode,装好插件,然后执行opencode auth login,终端卡住不动,或者浏览器打开一个http://localhost:51121的链接却显示无法访问。原因不复杂——OAuth 回调服务跑在远程服务器的 localhost 上,而你本地浏览器的 localhost 指向的是你自己的电脑,两者根本不是同一台机器。这个错位就是远程部署 OpenCode 接入 Antigravity 模型时最典型的坑。
另一个容易被忽略的点是统一 Key 通道。Antigravity 模型的鉴权如果每个环境都单独配一套,服务器、本地、CI 各一份,管理起来很乱。用 TaoToken 做统一 Key/API 通道,可以把鉴权入口收敛到一处,OpenCode 侧只需要指向同一个 Base URL 和 Key,模型 ID 保持一致即可。这样远程服务器上的配置和本地开发环境能对齐,排查问题时也少一层变量。
这篇内容面向的是已经在用或准备用远程服务器跑 OpenCode 的人,尤其是想接 Google Antigravity 模型、又不想在鉴权上反复折腾的开发者。接下来我会按真实操作顺序走一遍:先装 OpenCode 本体,再装 opencode-antigravity-auth 插件,然后处理远程 OAuth 的 SSH 端口转发,最后用 TaoToken 统一 Key 通道把配置固定下来,并给出验证请求和常见报错排查。每一步都有可复制的命令和配置片段,你可以直接照着做。
需要先明确一点:OpenCode 的插件机制依赖本体先装好,编辑器里的插件不能替代服务器端终端安装。所以无论你后续用什么编辑器远程连接,服务器终端里的opencode命令必须先能跑起来。这是后面所有步骤的前提。
2. TaoToken 统一 Key 通道前置准备:Base URL、API Key 与模型 ID 三件套
在动 OpenCode 配置之前,先把 TaoToken 这边的三件套准备好,后面所有配置文件都围绕这三个值展开。所谓三件套,就是 Base URL、API Key、Model ID。远程服务器部署 OpenCode 接入 Antigravity 模型时,只要这三个值对齐,鉴权链路就通了一大半。
Base URL 用https://taotoken.net/api,注意这个地址不带任何查询参数,直接作为 OpenAI 兼容接口的根路径使用。API Key 需要你在 TaoToken 控制台里生成,路径是 API Keys 页面。生成后复制出来,注意只显示一次,丢了就重新生成。Model ID 则填 Antigravity 对应的模型标识,具体名称以你账号下可用的模型列表为准,通常带 antigravity 后缀。
如果你还没生成 Key,可以先去控制台操作:
https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console生成 Key 的入口在 API Keys:
https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api-keys接入文档在这里,配置字段含义可以对照看:
https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=doc把这三个值先记在一个临时文本里,格式建议这样:
| 字段 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | 不带 UTM,作为接口根路径 |
| API Key | sk-你的实际Key | 控制台生成,只显示一次 |
| Model ID | antigravity 对应模型名 | 以账号可用列表为准 |
这里要提醒一句:不要把 API Key 直接写进会提交到 Git 的配置文件里。远程服务器上建议用环境变量或者单独的本地配置文件,权限设成 600。后面 OpenCode 的配置我会给出两种写法,一种直接写值方便调试,一种走环境变量更安全。
另外,TaoToken 的 Coding Plan 适合长期在服务器上跑编码任务的场景,如果你打算让 OpenCode 持续做 Agent 类工作,可以了解下:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-plan前置准备做完,接下来进入 OpenCode 本体的安装。顺序不能反:先本体,再插件,再鉴权,最后验证。每一步都有明确的成功标志,跟着走就不会乱。
3. 可复制配置:OpenCode 安装、opencode-antigravity-auth 插件与 opencode.json 片段
先在远程服务器终端里装 OpenCode 本体。官方安装脚本一行搞定:
curl -fsSL https://opencode.ai/install | bash装完验证版本:
opencode --version能输出版本号就说明本体 OK。如果提示 command not found,检查一下 shell 的 PATH,安装脚本一般会把二进制放到~/.opencode/bin或类似目录,重新 source 一下.bashrc或.zshrc即可。
接下来装 opencode-antigravity-auth 插件。推荐方式是在 OpenCode 交互界面里让它自己装。先启动:
opencode进入交互界面后,输入下面这段指令并回车:
Install the opencode-antigravity-auth plugin and add the Antigravity model definitions to ~/.config/opencode/opencode.json by following: https://raw.githubusercontent.com/NoeFabris/opencode-antigravity-auth/dev/README.md这一步会做两件事:自动安装插件,并把 Antigravity 的模型定义写进~/.config/opencode/opencode.json。装完后退出交互界面,检查配置文件是否存在:
cat ~/.config/opencode/opencode.json如果文件不存在,手动创建目录和文件:
mkdir -p ~/.config/opencode touch ~/.config/opencode/opencode.json然后写入下面这段配置。这是一个可复制的 JSON 片段,路径与原文一致,字段按 TaoToken 三件套填:
{ "$schema": "https://opencode.ai/config.json", "provider": { "taotoken": { "npm": "@ai-sdk/openai-compatible", "name": "TaoToken", "options": { "baseURL": "https://taotoken.net/api", "apiKey": "sk-你的实际Key" }, "models": { "antigravity": { "name": "Google Antigravity", "id": "antigravity" } } } }, "model": "taotoken/antigravity" }如果你不想把 Key 写死在文件里,改成环境变量引用:
{ "$schema": "https://opencode.ai/config.json", "provider": { "taotoken": { "npm": "@ai-sdk/openai-compatible", "name": "TaoToken", "options": { "baseURL": "https://taotoken.net/api", "apiKey": "{env:TAOTOKEN_API_KEY}" }, "models": { "antigravity": { "name": "Google Antigravity", "id": "antigravity" } } } }, "model": "taotoken/antigravity" }然后在服务器上设置环境变量,写进~/.bashrc或~/.zshrc:
export TAOTOKEN_API_KEY="sk-你的实际Key"重新加载:
source ~/.bashrc这里的三件套必须齐全:Base URL 是https://taotoken.net/api,API Key 是你的实际 Key,Model ID 是antigravity。缺任何一个,后面验证都会失败。配置写完后,先别急着登录,下一步处理远程 OAuth 的回调问题,这是远程服务器部署 OpenCode 最容易卡住的地方。
4. SSH 端口转发与验证请求:从 opencode auth login 到 Login successful
插件装好后,需要执行登录:
opencode auth login但在远程服务器上,这一步不能直接成功。原因是opencode auth login会在服务器本地启动一个 HTTP 回调服务,默认监听http://localhost:51121。你的本地浏览器访问不了远程服务器的 localhost,所以必须用 SSH 本地端口转发把两边接起来。
关键点:端口转发命令必须在你的本地电脑终端执行,不是在远程服务器上。打开本地终端,运行:
ssh -L 51121:localhost:51121 -p 22 user@服务器IP参数含义对照:
| 参数 | 说明 |
|---|---|
| 51121:localhost:51121 | 把本地 51121 端口转发到远程服务器的 51121 |
| -p 22 | SSH 端口,默认 22 可省略 |
| user@服务器IP | 服务器登录用户与地址 |
这条命令建立一条加密隧道,本地访问http://localhost:51121实际打到远程服务器的 OAuth 回调服务上。保持这个 SSH 会话不要关。
然后回到远程服务器终端,执行:
opencode auth login终端会提示打开浏览器进行登录,并给出一个http://localhost:51121开头的链接。把这个链接复制到本地浏览器打开,完成 Google OAuth 授权。回调请求会通过刚才的隧道到达远程服务器。当终端出现类似提示:
Login successful说明登录成功。如果浏览器打开链接后一直转圈,检查 SSH 隧道是否还在,以及本地 51121 端口有没有被其他程序占用。
登录完成后,重新进入 OpenCode:
opencode在交互界面输入/models,切换到带 antigravity 后缀的模型。然后发一条测试请求,比如让它解释一段代码。如果模型正常返回内容,说明整条链路通了。
为了更直接地验证 TaoToken 通道本身是否可用,可以绕过 OpenCode 先用 curl 打一次接口:
curl -s https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "antigravity", "messages": [{"role": "user", "content": "ping"}] }'预期返回里能看到choices字段和模型输出。如果这一步就报错,那问题在 Key 或 Base URL,不在 OpenCode。如果这一步通、OpenCode 里不通,问题在 opencode.json 的 provider 配置或模型 ID 上。分两段验证,排查范围会小很多。
5. 本篇常见错排查:401、local proxy failed、reading choices 与 OAuth 回调失败
远程服务器部署 OpenCode 接入 Antigravity 模型时,报错集中在几个固定位置。下面按真实报错对照排查。
401 Unauthorized。这个最常见,说明 Key 没被正确带上或已失效。先确认~/.config/opencode/opencode.json里apiKey字段的值,如果用了{env:TAOTOKEN_API_KEY},检查环境变量是否真的在当前 shell 里生效,echo $TAOTOKEN_API_KEY看有没有输出。再确认 Base URL 是https://taotoken.net/api,末尾不要多加斜杠或路径。如果 curl 直接打接口也 401,去控制台重新生成 Key。
local proxy failed。这个通常出现在 OAuth 登录阶段,说明本地到远程的端口转发没建立或已断开。检查本地终端里那条ssh -L 51121:localhost:51121命令是否还在运行,SSH 会话有没有超时断开。重新执行转发命令,再跑opencode auth login。另外确认本地 51121 端口没被占用,lsof -i :51121看一下。
reading choices 相关报错。这类错误一般出现在模型返回体解析阶段,说明请求发出去了但返回结构不符合预期。常见原因是 Model ID 填错,或者 provider 的npm字段不对。确认models里的id和model字段一致,都是antigravity。如果 TaoToken 账号下该模型名称不同,以实际可用列表为准替换。
OAuth 回调失败 / 浏览器无法访问 localhost:51121。回到端口转发这一步,确认命令是在本地电脑执行的,不是服务器上。确认-p后面的端口和服务器 SSH 端口一致。如果服务器 SSH 端口不是 22,必须显式写出来。授权完成后终端没出现Login successful,可以重跑一次opencode auth login,有时是回调超时。
插件装了但模型列表里没有 antigravity。检查~/.config/opencode/opencode.json是否真的写入了模型定义,cat出来看。如果文件被覆盖或格式错误,OpenCode 会静默忽略。JSON 格式要严格,逗号、引号都不能错。可以用python -m json.tool ~/.config/opencode/opencode.json校验一下。
Codex auth.json 或 Cline MCP 场景。如果你同时在用 Codex 或 Cline,注意它们的鉴权文件和 OpenCode 是分开的。Codex 的auth.json、Cline 的 MCP 配置里同样要写全三件套:Base URL、Key、Model ID。任何一处只写了两个,都会鉴权失败。CC Switch 切换配置时也要确认当前生效的是哪一套。
排查顺序建议固定:先 curl 验证 TaoToken 通道,再验证 OpenCode 配置,最后验证 OAuth 登录。三段分开,问题定位会快很多。
6. 稳定调用 Antigravity 模型的后续配置与 TaoToken 通道入口
链路跑通之后,还有几个让远程环境更稳的细节。第一,把 SSH 端口转发做成可复用的配置,写进本地~/.ssh/config:
Host myserver HostName 服务器IP User user Port 22 LocalForward 51121 localhost:51121之后直接ssh myserver就自动带上转发,不用每次敲长命令。第二,服务器上的TAOTOKEN_API_KEY环境变量建议写进 shell 配置文件并设权限,避免每次登录重新 export。第三,如果 OpenCode 要长期在服务器上跑 Agent 任务,考虑用 tmux 或 systemd 托管,断线不影响运行。
模型对话入口可以用来快速验证模型是否可用:
https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=models长期编码和 Agent 场景,Coding Plan 更合适:
https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding-planClaude Code 相关接入可以参考:
https://taotoken.net/claude-code?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=claudecode最后说一个我踩过的坑:远程服务器上 OpenCode 的配置文件路径是~/.config/opencode/opencode.json,但如果你用 sudo 或者切换了用户,这个路径会变。确认你当前登录用户和运行 OpenCode 的用户是同一个,否则配置写了也不生效。每次改完配置,重启一次 OpenCode 交互界面再测,别在旧会话里反复试。