Repository navigation
Conversation
Claude Code drops the Retry-After header and reports only the error message, so a client running through the proxy never learns when the cooldown ends. Append "(reset after <duration>)" to Claude-format 429 messages, from the pool cooldown or the upstream rate-limit reset. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: cd9785815f
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
Claude Fast 429s are written as the raw upstream body and skipped the reset suffix. Append it to that body's error.message too. Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2c1f3b9c59
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
A request interceptor can end a request with a Claude-format 429 whose reset lives only in its Retry-After header. Fall back to that header when the error carries no reset. Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
@codex review |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f95b1248d6
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
Reading Retry-After from a direct response's raw headers also picked up upstream Claude Fast values the rate-limit parser rejects. A terminating interceptor already writes its whole response, so drop the fallback and take the reset only from the error. This reverts commit f95b124. Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
@codex review |
|
Codex Review: Didn't find any major issues. Bravo. Reviewed commit: ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
Note 🤖 Agent responding on behalf of EhsanulHaqueSiam This is still needed on v8.0.56, but the branch no longer builds on The port is two lines: if message := ojson.GetBytesNoCopy(body, "error.message"); message.Type == ojson.String {
if updated, errSet := ojson.SetBytes(body, "error.message", fmt.Sprintf("%s (reset after %s)", message.String(), resetIn)); errSet == nil {and With that port on v8.0.56,
T3 Code already reads that suffix from a direct 429 (pingdotgg/t3code#25438, in current nightlies), which turns both results into a 3605 s reset. That makes auto-resume and snooze work for proxied Claude threads with no T3 change. Without this patch, T3 users report the missing reset in pingdotgg/t3code#26574. |
Note
From Claude (agent)
Claude Code drops
Retry-Afterand reports only the error message, so a client driving Claude Code through the proxy can't tell when a 429 clears. A model cooldown already computesreset_time, and an upstream Claude 429 carries the reset parsed from the rate-limit headers, but the Claude-format error keeps neither.toClaudeErrornow appends(reset after <duration>)to 429 messages when the error knows its reset: the pool cooldown'sRetry-After, or the upstream error'sRetryAfter(). The JSON response and the SSEevent: errorboth go through it. Other statuses, and 429s without a reset, are unchanged.Once every credential is cooling down, Claude Code now shows:
T3 Code reads this suffix to schedule an automatic resume at the reset: pingdotgg/t3code#25520
Tests:
TestClaudeErrorPutsRateLimitResetInMessagecovers the pool cooldown, an upstream limit withRetryAfter(), and a 429 without a reset; the first two fail without the change.go test ./sdk/api/handlers/claude/passes and./cmd/serverbuilds. The same patch on v8.0.3 is running locally behind Claude Code and returns the suffix on cooldown 429s.