Skip to content

fix(anthropic): OAuth token endpoint UA must be axios/, not claude-code/ (login 429, #48534) - #57922

Closed
mssteuer wants to merge 1 commit into
NousResearch:mainfrom
mssteuer:fix/oauth-token-ua-axios-429
Closed

fix(anthropic): OAuth token endpoint UA must be axios/, not claude-code/ (login 429, #48534)#57922
mssteuer wants to merge 1 commit into
NousResearch:mainfrom
mssteuer:fix/oauth-token-ua-axios-429

Conversation

@mssteuer

@mssteuer mssteuer commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes #48534 (current regression). The OAuth token-exchange 429 is back: Anthropic has extended the same anti-abuse gate that once blocked claude-cli/ (404) to the claude-code/ UA prefix (429). The fix merged in #56263 (claude-cli/claude-code/) worked for ~2 weeks and is now blocked again.

hermes auth add anthropic fails 100% at token exchange on current main:

Token exchange failed: HTTP Error 429: Too Many Requests
Anthropic OAuth login did not return credentials.

Root cause

The three /v1/oauth/token call sites in agent/anthropic_adapter.py send User-Agent: claude-code/{ver} (external, cli). Anthropic now rate-limits (429) any token-endpoint request whose UA starts with claude-code/ — the Max-subscription-as-API-key anti-abuse net. It's prefix-based, not version-gated, so _CLAUDE_CODE_VERSION_FALLBACK bumps can't help (same shape as the original claude-cli/ finding in this issue).

The genuine Claude Code CLI exchanges the auth code with a bare axios client (axios/<ver>). Its claude-code/ + x-app: cli fingerprint is attached only to the inference path (/v1/messages), which is a separate code path and is not throttled there. The two endpoints have opposite UA requirements.

Empirical isolation (garbage code, nothing burned)

A 429 is applied before code validation, so the exchange can be probed with a throwaway code — 400 invalid_grant means the request was accepted and only the fake code rejected (a real code → 200):

User-Agent Result
claude-code/2.1.200 (external, cli) (current main) 429 rate_limit
claude-code/2.1.200 429 rate_limit
Mozilla/5.0 429 rate_limit
axios/1.7.9 400 invalid_grant ✅ reached validation
node / empty / Claude-User (claude-code/…) 400 ✅

Fix

Introduce _OAUTH_TOKEN_USER_AGENT = "axios/1.7.9" and apply it at all three token-endpoint call sites:

  • refresh_anthropic_oauth_pure (refresh POST)
  • build_anthropic_client OAuth refresh POST
  • run_hermes_oauth_login_pure (login exchange POST)

The inference path (build_anthropic_kwargs) is deliberately left untouched — it keeps user-agent: claude-code/{ver} (external, cli) + x-app: cli, which is required on /v1/messages and is not throttled there. Two endpoints, opposite UA requirements.

Tests

tests/agent/test_anthropic_oauth_ua_prefix.py is updated so the invariant now encodes the split instead of freezing a single UA string:

  • token endpoint UA must not start with claude-code/ (nor claude-cli/)
  • inference UA must still be claude-code/

Two _refresh_oauth_token tests that leaked the machine's live ~/.claude/.credentials.json (they never patched Path.home, so they adopted a real token instead of returning None) are isolated with monkeypatch.setattr("agent.anthropic_adapter.Path.home", lambda: tmp_path), matching the sibling test_successful_refresh.

tests/agent/test_anthropic_oauth_pkce.py
tests/agent/test_anthropic_oauth_ua_prefix.py
tests/agent/test_anthropic_adapter.py
→ 181 passed

Verified end-to-end

With the fix applied (inference UA untouched), hermes auth add anthropic completes:

Added anthropic OAuth credential #2: "anthropic-oauth-2"

Note for maintainers

This UA gate is a moving target on Anthropic's side (claude-cli/claude-code/ → now axios/ needed on the token endpoint). If it flips again, the diagnostic is: fire the exchange with a throwaway code and compare the HTTP status per-UA (429 = blocked, 400 = reached validation), then match whatever the current Claude Code CLI's OAuth client actually sends.

@alt-glitch alt-glitch added type/bug Something isn't working comp/agent Core agent runtime: loop, agent_init, prompt builder, context-compression, responses endpoint provider/anthropic Anthropic native Messages API area/auth Authentication, OAuth, credential pools P1 High — major feature broken, no workaround labels Jul 3, 2026
…in 429)

hermes auth add anthropic failed 100% with HTTP 429 at token exchange while
Claude Code /login succeeded through the same client_id/redirect/scope. The
discriminator is the User-Agent on the /v1/oauth/token request.

Empirically verified against platform.claude.com (garbage code, nothing burned):
  claude-code/2.1.200 (external, cli)  -> 429 rate_limit   (Hermes, blocked)
  claude-code/2.1.200                  -> 429 rate_limit
  Mozilla/5.0                          -> 429 rate_limit
  axios/1.7.9                          -> 400 invalid_grant (reached validation)
  node / empty / Claude-User (...)     -> 400 invalid_grant

Anthropic rate-limits token-endpoint requests whose UA starts with claude-code/
(the anti-abuse net for Max-sub-as-API-key). The real Claude Code CLI exchanges
the auth code with a bare axios client (axios/<ver>), NOT its claude-code/
inference UA. Hermes hardcoded claude-code/{ver} (external, cli) on all three
OAuth-token call sites (login exchange + two refresh paths) and tripped the net.

Fix: shared _OAUTH_TOKEN_USER_AGENT = 'axios/1.7.9' on the token endpoint only.
The INFERENCE client (build_anthropic_kwargs) KEEPS claude-code/ + x-app: cli —
that fingerprint is required there and is not throttled on /v1/messages.

Also (this commit): match Claude Code's authorize host (claude.com/cai) +
redirect_uri (platform.claude.com) + full scope; isolate two _refresh_oauth_token
tests from live ~/.claude creds; update UA regression tests to assert the
token endpoint uses a non-claude-code UA while inference still uses claude-code/.

Verified: Hermes' own request path now returns 400 (past the 429 wall) instead
of 429. 181 tests pass.

Post-update guard: carried commit + patch 0005.
@mssteuer
mssteuer force-pushed the fix/oauth-token-ua-axios-429 branch from ebaca44 to 77c9b9f Compare July 3, 2026 20:55
kshitijk4poor added a commit to kshitijk4poor/hermes-agent that referenced this pull request Jul 4, 2026
…in isolation)

Two review findings on the NousResearch#57922 salvage:

1. Stale inline comment at the login-exchange site still claimed the token
   endpoint uses the claude-code/ UA prefix and 404s claude-cli/ — now
   contradicts the axios/ fix. Repointed it at _OAUTH_TOKEN_USER_AGENT.

2. The inherited Path.home test isolation on the three TestRefreshOauthToken
   tests only stubbed the ~/.claude *file* source, not the macOS Keychain.
   _refresh_oauth_token re-reads read_claude_code_credentials() (keychain
   first) in its adopt-already-refreshed branch, so on any macOS dev/CI runner
   with real Claude Code creds the branch short-circuits and the 3 tests fail.
   Stub read_claude_code_credentials -> None so the tests are hermetic.

(The remaining TestResolveAnthropicToken/TestResolveWithRefresh/TestRunOauthSetupToken
failures on macOS are the same pre-existing keychain-leak class on origin/main,
unrelated to this OAuth-UA fix, and pass in CI — left out of scope.)
kshitijk4poor pushed a commit that referenced this pull request Jul 4, 2026
…in 429, #48534)

hermes auth add anthropic fails 100% at token exchange with HTTP 429 while
Claude Code /login succeeds through the same client_id/redirect/scope. The
discriminator is the User-Agent on the /v1/oauth/token request.

Verified live against platform.claude.com (throwaway code, nothing burned):
  claude-code/2.1.200 (external, cli)  -> 429 rate_limit   (Hermes, blocked)
  Mozilla/5.0                          -> 429 rate_limit
  axios/1.7.9                          -> 400 invalid_grant (reached validation)
  node / empty / SDK-style UAs         -> 400 invalid_grant

Anthropic now rate-limits token-endpoint requests whose UA starts with
claude-code/ (the anti-abuse net for Max-sub-as-API-key). This is the same
prefix-block shape that #48534 first hit on claude-cli/, then #56263 dodged by
switching to claude-code/ — which held ~2 weeks and is now blocked too. Bumping
_CLAUDE_CODE_VERSION_FALLBACK cannot help; the gate is prefix-based.

Fix: shared _OAUTH_TOKEN_USER_AGENT (axios/) on the token endpoint only — the
two refresh POSTs (refresh_anthropic_oauth_pure) and the login exchange POST
(run_hermes_oauth_login_pure). The real Claude Code CLI exchanges the auth code
with a bare axios client, NOT its claude-code/ inference UA.

The INFERENCE client (build_anthropic_kwargs, /v1/messages) is deliberately left
on claude-code/ + x-app: cli — that fingerprint is required there and is NOT
throttled on the messages API. Two endpoints, opposite UA requirements.

Also isolate two _refresh_oauth_token tests from live ~/.claude creds and update
the UA regression tests to assert the split (token endpoint uses a
non-claude-code UA while inference keeps claude-code/).

Verified E2E: Hermes' own login path now returns 400 (past the 429 wall)
instead of 429, using the real _OAUTH_TOKEN_USER_AGENT constant against the live
platform.claude.com token endpoint.

Salvaged from #57922 (authorize-host + scope changes dropped as non-load-bearing;
they only add a redirect hop back to claude.ai and the UA fix alone clears 429).
kshitijk4poor added a commit that referenced this pull request Jul 4, 2026
…in isolation)

Two review findings on the #57922 salvage:

1. Stale inline comment at the login-exchange site still claimed the token
   endpoint uses the claude-code/ UA prefix and 404s claude-cli/ — now
   contradicts the axios/ fix. Repointed it at _OAUTH_TOKEN_USER_AGENT.

2. The inherited Path.home test isolation on the three TestRefreshOauthToken
   tests only stubbed the ~/.claude *file* source, not the macOS Keychain.
   _refresh_oauth_token re-reads read_claude_code_credentials() (keychain
   first) in its adopt-already-refreshed branch, so on any macOS dev/CI runner
   with real Claude Code creds the branch short-circuits and the 3 tests fail.
   Stub read_claude_code_credentials -> None so the tests are hermetic.

(The remaining TestResolveAnthropicToken/TestResolveWithRefresh/TestRunOauthSetupToken
failures on macOS are the same pre-existing keychain-leak class on origin/main,
unrelated to this OAuth-UA fix, and pass in CI — left out of scope.)
@kshitijk4poor

Copy link
Copy Markdown
Collaborator

Thanks @mssteuer — your UA-split diagnosis was exactly right. Salvaged and merged via #58178.

I kept the load-bearing part of your fix (the axios/ User-Agent on the OAuth token endpoint, with the inference path deliberately left on claude-code/ + x-app: cli), and dropped the bundled authorize-host and scope changes as non-load-bearing:

  • The claude.com/cai/oauth/authorize URL just 307-redirects straight back to claude.ai/oauth/authorize with the same params, so it adds a redirect hop but no behavioral difference.
  • I verified live against platform.claude.com/v1/oauth/token (throwaway code) that the UA change alone — with the original console.anthropic.com redirect_uri and scopes — clears the 429 (axios/ → 400 invalid_grant, i.e. reached validation), so the scope expansion isn't required to fix the reported failure.

Your authorship is preserved in the merge (rebase). Follow-up commit fixed a stale inline comment and made the TestRefreshOauthToken isolation neutralize the macOS Keychain source too (your Path.home patch only covered the ~/.claude file source; _refresh_oauth_token re-reads the Keychain first).

Merged: #58178
Closes #48534.

habarmc1223-sudo pushed a commit to habarmc1223-sudo/hermes-agent-fluxmem that referenced this pull request Jul 8, 2026
…in 429, NousResearch#48534)

hermes auth add anthropic fails 100% at token exchange with HTTP 429 while
Claude Code /login succeeds through the same client_id/redirect/scope. The
discriminator is the User-Agent on the /v1/oauth/token request.

Verified live against platform.claude.com (throwaway code, nothing burned):
  claude-code/2.1.200 (external, cli)  -> 429 rate_limit   (Hermes, blocked)
  Mozilla/5.0                          -> 429 rate_limit
  axios/1.7.9                          -> 400 invalid_grant (reached validation)
  node / empty / SDK-style UAs         -> 400 invalid_grant

Anthropic now rate-limits token-endpoint requests whose UA starts with
claude-code/ (the anti-abuse net for Max-sub-as-API-key). This is the same
prefix-block shape that NousResearch#48534 first hit on claude-cli/, then NousResearch#56263 dodged by
switching to claude-code/ — which held ~2 weeks and is now blocked too. Bumping
_CLAUDE_CODE_VERSION_FALLBACK cannot help; the gate is prefix-based.

Fix: shared _OAUTH_TOKEN_USER_AGENT (axios/) on the token endpoint only — the
two refresh POSTs (refresh_anthropic_oauth_pure) and the login exchange POST
(run_hermes_oauth_login_pure). The real Claude Code CLI exchanges the auth code
with a bare axios client, NOT its claude-code/ inference UA.

The INFERENCE client (build_anthropic_kwargs, /v1/messages) is deliberately left
on claude-code/ + x-app: cli — that fingerprint is required there and is NOT
throttled on the messages API. Two endpoints, opposite UA requirements.

Also isolate two _refresh_oauth_token tests from live ~/.claude creds and update
the UA regression tests to assert the split (token endpoint uses a
non-claude-code UA while inference keeps claude-code/).

Verified E2E: Hermes' own login path now returns 400 (past the 429 wall)
instead of 429, using the real _OAUTH_TOKEN_USER_AGENT constant against the live
platform.claude.com token endpoint.

Salvaged from NousResearch#57922 (authorize-host + scope changes dropped as non-load-bearing;
they only add a redirect hop back to claude.ai and the UA fix alone clears 429).
habarmc1223-sudo pushed a commit to habarmc1223-sudo/hermes-agent-fluxmem that referenced this pull request Jul 8, 2026
…in isolation)

Two review findings on the NousResearch#57922 salvage:

1. Stale inline comment at the login-exchange site still claimed the token
   endpoint uses the claude-code/ UA prefix and 404s claude-cli/ — now
   contradicts the axios/ fix. Repointed it at _OAUTH_TOKEN_USER_AGENT.

2. The inherited Path.home test isolation on the three TestRefreshOauthToken
   tests only stubbed the ~/.claude *file* source, not the macOS Keychain.
   _refresh_oauth_token re-reads read_claude_code_credentials() (keychain
   first) in its adopt-already-refreshed branch, so on any macOS dev/CI runner
   with real Claude Code creds the branch short-circuits and the 3 tests fail.
   Stub read_claude_code_credentials -> None so the tests are hermetic.

(The remaining TestResolveAnthropicToken/TestResolveWithRefresh/TestRunOauthSetupToken
failures on macOS are the same pre-existing keychain-leak class on origin/main,
unrelated to this OAuth-UA fix, and pass in CI — left out of scope.)
santhreal pushed a commit to santhreal/hermes-agent that referenced this pull request Jul 13, 2026
…in 429, NousResearch#48534)

hermes auth add anthropic fails 100% at token exchange with HTTP 429 while
Claude Code /login succeeds through the same client_id/redirect/scope. The
discriminator is the User-Agent on the /v1/oauth/token request.

Verified live against platform.claude.com (throwaway code, nothing burned):
  claude-code/2.1.200 (external, cli)  -> 429 rate_limit   (Hermes, blocked)
  Mozilla/5.0                          -> 429 rate_limit
  axios/1.7.9                          -> 400 invalid_grant (reached validation)
  node / empty / SDK-style UAs         -> 400 invalid_grant

Anthropic now rate-limits token-endpoint requests whose UA starts with
claude-code/ (the anti-abuse net for Max-sub-as-API-key). This is the same
prefix-block shape that NousResearch#48534 first hit on claude-cli/, then NousResearch#56263 dodged by
switching to claude-code/ — which held ~2 weeks and is now blocked too. Bumping
_CLAUDE_CODE_VERSION_FALLBACK cannot help; the gate is prefix-based.

Fix: shared _OAUTH_TOKEN_USER_AGENT (axios/) on the token endpoint only — the
two refresh POSTs (refresh_anthropic_oauth_pure) and the login exchange POST
(run_hermes_oauth_login_pure). The real Claude Code CLI exchanges the auth code
with a bare axios client, NOT its claude-code/ inference UA.

The INFERENCE client (build_anthropic_kwargs, /v1/messages) is deliberately left
on claude-code/ + x-app: cli — that fingerprint is required there and is NOT
throttled on the messages API. Two endpoints, opposite UA requirements.

Also isolate two _refresh_oauth_token tests from live ~/.claude creds and update
the UA regression tests to assert the split (token endpoint uses a
non-claude-code UA while inference keeps claude-code/).

Verified E2E: Hermes' own login path now returns 400 (past the 429 wall)
instead of 429, using the real _OAUTH_TOKEN_USER_AGENT constant against the live
platform.claude.com token endpoint.

Salvaged from NousResearch#57922 (authorize-host + scope changes dropped as non-load-bearing;
they only add a redirect hop back to claude.ai and the UA fix alone clears 429).
santhreal pushed a commit to santhreal/hermes-agent that referenced this pull request Jul 13, 2026
…in isolation)

Two review findings on the NousResearch#57922 salvage:

1. Stale inline comment at the login-exchange site still claimed the token
   endpoint uses the claude-code/ UA prefix and 404s claude-cli/ — now
   contradicts the axios/ fix. Repointed it at _OAUTH_TOKEN_USER_AGENT.

2. The inherited Path.home test isolation on the three TestRefreshOauthToken
   tests only stubbed the ~/.claude *file* source, not the macOS Keychain.
   _refresh_oauth_token re-reads read_claude_code_credentials() (keychain
   first) in its adopt-already-refreshed branch, so on any macOS dev/CI runner
   with real Claude Code creds the branch short-circuits and the 3 tests fail.
   Stub read_claude_code_credentials -> None so the tests are hermetic.

(The remaining TestResolveAnthropicToken/TestResolveWithRefresh/TestRunOauthSetupToken
failures on macOS are the same pre-existing keychain-leak class on origin/main,
unrelated to this OAuth-UA fix, and pass in CI — left out of scope.)
Gravezzz pushed a commit to Gravezzz/hermes-agent that referenced this pull request Jul 21, 2026
…in 429, NousResearch#48534)

hermes auth add anthropic fails 100% at token exchange with HTTP 429 while
Claude Code /login succeeds through the same client_id/redirect/scope. The
discriminator is the User-Agent on the /v1/oauth/token request.

Verified live against platform.claude.com (throwaway code, nothing burned):
  claude-code/2.1.200 (external, cli)  -> 429 rate_limit   (Hermes, blocked)
  Mozilla/5.0                          -> 429 rate_limit
  axios/1.7.9                          -> 400 invalid_grant (reached validation)
  node / empty / SDK-style UAs         -> 400 invalid_grant

Anthropic now rate-limits token-endpoint requests whose UA starts with
claude-code/ (the anti-abuse net for Max-sub-as-API-key). This is the same
prefix-block shape that NousResearch#48534 first hit on claude-cli/, then NousResearch#56263 dodged by
switching to claude-code/ — which held ~2 weeks and is now blocked too. Bumping
_CLAUDE_CODE_VERSION_FALLBACK cannot help; the gate is prefix-based.

Fix: shared _OAUTH_TOKEN_USER_AGENT (axios/) on the token endpoint only — the
two refresh POSTs (refresh_anthropic_oauth_pure) and the login exchange POST
(run_hermes_oauth_login_pure). The real Claude Code CLI exchanges the auth code
with a bare axios client, NOT its claude-code/ inference UA.

The INFERENCE client (build_anthropic_kwargs, /v1/messages) is deliberately left
on claude-code/ + x-app: cli — that fingerprint is required there and is NOT
throttled on the messages API. Two endpoints, opposite UA requirements.

Also isolate two _refresh_oauth_token tests from live ~/.claude creds and update
the UA regression tests to assert the split (token endpoint uses a
non-claude-code UA while inference keeps claude-code/).

Verified E2E: Hermes' own login path now returns 400 (past the 429 wall)
instead of 429, using the real _OAUTH_TOKEN_USER_AGENT constant against the live
platform.claude.com token endpoint.

Salvaged from NousResearch#57922 (authorize-host + scope changes dropped as non-load-bearing;
they only add a redirect hop back to claude.ai and the UA fix alone clears 429).
Gravezzz pushed a commit to Gravezzz/hermes-agent that referenced this pull request Jul 21, 2026
…in isolation)

Two review findings on the NousResearch#57922 salvage:

1. Stale inline comment at the login-exchange site still claimed the token
   endpoint uses the claude-code/ UA prefix and 404s claude-cli/ — now
   contradicts the axios/ fix. Repointed it at _OAUTH_TOKEN_USER_AGENT.

2. The inherited Path.home test isolation on the three TestRefreshOauthToken
   tests only stubbed the ~/.claude *file* source, not the macOS Keychain.
   _refresh_oauth_token re-reads read_claude_code_credentials() (keychain
   first) in its adopt-already-refreshed branch, so on any macOS dev/CI runner
   with real Claude Code creds the branch short-circuits and the 3 tests fail.
   Stub read_claude_code_credentials -> None so the tests are hermetic.

(The remaining TestResolveAnthropicToken/TestResolveWithRefresh/TestRunOauthSetupToken
failures on macOS are the same pre-existing keychain-leak class on origin/main,
unrelated to this OAuth-UA fix, and pass in CI — left out of scope.)
leewenjie pushed a commit to leewenjie/hermes-agent that referenced this pull request Aug 7, 2026
…in 429, NousResearch#48534)

hermes auth add anthropic fails 100% at token exchange with HTTP 429 while
Claude Code /login succeeds through the same client_id/redirect/scope. The
discriminator is the User-Agent on the /v1/oauth/token request.

Verified live against platform.claude.com (throwaway code, nothing burned):
  claude-code/2.1.200 (external, cli)  -> 429 rate_limit   (Hermes, blocked)
  Mozilla/5.0                          -> 429 rate_limit
  axios/1.7.9                          -> 400 invalid_grant (reached validation)
  node / empty / SDK-style UAs         -> 400 invalid_grant

Anthropic now rate-limits token-endpoint requests whose UA starts with
claude-code/ (the anti-abuse net for Max-sub-as-API-key). This is the same
prefix-block shape that NousResearch#48534 first hit on claude-cli/, then NousResearch#56263 dodged by
switching to claude-code/ — which held ~2 weeks and is now blocked too. Bumping
_CLAUDE_CODE_VERSION_FALLBACK cannot help; the gate is prefix-based.

Fix: shared _OAUTH_TOKEN_USER_AGENT (axios/) on the token endpoint only — the
two refresh POSTs (refresh_anthropic_oauth_pure) and the login exchange POST
(run_hermes_oauth_login_pure). The real Claude Code CLI exchanges the auth code
with a bare axios client, NOT its claude-code/ inference UA.

The INFERENCE client (build_anthropic_kwargs, /v1/messages) is deliberately left
on claude-code/ + x-app: cli — that fingerprint is required there and is NOT
throttled on the messages API. Two endpoints, opposite UA requirements.

Also isolate two _refresh_oauth_token tests from live ~/.claude creds and update
the UA regression tests to assert the split (token endpoint uses a
non-claude-code UA while inference keeps claude-code/).

Verified E2E: Hermes' own login path now returns 400 (past the 429 wall)
instead of 429, using the real _OAUTH_TOKEN_USER_AGENT constant against the live
platform.claude.com token endpoint.

Salvaged from NousResearch#57922 (authorize-host + scope changes dropped as non-load-bearing;
they only add a redirect hop back to claude.ai and the UA fix alone clears 429).
leewenjie pushed a commit to leewenjie/hermes-agent that referenced this pull request Aug 7, 2026
…in isolation)

Two review findings on the NousResearch#57922 salvage:

1. Stale inline comment at the login-exchange site still claimed the token
   endpoint uses the claude-code/ UA prefix and 404s claude-cli/ — now
   contradicts the axios/ fix. Repointed it at _OAUTH_TOKEN_USER_AGENT.

2. The inherited Path.home test isolation on the three TestRefreshOauthToken
   tests only stubbed the ~/.claude *file* source, not the macOS Keychain.
   _refresh_oauth_token re-reads read_claude_code_credentials() (keychain
   first) in its adopt-already-refreshed branch, so on any macOS dev/CI runner
   with real Claude Code creds the branch short-circuits and the 3 tests fail.
   Stub read_claude_code_credentials -> None so the tests are hermetic.

(The remaining TestResolveAnthropicToken/TestResolveWithRefresh/TestRunOauthSetupToken
failures on macOS are the same pre-existing keychain-leak class on origin/main,
unrelated to this OAuth-UA fix, and pass in CI — left out of scope.)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/auth Authentication, OAuth, credential pools comp/agent Core agent runtime: loop, agent_init, prompt builder, context-compression, responses endpoint P1 High — major feature broken, no workaround provider/anthropic Anthropic native Messages API type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Anthropic Max OAuth fails: token exchange 404s because Anthropic now blocks the claude-cli/ User-Agent

3 participants