ChatGPT 訂閱
透過 LiteLLM 與 OAuth 裝置流程驗證使用 ChatGPT Pro/Max 訂閱模型。
| 屬性 | 詳細資料 |
|---|---|
| 描述 | 透過 ChatGPT 後端 API 存取 ChatGPT 訂閱(Codex + GPT-5.3/5.4 系列) |
| LiteLLM 上的提供者路由 | chatgpt/ |
| 支援的端點 | /responses、/chat/completions(對支援的模型橋接至 Responses) |
| API 參考 | https://chatgpt.com |
ChatGPT 訂閱存取原生支援 Responses API。Chat Completions 請求會針對支援的模型橋接至 Responses(例如 chatgpt/gpt-5.4)。
備註:
- ChatGPT 訂閱後端會拒絕 token 限制欄位(
max_tokens、max_output_tokens、max_completion_tokens)以及metadata。LiteLLM 會為此提供者移除這些欄位。 /v1/chat/completions會遵循stream。當stream為 false(預設)時,LiteLLM 會將 Responses 串流彙整為單一 JSON 回應。
驗證
ChatGPT 訂閱存取使用 OAuth 裝置代碼流程。LiteLLM Python SDK 會在第一次需要權杖時執行此流程,前提是它是從主執行緒上的同步腳本呼叫:它會印出驗證網址和裝置代碼,您開啟該網址、登入,並輸入代碼,接著權杖會儲存在 ~/.config/litellm/chatgpt/auth.json 供重複使用。非同步程式、notebook、工作執行緒以及 LiteLLM proxy 都無法回應該提示(較舊版本會在此處阻塞,較新版本則會以 ChatGPT device-code login needs a human 失敗),因此對於 proxy,您需要先登入並掛載產生的檔案,如 在啟動 proxy 前登入 所述。
使用方式 - LiteLLM Python SDK
Responses(Codex 模型建議使用)
import litellm
response = litellm.responses(
model="chatgpt/gpt-5.3-codex",
input="Write a Python hello world"
)
print(response)
Chat Completions(橋接至 Responses)
import litellm
response = litellm.completion(
model="chatgpt/gpt-5.4",
messages=[{"role": "user", "content": "Write a Python hello world"}]
)
print(response)
使用方式 - LiteLLM Proxy
在啟動 proxy 前登入
proxy 無法完成裝置代碼流程:它在工作程序中執行,沒有終端可用來傳遞代碼。當磁碟上沒有 auth.json 時,較舊版本會從工作程序印出代碼,並在每個 chatgpt/ 部署的啟動過程中保持等待,直到有人輸入為止(從前景終端機中,您可以對每個工作程序各做一次,而啟動會同時被暫停;從服務或容器記錄中則沒有人能做到),而較新版本則會拒絕初始化該部署,並在每個工作程序中針對每個部署記錄一次 ChatGPT device-code login needs a human and cannot run inside a running event loop or a worker thread。無論哪種情況,對這些模型的每個請求之後都會回傳 HTTP 400 There are no healthy deployments for this model。請先從終端機登入一次:
python -c "from litellm.llms.chatgpt.authenticator import Authenticator; Authenticator().get_access_token()"
開啟印出的網址、登入,並輸入代碼。權杖會落在 ~/.config/litellm/chatgpt/auth.json(CHATGPT_TOKEN_DIR 和 CHATGPT_AUTH_FILE 會變更位置);在放棄嘗試後的五分鐘內再次執行,會先等待該時間窗剩餘的時間,然後才會印出新的代碼。將檔案放在 proxy 主機上的相同路徑,或將 CHATGPT_TOKEN_DIR 設定為存放該檔案的目錄(litellm-non_root 映像檔以 uid 65534 執行,因此您 bind mount 進去的檔案必須由該 uid 擁有或可由其寫入,chown 65534 auth.json,否則第一次重新整理會因下方的寫入錯誤而失敗),之後才啟動 proxy:model_list 部署會在啟動時建立,因此在沒有該檔案的情況下啟動的 proxy,在檔案出現後需要重新啟動。
存取權杖大約可維持十天。當它過期時,proxy 會以重新整理權杖換取一組新的配對,並將其寫回 auth.json,而每個重新整理權杖只能使用一次,因此該檔案必須可寫入:唯讀複本會記錄 Failed to write ChatGPT auth file,並在第一次重新整理時停止運作。基於相同原因,每個 proxy 程序都必須共用同一份檔案。proxy 會在每個請求時重新讀取該檔案,因此無論哪個工作程序或 pod 先重新整理,就由它服務其餘請求;而分開的複本會在第一次重新整理時分歧,除了其中一個之外,其餘全部都會停止運作,直到您再次登入。兩個在同一時刻遇到到期的工作程序會同時嘗試使用相同的重新整理權杖,而失敗者會記錄 ChatGPT refresh token failed, re-login required:較新版本會讓那一個請求失敗,並在下一個請求時取得新的配對;較舊版本則會先讓該工作程序在裝置代碼輪詢中阻塞最長十五分鐘。
在 Kubernetes 上,請提供給 proxy 一份可在重新啟動後仍保留、且由所有複本共用的可寫檔案:將 PersistentVolumeClaim(ReadWriteMany 適用於多於一個複本)掛載到 CHATGPT_TOKEN_DIR,並在第一次卷空白時由 init container 從 Secret 進行播種。ReadWriteMany 需要支援它的儲存類別(GKE 上的 Filestore、EKS 上的 EFS、AKS 上的 Azure Files);預設磁碟類別僅限 ReadWriteOnce,而對其中之一的 claim 會保持 Pending,且每個複本都卡在 ContainerCreating。若只有這類儲存類別,請執行一個複本,或將所有複本固定在同一個節點上,在那裡 ReadWriteOnce volume 仍會由其上的每個 pod 共用。Secret volume 是唯讀的,而每個 pod 各自的 emptyDir 會在每次重新啟動時從原始登入重新播種,因此兩者都會在第一次重新整理時失效。proxy 會就地改寫檔案,而不是以原子方式寫入,因此若某個複本在另一個複本寫入途中讀取該檔案,會記錄 Invalid ChatGPT auth file,並表現得像根本沒有登入一樣:在啟動時,這會使部署降級,且該複本需要重新啟動;在請求時,下一個請求會重新讀取檔案。chown 會將檔案交給官方 litellm-non_root 映像檔所使用的使用者(65534);root 映像檔不需要 chown,自訂映像檔則會使用自己的 uid。在受限制的 pod security policy 下,若 init container 無法以 root 執行,請在 pod 上設定 fsGroup: 65534,使 volume 可由群組寫入,將 init container 以 runAsUser: 65534 執行,並移除 chown。init container 只會複製到空的 volume,因此在重新登入後,請更新 Secret,並在重新啟動 pods 前,從 volume 中刪除 auth.json(kubectl exec <pod> -c litellm -- rm /tokens/chatgpt/auth.json),否則它們會保留過時檔案並記錄 ChatGPT refresh token failed, re-login required。
kubectl create secret generic litellm-chatgpt-auth --from-file=auth.json=$HOME/.config/litellm/chatgpt/auth.json
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: litellm-chatgpt-tokens
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 1Mi
spec:
initContainers:
- name: chatgpt-token
image: busybox:1.37
command:
- sh
- -c
- "test -f /tokens/chatgpt/auth.json || cp /secrets/chatgpt/auth.json /tokens/chatgpt/auth.json && chown 65534 /tokens/chatgpt/auth.json"
volumeMounts:
- name: chatgpt-secret
mountPath: /secrets/chatgpt
readOnly: true
- name: chatgpt-tokens
mountPath: /tokens/chatgpt
containers:
- name: litellm
env:
- name: CHATGPT_TOKEN_DIR
value: /tokens/chatgpt
volumeMounts:
- name: chatgpt-tokens
mountPath: /tokens/chatgpt
volumes:
- name: chatgpt-secret
secret:
secretName: litellm-chatgpt-auth
- name: chatgpt-tokens
persistentVolumeClaim:
claimName: litellm-chatgpt-tokens
設定並啟動 proxy
model_list:
- model_name: chatgpt/gpt-5.4
model_info:
mode: responses
litellm_params:
model: chatgpt/gpt-5.4
- model_name: chatgpt/gpt-5.4-pro
model_info:
mode: responses
litellm_params:
model: chatgpt/gpt-5.4-pro
- model_name: chatgpt/gpt-5.3-codex
model_info:
mode: responses
litellm_params:
model: chatgpt/gpt-5.3-codex
- model_name: chatgpt/gpt-5.3-codex-spark
model_info:
mode: responses
litellm_params:
model: chatgpt/gpt-5.3-codex-spark
- model_name: chatgpt/gpt-5.3-instant
model_info:
mode: responses
litellm_params:
model: chatgpt/gpt-5.3-instant
- model_name: chatgpt/gpt-5.3-chat-latest
model_info:
mode: responses
litellm_params:
model: chatgpt/gpt-5.3-chat-latest
litellm --config config.yaml
設定
環境變數
CHATGPT_TOKEN_DIR:自訂權杖儲存目錄(預設:~/.config/litellm/chatgpt)CHATGPT_AUTH_FILE:驗證檔案名稱(預設:auth.json)CHATGPT_API_BASE:覆寫 API base(預設:https://chatgpt.com/backend-api/codex)OPENAI_CHATGPT_API_BASE:CHATGPT_API_BASE的別名CHATGPT_ORIGINATOR:覆寫originator標頭值CHATGPT_USER_AGENT:覆寫User-Agent標頭值CHATGPT_USER_AGENT_SUFFIX:附加到User-Agent標頭的可選尾碼