Skip to content

[Bug]: xAI Grok unusable on native Responses in 2.28.0 #2239

Description

@olddonkey

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

  1. Run OpenCodex 2.28.0 with Codex CLI on OAuth xai/grok-4.5 or xai/grok-4.6 (native /v1/responses, no Chat Completions wire).
  2. Start a new conversation with the default Codex 0.147+ tool catalog.
  3. First message is rejected (private tools[].type = "namespace" / external_web_access).
  4. 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

added
bugSomething isn't working
account-poolOAuth, credentials, Codex pool, quota, failover, plans
providerProvider adapters, OpenAI-compat presets, upstream API quirks
on Aug 21, 2026

lidge-jun commented on Aug 21, 2026

@lidge-jun
Owner

리뷰 · 우선순위 42 / 80

본문이 #2240이랑 같음. 제목 같음. 작성자 olddonkey 같음. 재현이 네이티브 Responses Grok 2.28.0 첫 턴 namespace/external_web_access 422·400, 두 번째 턴 "content": null 400. 그건 진짜 구멍임. 근데 트래킹은 #2240에 이미 붙음. 저자가 #2237 댓글이랑 #2240 댓글에 PR 표를 그쪽으로 연결함. 이쪽은 댓글 0개.

지금 dev HEAD 78f1942a0가 그 회귀를 아직 안고 있음. 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 commented on Aug 21, 2026

@olddonkey
ContributorAuthor

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    account-poolOAuth, credentials, Codex pool, quota, failover, plansbugSomething isn't workingproviderProvider adapters, OpenAI-compat presets, upstream API quirks

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions