ChatGPT API 呼叫逾時,不一定代表 API 服務故障,也不一定能靠切換 VPN 線路解決。請先分清楚問題發生在 DNS 解析、TCP 連線、TLS 交握、等待 API 回應,還是應用程式收到回應後的處理階段。網頁版與 API 使用的請求路徑、登入狀態及用量計費方式不同;網頁能正常開啟,不能單獨證明程式所在環境也能連到 API。
本文整理一套由外而內的排查流程:先確認官方服務資訊與帳戶狀態,再檢查用戶端路由、DNS、代理環境變數及逾時設定。VPN 可以改變程式流量經過的網路路徑,但不保證特定 API 一定可用,也不能取代對服務供應地區、使用條款與帳戶資格的確認。
先判斷逾時發生在哪個階段
「逾時」只是程式呈現的結果,不是根因。不同階段失敗,應採取的處理方式也不同。DNS 查詢失敗時,程式可能還沒連上伺服器;TCP 或 TLS 階段沒有完成,通常要檢查路由、防火牆、代理及系統時間;連線已建立但遲遲沒有回應,則要再看 API 服務狀態、請求內容、帳戶限制與程式設定。
DNS
網域名稱解析
TCP
建立傳輸連線
TLS
建立加密連線
HTTP
取得 API 回應
先保存完整錯誤內容,不要只記下介面上的「Request timed out」。留意日誌是否指出名稱解析錯誤、連線遭拒、TLS 憑證驗證失敗、讀取逾時,或收到 HTTP 狀態碼。若請求已取得 HTTP 回應,代表至少有一部分網路流程完成;此時應檢查回應本文、請求參數、授權狀態及用量,而不是一律更換 VPN 節點。
用同一個請求比較網路狀態
在允許使用 API 的網路及帳戶環境中,先使用相同程式、相同 API 金鑰與相同請求測試。接著只切換 VPN 連線狀態,再重複測試並比較錯誤階段。若 VPN 開啟後 DNS 或 TLS 才失敗,應檢查用戶端的 DNS、分流和代理設定;若兩種狀態都在收到回應後出現相同錯誤,則應優先查看 API 回應內容及帳戶設定。
網頁版和 API 不宜當成完全相同的測試目標。網頁版通常經由瀏覽器登入流程與網站前端,API 則由程式向 API 網域發出 HTTPS 請求,並使用 API 金鑰等授權方式。兩者在網路出口、瀏覽器代理、應用程式代理變數、帳戶權限與計費設定上都可能不同。因此,瀏覽器可以登入,只能說明該瀏覽器當時能使用網頁服務,不能證明命令列或伺服器程式的 API 請求也走同一條路徑。
檢查 VPN 路由、分流與 DNS
連線 VPN 後,先確認負責呼叫 API 的那個程序是否真的經過 VPN。桌面用戶端若啟用規則分流,瀏覽器可能走代理,但終端機、IDE、容器或背景服務仍走直連;也可能相反,只有部分網域被送進隧道。應檢查目前模式、規則命中結果與應用程式代理設定,並確認 API 網域沒有被誤設為直連或送往不相容的出口。
接著檢查 DNS。用戶端可能使用系統 DNS、隧道內 DNS 或自訂 DNS;不同解析路徑會造成同一網域在不同網路狀態下解析結果不同。不要只憑 IP 位址差異就判定遭到攔截,也不要把查到的單一 IP 寫死在程式中。服務端位址可能調整,固定 IP 會讓憑證驗證、負載平衡或後續連線出現問題。較穩妥的做法是確認網域名稱可正常解析,並讓 HTTPS 憑證驗證保持啟用。
若程式使用 HTTP 代理,請確認代理設定與 VPN 用戶端的接管方式沒有互相衝突。部分程式會讀取 HTTPS_PROXY、HTTP_PROXY 或 NO_PROXY 等環境變數;瀏覽器的代理設定不一定會自動套用到這些程序。切換網路後,重新啟動終端機、IDE、容器或服務程序,避免它們繼續使用舊的環境變數或連線池。
| 觀察到的現象 | 優先檢查 | 建議處理方式 |
|---|---|---|
| 網域名稱無法解析 | DNS 設定、分流規則、系統 DNS 快取 | 確認 API 網域由預期的 DNS 路徑解析,再重啟程式測試 |
| 連線或 TLS 交握失敗 | 代理環境變數、系統時間、憑證檢查、防火牆 | 核對代理出口與系統時間,不要停用憑證驗證來掩蓋錯誤 |
| 瀏覽器正常,命令列逾時 | 終端機是否走 VPN、命令列代理、容器網路 | 在實際執行 API 的環境中檢查路由與代理設定 |
| VPN 開啟後才出現問題 | 分流規則、DNS 模式、出口連線品質 | 一次只調整一項設定,使用相同請求重測並保留日誌 |
| 取得 API 錯誤回應 | 授權、請求格式、帳戶用量及服務狀態 | 依回應本文與官方說明處理,不要把所有 HTTP 錯誤都視為網路逾時 |
確認 API 請求、金鑰與帳戶狀態
請求格式錯誤、金鑰無效或帳戶用量受限,通常與 VPN 線路無關。先確認程式呼叫的是官方文件所列的 API 端點、使用的模型與參數目前仍受支援,並檢查請求本文是否符合該端點的格式。API 版本、模型名稱與功能可能變動,請以官方文件及帳戶控制檯顯示為準,不要直接複製很久以前的範例。
以下命令可作為 HTTPS 請求的基本檢查方式。請先在本機環境安全地設定 OPENAI_API_KEY,再執行測試;將模型欄位替換為帳戶可用且符合官方文件的值。命令列輸出可能包含請求與回應資訊,分享日誌前務必移除授權標頭、金鑰、個人資料及其他敏感內容。
curl -v https://api.openai.com/v1/responses \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"替換為可用模型","input":"連線測試"}'
檢查結果時,分辨「沒有收到 HTTP 回應」與「收到錯誤回應」很重要。若有 HTTP 狀態碼及回應本文,請先依官方文件解讀授權、參數、額度或速率限制相關訊息;若請求卡在連線或讀取階段,再回到網路路由與逾時設定排查。也要確認使用的金鑰屬於正確的專案或帳戶,且該帳戶的 API 用量與付款設定正常。ChatGPT 網頁版的方案狀態與 API 用量計費並非同一件事,不應只根據網頁版是否能使用來推斷 API 權限或餘額。
API 金鑰應放在環境變數或受控的密鑰管理工具中,不要寫進前端程式、公開程式碼、截圖或錯誤回報。若金鑰曾貼到公開位置,應依官方流程撤銷並更換,再檢查帳戶用量。除非確定是安全測試環境,也不要在除錯時把授權標頭完整輸出到可被其他人讀取的日誌。
調整逾時、重試與串流處理
應用程式的逾時通常至少涉及建立連線與等待回應兩類設定。連線逾時過短,可能在 DNS、TCP 或 TLS 尚未完成時就中止;讀取逾時過短,則可能在 API 正常處理較長請求期間提前放棄。不同語言、SDK 與 HTTP 用戶端的選項名稱不一致,應查閱目前所用版本的文件,並把逾時設定放在呼叫 API 的那一層,而不是隻調整瀏覽器或 VPN 用戶端。
不要把逾時無限制拉長作為唯一處理方式。過長的等待會讓工作程序、連線池或使用者介面長時間被佔用,也可能掩蓋網路故障。先根據應用程式的使用情境設定合理的連線與讀取期限,再記錄每次呼叫開始、連線完成、收到首段資料及結束的時間點。這些紀錄能幫助判斷延遲出現在網路建立、模型處理或回應下載階段。
重試時採取有上限的退避策略,並加入隨機抖動,避免大量請求在同一時間集中重送。對於暫時性網路錯誤或官方文件指出可重試的回應,可以在確認請求語意安全後重試;對於金鑰無效、參數錯誤或帳戶用量問題,重試通常不會修復根因。若請求可能已在服務端完成,但用戶端只是沒有收到回應,不要盲目重送可能產生重複副作用的操作;應先依端點支援方式處理請求識別與結果確認。
使用串流回應時,應區分「尚未收到第一段資料」與「串流途中中斷」。前者可能與連線路徑、服務端等待或讀取期限有關;後者還要檢查代理是否允許長時間連線、應用程式是否正確讀取事件串流,以及中間層是否提早關閉閒置連線。除錯期間可先使用非串流請求縮小問題範圍,再恢復串流模式逐項確認。
依序排查,避免把問題越改越複雜
測試時最好固定裝置、程式版本、請求內容與帳戶,只改變一個網路條件。先檢查官方服務狀態與使用地區資訊,再確認帳戶、金鑰及用量;接著在實際執行程式的環境中測試 DNS 與 HTTPS;最後才比較 VPN 開啟、關閉或不同分流設定的結果。若同時更換 VPN 線路、DNS、代理變數與 SDK 版本,即使問題消失,也很難知道真正原因。
- ✅ 以官方資訊確認 API 的服務狀態、支援地區與使用要求
- ✅ 保存錯誤階段、HTTP 回應及程式版本等必要診斷資訊
- ✅ 在命令列、容器或伺服器等實際執行環境檢查代理與路由
- ✅ VPN 每次只切換一項設定,並用相同請求進行比較
- ✅ 依 SDK 文件分別設定連線與讀取逾時,避免無限制等待
- ❌ 不要停用 TLS 憑證驗證或把 API 金鑰貼到公開除錯工具
- ❌ 不要把網頁版可登入,當成 API 權限、計費或連線正常的證明
- ❌ 不要用反覆重試取代對帳戶錯誤、請求格式與服務狀態的確認
如需切換線路作為診斷手段,應以穩定、符合所在地與服務規範的網路環境為前提。VPN 可能改善特定網路下的路由,也可能因 DNS、代理出口或傳輸限制增加新的變數;它不能保證解除服務限制,也不能替代官方支援地區與使用條款。若官方服務狀態正常、基本 HTTPS 連線可建立,但特定帳戶仍收到授權或用量錯誤,應依官方帳戶與 API 文件處理。