• keh4l's avatar
    feat(gateway): add billing attribution block with cc_version fingerprint · bebded28
    keh4l authored and 陈曦's avatar 陈曦 committed
    Real Claude Code CLI always sends a 2-block system array:
    
      [0] {"type":"text", "text":"x-anthropic-billing-header: cc_version=X.Y.Z.{fp}; cc_entrypoint=cli; cch=00000;"}
      [1] {"type":"text", "text":"You are Claude Code...", "cache_control":{...}}
    
    Before this commit, sub2api's mimicry path only produced block [1].
    The missing billing block is one of the primary third-party detection
    signals Anthropic uses for Claude-Code-scoped OAuth tokens.
    
    New file gateway_billing_block.go ports the fingerprint algorithm
    (byte-for-byte from Parrot cc_mimicry.py:compute_fingerprint):
    pick chars at positions [4,7,20] of the first user text, then
    `sha256(SALT + chars + cc_version)[:3]`.
    
      - claude/constants.go: CLICurrentVersion = "2.1.92" (must match UA)
      - gateway_billing_block.go: computeClaudeCodeFingerprint +
        buildBillingAttributionBlockJSON + extractFirstUserText
      - gateway_service.go: rewriteSystemForNonClaudeCode now emits both
        blocks in order; cch=00000 is filled in later by
        signBillingHeaderCCH in buildUpstreamRequest.
    
    Downstream compat note: syncBillingHeaderVersion's regex
    `cc_version=\d+\.\d+\.\d+` only matches the semver triple,
    leaving the `.{fp}` suffix intact when rewriting in buildUpstreamRequest.
    bebded28
constants.go 7.79 KB