CLIProxyAPI works without bans using hardcoded darwin/arm64 in the
Antigravity User-Agent. Real Antigravity is a macOS desktop tool —
reporting the actual server OS (linux/amd64 on a VPS) is MORE
suspicious than always claiming darwin/arm64. Matches proven
production fingerprint.
Matches the Antigravity executor treatment:
- Dynamic User-Agent: GeminiCLI/0.31.0/MODEL (OS; ARCH) per-model
- X-Goog-Api-Client: maintained (was already correct)
- Header scrubbing: removes proxy/fingerprint headers
- Sensitive word obfuscation in user message content
- Tracks current model for per-request UA generation
Brings the Antigravity executor to parity with CLIProxyAPI and
ZeroGravity for Gemini/Google traffic handling.
New modules:
- antigravityHeaderScrub.ts: Removes 28 proxy/fingerprint/Chromium
headers that reveal non-native traffic. Sets Accept-Encoding to
'gzip, deflate, br' (Node.js default).
- antigravity429Engine.ts: 4-tier 429 classification (unknown,
rate_limited, quota_exhausted, soft_rate_limit) with nuanced
retry decisions (soft_retry, instant_retry, short_cooldown,
full_quota_exhausted). Per-auth credits failure tracking with
auto-disable after 3 failures (5h cooldown).
- antigravityCredits.ts: Google One AI credits injection — retries
quota_exhausted 429s with enabledCreditTypes: ['GOOGLE_ONE_AI'].
Enabled via ANTIGRAVITY_CREDITS=1 env var.
- antigravityHeaders.ts: Dynamic User-Agent from OS/arch
(antigravity/1.21.9 darwin/arm64), Gemini CLI UA per-model
(GeminiCLI/0.31.0/MODEL (OS; ARCH)), X-Goog-Api-Client header
(google-genai-sdk/1.41.0 gl-node/v22.19.0).
- antigravityObfuscation.ts: Sensitive word obfuscation using
zero-width joiners for 17 client names (matching ZeroGravity).
Updated antigravity.ts:
- Dynamic UA replaces hardcoded 'antigravity/1.104.0 darwin/arm64'
- X-Goog-Api-Client header added (was missing entirely)
- Header scrubbing on all outbound requests
- 4-tier 429 engine replaces 2-category classification
- Google One AI credits retry on quota_exhausted
- Sensitive word obfuscation in user message content
Updated mask-email.test.mjs and model-sync-route.test.mjs to match
the revised maskEmail function that preserves full domain names for
account differentiation (die********@gmail.com vs old di*********@g****.com).
- CHANGELOG: documented 33 new API Key providers (DeepInfra, SambaNova, Meta Llama API, AI21 Labs, Databricks, Snowflake, GigaChat, etc.)
- README: updated tagline, unified endpoint, and feature descriptions from 60+ to 100+
- AGENTS.md: updated project description and full API Key provider list (48+ → 91)
- ARCHITECTURE.md: updated executive summary
- i18n: synced all 33 language README and ARCHITECTURE files
- Add emailPrivacyStore (Zustand + persist) for global toggle state
- Add EmailPrivacyToggle component with eye open/closed icons
- Add pickDisplayValue() visibility-aware masking function
- Integrate toggle into provider detail, usage limits & playground pages
- Per-modal showEmail now uses global store (synced across all pages)
- Default: emails hidden; toggle persists across page reloads
- Add showEmails/hideEmails i18n keys
- Update CHANGELOG.md and openapi.yaml to v3.6.2