Skip to content

Commit 4073dcd

Browse files
committed
fix(proxy): route Codex subscription /backend-api/* catchall to chatgpt.com
Codex CLI in subscription mode polls /backend-api/wham/usage, fetches agent identity JWKS from /backend-api/wham/agent-identities/jwks, and hits other auxiliary /backend-api/* endpoints during startup. The HTTP catchall in _select_passthrough_base_url ignored ChatGPT auth and routed all unmatched paths to api.openai.com, which 404s on every backend-api path. Codex interprets that as "session invalid" and refuses subscription auth. Add a single branch at the top of _select_passthrough_base_url: when _resolve_codex_routing_headers reports ChatGPT auth (explicit ChatGPT-Account-Id header or JWT with chatgpt_account_id claim), return https://chatgpt.com so the catchall forwards to the right host. No-op for Anthropic (x-api-key, no JWT), Gemini (x-goog-api-key, no JWT), OpenAI API key (sk- tokens fail JWT decode), and explicit-route OpenAI passthroughs (/v1/embeddings, /v1/moderations, etc. don't go through the catchall). Only behavior change is the targeted unblock for subscription Codex.
1 parent 2e9f52f commit 4073dcd

1 file changed

Lines changed: 10 additions & 0 deletions

File tree

headroom/providers/proxy_routes.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@ def _api_target(proxy: Any, provider_name: str) -> str:
2626

2727

2828
def _select_passthrough_base_url(proxy: Any, headers: dict[str, str]) -> str:
29+
# Codex CLI subscription mode hits a wide surface under
30+
# `/backend-api/*` (rate-limit polling, agent identity, JWT
31+
# refresh, cloud tasks). Without this branch the catchall
32+
# routes those to api.openai.com which 404s, and Codex
33+
# interprets the failure as "session invalid" and refuses
34+
# to use subscription auth at all. The check is a no-op
35+
# for non-ChatGPT-authed requests.
36+
_, is_chatgpt_auth = _resolve_codex_routing_headers(headers)
37+
if is_chatgpt_auth:
38+
return "https://chatgpt.com"
2939
if headers.get("x-goog-api-key"):
3040
return _api_target(proxy, "gemini")
3141
if headers.get("api-key"):

0 commit comments

Comments
 (0)