fix(oauth): send Codex client version header on upstream requests

Upstream gates newer models on a version header. Attach resolve_codex_version() when non-empty so completions match /models. Fixes #1765

axelray-dev committed Jul 16, 2026 at 03:44 UTC 01def8603ae9a3eecd3d1f50d9a1fa00bec3c54d
2 files changed +12 -1
plugins/_oauth/helpers/codex.py
+3
@@ -599,6 +599,9 @@ def request_codex(
599 "thread-id": metadata["thread_id"],
600 }
601 )
602 + client_version = resolve_codex_version()
603 + if client_version:
604 + request_headers["version"] = client_version
605
606 return requests.request(
607 method,
tests/test_oauth_codex.py
+9 -1
@@ -301,7 +301,10 @@ def test_prepare_responses_body_sends_empty_continuation_input_as_list(monkeypat
301 assert body["previous_response_id"] == "resp_1"
302
303
304 -def test_request_codex_sends_current_codex_headers_from_body(monkeypatch):
304 +@pytest.mark.parametrize("client_version", ["0.142.5", ""])
305 +def test_request_codex_sends_current_codex_headers_from_body(
306 + monkeypatch, client_version
307 +):
308 calls = []
309 body = json.dumps(
310 {
@@ -333,6 +336,7 @@ def test_request_codex_sends_current_codex_headers_from_body(monkeypatch):
336 account_id="account-1",
337 ),
338 )
339 + monkeypatch.setattr(codex, "resolve_codex_version", lambda: client_version)
340
341 def fake_request(method, target, headers, data, params, timeout, stream):
342 calls.append(
@@ -369,6 +373,10 @@ def test_request_codex_sends_current_codex_headers_from_body(monkeypatch):
373 assert call["headers"]["session-id"] == "session-1"
374 assert call["headers"]["thread-id"] == "thread-1"
375 assert call["headers"]["x-codex-window-id"] == "agent-zero"
376 + if client_version:
377 + assert call["headers"]["version"] == "0.142.5"
378 + else:
379 + assert "version" not in call["headers"]
380
381
382 def test_chat_messages_to_response_body_preserves_image_parts_for_responses():