TL;DR :Google Antigravity 桌面客户端(Antigravity App)底层将上下文截断阈值硬编码为 256K ,到点会自动触发有损压缩(Auto-Compaction),而官方 UI 全程不显示余量、压缩前也无预警。为了在不改动官方客户端
app.asar的前提下解决这一盲盒痛点,我们基于 CDP 动态注入与 Connect-RPC 物理遥测,打造了一颗 19px 的原生行内上下文长度监控圆环------Antigravity Context Ring。本文将完整复盘其背后的硬核工程实现。
1. 痛点根因:模型标称 1M,为什么客户端 256K 就被强制压缩?
平时使用 Google Antigravity 桌面客户端写代码时,大家经常会遇到一个情况: 聊着聊着,AI 突然忘记了几十轮之前的架构设计约定,甚至对刚刚讨论过的关键代码边界产生"失忆"。
很多人第一反应是怀疑底座大模型(如 Gemini 4 Argon、Gemini 3.8 Flash、Claude 5.5 等)的有效注意力窗口(Effective Context Window)不行。但通过对 Antigravity 桌面客户端底层通信与日志的深度逆向分析,我们发现了核心根因:
- 写死的物理截断线 : 虽然底层模型具备 1M 甚至更长的物理容量,但 Antigravity 桌面客户端出于推理成本与响应延迟的权衡,将单会话的自动压缩阈值固定在 256K。
- 静默的有损压缩(Auto-Compaction): 一旦单会话的实际 Token 消耗累积触碰 256K,客户端后台的 Language Server 会强制触发压缩动作。历史消息被抽取摘要并剔除细节,导致精密的技术约束与局部代码上下文被永久破坏。
- 官方 UI 的信息真空: 官方界面上没有任何指示条或数值提示当前会话究竟消耗了多少 Token,用户无法预知何时会被压缩,如同在"盲盒"中前行。
要在日常开发中彻底掌握掌控权,最理想的形态不是外挂一个笨重的大弹窗或终端监控窗口,而是像系统原生功能一样,在输入框附近提供一个极其低调、悬停即显、0 认知负担的实时指标:

2. 架构设计哲学:为什么坚决拒绝解包 app.asar?
在做这类桌面客户端增强插件时,业界常见的粗暴做法通常是: 解包 Electron 的 resources/app.asar,强行篡改里面的 JavaScript 代码,然后重新打包。
但这种方案在工程上有极其严重的副作用:
- 宿主升级即失效 :Antigravity 频繁自动热更新,一旦更新覆写
app.asar,所有修改全部丢失; - 文件校验与签名风险:篡改核心包可能破坏安装文件的完整性校验,导致偶发性白屏崩溃;
- 用户心智门槛高:普通开发者很难接受为了一个监控工具去修改核心系统程序。
因此,我们确立了一级架构铁律------零侵入(Zero-Invasion):
- 100% 不修改
app.asar:安装与卸载对宿主二进制和核心包不做任何字节级修改; - Chrome DevTools Protocol (CDP) 运行时热挂载:利用桌面客户端暴露的标准调试通道,通过独立的轻量 Node.js 守护进程(常驻仅 ~18MB 内存,CPU 闲置率接近 0%),在检测到窗口激活时动态完成安全热注入;
- 即插即拔:卸载只需一条命令,清理注入并重启客户端,宿主即刻恢复 100% 纯净原生状态。
3. 计量口径真相:为什么拒绝字符估算,直读 Connect-RPC 物理真值?
很多第三方上下文估算工具为了省事,往往采用"字符估算"(如英文 4 字符/Token、中文 1.5 字符/Token)。但这种做法在现代复杂 Agent 场景下会产生高达 ±30% 的灾难级误差,原因包括:
- Prompt Cache 机制 :Gemini 等前沿模型对重复系统提示词与历史步骤具有大比例的缓存读取(
cacheReadTokens),按字符粗估完全体现不出实际计费与上下文消耗; - 隐藏上下文:Subagent 派发、工具调用结构体(Tool Calls)、结构化 Schema 描述等在 UI 上不渲染的后台信息,字符计算器根本无法感知。
硬件级真实数据流:直读 Connect-RPC
Antigravity 桌面客户端内置了一个本地 Language Server,二者通过基于 HTTP/2 的 Connect-RPC 协议进行内部通信。 在每轮对话(Turn)结算时,Language Server 会返回最权威的 modelUsage 快照:
typescript
interface ModelUsageSnapshot {
inputTokens: number; // 本轮新增未缓存输入
outputTokens: number; // 模型输出生成
cacheReadTokens: number; // 命中的历史 Prefix Cache 物理占用
cacheCreationTokens: number;// 新创建的缓存切片
}
真实的物理占用必须精准计算: Total Context=inputTokens+outputTokens+cacheReadTokens
Antigravity Context Ring 坚决不使用任何本地字符分词猜测,直接从本地 Connect-RPC 获取权威快照。 无论是流式打字中途还是工具调用结束,呈现的数值与 Google 官方后台的真实结算完全一致。
4. 前端交互与工程细节实现
在交互设计上,我们拒绝了"自嗨营销",遵循极简工程美学:

4.1 19px 原生行内圆环与毛玻璃 HUD
- 尺寸微小:仅 19px 直径,内嵌于输入框底栏的模型按钮旁边,与官方按钮保持精确的 6px 间距,浑然天成;
- 毛玻璃 HUD 气泡 :鼠标悬停在圆环上时,毫秒级呼出毛玻璃渐变 Tooltip,清晰展示:
- 当前具体 Token 数与截断百分比(例如:
38.2% · 97.8K / 256.0K); - 详细的输入、输出、历史缓存分解;
- 压缩状态与释放量标注(若触发过压缩)。
- 当前具体 Token 数与截断百分比(例如:
4.2 状态演进与色彩反馈
状态演进严禁复杂的视觉噪音,严格遵循以下四阶标准色标:
- 健康初期 (
< 60%) :原生科技蓝 (#3b82f6),代表上下文处于极佳宽裕期; - 注意过渡 (
60% ~ 80%) :琥珀暖黄 (#f59e0b),提示会话已逐步进入深水区; - 警戒高位 (
80% ~ 90%) :警戒亮橙 (#f97316),建议用户注意收敛对话轮次; - 临界极危 (
≥ 90%) :警示正红 (#ef4444),强烈建议立刻执行手动整理或准备换会话,防止被 256K 强制截断。
历史压缩特殊标识 : 若当前会话触发过手动 /compact 或自动压缩,在 < 60% 安全区时,圆环不会退回普通蓝色,而是呈现清透的薰衣草亮紫 (#a78bfa),并在气泡中明确提示"历史上下文已压缩 释放 xxK",消除"压缩后水位下降误以为是全新会话"的认知错位。
4.3 React Fiber 深度绑定:彻底解决多分屏"串台"
Antigravity 普遍采用多分屏(Split View)并行开发。如果盲目监听全局路由,会导致"左屏新建草稿,右屏的活跃进度被错误挪到左侧"的严重串台 Bug。
Context Ring 深入遍历并挂载到输入框局部的 React Fiber 状态树 : 每个分屏容器拥有独立的 PaneRingInstance 生命周期实例。各分屏只读取自身绑定的 Fiber 会话 ID,分屏之间互不干扰;而当左右分屏打开同一会话时,又能实现状态的无缝共振。

4.4 0ms 瞬间回显(SWR)与 250ms 事件防抖
- SWR 双阶缓存:切换回历史会长会话时,先从内存 LRU / LocalStorage 瞬间(0ms)回显上一帧历史记录,绝不出现灰色空白或转圈等待;
- 防抖合并:在大模型高速流式打字输出时,原生状态机每秒可能触发数十次更新通知。我们在前端建立了 250ms 防抖合并器,阻断事件风暴对渲染线程的冲刷,CPU 占用几乎可以忽略不计。
5. 开源与 30 秒极速安装
Antigravity Context Ring 现已完全开源(采用标准的宽松 MIT 协议),支持 Windows、macOS 与 Linux 三大平台。
推荐:直接让你的 Antigravity 助理帮你装
如果你正在使用 Antigravity,甚至不需要自己打开终端,直接复制下方一句话发给聊天窗口里的 AI 助理即可:
"帮我克隆 github.com/brien9/anti... 并执行 node manage.mjs install"
终端手动安装(跨平台)
bash
git clone https://github.com/brien9/antigravity-context-ring.git
cd antigravity-context-ring
# 一键跨平台安装(自动探活并热注入)
node manage.mjs install
- 项目地址 :github.com/brien9/anti...
- 独立展示页 :brien9.github.io/antigravity...
欢迎平时使用 Antigravity 的朋友上手体验。如果有更好的改进建议或发现了特定边缘场景,欢迎在 GitHub 提交 Issue 或 PR 共同探讨!