Skip to content

fix: route default launch through proxy (fixes cost tracking and auth override) - #9

Draft
aattaran wants to merge 4 commits into
mainfrom
claude/reorganize-codebase-9TQvc
Draft

fix: route default launch through proxy (fixes cost tracking and auth override)#9
aattaran wants to merge 4 commits into
mainfrom
claude/reorganize-codebase-9TQvc

Conversation

@aattaran

@aattaran aattaran commented May 4, 2026

Copy link
Copy Markdown
Owner

Summary

  • deepclaude (default mode) previously set ANTHROPIC_BASE_URL directly to the upstream backend, bypassing the local proxy entirely
  • The proxy on :3200 was only ever started in --remote mode — so /_proxy/cost always showed {"backends":{}, "total_cost":0} and /switch had no effect in normal sessions
  • If the user was logged in via claude login (Claude Max/Pro subscription), the OAuth token wasn't intercepted, causing requests to fall back to Anthropic

Both deepclaude.sh and deepclaude.ps1 now start the proxy on a dynamic port and point ANTHROPIC_BASE_URL at it in all non-anthropic modes. The proxy already replaces auth headers in-flight for model calls, so subscription OAuth tokens and API keys are both handled correctly. ANTHROPIC_API_KEY is set to the backend key so Claude Code starts cleanly regardless of login state.

Closes #3

Test plan

  • deepclaude (no flags) — verify startup shows Proxy on :XXXX and Cost tracking: curl …
  • After a few turns, curl http://127.0.0.1:PORT/_proxy/cost shows non-zero tokens/cost
  • deepclaude --switch ds still works (proxy is in path)
  • deepclaude --backend anthropic still launches without proxy
  • deepclaude --remote still works unchanged

https://claude.ai/code/session_01FTqposuxzUQwueS9Zpa3ez


Generated by Claude Code

claude added 4 commits May 4, 2026 19:56
…erride

Previously `deepclaude` set ANTHROPIC_BASE_URL directly to the upstream
backend, bypassing the local proxy entirely. This meant:
- `/_proxy/cost` always showed {"backends":{}, "total_cost":0}
- `/switch` had no effect in default mode
- Claude subscription OAuth tokens weren't intercepted, causing fallback to Anthropic

Now both bash and PowerShell scripts start the proxy on a dynamic port and
point ANTHROPIC_BASE_URL at it in all non-anthropic modes. The proxy replaces
auth headers in-flight so subscription tokens and API keys are both handled.
ANTHROPIC_API_KEY is set to the backend key so Claude Code starts cleanly.

Fixes #3

https://claude.ai/code/session_01FTqposuxzUQwueS9Zpa3ez
…0x → 110x

ANTHROPIC_AUTH_TOKEN is Claude Code's OAuth subscription token, not the
API key — scripts now set ANTHROPIC_API_KEY. Cache ratio corrected:
$0.44 / $0.004 = 110x, not 120x.

https://claude.ai/code/session_01FTqposuxzUQwueS9Zpa3ez
@Lyapsus

Lyapsus commented May 28, 2026

Copy link
Copy Markdown

Any progress?

g-roliveira added a commit to g-roliveira/deepclaude that referenced this pull request Aug 6, 2026
…parity

Summary of fixes and features applied from aattaran/deepclaude
issues and PRs, plus original improvements:

Model coverage (Issue aattaran#39):
- Add claude-fable-5, claude-opus-5, claude-sonnet-5 to MODEL_REMAP
- Tier-based _default fallback (fable/opus/sonnet/haiku) so new
  Claude models degrade predictably instead of silently routing
  to the wrong backend
- Warning log when model is forwarded unmapped

Proxy resilience (PR aattaran#18):
- proxyRes error handler — upstream TCP reset mid-response no
  longer crashes the entire proxy process
- proxyReq error after headers-sent: destroy response instead of
  injecting JSON into the SSE stream (which corrupted the parser)

Thinking-block continuity (PR aattaran#24):
- Drop top-level thinking/context_management on non-Anthropic
  routes instead of stripping all thinking blocks from history
- Fixes DeepSeek 400: "content[].thinking must be passed back"

Proxy in normal mode (PR aattaran#9):
- Default launch now starts the proxy; cost tracking and live
  /switch work in all sessions, not just --remote
- Use ANTHROPIC_API_KEY instead of ANTHROPIC_AUTH_TOKEN so
  subscription OAuth tokens are handled correctly

Body size limit (PR aattaran#7):
- 50 MB cap on /v1/messages request body, returns 413

Forward unknown args to claude (Issue aattaran#25):
- Bash: -- separator support for explicit passthrough
- PowerShell: ValueFromRemainingArguments captures unknown flags

PowerShell parity (PR aattaran#5, aattaran#8):
- --switch/-s parameter with backend name normalization
- try/finally ensures proxy cleanup on Ctrl+C/crash

Model [1m] suffix:
- All model names include [1m] token window hint so Claude Code
  doesn't assume 200k context and auto-compact prematurely

Project documentation:
- CLAUDE.md with architecture overview, proxy routing, SSE
  normalization, model remapping, and development conventions
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Does not route through deepseek

3 participants