Repository navigation
[Bug]: xAI Grok unusable on native Responses in 2.28.0 #2239
Description
Client or integration
Codex CLI
Area
Provider adapter
Summary
In OpenCodex 2.28.0, OAuth xai/grok-4.5 and xai/grok-4.6 became unusable on the native Responses route. #2147 moved those models off the Chat Completions compatibility wire onto openai-responses passthrough so Codex would not sit blank until reasoning finished (#1886). Chat translation had been sanitizing Codex-private wire extensions as a side effect; passthrough forwards the client's bytes, and xAI rejects the request before inference.
The conversation-killing case is the second turn: Codex replays a reasoning item with "content": null, and xAI returns HTTP 400 while mislabeling the field as a compaction blob. A first-turn namespace / private-tool catalog can 422 the same session before that.
I have already handled this (fix PRs #2217 and #2237). Please assign the issue to @olddonkey.
Reproduction
- Run OpenCodex 2.28.0 with Codex CLI on OAuth
xai/grok-4.5orxai/grok-4.6(native/v1/responses, no Chat Completions wire). - Start a new conversation with the default Codex 0.147+ tool catalog.
- First message is rejected (private
tools[].type = "namespace"/external_web_access). - After the catalog is lowered, send a second message so Codex replays the previous reasoning item with
"content": null.
Redacted second-request shape:
{
"model": "grok-4.6",
"input": [
{"role": "user", "content": "hello"},
{
"type": "reasoning",
"id": "rs_redacted",
"encrypted_content": "<intact grok blob>",
"content": null
},
{"role": "user", "content": "continue"}
]
}On a captured failing body: verbatim request → 400; removing only the content key → 200; removing encrypted_content → 400 schema error (blob was intact). Stripping content: null unconditionally repairs Grok and breaks OpenAI, which requires that field.
Version
2.28.0
Operating system
macOS
Provider and model
xai / grok-4.5, xai / grok-4.6
Logs or error output
HTTP 422
Argument not supported: external_web_access
{"code":"invalid-argument","error":"Could not decode the compaction blob. Ensure it is unmodified from the compact response."}The failing request often has no compaction item. xAI names the sibling field, not the null content channel that actually caused the 400.
Redacted configuration
{
"model": "xai/grok-4.6",
"route": "openai-responses",
"auth": "oauth"
}Checks
- I searched existing issues and documentation.
- I removed secrets, tokens, account details, request credentials, and personal data.
Activity
lidge-jun commentedon Aug 21, 2026
리뷰 · 우선순위 42 / 80
본문이 #2240이랑 같음. 제목 같음. 작성자
olddonkey같음. 재현이 네이티브 Responses Grok 2.28.0 첫 턴 namespace/external_web_access422·400, 두 번째 턴"content": null400. 그건 진짜 구멍임. 근데 트래킹은 #2240에 이미 붙음. 저자가 #2237 댓글이랑 #2240 댓글에 PR 표를 그쪽으로 연결함. 이쪽은 댓글 0개.지금
devHEAD78f1942a0가 그 회귀를 아직 안고 있음.modelWireDefaults가 grok-4.5/4.6 OAuth+responses를openai-responses로 박음 (src/providers/registry.ts:1030-1042).sanitizeReasoningInputContent(src/adapters/openai-responses.ts:42-80)가 null 채널을 통과시킴. 패스스루가 Codex private 확장을 그대로 보냄. Chat 번역이 예전에 곁다리로 닦아주던 거임. 그 분석은 #2240 리뷰에 있음.같은 이슈를 두 개 열어 두면 핫픽스 PR이 클로징 키워드를 어디에 걸지 헷갈림. #2217/#2237/#2228/#2229가 시퀀셜이라 이슈는 마지막까지 열려 있어야 함. 열린 게 두 개면 한쪽만 닫히고 나머지가 유령으로 남음. ㅋㅋ 그게 더 귀찮음.
#2217/#2227 와이어 싸움이랑 무관하게, 이 번호는 중복임. types.ts/config.ts 스플릿, #2188 사이드카, #2190
x_search다 여기 본문이 아님. 리베이스할 것도 없음. 닫을 중복 맞음.2.28 사용자 체감은 심각함. 그 점수는 #2240에 몰아라. 이쪽을 76으로 다시 세면 대시보드가 구멍 두 개로 보임. 아님.
해결방안: #2239 닫고 #2240 중복으로 표시. 핫픽스는 #2240만 트래킹. 클로징 키워드는 마지막 PR까지 넣지 말 것.
이 댓글은 grok-bot이 작성했습니다
olddonkey commentedon Aug 21, 2026
Duplicate of #2240. Same body from a retried after the first call created the issue and then failed on assignee permissions. Tracking stays on #2240.