發(fā),把CC Switch的Codex接入遠(yuǎn)程服務(wù)器)
1. 本地 CC Switch 管 Codex 時遠(yuǎn)程服務(wù)器請求為什么總打不通先說清楚這篇要解決的具體問題。CC Switch 是一個本地模型路由工具它能在你本機起一個轉(zhuǎn)發(fā)服務(wù)把 Codex、Claude Code 這類命令行工具的請求統(tǒng)一收口再按你配置的渠道分發(fā)出去。很多人本地用得好好的一旦把 Codex 裝到遠(yuǎn)程開發(fā)機上請求就發(fā)不出去了——因為遠(yuǎn)程服務(wù)器上的 Codex 默認(rèn)會去連127.0.0.1的某個端口而那個端口在服務(wù)器上根本沒人監(jiān)聽真正在跑路由的是你本地電腦上的 CC Switch。這就是典型的「本地有服務(wù)、遠(yuǎn)程要調(diào)用」場景。你有一臺遠(yuǎn)程開發(fā)機云主機、公司內(nèi)網(wǎng)跳板機、實驗室服務(wù)器都算日常在服務(wù)器上跑代碼、跑 Agent但模型入口想統(tǒng)一走本地 CC Switch 管理好處是 Key 只存在本地、渠道切換只改一處、用量和日志都集中。問題在于遠(yuǎn)程服務(wù)器和你的本地電腦之間沒有直接可達(dá)的端口通道Codex 發(fā)出的請求到不了 CC Switch。SSH 端口轉(zhuǎn)發(fā)就是補這條通道的工具。它不需要你改動服務(wù)器防火墻也不需要把 CC Switch 暴露到公網(wǎng)而是借助你已經(jīng)建立的 SSH 連接把遠(yuǎn)程服務(wù)器上的某個本地端口「反向」映射回你本機的服務(wù)端口。這樣服務(wù)器上訪問127.0.0.1:15721實際流量會順著 SSH 隧道回到你電腦的127.0.0.1:15721也就是 CC Switch 的路由地址。適合誰看手上有遠(yuǎn)程開發(fā)機、已經(jīng)在本地用 CC Switch 管 Codex、希望遠(yuǎn)程也能復(fù)用同一套模型入口的開發(fā)者。整篇按「先打通隧道 → 再配 CC Switch → 再填 Codex → 最后驗證」的順序走每一步都給可復(fù)制的命令和配置。核心檢索詞就是 SSH 端口轉(zhuǎn)發(fā)、CC Switch、Codex、遠(yuǎn)程服務(wù)器下面所有操作都圍繞這幾個點展開。需要提前說明一點SSH 端口轉(zhuǎn)發(fā)走的是你自己已有的 SSH 登錄鏈路屬于標(biāo)準(zhǔn)的遠(yuǎn)程開發(fā)手段和任何網(wǎng)絡(luò)規(guī)避工具無關(guān)。你只是把本機服務(wù)通過加密連接共享給遠(yuǎn)程機器流量始終在你自己的兩臺設(shè)備之間。2. 前置準(zhǔn)備CC Switch 路由地址、TaoToken Key 與遠(yuǎn)程環(huán)境確認(rèn)動手之前先把三樣?xùn)|西確認(rèn)好不然后面配到一半發(fā)現(xiàn)缺東西會很煩。第一樣是 CC Switch 的本地路由地址。打開 CC Switch進入設(shè)置里的路由本地路由頁面默認(rèn)服務(wù)地址是127.0.0.1:15721。這個端口號要記牢后面 SSH 隧道命令和 Codex 配置都要用它。如果你的 CC Switch 改過端口以實際顯示為準(zhǔn)。確認(rèn)這個服務(wù)處于運行狀態(tài)本地瀏覽器或 curl 能訪問到它。第二樣是模型渠道的 Key 和 Base URL。CC Switch 本身是路由層真正提供模型能力的是你導(dǎo)入的渠道。如果你還沒有可用的渠道可以到 TaoToken 控制臺創(chuàng)建一個 API Key地址是 https://taotoken.net/api-keys 創(chuàng)建后復(fù)制保存。對應(yīng)的接入文檔在 https://taotoken.net/doc 里面有 Base URL 和模型 ID 的說明。TaoToken 的 API 入口是 https://taotoken.net/api 配置時 Base URL 填這個即可。想先驗證模型是否通可以用模型對話頁面 https://taotoken.net/models 發(fā)一條測試消息確認(rèn) Key 有效再往下走。第三樣是遠(yuǎn)程服務(wù)器的環(huán)境。你需要能 SSH 登錄上去并且服務(wù)器上已經(jīng)裝了 Codex 相關(guān)插件或 CLI。如果還沒裝先在服務(wù)器上把 Codex 裝好裝完先別急著配因為默認(rèn)配置連不上我們要先把隧道打通。這里有個概念要理清CC Switch 跑在你本地Codex 跑在遠(yuǎn)程。兩者之間靠 SSH 反向轉(zhuǎn)發(fā)連接。所謂「反向」是指轉(zhuǎn)發(fā)方向由遠(yuǎn)程指向本地——在 SSH 連接建立時由遠(yuǎn)程服務(wù)器主動把它的某個端口映射到本地端口。這正好符合我們的需求遠(yuǎn)程的 Codex 訪問自己的127.0.0.1:15721流量被 SSH 帶回本地 CC Switch。把這三樣準(zhǔn)備好就可以進入配置環(huán)節(jié)了。下面先給 SSH 隧道命令再給 CC Switch 和 Codex 的填寫位置。3. 可復(fù)制配置SSH RemoteForward 隧道 CC Switch 與 Codex 填寫這一步是全文的核心配置對了后面就順。分三小塊SSH 隧道、CC Switch 側(cè)、Codex 側(cè)。3.1 SSH 隧道RemoteForward 反向轉(zhuǎn)發(fā)最直接的方式是在 SSH 命令里加-R參數(shù)。假設(shè)你的遠(yuǎn)程服務(wù)器在 SSH config 里叫devbox本地 CC Switch 監(jiān)聽127.0.0.1:15721那么登錄命令寫成ssh -R 127.0.0.1:15721:127.0.0.1:15721 devbox-R的格式是遠(yuǎn)程監(jiān)聽地址:遠(yuǎn)程端口:本地目標(biāo)地址:本地目標(biāo)端口。這條命令的意思是在遠(yuǎn)程服務(wù)器上監(jiān)聽127.0.0.1:15721把收到的流量轉(zhuǎn)發(fā)到本地的127.0.0.1:15721。登錄成功后隧道就建立了。但每次手動敲參數(shù)容易忘更好的做法是寫進 SSH config 文件。打開你本地的~/.ssh/config找到對應(yīng) Host 段落加上 RemoteForward 配置Host devbox HostName 192.0.2.10 User simon RemoteForward 127.0.0.1:15721 127.0.0.1:15721 ExitOnForwardFailure yes這里HostName和User換成你自己的服務(wù)器地址和用戶名。ExitOnForwardFailure yes很關(guān)鍵如果端口轉(zhuǎn)發(fā)失敗比如遠(yuǎn)程端口被占用SSH 會直接退出而不是靜默繼續(xù)這樣你能立刻發(fā)現(xiàn)問題而不是登錄成功卻發(fā)現(xiàn)隧道沒通。配好之后直接ssh devbox就會自動帶上轉(zhuǎn)發(fā)。注意如果遠(yuǎn)程服務(wù)器上15721端口已經(jīng)被別的進程占用SSH 會報remote port forwarding failed。這時要么換一個遠(yuǎn)程端口比如-R 127.0.0.1:25721:127.0.0.1:15721要么先查清占用進程。換端口的話Codex 側(cè)填的端口也要跟著改。3.2 CC Switch 側(cè)確認(rèn)路由與渠道CC Switch 這邊主要是確認(rèn)路由服務(wù)在跑、渠道已導(dǎo)入。進入設(shè)置 → 路由 → 本地路由確認(rèn)服務(wù)地址是127.0.0.1:15721狀態(tài)為運行中。然后在渠道管理里把你從 TaoToken 拿到的 Key 導(dǎo)入進去Base URL 填https://taotoken.net/api模型 ID 按文檔填你需要的那個。如果你用的是配置文件方式管理渠道CC Switch 的渠道配置大致是 JSON 結(jié)構(gòu)形如{ name: taotoken, base_url: https://taotoken.net/api, api_key: sk-你的Key, models: [你的模型ID] }具體字段名以你本地 CC Switch 版本為準(zhǔn)路徑一般在應(yīng)用配置目錄下。導(dǎo)入后CC Switch 會把所有渠道統(tǒng)一暴露在127.0.0.1:15721這個路由地址上Codex 只需要連這個地址不用關(guān)心背后是哪個渠道。3.3 Codex 側(cè)Base URL、Key、Model ID 三件套遠(yuǎn)程服務(wù)器上的 Codex 需要指向本地路由。Codex 的配置通常在~/.codex/config.toml或類似路徑核心是三個值Base URL、API Key、Model ID。Base URL 填http://127.0.0.1:15721注意是遠(yuǎn)程服務(wù)器視角的本地地址因為隧道已經(jīng)在服務(wù)器上監(jiān)聽了這個端口Key 填 CC Switch 路由要求的 Key如果 CC Switch 路由不校驗 Key可填任意占位符但建議按 CC Switch 文檔填Model ID 填你在 CC Switch 里配置的模型。一個 TOML 配置示例model 你的模型ID model_provider ccswitch [model_providers.ccswitch] name CC Switch Local Route base_url http://127.0.0.1:15721 api_key sk-你的Key如果你用的是 Codex 的auth.json方式管理憑據(jù)那對應(yīng)寫{ base_url: http://127.0.0.1:15721, api_key: sk-你的Key, model: 你的模型ID }三件套缺一不可Base URL 決定請求發(fā)到哪Key 決定能不能過鑒權(quán)Model ID 決定用哪個模型。任何一項填錯驗證階段都會報錯。填完保存準(zhǔn)備驗證。4. 驗證請求從遠(yuǎn)程服務(wù)器發(fā)一次對話確認(rèn)鏈路通配置寫完不代表通了必須實測。驗證分兩步先確認(rèn)隧道端口在遠(yuǎn)程服務(wù)器上確實被監(jiān)聽再從遠(yuǎn)程發(fā)一次真實請求。第一步在遠(yuǎn)程服務(wù)器上執(zhí)行ss -tlnp | grep 15721如果看到類似LISTEN 0 128 127.0.0.1:15721的輸出說明 SSH 反向轉(zhuǎn)發(fā)已經(jīng)生效服務(wù)器上有人在監(jiān)聽這個端口。如果沒有輸出說明隧道沒建起來回到第 3.1 節(jié)檢查 RemoteForward 配置和 SSH 登錄日志。第二步在遠(yuǎn)程服務(wù)器上直接 curl 本地路由確認(rèn)能拿到響應(yīng)curl -s http://127.0.0.1:15721/v1/models \ -H Authorization: Bearer sk-你的Key如果返回模型列表 JSON說明從遠(yuǎn)程到本地 CC Switch 的鏈路是通的。如果返回連接拒絕說明隧道斷了或 CC Switch 沒運行如果返回 401說明 Key 不對檢查 CC Switch 路由的鑒權(quán)配置。第三步用 Codex 本身發(fā)一次對話。在遠(yuǎn)程服務(wù)器上啟動 Codex輸入一句簡單的話比如「用一句話解釋什么是端口轉(zhuǎn)發(fā)」。觀察返回如果正常輸出內(nèi)容說明整條鏈路——遠(yuǎn)程 Codex → 遠(yuǎn)程 15721 → SSH 隧道 → 本地 CC Switch → TaoToken → 模型——全部打通。如果卡住或報錯看 Codex 的輸出日志通常會指出是連接問題還是鑒權(quán)問題。實測下來最容易出問題的是端口號和 Key 這兩處。端口號在 SSH 命令、CC Switch、Codex 三處必須一致Key 在 CC Switch 渠道和 Codex 配置兩處必須匹配。驗證通過后你以后每次ssh devbox登錄隧道會自動建立Codex 直接可用不用重復(fù)配置。5. 本篇常見錯排查401、remote port forwarding failed 與 reading choices配置過程中會碰到幾類典型報錯這里逐個對照排查。401 Unauthorized請求到了 CC Switch 但鑒權(quán)沒過。原因通常是 Codex 里填的 Key 和 CC Switch 路由要求的 Key 不一致。檢查兩處CC Switch 路由設(shè)置里的鑒權(quán) Key以及 Codex 配置里的api_key。如果 CC Switch 路由不校驗 Key也要確認(rèn)渠道本身的 Key 是有效的——渠道 Key 無效時CC Switch 轉(zhuǎn)發(fā)到上游會拿到 401最終透傳給 Codex。這時去 TaoToken 控制臺確認(rèn) Key 狀態(tài)必要時重新創(chuàng)建一個。remote port forwarding failed for listen port 15721SSH 登錄時報這個說明遠(yuǎn)程服務(wù)器上 15721 已被占用或者之前一條 SSH 連接的轉(zhuǎn)發(fā)沒釋放。先ssh devbox登錄后執(zhí)行ss -tlnp | grep 15721看誰占著如果是殘留的 sshd 轉(zhuǎn)發(fā)進程斷開舊連接再重連。實在沖突就換遠(yuǎn)程端口比如-R 127.0.0.1:25721:127.0.0.1:15721同時 Codex 的 Base URL 改成http://127.0.0.1:25721。local proxy failed / connection refusedCodex 報連接本地代理失敗。這通常是隧道沒建立或者 CC Switch 沒運行。先在遠(yuǎn)程ss -tlnp | grep 15721確認(rèn)監(jiān)聽存在再在本地確認(rèn) CC Switch 路由服務(wù)在跑。兩者缺一請求都到不了。reading choices 相關(guān)報錯這類錯誤一般出現(xiàn)在響應(yīng)解析階段說明請求已經(jīng)到達(dá)上游并返回了數(shù)據(jù)但格式不符合 Codex 預(yù)期。常見原因是 Model ID 填錯或者 CC Switch 渠道配置的模型和 Codex 請求的模型不匹配。檢查 Codex 配置里的model字段確保它在 CC Switch 渠道支持的模型列表里。如果 CC Switch 做了模型映射確認(rèn)映射關(guān)系正確。OAuth 相關(guān)報錯如果你用的是需要 OAuth 的渠道而 Codex 走的是 API Key 模式會報 OAuth 失敗。這種情況要么在 CC Switch 側(cè)把渠道切成 API Key 模式要么在 Codex 側(cè)按 OAuth 流程配置。多數(shù)本地路由場景用 API Key 就夠了不建議混用。排查順序建議固定先看隧道ss命令→ 再看 CC Switch本地 curl→ 再看 Key401 類→ 最后看模型 ID解析類。按這個順序走基本能定位到具體環(huán)節(jié)。6. 長期編碼與 Agent 場景把這條鏈路固定下來隧道打通、驗證通過之后接下來是讓它穩(wěn)定服務(wù)于日常開發(fā)。幾個實用建議。第一把 SSH config 里的 RemoteForward 和 ExitOnForwardFailure 保留這樣每次登錄自動建隧道不用記命令。如果你經(jīng)常開多個終端連同一臺服務(wù)器注意 SSH 復(fù)用ControlMaster場景下轉(zhuǎn)發(fā)只建一次重復(fù)登錄不會重復(fù)監(jiān)聽這是正常的。第二CC Switch 的渠道配置建議固定一個主渠道加一個備用渠道主渠道出問題時快速切換Codex 側(cè)不用改任何配置因為 Base URL 始終指向本地路由。這就是統(tǒng)一入口的價值遠(yuǎn)程機器上的工具配置一次之后渠道變更都在本地完成。第三如果你在遠(yuǎn)程跑的是長期編碼任務(wù)或 Agent建議把 Codex 配置和 SSH 隧道做成啟動腳本登錄后自動檢查端口監(jiān)聽狀態(tài)異常時給出提示。這樣即使隧道偶發(fā)斷開也能快速發(fā)現(xiàn)。第四Key 管理上本地 CC Switch 集中持有渠道 Key遠(yuǎn)程 Codex 只持有路由 Key這樣遠(yuǎn)程服務(wù)器上不落敏感憑據(jù)安全性更好。需要新增渠道時只改本地 CC Switch遠(yuǎn)程無感。對于需要長期跑 Agent、頻繁調(diào)用模型的場景可以了解下 Coding Plan 這類方案地址是 https://taotoken.net/coding-plan 適合把編碼類請求集中管理。日常驗證模型連通性用模型對話頁面 https://taotoken.net/models 接入文檔在 https://taotoken.net/doc 控制臺和 API Key 管理在 https://taotoken.net/console 和 https://taotoken.net/api-keys 。把這些入口理順本地 CC Switch 加 SSH 端口轉(zhuǎn)發(fā)的組合就能穩(wěn)定支撐遠(yuǎn)程開發(fā)機的模型調(diào)用需求。