首页
社区
课程
招聘
[原创]【技术分享】跨生态桥接:将 Claude Code 无缝接入 Google Antigravity订阅算力的反向代理架构实现
发表于: 2026-9-29 22:18 320

[原创]【技术分享】跨生态桥接:将 Claude Code 无缝接入 Google Antigravity订阅算力的反向代理架构实现

2026-9-29 22:18
320

【技术分享】跨生态桥接:将 Claude Code 无缝接入 Google Antigravity/Cloud Code 订阅算力的反向代理架构实现

论坛建议板块:『编程技术』 或 『安全工具』
文章标签:AI工具, 反向代理, ClaudeCode, GoogleCloudCode, OAuth2, SSE流式
摘要:Claude Code 作为 Anthropic 官方推出的强大终端 Agent,其通信深度强绑定官方 Messages API 规范。而 Google One AI Premium 订阅提供了充裕的高性能模型(Claude 4.6 Sonnet / Opus / Gemini 3.8),却只允许自家的 Antigravity 客户端调用其私有 Cloud Code PA 接口。本文详细拆解一款开源本地代理网关的设计与实现,从 OAuth 2.0 PKCE 凭证自动续期、内部托管项目绑定、双向 JSON Schema / SSE 协议状态机转换,到客户端防伪伪装与首包缓冲策略,实现双生态的完全无缝桥接。


0x01 背景与核心痛点(生态断层)

随着大语言模型生态的分化,开发者的常用工具与订阅算力常常出现错位:

  • 下游客户端(Claude Code CLI):体验极佳的终端代码 Agent,但只认 Anthropic 官方规范:
    • 请求入口:c9dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7r3W2Q4x3X3g2S2L8Y4c8Z5M7X3!0H3K9h3y4Q4x3X3g2U0L8$3#2Q4x3V1k6$3x3g2)9J5c8X3#2W2M7%4y4S2k6$3g2K6
    • 报文结构:Anthropic Messages JSON 格式(content_blocks, tool_use, thinking)
    • 流式机制:基于 Anthropic 专属 SSE 事件规范(message_start, content_block_delta...)
  • 上游算力源(Google One AI Premium / Antigravity):用户购买了 Google 订阅,包含充足的 Claude 3.5 Sonnet / Opus 额度,但 Google 的门禁极其严格:
    • 通信接口:Google 内部私有 Generative AI PA 协议(v1internal:streamGenerateContent)
    • 鉴权机制:Google OAuth 2.0 凭证,绑定到专属托管项目(如 aicode-consumers)
    • 客户端审查:严格要求官方 Antigravity IDE 的 Headers 特征(X-Client-Name: antigravity),并对竞争对手 Agent 指纹进行拦截。

核心目标:实现一个本地高性能协议中继网关(antigravity-claude-proxy),在本地监听 8080 端口。对下作为标准的 Anthropic API 服务供 Claude Code 无感知调用;对上伪装成 Antigravity 官方客户端向 Google 索取真实算力。

系列与排查篇导读:
本文是《Claude Code 接入 Google Antigravity 实战》的**【架构与实现篇】**。
如果你在重型上下文(大量 Skills/Tools)使用中遇到了启动即报 400/429 RESOURCE_EXHAUSTED 的问题,这是由于 Google 云端 WAF 针对竞品词汇的指纹封杀所致,完整单变量逆向破案过程请参阅:
《【逆向排查】深挖云端黑盒:Claude Code 接入 Google Cloud Code 伪装 429 RESOURCE_EXHAUSTED 竞品指纹过滤破案实录》。


0x02 全局架构拓扑设计

┌─────────────────────────────────────────────────────────────┐
│                    Claude Code CLI (客户端)                  │
│       发送: Anthropic 标准 Messages API (含 Tools/Skills)     │
│       接收: Anthropic 标准 SSE 流 (message_start, delta...)   │
└──────────────────────────────┬──────────────────────────────┘
                               │ HTTP: http://localhost:8080/v1/messages
                               ▼
┌─────────────────────────────────────────────────────────────┐
│             antigravity-claude-proxy (核心代理网关)          │
│                                                             │
│  [1. Server 服务入口 (src/server.js)]                       │
│      ├── Express HTTP Server (监听 8080 端口)                │
│      ├── 路由分发 (/v1/messages, /v1/models, /health)       │
│      └── 首包缓冲策略 (First-Chunk Buffering,防下游挂死)    │
│                                                             │
│  [2. 账号与凭据管理层 (src/account-manager/ & src/auth/)]   │
│      ├── OAuth 2.0 自动换 Token (Refresh Token -> Access)   │
│      ├── 项目发现 (loadCodeAssist -> aicode-consumers)      │
│      ├── 多账号调度 (Hybrid / Sticky / Round-Robin 算法)    │
│      └── 本地持久化 (~/.config/antigravity-proxy/accounts.json)
│                                                             │
│  [3. 双向协议格式转换引擎 (src/format/)]                     │
│      ├── Request Converter (Anthropic Schema -> Google)     │
│      ├── Schema Sanitizer (清洗 Google 不支持的 JSON Schema) │
│      ├── Cache Control 清除器 (剥离 Claude 私有缓存标记)     │
│      └── Thinking Utils (思维链签名保护与预算分配)           │
│                                                             │
│  [4. Cloud Code 组包与脱敏层 (src/cloudcode/)]               │
│      ├── Request Builder (封装 Google Cloud Code PA 信封)   │
│      ├── Identity Scrubber (中和 Anthropic 竞品指纹)         │
│      └── Session Manager (会话 ID 派生以保障多轮上下文一致)   │
│                                                             │
│  [5. 流式传输与事件映射层 (src/cloudcode/)]                 │
│      ├── SSE Parser (解析 Google 流式分块)                   │
│      └── SSE Streamer (组装 Anthropic 标准事件推送给下游)    │
└──────────────────────────────┬──────────────────────────────┘
                               │ HTTPS (带 Google OAuth Bearer Token + 官方防伪 Headers)
                               ▼
┌─────────────────────────────────────────────────────────────┐
│      Google Cloud Code PA (daily-cloudcode-pa.googleapis.com)│
│               执行真实的 Claude 3.5 / Gemini 模型推理         │
└─────────────────────────────────────────────────────────────┘

0x03 Google 身份鉴权与凭证生命周期

1. OAuth 2.0 授权机制

代理基于标准 Google OAuth 2.0 Authorization Code + PKCE 流程构建:

  • 授权 Scope:9c2K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2Y4L8$3!0Y4L8r3g2S2M7r3W2K6i4K6u0W2j5$3!0E0i4K6u0r3j5i4g2@1K9q4)9J5c8X3y4D9L8%4g2V1i4K6u0V1M7r3I4S2N6r3k6G2M7X3@1`.。
  • 双 Token 体系:
    • Refresh Token:长效凭证,存储在 ~/.config/antigravity-proxy/accounts.json 中,除非手动解绑,否则永久有效。
    • Access Token:每次向上游请求时携带的短期 Bearer Token(有效期 1 小时)。
  • 自动静默续期:网关在 Access Token 过期前 5 分钟,自动向 6afK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6G2j5i4g2@1K9o6u0Q4x3X3g2Y4L8$3!0Y4L8r3g2S2M7r3W2K6i4K6u0W2j5$3!0E0i4K6u0r3N6r3!0C8k6h3^5`. 发送请求刷新 Access Token,用户完全无感。

2. 内部项目自动挂载(loadCodeAssist)

Google One 订阅用户的免费算力并不挂在个人新建的 GCP 项目下,而是挂载在 Google 为开发者托管的专用 Project(通常为 aicode-consumers 或 rising-fact-xxxx)。
网关启动时自动向内部接口 v1internal:loadCodeAssist 报到,探测该 Project ID 及订阅状态(tier: "pro"),并在随后的每个请求外层自动封装 project: "aicode-consumers"。


0x04 双向协议转换引擎实现细节

1. 请求维度映射(Request Mapping)

在 src/format/request-converter.js 中完成数据模型重构:

Anthropic 概念 Google Cloud Code PA 对应映射 处理细节与避坑点
system (字符串或 TextBlocks) request.systemInstruction.parts 必须剥离 cache_control;必须经过 Identity Scrubbing 中和竞品特征。
messages[i].role (user/assistant) contents[i].role (user/model) Anthropic 的 assistant 必须重命名为 model。
tools (Anthropic Tool 规范) request.tools[0].functionDeclarations 格式重构为 Google Function Calling 规范;剔除 $schema、default 等非法字段。
tool_use (Assistant 发起调用) parts: [{ functionCall: { name, args } }] 工具名称与参数转为 JSON 对象。
tool_result (User 返回执行结果) parts: [{ functionResponse: { name, response } }] 针对 Claude 系列模型,保留部分原生 Anthropic 标识。
thinking.budget_tokens generationConfig.thinkingConfig 映射为 Google 思考预算限制,防止死循环。

2. 流式响应状态机转换(SSE Streamer)

在 src/cloudcode/sse-streamer.js 中,网关作为下游的 SSE Server,向下游输出标准的 5 阶段状态机:

  1. message_start:下发包含消息 ID、模型名和初始元数据的事件。
  2. content_block_start:标记文本块(type: "text")或深度思考块(type: "thinking")的开始。
  3. content_block_delta:将 Google 的 candidates[0].content.parts[0].text 打包为 Anthropic 打字机增量推给终端。
  4. content_block_stop:当前块结束;若模型发起工具调用,在此输出 type: "tool_use"。
  5. message_delta & message_stop:附带 Token 消耗统计(usage),优雅断开连接。

3. 首包缓冲策略(First-Chunk Buffering)

流式代理最大的陷阱在于 HTTP 状态码的写入时机:

  • 常见错误做法:网关收到下游请求,立即执行 res.writeHead(200) 并开始推流。一旦上游在首个 Chunk 发生 4xx/5xx 错误(如限流或认证失败),此时 HTTP 头已经发出,再也无法向客户端返回合法的 JSON 错误报文,导致下游 CLI 直接崩溃挂死。
  • 正确做法:采用异步生成器(async function*)在内存中 pull 出第一个业务 Chunk;仅当首个 Chunk 成功获取后,才向客户端 flush 200 OK 响应头;若首个包抛错,则直接返回标准 HTTP 4xx/5xx JSON。

4. 官方客户端防伪伪装

在 src/constants.js 中伪装了完整的 Antigravity 二进制特征:

export const ANTIGRAVITY_HEADERS = {
    'User-Agent': 'Mozilla/5.0 ... Antigravity/1.110.0',
    'Content-Type': 'application/json',
    'X-Client-Name': 'antigravity',
    'X-Client-Version': '1.110.0',
    'x-goog-api-client': 'gl-node/18.18.2 fire/0.8.6 grpc/1.10.x'
};

5. 竞品特征中和脱敏机制(Identity Scrubbing)

在构建反向代理时,最隐蔽、最致命的一个坑点是云厂商后端针对竞品 SDK 的指纹审查。
Claude Code 在向 API 发送请求时,会在 system 字段头部强制注入私有计费头和身份标识:

x-anthropic-billing-header: cc_version=2.1.284.12a; cc_entrypoint=sdk-cli;
You are a Claude agent, built on Anthropic's Claude Agent SDK.

Google Cloud Code PA 内部设置了安全过滤规则:只要检测到关键词 "Anthropic",上游会直接返回一个伪装的 HTTP 429 RESOURCE_EXHAUSTED(故意伪装成配额耗尽以阻断竞争对手)。

因此,代理在 src/cloudcode/request-builder.js 中必须实施自动化中和脱敏过滤:

const DEFAULT_IDENTITY_SCRUB = [
    ['Nous Research', 'the assistant team'],
    ['Hermes Agent', 'the assistant'],
    ['Hermes', 'the assistant'],
    ['Anthropic', 'AssistantCorp'],
    ['anthropic', 'assistantcorp'],
    ['ANTHROPIC', 'ASSISTANTCORP']
];

function scrubClientIdentity(text) {
    if (typeof text !== 'string') return text;
    let out = text;
    for (const [term, replacement] of IDENTITY_SCRUB_RULES) {
        out = out.split(term).join(replacement);
    }
    out = out.replace(/Anthropic/gi, 'AssistantCorp');
    return out;
}

关于该问题的深度逆向与排查推演:
当初在排查这个 Bug 时,曾一度以为是 37,000+ tokens 的上下文过大导致“爆额度”。我们通过单变量二分探针实验,逐层剥离 Tools、Messages、System,最终锁定是单个词汇 "Anthropic" 触发了 Google 云端黑名单,并修复了本地代理误判 429 导致锁定 30 分钟的死锁 Bug。
完整排查全过程详见排查专文: 《【逆向排查】深挖云端黑盒:Claude Code 接入 Google Cloud Code 伪装 429 RESOURCE_EXHAUSTED 竞品指纹过滤破案实录》。


0x05 快速部署与运维实操

1. 全局安装

npm install -g antigravity-claude-proxy

安装完成后系统获得 acc 全局命令。

2. 启动与管理命令

# 前台调试启动(可查看彩色请求日志与模型分发流)
acc start --log

# 后台静默常驻启动
acc start

# 查看服务运行状态、已绑定账号列表与健康度
acc status

# 停止服务
acc stop

3. 国内网络代理配置

由于 Google 上游端点在境外,启动前必须设置代理:

$env:HTTP_PROXY = "dc0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9K6b7e0M7^5z5e0l9`."
$env:HTTPS_PROXY = "d80K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9K6b7e0M7^5z5e0l9`."
acc start --log

4. Web 控制台与配额查询

启动后在浏览器打开:

  • Web 控制台:http://localhost:8080/(一键点击 Add Account 即可自动调起 Google OAuth 授权绑定)
  • 实时配额接口:http://localhost:8080/account-limits?includeHistory=true(查看各模型真实剩余比例)

0x06 在 Claude Code / CC Switch 中的使用

在 CC Switch(或终端环境变量)中配置以下内容即可无缝使用:

{
  "env": {
    "ANTHROPIC_BASE_URL": "http://localhost:8080",
    "ANTHROPIC_AUTH_TOKEN": "test",
    "ANTHROPIC_MODEL": "claude-sonnet-4-6",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "claude-sonnet-4-6",
    "ANTHROPIC_DEFAULT_SONNET_MODEL_NAME": "claude-sonnet-4-6",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "claude-opus-4-6-thinking",
    "ANTHROPIC_DEFAULT_OPUS_MODEL_NAME": "claude-opus-4-6-thinking",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "gemini-3.8-flash-medium",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME": "gemini-3.8-flash-medium",
    "CLAUDE_CODE_SUBAGENT_MODEL": "gemini-3.8-flash-high"
  }
}
  • 主模型(Sonnet):claude-sonnet-4-6 —— 对应 Google 满血 Sonnet 4.6,响应在 3 秒左右。
  • 思考模型(Opus):claude-opus-4-6-thinking —— 耗时 10~15 秒,提供超深度逻辑思维链。
  • 子 Agent(Haiku):gemini-3.8-flash-medium —— 速度极快,适合轻量级任务。

0x07 延伸阅读与系列导航


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
点赞 ・1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回