全量上线即暗坑不断?Google Gemini 4 Hydrogen 全量开发实战与迁移排雷:别等 12 月涨价断链才后悔(附三大系统全自动审计脚本)
先泼一盆冷水再给颗定心丸:北京时间 2026 年 11 月 12 日深夜,Google 正式向全球开发者和所有产品线全量开放 Gemini 4 Hydrogen(gemini-4-hydrogen)——如果你只是顺手把代码里的模型名称改个字符串就准备上线,大概率会在半夜被“API 明明返回 200 OK,结果页面却吐出空白、账单反而悄悄翻倍、长任务上下文莫名失忆”的告警电话叫醒;但如果你按正确姿势迁移,复杂 Agentic 任务的单次实付成本最高反而能比 Gemini 3.8 Flash 狂降 59%,同时编码与终端执行速度直接拉升近两倍。
很多团队对“全量开发”有个危险的错觉,以为只是多了个更快的新模型可以盲切。事实上,Google 这次在发布 Gemini 4 Hydrogen 的同时,直接把两把倒计时悬在了旧管线头顶:2026 年 12 月 1 日,已弃用的 gemini-2.5-pro 将被强制自动路由到 gemini-3.8-flash,而旗舰级的 gemini-4-carbon 与 gemini-4-argon 标准定价将直接翻倍(飙升至 $4.00 / $20.00 每百万 token);紧接着 2027 年 1 月 1 日,连老黄牛 gemini-3.8-flash 的价格也要翻倍到 $1.50 / $7.50——刚好跟今天的 Hydrogen 完全同价!
也就是说,摆在所有工程师面前的根本不是“要不要升级”的选择题,而是:趁这几周窗口期一次性把生产管线安全迁入 Gemini 4 Hydrogen 全量架构,还是被动等着接口路由跳转和翻倍账单把线上服务拖垮?

图 1:本文原创题图。Gemini 4 Hydrogen 全量上线关键指标、100 万统一池、8 大迁移陷阱审计与 12 月—1 月计费时间崖全景。
一、问题背景:为什么说 Hydrogen 不是普通的“轻量迭代”,而是一场主力切换?
让我们先把官方发布阵仗盘清楚。根据 Google 首席 AI 架构师 Koray Kavukcuoglu 于 2026 年 11 月 12 日在 Google 官方博客公布的资料,Gemini 4 Hydrogen 基于大型旗舰 Gemini 4 Carbon 蒸馏适配而来(知识截止时间更新至 2026 年 3 月),但与此前“仅限 Paid / 无免费额度”的 Carbon 和 Argon 不同,Hydrogen 从发布第一天起就在全生态全量开放:
- 开发者端全开放:Google AI Studio 与 Gemini API 同步开放免费层(Free tier,有速率限制,注意免费层输入可用于改进产品)和 付费层(Paid tier),支持标准(Standard)、Flex、Batch 与 Priority 多档服务;
- AI 原生开发环境:Google Antigravity 内置全量上线
Gemini 4 Hydrogen,同时把新升级的调度器Orchestrator (Carbon)与Orchestrator (Argon)默认下层的繁重高频读写与子任务切换给 Hydrogen; - 终端与办公全家桶:同步登陆 Google Search(包括网页、AI Overviews 与 AI Mode 免费全面开放)、Gemini App、Android Studio(支持端到端应用原型开发)以及 Google Sheets。
图 2:真实网页截图——Google 官方发布博客《Introducing Gemini 4 Hydrogen for Agentic Workflows》(2026 年 11 月 12 日)。
Google 给 Hydrogen 的战略定位非常直白:以前大家被逼着在“便宜但常在复杂终端环境里掉链子的 3.8 Flash”和“聪明但既贵又慢的 Carbon / Argon”之间做痛苦二选一;现在 Hydrogen 用 Flash 级别的输出速度,去承接平时开发工作里 80% 最费时费力的中高频 Agentic 任务。
在官方面向开发者的技术公告中,Google 甚至罕见地直接给出了与竞品以及自家上代模型的对比:它拥有原生的并行工具调用(Parallel Tool Calling)能力——遇到需要读取十几个源码文件、查表、写单元测试的场景,以前 Flash 只能“查一个 -> 等结果 -> 再查下一个”串行干耗,Hydrogen 则会一次性甩出一整排工具请求并行回收。根据官方披露,这让文件遍历与代码搜索类工作直接跑出 2 倍到 2.8 倍的速度飞跃,而在复杂依赖图推理与 SQL 编写等基准上,消耗的总 token 数甚至还能额外省下 12% 到 23%。
图 3:真实网页截图——Google 开发者频道技术公告《Gemini 4 Hydrogen: Fast agentic development for coding and long-horizon tasks》。
更值得关注的是多模型协同定价的时间压力:
| 模型 ID | 2026-11-12 发布现状 | 标准输入 / 输出单价(每 1M Tokens) | 2026-12-01 与 2027-01-01 强制变化 |
|---|---|---|---|
gemini-4-hydrogen |
全量开放(含 Free 层) | $1.50 / $7.50(隐式缓存 $0.075) | 长期主力标准定价;Batch/Flex 对折 $0.75 / $3.75 |
gemini-4-argon |
全量旗舰(仅 Paid) | 当前 $2.00 / $10.00 | 2026-12-01 翻倍至 $4.00 / $20.00 |
gemini-4-carbon |
全量顶配(仅 Paid) | 当前 $2.00 / $10.00 | 2026-12-01 翻倍至 $4.00 / $20.00 |
gemini-3.8-flash |
过渡维持中 | 当前 $0.75 / $3.75 | 2027-01-01 翻倍至 $1.50 / $7.50(与 Hydrogen 同价) |
gemini-2.5-pro |
已弃用(Deprecated) | 历史遗留管线 | 2026-12-01 自动重定向至 3.8 Flash |
如果你今天不开始规划向 Hydrogen 迁移,过两周 Carbon/Argon 费用直接翻倍,元旦后连老 3.8 Flash 的价格优势也彻底归零,留给旧架构的成本优势只剩下最后几周。
二、小学生都能听懂的原理课:用厨房、游泳池与变速赛车拆解 Hydrogen
很多一线程序员迁移 Hydrogen 之所以频频栽跟头,核心不是看不懂英语文档,而是脑子里依然装着“旧版 Flash 模型”的直觉模型(Mental Model)。我们干脆把底层那些绕口令一样的参数规范,拆成三个小学生也能轻松听懂 70% 以上的生活大比方:

图 4:本文原创配图。生活化直觉映射:双厨分工、100 万统一游泳池与被厨师收起来的盐罐。
1. 米其林总厨 Carbon + 闪电全能二厨 Hydrogen(Orchestrator 哲学)
想象你在开一家生意爆棚的餐厅。以前为了省钱,你只给米其林总厨 Carbon 配了一个便宜但老爱搞砸事情的杂工(旧款小模型):每次让杂工去配菜、洗碗、改菜单,十次有八次听错要求,总厨不得不亲自返工重做,算下来单道菜的人工账单高达 $7.77。
现在来的 Hydrogen 是一位基本功极其扎实、手脚麻利得像闪电的“全能二厨”:虽然按小时算时薪好像比杂工高了一倍,但它几乎不砸盘、而且能同时端好几个锅并行炒菜(Parallel Tool Calling)。总厨 Carbon(或者 Argon)只负责看一眼菜单定下大方向和核心验收,剩下 80% 的配菜、备料、翻文档、跑测试全部并行丢给 Hydrogen 一口气一次做对。结果餐厅上菜速度快了近两成、总厨少加了无数次班,算总账单道菜反而只要 $3.16,硬生生省下 59%!
2. “100 万一体式大泳池” vs 旧式“分格便当盒”(Unified 1M Context Pool)
以前用 gemini-3.8-flash 或 carbon 时,模型像是拿了一个分格便当盒:左边大格专门装你塞进去的“题目(最多 100 万 Token 输入)”,右边小格独立留给模型“写答案(例如最多 6.4 万输出)”,两边水火不相容。
但 gemini-4-hydrogen 彻底换成了同一座总容量 1,048,576 Token 的一体化大游泳池(Unified Context Window)!你的提问(Input) + 模型自己偷偷打的草稿(Thinking Tokens) + 最终写给你看的答案(Output),全都要泡在同一个泳池里!
这就立刻带来两个新手极易溺水的物理铁律:
- 如果你一上来就往泳池里倒进 90 万 Token 的整库代码,那池子里只剩下 14.8 万升空间供它“打草稿 + 写答案”,再往后就会撞墙截断;
- 更坑的是“水桶盖子效应”:Hydrogen API 里的
max_output_tokens管的是“内部草稿 + 正式回答”加起来的上限!很多老代码习惯性沿用了max_output_tokens=8192。结果 Hydrogen 默认思考得非常深入,光是打草稿就用完了 8,192 额度,池盖死死扣住,最后正式回答只挤出来 0 个字,接口返回incomplete空白文本!
记住这组对应水阀规则:普通单次同步请求最高只出水 65,536 tokens(64K);只有当你真正需要一口气生成超过 64K 到极限剩余池容的超长代码时,才需要打开“后台长接力水泵”(background=True + store=True + max_output_tokens > 65536)。
3. “四档变速赛车”与“被后厨悄悄没收的盐罐”(Thinking Levels & Sampling)
以前开老款 gemini-3.8-flash 这辆变速自行车,它有 minimal 极省力档、出厂默认挂在 medium(中等思考);还有人习惯自己在车把上扭 temperature=0.1、top_p、top_k 这几个“微调盐罐”。
换成 Gemini 4 Hydrogen 后发生了两个颠覆性的出厂设定变化:
- 拆掉了
minimal极简档,只留四档:low / medium / high / xhigh。而且新车默认一脚油门直接挂在high(高强度深度推理)!如果你在代码里还留着thinking_level="minimal",发动机直接报错熄火;而如果不传任何档位参数,以前跑轻快小任务的接口现在全都会用high档疯狂燃烧思考 Token(注意思考 Token 一样按 $7.50 / 1M 的输出价格算钱!); - 你递给后厨的盐罐会被礼貌收起来,不报错但也不用:无论你在请求 JSON 里怎么硬塞
temperature=0.0还是top_p=0.5,Hydrogen 都会微笑着返回你HTTP 200 OK,然后原封不动 ignoring 你的采样参数,坚决按 DeepMind 出厂调校好的标准火候炒菜!所以绝对不要再靠temperature=0来赌 JSON 格式不出乱子,必须直接上官方 Structured Outputs(response_schema)“固定模具”来压制输出结构。
三、问题表现:直接改 Model ID 上线后,工程团队最常踩到的 5 个诡异症状
根据第三方大模型路由平台 OrcaRouter 的生产回归对比评测以及 Google AI Studio 官方发布的《Gemini 4 Hydrogen 迁移清单》,几乎所有没做预检就强行切换的模型,都会在一周内密集暴发以下五类诡异故障:
图 5:真实网页截图——OrcaRouter 工程团队发布的迁移实测对比《Gemini 4 Hydrogen vs Gemini 3.8 Flash: what breaks when you migrate》。
- 症状 A(静默假成功):结构化抽取莫名其妙偶尔字段走形,但日志里一行报错都没有
老代码里写着
temperature=0用来强制压抑幻觉保证输出合法,升级 Hydrogen 后虽然 HTTP 状态码依然是 200 OK,却偶发多出自然语言前缀或格式微漂。原因正是temperature、top_p、top_k在服务端被静默无视了。 - 症状 B(无声吞预算 + 空输出):短小 API 响应延迟从几百毫秒飙到十几秒,复杂一点直接返回空白
因为迁移时没显式传
thinking_level(Hydrogen 默认跳到high),再加上旧代码里残留着max_output_tokens=4096或8192。结果模型把全额预算全花在“内心思考”上,返回阶段一个可见字符都写不出来,直接报incomplete,钱却按思考输出字数一分不少扣掉了。 - 症状 C(直击 400 阻断):低延迟分类路由和正则清洗服务全线崩溃
凡是用过
thinking_level=“minimal”压极速延迟的管线,切上 Hydrogen 会瞬间收到参数非法错误——因为 Hydrogen 最低只支持low。 - 症状 D(缓存失灵 + 长上下文“幻觉失忆”):账单里 Cached Input 掉成 0,Agent 才干到第 2 轮就强行压缩丢记忆
如果原本用
cachedContents.create或显式cached_content绑定长文档,Hydrogen 不支持显式缓存会直接失效/报错;而更隐蔽的是在 Long Decode 超过 64K 的后台长输出接力里,开发者的压缩控制器读取了usage.total_input_tokens字段——当长输出横跨第 2 跳(Hop 2)、第 3 跳(Hop 3)时,每次重放输入都会把total_input_tokens翻倍累加,很快把一个实际只有 12 万上下文的窗口误算成“突破 80 万快爆了”,从而过早触发上下文压缩器,把重要代码细节抹得一干二净! - 症状 E(图像/审核边界与工具链报错):部分多模态图片合规风控突然变严、或 Live / 生图 / 无状态 Tool Calling 崩盘
gemini-4-hydrogen明确不支持 Live API、原生图像生成(Image generation)和音频生成(Audio generation);并且根据 DeepMind Model Card 公布的实测数据,与上代gemini-3.8-flash相比,Hydrogen 在文生图/图生文安全边界上的无理由拒答率(Unjustified refusals)上升了 +5.57 个百分点(其中图像安全过滤提升 +7.00pp,HealthBench Pro 等医学场景则维持 <0.4% 的极低误拒率)。如果你的业务依赖图生文灰产边缘提示词或未经清洗的用户截图,拒绝率会上浮。
四、根因深度解剖:6+2 个核心迁移陷阱全息矩阵
为了把上面所有的诡异现象一次性锁死在上线之前,我们把官方文档(What’s new in Gemini 4 Hydrogen / Long Decode / Thinking Docs)里的所有破坏性变更与隐形规则,浓缩成下面这张“A区静默变形 vs B区显性断点”排雷矩阵:

图 6:本文原创诊断图。A 区为“最危险、不报错但暗中变形”的 4 个 HTTP 200 静默陷阱,B 区为需要显式重构或替换的 4 个断点。
根因深挖 1:为什么 Google 要锁死 temperature / top_p / top_k?
因为现代深度思考型(Thinking-native)推理模型在训练后阶段(Post-training RL)已经把思考轨迹里的探索熵(Exploration Entropy)与验证收敛策略和推理参数深度耦合。如果在外部强行把 temperature 拉低至 0 或 0.1,反而会锁死模型在复杂代码调试与 Tool Calling 中的自我纠错回溯链条,导致死循环或退化。因此 Google 在 API 层选择向开发者“接收参数但不做采样改写”——根治之道是把所有格式确定性需求全权交给 Structured Outputs(JSON Schema)和原生 Function Calling,删除旧有在 Prompt 里手写伪 JSON 工具调用的脏代码(否则极易触发 MALFORMED_FUNCTION_CALL)。
根因深挖 2:Long Decode 突破 64K 输出天花板的两把钥匙
很多人以为只要设置了 background=True 就可以像 Argon 那样一口气生成 10 万行代码。错!根据 Google AI Studio 的 Long Decode 官方文档:
- 默认同步上限(无论流式 Stream 还是非流式 Non-stream)在 Hydrogen 上都统一封顶在 65,536 tokens(64K);
- 如果用服务端托管长输出(Interactions API),你必须同时传齐三件套:
background=True+store=True+max_output_tokens > 65536(漏传大于 64K 的上限,后台跑完 64K 依然照样停下); - 如果你不使用
background=True,而是依赖 SDK 客户端自动分跳接力(Client-side continuation),则必须先升级客户端 SDK 至最低支持版本:Pythongoogle-genai >= 2.34.0、JS/TS@google/genai >= 2.32.0、Go>= 1.77.0、Java>= 1.80.0、.NET>= 1.28.0(比如我们在本机实测环境中如果仍装着老版本1.68.0,自动接力会根本不起作用); - 而在多跳长解码的记忆水位计算上,官方明令禁止直接使用汇总翻倍后的
total_input_tokens,正确公式必须是:实际已占池容量 = initial_input_tokens + total_output_tokens + total_thought_tokens。
根因深挖 3:Implicit Caching(隐式缓存)的 95% 折扣怎么白嫖才不击穿?
Hydrogen 取消了对显式缓存 API(cachedContents)的支持,但把极度划算的 95% 折扣(输入每百万 token 仅 $0.075,仅为原价 $1.50 的二十分之一!) 做成了零配置、自动触发的 Implicit Caching(隐式缓存)。
触发的唯一硬性门槛有两个:稳定公共前缀长度 >= 4,096 tokens,以及字节级完全一致!任何会把动态变量(例如请求 UUID、精确到秒的时间戳 2026-11-13 23:35:01、用户随机 Session ID)拼进 System Prompt 顶部或工具清单最前面的写法,都会一刀斩断缓存前缀树,让你的接口账单瞬间涨回 20 倍($1.50/M)。正确的工程习惯是:静态系统提示词 -> 固定全套 Tool Schema -> 仓库骨架只读摘要 -> 最后才拼入本次动态用户输入与当前 Diff。
根因深挖 4:高并发搜索与真实世界信息接地的突破
除了写代码,Google 还罕见地同日用 Gemini 4 Hydrogen 全面升级了全球版 Google Search(包含 AI Overviews 与 AI Mode 免费全量推开)。这意味着 Search API Grounding 与本地检索增强(RAG)的协同架构正在走向成熟——对长文本事实核查与多步信息比对而言,Hydrogen 成了性价比最高的底座。
图 7:真实网页截图——Google Search 升级公告(Robby Stein),验证 Hydrogen 已全面承担生产级超高并发信息检索与推理。
五、全量开发实战与一键全自动排查迁移方案(含 Win11 / Ubuntu / macOS 脚本)
既然所有坑点、定价时间崖和底层机制都已彻底摸透,接下来就是动手把这套 “Gemini 4 Hydrogen 全量生产力架构” 稳稳落进我们的本地和 CI 开发管线。

图 8:本文原创架构图。生产级 Agentic 开发黄金闭环:Antigravity 顶层 Orchestrator 分工 + 4,096+ 静态前缀隐式缓存 + >64K 后台长解码接力。
第一步:代码与 IDE/Agent 工具链的四大核心改造
- 新版 Python
google-genai规范调用模板(彻底绕开 6 大陷阱)
# pip install -U "google-genai>=2.34.0"
from google import genai
from google.genai import types
client = genai.Client()
# 场景 1:轻量级分类/路由/快速清洗 -> 显式降回 low 防止 default=high 烧钱
fast_resp = client.models.generate_content(
model="gemini-4-hydrogen",
contents=static_4096_prefix + "\n" + user_query,
config=types.GenerateContentConfig(
thinking_level="low",
max_output_tokens=16384, # 含 thinking,避免 4096/8192 饿死正文
response_mime_type="application/json",
response_schema=MyStrictSchema, # 替代已失效的 temperature=0
),
)
# 场景 2:超过 64K token 的整仓重构 / 超长报告 -> 必须三件套齐备
long_job = client.interactions.create(
model="gemini-4-hydrogen",
input=massive_spec,
background=True,
store=True,
generation_config={"max_output_tokens": 180000, "thinking_level": "high"},
)
- 在 Google Antigravity 中开启
Orchestrator与gemini-4-hydrogen (Extra / xhigh)如果你日常使用 Google Antigravity 开展全量 Agentic 研发,官方文档已经明确展示了Orchestrator (Carbon)与Orchestrator (Argon)如何无缝调度底层的Gemini 4 Hydrogen。在 AntigravityTerminal-Bench 4.0真实软件工程评测中,这套主从分工跑出了逼近纯 Carbon 旗舰的通关率,同时 消耗配额直降 24%、执行耗时再提速 19%!使用终端 CLI(agy)甚至可以通过一行参数把 Hydrogen 拉到极限的xhigh(UI 中称为 Extra)档位专门攻坚疑难并发 bug:
# 交互式选模型或 CLI 直接挂入 Gemini 4 Hydrogen 极限思考档位
agy --model gemini-4-hydrogen --effort xhigh
# 或者直接使用官方复合别名
agy --model gemini-4-hydrogen-xhigh
图 9:真实网页截图——Google Antigravity 官方模型选择文档页(antigravity.google/docs/models/),清晰标注了 Hydrogen 默认承接 Orchestrator 下的高频工程重任。
- 给编码 Agent 装上“防 API 幻觉护栏”:官方
gemini-api-devSkill 由于大多数开源编码 Agent 的内置记忆还停留在 2025 年老版本 SDK(常常手滑给你写出已废弃的google-generativeai包或caches.create),Google 官方在latest-model文档里专门建议执行以下指令注入最新的gemini-api-devSkill 与 MCP 文档服务器:
# 给各类 AI 编程 Agent 自动装配官方最新的 Gemini 4 Hydrogen 规范 Skill
npx skills add google-gemini/gemini-skills --skill gemini-api-dev --global
# 或在支持 MCP 的客户端接入 https://aistudio.google.com/mcp
第二步:三大操作系统零依赖“一键全自动迁移审计脚本”(人工与 Agent 双模支持)
为了彻底消除人工肉眼翻几百个源码文件漏查的风险,我们针对 Windows 11(PowerShell)、Ubuntu 26.04(Bash)、macOS 27(Zsh) 分别编写了完全不依赖任何第三方库的一键全自动审计脚本。
该脚本能一次性扫描目标仓库里的 8 项真实迁移风险(G4H-TRAP-01 至 G4H-TRAP-08),同时自动核查本机 Python google-genai SDK 是否达到长解码最低版本(>= 2.34.0)、检测 Antigravity agy CLI 状态,并支持在配置了 GEMINI_API_KEY 时执行可选的安全只读元数据探测(全程绝不输出任何密钥或隐私信息)。
两种执行方法指南
- 方法一:人类工程师手动 / 交互式全自动执行(只需直接运行脚本,按终端交互提示回车选择路径、是否执行只读探针、是否落地生成
.gemini4-migration-plan.json即可;脚本已做严格路径脱敏,绝不会输出本地计算机名或内网地址)。 - 方法二:AI Agent 全自动流水线执行(Non-interactive + JSON 输出)(把脚本交给 Antigravity、Claude Code 或 CI Runner 时,传入
--auto --json --write-plan,Windows 传-Auto -Json -WritePlan,脚本零阻塞直接输出严格合法的 JSON 报告,且发现致命阻断项如minimal档位或已退役旧 SDK 时自动返回退出码1,方便 Agent 自动接管并逐行生成修复 Patch!)。
下面是在真实测试项目目录上直接执行本文 macOS 27 Zsh 审计脚本时捕获的 真实终端全屏输出结果(左侧为人工模式对齐报表,右侧为 Agent 自动接入的 JSON 结构输出):
图 10:真实运行捕获——gemini4_hydrogen_audit_macos27.zsh 实测扫描测试仓库 g4h-sample-test,精准揪出全部 12 处静默/显性深坑并输出标准退出码 1。
1. Windows 11 全自动审计脚本(gemini4_hydrogen_audit_windows11.ps1)
人类执行:.\gemini4_hydrogen_audit_windows11.ps1(按交互回车)
Agent 全自动:powershell -ExecutionPolicy Bypass -File .\gemini4_hydrogen_audit_windows11.ps1 -Target .\your-repo -Auto -Json -WritePlan
<#
.SYNOPSIS
Gemini 4 Hydrogen (GA) Migration & Agentic Pre-Flight Audit — Windows 11 PowerShell 5.1 / 7+
Zero third-party dependencies (uses built-in Get-ChildItem, Select-String, Invoke-RestMethod).
.EXAMPLE
Human Interactive: .\gemini4_hydrogen_audit_windows11.ps1
Agent Automated: .\gemini4_hydrogen_audit_windows11.ps1 -Target .\repo -Auto -Json
#>
[CmdletBinding()]
param(
[string]$Target = ".",
[switch]$Auto,
[switch]$Json,
[switch]$Probe,
[switch]$WritePlan,
[switch]$Help
)
$ErrorActionPreference = "Stop"
if ($Help) {
Write-Output "Usage: .\gemini4_hydrogen_audit_windows11.ps1 [-Target <dir>] [-Auto] [-Json] [-Probe] [-WritePlan]"
exit 0
}
if ($Json) { $Auto = $true }
if (-not (Test-Path -Path $Target -PathType Container)) {
Write-Error "Target directory not found: $Target"
exit 2
}
$TargetAbs = (Resolve-Path -Path $Target).Path
if (-not $Auto) {
Write-Host "=====================================================================" -ForegroundColor Cyan
Write-Host " Gemini 4 Hydrogen (GA) Pre-Flight Audit - Windows 11 Interactive" -ForegroundColor Blue
Write-Host "=====================================================================" -ForegroundColor Cyan
$inputDir = Read-Host "Target project [$TargetAbs] (Press Enter to keep)"
if ($inputDir -and $inputDir.Trim() -ne "") {
if (-not (Test-Path -Path $inputDir -PathType Container)) {
Write-Error "Directory not found: $inputDir"
exit 2
}
$TargetAbs = (Resolve-Path -Path $inputDir).Path
}
$probeAns = Read-Host "Run optional live check if GEMINI_API_KEY / agy CLI present? [y/N]"
if ($probeAns -match "^[Yy]") { $Probe = $true }
$planAns = Read-Host "Write sanitized migration plan JSON into target folder? [y/N]"
if ($planAns -match "^[Yy]") { $WritePlan = $true }
}
$TargetBase = Split-Path -Path $TargetAbs -Leaf
$Extensions = @("*.py","*.ts","*.tsx","*.js","*.jsx","*.mjs","*.go","*.java","*.cs","*.rs","*.json","*.yaml","*.yml","*.toml",".env*","requirements*.txt","go.mod","pyproject.toml")
$SkipDirsRegex = '\\(\.git|node_modules|\.venv|venv|__pycache__|dist|build|\.next)(\\|$)'
$Files = Get-ChildItem -Path $TargetAbs -Recurse -File -Include $Extensions -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -notmatch $SkipDirsRegex -and $_.Name -ne ".gemini4-migration-plan.json" }
function Invoke-RuleScan {
param([string]$Pattern)
$matchesList = @()
if ($Files) {
$matchesList = $Files | Select-String -Pattern $Pattern -AllMatches -ErrorAction SilentlyContinue
}
$count = 0
$sample = ""
if ($matchesList) {
$count = ($matchesList | ForEach-Object { $_.Matches.Count } | Measure-Object -Sum).Sum
$first = $matchesList | Select-Object -First 1
if ($first) {
$relPath = $first.Path.Substring($TargetAbs.Length).TrimStart('\','/') -replace '\\','/'
$lineSnippet = ($first.Line.Trim() -replace '[\r\n]+', ' ')
if ($lineSnippet.Length -gt 80) { $lineSnippet = $lineSnippet.Substring(0, 80) }
$sample = "${relPath}:$($first.LineNumber):$lineSnippet"
}
}
return [PSCustomObject]@{ Count = [int]$count; Sample = $sample }
}
$rSampling = Invoke-RuleScan '["'']?(temperature|top_p|topP|top_k|topK)["'']?\s*[:=]'
$rMinimal = Invoke-RuleScan 'thinking_?[lL]evel["''\s:=]+(MINIMAL|minimal)'
$rLowCap = Invoke-RuleScan '["'']?max_?[oO]utput_?[tT]okens["'']?\s*[:=]\s*([1-9][0-9]{0,3}|16384)([^0-9]|$)'
$rCache = Invoke-RuleScan 'cachedContents|caches\.create|cached_content'
$rLegacy = Invoke-RuleScan 'gemini-(2\.5-pro|3\.8-flash|4-carbon|4-argon)'
$rTokenTrap = Invoke-RuleScan 'total_input_tokens'
$rOldSdk = Invoke-RuleScan 'google-generativeai|import google\.generativeai|@google/generative-ai'
$rLiveMedia = Invoke-RuleScan 'bidiGenerateContent|aio\.live|IMAGE_GENERATION|response_modalities.*AUDIO|gemini-4-hydrogen.*(IMAGE|AUDIO)'
$TotalIssues = $rSampling.Count + $rMinimal.Count + $rLowCap.Count + $rCache.Count + $rLegacy.Count + $rTokenTrap.Count + $rOldSdk.Count + $rLiveMedia.Count
$PythonGenAiVer = "not_installed"
if (Get-Command python -ErrorAction SilentlyContinue) {
try {
$ver = & python -c "import importlib.metadata as m; print(m.version('google-genai'))" 2>$null
if ($ver) { $PythonGenAiVer = $ver.Trim() }
} catch {}
} elseif (Get-Command py -ErrorAction SilentlyContinue) {
try {
$ver = & py -3 -c "import importlib.metadata as m; print(m.version('google-genai'))" 2>$null
if ($ver) { $PythonGenAiVer = $ver.Trim() }
} catch {}
}
$AgyStatus = "not_found"
if (Get-Command agy -ErrorAction SilentlyContinue) {
try {
$AgyStatus = (& agy --version 2>$null | Select-Object -First 1).ToString().Trim()
if (-not $AgyStatus) { $AgyStatus = "installed" }
} catch { $AgyStatus = "installed" }
}
$ApiProbeStatus = "skipped"
if ($Probe) {
if ($env:GEMINI_API_KEY) {
try {
$resp = Invoke-WebRequest -Uri "https://generativelanguage.googleapis.com/v1beta/models/gemini-4-hydrogen" `
-Headers @{ "x-goog-api-key" = $env:GEMINI_API_KEY } -TimeoutSec 8 -UseBasicParsing
$ApiProbeStatus = "ok_http_$($resp.StatusCode)"
} catch {
$ApiProbeStatus = "probe_error"
}
} else {
$ApiProbeStatus = "no_GEMINI_API_KEY_in_env"
}
}
$Payload = [ordered]@{
tool = "gemini4-hydrogen-audit"
os = "Windows 11 (PowerShell)"
model_target = "gemini-4-hydrogen"
project_basename = $TargetBase
total_findings = $TotalIssues
environment = [ordered]@{
google_genai_python_sdk = $PythonGenAiVer
recommended_min_python_sdk = "2.34.0"
antigravity_cli = $AgyStatus
api_model_metadata_probe = $ApiProbeStatus
}
checks = @(
@{ id = "G4H-TRAP-01"; severity = "SILENT_HTTP_200"; title = "Ignored sampling overrides (temperature/top_p/top_k)"; count = $rSampling.Count; sample = $rSampling.Sample },
@{ id = "G4H-TRAP-02"; severity = "LOUD_ERROR"; title = "Unsupported minimal thinking_level (defaults to high on Hydrogen)"; count = $rMinimal.Count; sample = $rMinimal.Sample },
@{ id = "G4H-TRAP-03"; severity = "SILENT_TRUNCATION"; title = "Low max_output_tokens <=16384 starves thinking + output budget"; count = $rLowCap.Count; sample = $rLowCap.Sample },
@{ id = "G4H-TRAP-04"; severity = "UNSUPPORTED_FEATURE"; title = "Explicit caching calls (use implicit >=4096 token cache on Hydrogen)"; count = $rCache.Count; sample = $rCache.Sample },
@{ id = "G4H-TRAP-05"; severity = "COST_OR_DEPRECATION"; title = "Legacy Gemini model IDs facing Dec 1 / Jan 1 price or routing shifts"; count = $rLegacy.Count; sample = $rLegacy.Sample },
@{ id = "G4H-TRAP-06"; severity = "COMPACTION_BUG"; title = "total_input_tokens used in Long Decode multi-hop accounting"; count = $rTokenTrap.Count; sample = $rTokenTrap.Sample },
@{ id = "G4H-TRAP-07"; severity = "RETIRED_SDK"; title = "Retired google-generativeai / @google/generative-ai package"; count = $rOldSdk.Count; sample = $rOldSdk.Sample },
@{ id = "G4H-TRAP-08"; severity = "UNSUPPORTED_MODALITY"; title = "Live API / native image or audio generation markers"; count = $rLiveMedia.Count; sample = $rLiveMedia.Sample }
)
}
$JsonText = $Payload | ConvertTo-Json -Depth 5
if ($WritePlan) {
$PlanPath = Join-Path -Path $TargetAbs -ChildPath ".gemini4-migration-plan.json"
Set-Content -Path $PlanPath -Value $JsonText -Encoding UTF8
}
if ($Json) {
Write-Output $JsonText
} else {
Write-Host "`nTarget folder: $TargetBase Findings: $TotalIssues"
Write-Host "Python google-genai SDK: $PythonGenAiVer (min >= 2.34.0 for Long Decode client continuation)"
Write-Host "Antigravity CLI (agy): $AgyStatus API Metadata Probe: $ApiProbeStatus"
Write-Host "---------------------------------------------------------------------"
"{0,-13} | {1,-19} | {2,5} | {3}" -f "Check ID", "Behavior", "Hits", "First Relative Hit" | Write-Host
Write-Host "---------------------------------------------------------------------"
foreach ($chk in $Payload.checks) {
$samp = if ($chk.sample) { $chk.sample } else { "-" }
"{0,-13} | {1,-19} | {2,5} | {3}" -f $chk.id, $chk.severity, $chk.count, $samp | Write-Host
}
Write-Host "---------------------------------------------------------------------"
if ($WritePlan) {
Write-Host "Saved migration plan: $TargetBase/.gemini4-migration-plan.json" -ForegroundColor Green
}
}
if ($rMinimal.Count -gt 0 -or $rOldSdk.Count -gt 0) { exit 1 }
exit 0
2. Ubuntu 26.04 全自动审计脚本(gemini4_hydrogen_audit_ubuntu2604.sh)
人类执行:bash gemini4_hydrogen_audit_ubuntu2604.sh
Agent 全自动:bash gemini4_hydrogen_audit_ubuntu2604.sh –target ./your-repo –auto –json –write-plan
#!/usr/bin/env bash
# ==============================================================================
# Gemini 4 Hydrogen (GA) Migration & Agentic Pre-Flight Audit — Ubuntu 26.04
# Zero third-party dependencies (standard bash, grep, awk, sed, curl)
# Modes:
# Human Interactive: bash gemini4_hydrogen_audit_ubuntu2604.sh [--target ./repo]
# Agent Automated: bash gemini4_hydrogen_audit_ubuntu2604.sh --target ./repo --auto --json
# ==============================================================================
set -euo pipefail
TARGET_DIR="."
AUTO_MODE=0
JSON_MODE=0
PROBE_API=0
WRITE_PLAN=0
print_usage() {
cat <<'USAGE'
Usage: bash gemini4_hydrogen_audit_ubuntu2604.sh [options]
--target <dir> Directory to scan (default: current directory)
--auto Non-interactive mode (no prompts; ideal for CI / AI Agents)
--json Emit machine-readable JSON summary to stdout
--probe Run optional read-only API/Antigravity CLI check if configured
--write-plan Write sanitized migration checklist to .gemini4-migration-plan.json
-h, --help Show this help message
USAGE
}
while [[ $# -gt 0 ]]; do
case "$1" in
--target)
shift
[[ $# -gt 0 ]] || { echo "Error: --target requires a directory" >&2; exit 2; }
TARGET_DIR="$1"
;;
--auto) AUTO_MODE=1 ;;
--json) JSON_MODE=1; AUTO_MODE=1 ;;
--probe) PROBE_API=1 ;;
--write-plan) WRITE_PLAN=1 ;;
-h|--help) print_usage; exit 0 ;;
*) echo "Unknown option: $1" >&2; print_usage >&2; exit 2 ;;
esac
shift
done
[[ -d "$TARGET_DIR" ]] || { echo "Error: Target directory not found: $TARGET_DIR" >&2; exit 2; }
TARGET_ABS="$(cd "$TARGET_DIR" && pwd)"
TARGET_BASE="$(basename "$TARGET_ABS")"
if [[ "$AUTO_MODE" -eq 0 ]]; then
printf '\033[36m=====================================================================\033[0m\n'
printf '\033[1;34m Gemini 4 Hydrogen (GA) Pre-Flight Audit — Ubuntu 26.04 Interactive\033[0m\n'
printf '\033[36m=====================================================================\033[0m\n'
read -r -p "Target project [${TARGET_ABS}] (Press Enter to keep): " input_dir || true
if [[ -n "${input_dir:-}" ]]; then
[[ -d "$input_dir" ]] || { echo "Directory not found: $input_dir" >&2; exit 2; }
TARGET_ABS="$(cd "$input_dir" && pwd)"
TARGET_BASE="$(basename "$TARGET_ABS")"
fi
read -r -p "Run optional live check if GEMINI_API_KEY / agy CLI present? [y/N]: " probe_ans || true
[[ "${probe_ans:-n}" == [Yy]* ]] && PROBE_API=1
read -r -p "Write sanitized migration plan JSON into target folder? [y/N]: " plan_ans || true
[[ "${plan_ans:-n}" == [Yy]* ]] && WRITE_PLAN=1
fi
EXCLUDE_ARGS=(
--exclude-dir=.git --exclude-dir=node_modules --exclude-dir=.venv
--exclude-dir=venv --exclude-dir=__pycache__ --exclude-dir=dist
--exclude-dir=build --exclude-dir=.next --exclude=.gemini4-migration-plan.json
)
INCLUDE_ARGS=(
--include='*.py' --include='*.ts' --include='*.tsx' --include='*.js' --include='*.jsx'
--include='*.mjs' --include='*.go' --include='*.java' --include='*.cs' --include='*.rs'
--include='*.json' --include='*.yaml' --include='*.yml' --include='*.toml' --include='*.env*'
--include='requirements*.txt' --include='go.mod' --include='pyproject.toml'
)
scan_count_and_sample() {
local pattern="$1"
local matches total first_rel sq="'"
matches="$(grep -rnE "${EXCLUDE_ARGS[@]}" "${INCLUDE_ARGS[@]}" -- "$pattern" "$TARGET_ABS" 2>/dev/null | grep -vE '(^|/)\.gemini4-migration-plan\.json:' || true)"
if [[ -z "$matches" ]]; then
echo "0|"
return
fi
total="$(printf '%s\n' "$matches" | wc -l | tr -d ' ')"
first_rel="${matches%%$'\n'*}"
first_rel="${first_rel#"$TARGET_ABS"/}"
first_rel="${first_rel//\"/$sq}"
first_rel="$(printf '%s' "$first_rel" | sed -E 's/:([0-9]+):[[:space:]]*/:\1: /' | cut -c1-84)"
echo "${total}|${first_rel}"
}
r_sampling="$(scan_count_and_sample '["'\'']?(temperature|top_p|topP|top_k|topK)["'\'']?[[:space:]]*[:=]')"
r_minimal="$(scan_count_and_sample 'thinking_?[lL]evel["'\''[:space:]:=]+(MINIMAL|minimal)')"
r_lowcap="$(scan_count_and_sample '["'\'']?max_?[oO]utput_?[tT]okens["'\'']?[[:space:]]*[:=][[:space:]]*([1-9][0-9]{0,3}|16384)([^0-9]|$)')"
r_explicit_cache="$(scan_count_and_sample 'cachedContents|caches\.create|cached_content')"
r_legacy_models="$(scan_count_and_sample 'gemini-(2\.5-pro|3\.8-flash|4-carbon|4-argon)')"
r_token_trap="$(scan_count_and_sample 'total_input_tokens')"
r_old_sdk="$(scan_count_and_sample 'google-generativeai|import google\.generativeai|@google/generative-ai')"
r_live_media="$(scan_count_and_sample 'bidiGenerateContent|aio\.live|IMAGE_GENERATION|response_modalities.*AUDIO|gemini-4-hydrogen.*(IMAGE|AUDIO)')"
C_SAMPLING="${r_sampling%%|*}"; S_SAMPLING="${r_sampling#*|}"
C_MINIMAL="${r_minimal%%|*}"; S_MINIMAL="${r_minimal#*|}"
C_LOWCAP="${r_lowcap%%|*}"; S_LOWCAP="${r_lowcap#*|}"
C_CACHE="${r_explicit_cache%%|*}"; S_CACHE="${r_explicit_cache#*|}"
C_LEGACY="${r_legacy_models%%|*}"; S_LEGACY="${r_legacy_models#*|}"
C_TOKENTRAP="${r_token_trap%%|*}"; S_TOKENTRAP="${r_token_trap#*|}"
C_OLDSDK="${r_old_sdk%%|*}"; S_OLDSDK="${r_old_sdk#*|}"
C_LIVEMEDIA="${r_live_media%%|*}"; S_LIVEMEDIA="${r_live_media#*|}"
TOTAL_ISSUES=$(( C_SAMPLING + C_MINIMAL + C_LOWCAP + C_CACHE + C_LEGACY + C_TOKENTRAP + C_OLDSDK + C_LIVEMEDIA ))
PYTHON_GENAI_VER="not_installed"
if command -v python3 >/dev/null 2>&1; then
PYTHON_GENAI_VER="$(python3 -c 'import importlib.metadata as m; print(m.version("google-genai"))' 2>/dev/null || echo "not_installed")"
fi
AGY_CLI_STATUS="not_found"
if command -v agy >/dev/null 2>&1; then
AGY_CLI_STATUS="$(agy --version 2>/dev/null | head -n 1 || echo "installed")"
fi
API_PROBE_STATUS="skipped"
if [[ "$PROBE_API" -eq 1 ]]; then
if [[ -n "${GEMINI_API_KEY:-}" ]]; then
http_code="$(curl -sS -o /dev/null -w "%{http_code}" --max-time 8 \
-H "x-goog-api-key: ${GEMINI_API_KEY}" \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-4-hydrogen" || echo "000")"
API_PROBE_STATUS="http_${http_code}"
[[ "$http_code" == "200" ]] && API_PROBE_STATUS="ok_http_200"
else
API_PROBE_STATUS="no_GEMINI_API_KEY_in_env"
fi
fi
json_escape() {
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' | tr -d '\r\n'
}
build_json_payload() {
cat <<JSON
{
"tool": "gemini4-hydrogen-audit",
"os": "Ubuntu 26.04 (Bash)",
"model_target": "gemini-4-hydrogen",
"project_basename": "$(json_escape "$TARGET_BASE")",
"total_findings": ${TOTAL_ISSUES},
"environment": {
"google_genai_python_sdk": "$(json_escape "$PYTHON_GENAI_VER")",
"recommended_min_python_sdk": "2.34.0",
"antigravity_cli": "$(json_escape "$AGY_CLI_STATUS")",
"api_model_metadata_probe": "$(json_escape "$API_PROBE_STATUS")"
},
"checks": [
{"id": "G4H-TRAP-01", "severity": "SILENT_HTTP_200", "title": "Ignored sampling overrides (temperature/top_p/top_k)", "count": ${C_SAMPLING}, "sample": "$(json_escape "$S_SAMPLING")"},
{"id": "G4H-TRAP-02", "severity": "LOUD_ERROR", "title": "Unsupported minimal thinking_level (defaults to high on Hydrogen)", "count": ${C_MINIMAL}, "sample": "$(json_escape "$S_MINIMAL")"},
{"id": "G4H-TRAP-03", "severity": "SILENT_TRUNCATION", "title": "Low max_output_tokens <=16384 starves thinking + output budget", "count": ${C_LOWCAP}, "sample": "$(json_escape "$S_LOWCAP")"},
{"id": "G4H-TRAP-04", "severity": "UNSUPPORTED_FEATURE", "title": "Explicit caching calls (use implicit >=4096 token cache on Hydrogen)", "count": ${C_CACHE}, "sample": "$(json_escape "$S_CACHE")"},
{"id": "G4H-TRAP-05", "severity": "COST_OR_DEPRECATION", "title": "Legacy Gemini model IDs facing Dec 1 / Jan 1 price or routing shifts", "count": ${C_LEGACY}, "sample": "$(json_escape "$S_LEGACY")"},
{"id": "G4H-TRAP-06", "severity": "COMPACTION_BUG", "title": "total_input_tokens used in Long Decode multi-hop accounting", "count": ${C_TOKENTRAP}, "sample": "$(json_escape "$S_TOKENTRAP")"},
{"id": "G4H-TRAP-07", "severity": "RETIRED_SDK", "title": "Retired google-generativeai / @google/generative-ai package", "count": ${C_OLDSDK}, "sample": "$(json_escape "$S_OLDSDK")"},
{"id": "G4H-TRAP-08", "severity": "UNSUPPORTED_MODALITY", "title": "Live API / native image or audio generation markers", "count": ${C_LIVEMEDIA}, "sample": "$(json_escape "$S_LIVEMEDIA")"}
]
}
JSON
}
if [[ "$WRITE_PLAN" -eq 1 ]]; then
build_json_payload > "${TARGET_ABS}/.gemini4-migration-plan.json"
fi
if [[ "$JSON_MODE" -eq 1 ]]; then
build_json_payload
else
printf '\nTarget folder: %s Findings: %d\n' "$TARGET_BASE" "$TOTAL_ISSUES"
printf 'Python google-genai SDK: %s (min >= 2.34.0 for Long Decode client continuation)\n' "$PYTHON_GENAI_VER"
printf 'Antigravity CLI (agy): %s API Metadata Probe: %s\n' "$AGY_CLI_STATUS" "$API_PROBE_STATUS"
echo "---------------------------------------------------------------------"
printf "%-13s | %-19s | %5s | %s\n" "Check ID" "Behavior" "Hits" "First Relative Hit"
echo "---------------------------------------------------------------------"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-01" "SILENT_HTTP_200" "$C_SAMPLING" "${S_SAMPLING:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-02" "LOUD_ERROR" "$C_MINIMAL" "${S_MINIMAL:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-03" "SILENT_TRUNCATION" "$C_LOWCAP" "${S_LOWCAP:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-04" "UNSUPPORTED_FEATURE" "$C_CACHE" "${S_CACHE:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-05" "COST_DEPRECATION" "$C_LEGACY" "${S_LEGACY:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-06" "COMPACTION_BUG" "$C_TOKENTRAP" "${S_TOKENTRAP:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-07" "RETIRED_SDK" "$C_OLDSDK" "${S_OLDSDK:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-08" "UNSUPPORTED_MOD" "$C_LIVEMEDIA" "${S_LIVEMEDIA:--}"
echo "---------------------------------------------------------------------"
if [[ "$WRITE_PLAN" -eq 1 ]]; then
echo "Saved migration plan: ${TARGET_BASE}/.gemini4-migration-plan.json"
fi
fi
if [[ "$C_MINIMAL" -gt 0 || "$C_OLDSDK" -gt 0 ]]; then
exit 1
fi
exit 0
3. macOS 27 全自动审计脚本(gemini4_hydrogen_audit_macos27.zsh)
人类执行:zsh gemini4_hydrogen_audit_macos27.zsh
Agent 全自动:zsh gemini4_hydrogen_audit_macos27.zsh –target ./your-repo –auto –json –write-plan
#!/usr/bin/env zsh
# ==============================================================================
# Gemini 4 Hydrogen (GA) Migration & Agentic Pre-Flight Audit — macOS 27 (Zsh)
# Zero third-party dependencies (macOS 27 built-in zsh, grep, awk, sed, curl)
# Modes:
# Human Interactive: zsh gemini4_hydrogen_audit_macos27.zsh [--target ./repo]
# Agent Automated: zsh gemini4_hydrogen_audit_macos27.zsh --target ./repo --auto --json
# ==============================================================================
emulate -L zsh
setopt PIPE_FAIL NO_UNSET
TARGET_DIR="."
AUTO_MODE=0
JSON_MODE=0
PROBE_API=0
WRITE_PLAN=0
print_usage() {
cat <<'USAGE'
Usage: zsh gemini4_hydrogen_audit_macos27.zsh [options]
--target <dir> Directory to scan (default: current directory)
--auto Non-interactive mode (no prompts; ideal for CI / AI Agents)
--json Emit machine-readable JSON summary to stdout
--probe Run optional read-only API/Antigravity CLI check if configured
--write-plan Write sanitized migration checklist to .gemini4-migration-plan.json
-h, --help Show this help message
USAGE
}
while (( $# > 0 )); do
case "$1" in
--target)
shift
[[ $# -gt 0 ]] || { echo "Error: --target requires a directory" >&2; exit 2; }
TARGET_DIR="$1"
;;
--auto) AUTO_MODE=1 ;;
--json) JSON_MODE=1; AUTO_MODE=1 ;;
--probe) PROBE_API=1 ;;
--write-plan) WRITE_PLAN=1 ;;
-h|--help) print_usage; exit 0 ;;
*) echo "Unknown option: $1" >&2; print_usage >&2; exit 2 ;;
esac
shift
done
if [[ ! -d "$TARGET_DIR" ]]; then
echo "Error: Target directory does not exist: $TARGET_DIR" >&2
exit 2
fi
TARGET_ABS="$(cd "$TARGET_DIR" && pwd)"
if (( AUTO_MODE == 0 )); then
print -P "%F{cyan}=====================================================================%f"
print -P "%B%F{blue} Gemini 4 Hydrogen (GA) Pre-Flight Audit — macOS 27 Interactive%f%b"
print -P "%F{cyan}=====================================================================%f"
printf "Target project [%s] (Press Enter to keep): " "$TARGET_ABS"
read -r input_dir || true
if [[ -n "${input_dir:-}" ]]; then
[[ -d "$input_dir" ]] || { echo "Directory not found: $input_dir" >&2; exit 2; }
TARGET_ABS="$(cd "$input_dir" && pwd)"
fi
printf "Run optional live check if GEMINI_API_KEY / agy CLI present? [y/N]: "
read -r probe_ans || true
[[ "${probe_ans:-n}" == [Yy]* ]] && PROBE_API=1
printf "Write sanitized migration plan JSON into target folder? [y/N]: "
read -r plan_ans || true
[[ "${plan_ans:-n}" == [Yy]* ]] && WRITE_PLAN=1
fi
typeset -a EXCLUDE_ARGS
EXCLUDE_ARGS=(
"--exclude-dir=.git"
"--exclude-dir=node_modules"
"--exclude-dir=.venv"
"--exclude-dir=venv"
"--exclude-dir=__pycache__"
"--exclude-dir=dist"
"--exclude-dir=build"
"--exclude-dir=.next"
"--exclude=.gemini4-migration-plan.json"
)
typeset -a INCLUDE_ARGS
INCLUDE_ARGS=(
"--include=*.py" "--include=*.ts" "--include=*.tsx" "--include=*.js" "--include=*.jsx"
"--include=*.mjs" "--include=*.go" "--include=*.java" "--include=*.cs" "--include=*.rs"
"--include=*.json" "--include=*.yaml" "--include=*.yml" "--include=*.toml" "--include=*.env*"
"--include=requirements*.txt" "--include=go.mod" "--include=pyproject.toml"
)
scan_count_and_sample() {
local pattern="$1"
local matches total first_rel sq="'"
matches="$(grep -rnE "${EXCLUDE_ARGS[@]}" "${INCLUDE_ARGS[@]}" -- "$pattern" "$TARGET_ABS" 2>/dev/null | grep -vE '(^|/)\.gemini4-migration-plan\.json:' || true)"
if [[ -z "$matches" ]]; then
echo "0|"
return
fi
total="$(printf '%s\n' "$matches" | wc -l | tr -d ' ')"
first_rel="${matches%%$'\n'*}"
# Strip prefix paths & usernames to keep output leak-free
first_rel="${first_rel#$TARGET_ABS/}"
first_rel="${first_rel//\"/$sq}"
first_rel="$(printf '%s' "$first_rel" | sed -E 's/:([0-9]+):[[:space:]]*/:\1: /' | cut -c1-84)"
echo "${total}|${first_rel}"
}
r_sampling="$(scan_count_and_sample '["'\'']?(temperature|top_p|topP|top_k|topK)["'\'']?[[:space:]]*[:=]')"
r_minimal="$(scan_count_and_sample 'thinking_?[lL]evel["'\''[:space:]:=]+(MINIMAL|minimal)')"
r_lowcap="$(scan_count_and_sample '["'\'']?max_?[oO]utput_?[tT]okens["'\'']?[[:space:]]*[:=][[:space:]]*([1-9][0-9]{0,3}|16384)([^0-9]|$)')"
r_explicit_cache="$(scan_count_and_sample 'cachedContents|caches\.create|cached_content')"
r_legacy_models="$(scan_count_and_sample 'gemini-(2\.5-pro|3\.8-flash|4-carbon|4-argon)')"
r_token_trap="$(scan_count_and_sample 'total_input_tokens')"
r_old_sdk="$(scan_count_and_sample 'google-generativeai|import google\.generativeai|@google/generative-ai')"
r_live_media="$(scan_count_and_sample 'bidiGenerateContent|aio\.live|IMAGE_GENERATION|response_modalities.*AUDIO|gemini-4-hydrogen.*(IMAGE|AUDIO)')"
split_metric() {
local val="$1"
echo "${val%%|*}"
}
split_sample() {
local val="$1"
echo "${val#*|}"
}
C_SAMPLING=$(split_metric "$r_sampling"); S_SAMPLING=$(split_sample "$r_sampling")
C_MINIMAL=$(split_metric "$r_minimal"); S_MINIMAL=$(split_sample "$r_minimal")
C_LOWCAP=$(split_metric "$r_lowcap"); S_LOWCAP=$(split_sample "$r_lowcap")
C_CACHE=$(split_metric "$r_explicit_cache"); S_CACHE=$(split_sample "$r_explicit_cache")
C_LEGACY=$(split_metric "$r_legacy_models"); S_LEGACY=$(split_sample "$r_legacy_models")
C_TOKENTRAP=$(split_metric "$r_token_trap"); S_TOKENTRAP=$(split_sample "$r_token_trap")
C_OLDSDK=$(split_metric "$r_old_sdk"); S_OLDSDK=$(split_sample "$r_old_sdk")
C_LIVEMEDIA=$(split_metric "$r_live_media"); S_LIVEMEDIA=$(split_sample "$r_live_media")
TOTAL_ISSUES=$(( C_SAMPLING + C_MINIMAL + C_LOWCAP + C_CACHE + C_LEGACY + C_TOKENTRAP + C_OLDSDK + C_LIVEMEDIA ))
# Environment checks (zero external dependencies)
PYTHON_GENAI_VER="not_installed"
if command -v python3 >/dev/null 2>&1; then
PYTHON_GENAI_VER="$(python3 -c 'import importlib.metadata as m; print(m.version("google-genai"))' 2>/dev/null || echo "not_installed")"
fi
AGY_CLI_STATUS="not_found"
if command -v agy >/dev/null 2>&1; then
AGY_CLI_STATUS="$(agy --version 2>/dev/null | head -n 1 || echo "installed")"
fi
API_PROBE_STATUS="skipped"
if (( PROBE_API == 1 )); then
if [[ -n "${GEMINI_API_KEY:-}" ]]; then
http_code="$(curl -sS -o /dev/null -w "%{http_code}" --max-time 8 \
-H "x-goog-api-key: ${GEMINI_API_KEY}" \
"https://generativelanguage.googleapis.com/v1beta/models/gemini-4-hydrogen" || echo "000")"
if [[ "$http_code" == "200" ]]; then
API_PROBE_STATUS="ok_http_200"
else
API_PROBE_STATUS="http_${http_code}"
fi
else
API_PROBE_STATUS="no_GEMINI_API_KEY_in_env"
fi
fi
json_escape() {
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' | tr -d '\r\n'
}
build_json_payload() {
cat <<JSON
{
"tool": "gemini4-hydrogen-audit",
"os": "macOS 27 (Zsh)",
"model_target": "gemini-4-hydrogen",
"project_basename": "$(json_escape "${TARGET_ABS:t}")",
"total_findings": ${TOTAL_ISSUES},
"environment": {
"google_genai_python_sdk": "$(json_escape "$PYTHON_GENAI_VER")",
"recommended_min_python_sdk": "2.34.0",
"antigravity_cli": "$(json_escape "$AGY_CLI_STATUS")",
"api_model_metadata_probe": "$(json_escape "$API_PROBE_STATUS")"
},
"checks": [
{"id": "G4H-TRAP-01", "severity": "SILENT_HTTP_200", "title": "Ignored sampling overrides (temperature/top_p/top_k)", "count": ${C_SAMPLING}, "sample": "$(json_escape "$S_SAMPLING")"},
{"id": "G4H-TRAP-02", "severity": "LOUD_ERROR", "title": "Unsupported minimal thinking_level (defaults to high on Hydrogen)", "count": ${C_MINIMAL}, "sample": "$(json_escape "$S_MINIMAL")"},
{"id": "G4H-TRAP-03", "severity": "SILENT_TRUNCATION", "title": "Low max_output_tokens <=16384 starves thinking + output budget", "count": ${C_LOWCAP}, "sample": "$(json_escape "$S_LOWCAP")"},
{"id": "G4H-TRAP-04", "severity": "UNSUPPORTED_FEATURE", "title": "Explicit caching calls (use implicit >=4096 token cache on Hydrogen)", "count": ${C_CACHE}, "sample": "$(json_escape "$S_CACHE")"},
{"id": "G4H-TRAP-05", "severity": "COST_OR_DEPRECATION", "title": "Legacy Gemini model IDs facing Dec 1 / Jan 1 price or routing shifts", "count": ${C_LEGACY}, "sample": "$(json_escape "$S_LEGACY")"},
{"id": "G4H-TRAP-06", "severity": "COMPACTION_BUG", "title": "total_input_tokens used in Long Decode multi-hop accounting", "count": ${C_TOKENTRAP}, "sample": "$(json_escape "$S_TOKENTRAP")"},
{"id": "G4H-TRAP-07", "severity": "RETIRED_SDK", "title": "Retired google-generativeai / @google/generative-ai package", "count": ${C_OLDSDK}, "sample": "$(json_escape "$S_OLDSDK")"},
{"id": "G4H-TRAP-08", "severity": "UNSUPPORTED_MODALITY", "title": "Live API / native image or audio generation markers", "count": ${C_LIVEMEDIA}, "sample": "$(json_escape "$S_LIVEMEDIA")"}
]
}
JSON
}
if (( WRITE_PLAN == 1 )); then
build_json_payload > "${TARGET_ABS}/.gemini4-migration-plan.json"
fi
if (( JSON_MODE == 1 )); then
build_json_payload
else
print ""
print -P "%BTarget folder:%b ${TARGET_ABS:t} %BFindings:%b ${TOTAL_ISSUES}"
print -P "%BPython google-genai SDK:%b ${PYTHON_GENAI_VER} (min >= 2.34.0 for Long Decode client continuation)"
print -P "%BAntigravity CLI (agy):%b ${AGY_CLI_STATUS} %BAPI Metadata Probe:%b ${API_PROBE_STATUS}"
printf "---------------------------------------------------------------------\n"
printf "%-13s | %-19s | %5s | %s\n" "Check ID" "Behavior" "Hits" "First Relative Hit"
printf "---------------------------------------------------------------------\n"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-01" "SILENT_HTTP_200" "$C_SAMPLING" "${S_SAMPLING:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-02" "LOUD_ERROR" "$C_MINIMAL" "${S_MINIMAL:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-03" "SILENT_TRUNCATION" "$C_LOWCAP" "${S_LOWCAP:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-04" "UNSUPPORTED_FEATURE" "$C_CACHE" "${S_CACHE:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-05" "COST_DEPRECATION" "$C_LEGACY" "${S_LEGACY:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-06" "COMPACTION_BUG" "$C_TOKENTRAP" "${S_TOKENTRAP:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-07" "RETIRED_SDK" "$C_OLDSDK" "${S_OLDSDK:--}"
printf "%-13s | %-19s | %5d | %s\n" "G4H-TRAP-08" "UNSUPPORTED_MOD" "$C_LIVEMEDIA" "${S_LIVEMEDIA:--}"
printf "---------------------------------------------------------------------\n"
if (( WRITE_PLAN == 1 )); then
print -P "%F{green}Saved migration plan:%f ${TARGET_ABS:t}/.gemini4-migration-plan.json"
fi
fi
if (( C_MINIMAL > 0 || C_OLDSDK > 0 )); then
exit 1
fi
exit 0
六、跑分跃升与成本悖论:为什么“单价翻倍”,总账反而暴降 59%?
很多人第一眼看 Google 定价表都会皱眉头:gemini-3.8-flash 标准价才 $0.75 / $3.75,gemini-4-hydrogen 却要 $1.50 / $7.50——这不是直接涨价一倍吗?
答案藏在独立第三方基准测试机构 Artificial Analysis(v5.0.1) 与 Google DeepMind 官方 Model Card 同时披露的一组“违背直觉”的实测数据里:

图 11:本文原创分析图。左图展示 Terminal-Bench 4.1 从 18.2% 暴涨至 57.0% 与 SWE-sweep 领跑实力;右图揭示“为什么单价翻倍实付却骤降 59%”。
请仔细品这几组已经通过全量验证的真实数字:
- Artificial Analysis Intelligence Index v5.0.1:Hydrogen 在默认
high档位直接拿到 51 分,而在开启xhigh(Extra)档位后更是飙到 54 分!同代可比模型中位数仅 41 分,上代gemini-3.8-flash (high)只有 31 分——换句话说,定位“日常轻量主力”的 Hydrogen 在智力指标上已经直接反超了大哥 Gemini 4 Argon(50 分)! - 单任务实付成本悖论:在 AA 全套复杂推理评测中,完成全部测试题,上代
3.8 Flash花费了 $7.77(因为它终端任务通过率低,遇到报错不停绕路试错),而同样跑完这套评价体系的Hydrogen (xhigh)实付仅 $3.16——直降 59%!同时 Hydrogen 实测输出吞吐稳定在 188 tok/s(早期实测甚至达到 198 tok/s,对比 3.8 Flash 约 111 tok/s 快了约 1.8 倍)。
图 12:真实网页截图——Artificial Analysis 官网针对 gemini-4-hydrogen (xhigh) 的实时评分、吞吐与全套花费面板(artificialanalysis.ai)。
再看 DeepMind 在官方 Model Card 里公布的真实工程硬骨头榜单,差距更是代际级别的鸿沟:
Terminal-Bench 4.1(真实 Linux 终端排错、编译与运维):Gemini 4 Hydrogen 拿到 57.0%,而gemini-3.8-flash仅 18.2%(暴涨 +38.8 个百分点!接近 Claude Sonnet 5.5 的 63.9%);SWE-sweep(高难度跨仓库软件工程):Hydrogen 拿到 13.5%,大幅甩开同等梯队里的 Claude Sonnet 5.5(3.1%)和 GPT-6.1 Terra(5.8%);Agents' Last Exam v1.1/OSWorld-2.1/Vending-Bench 2:Hydrogen 分别斩获 71.6%、77.6%(桌面 GUI 真实操作)与 $14,549 商业长程博弈收益,并在Vals Tax Agent Bench(52.3%)夺得第一、Vals Legal Research Bench(55.8%)并列第一、Agent Arena榜单高居 第 5 名。
图 13:真实网页截图——官方披露的性能对比与多维度终端工程实测面板,全面支撑 Hydrogen 在高难编码与代理任务中的性价比反转。
顺带提一个关键“体感小贴士”:虽然 Hydrogen 写字飞快(188 tok/s),但在 xhigh 极限思考模式下,它的 AA 实测首字延迟(TTFT)大约在 40.55 秒(对比 3.8 Flash 约 17.10 秒),完整高难长链题平均耗时约 13.7 分钟。这再次印证了一句话:给它开启 high / xhigh 是用来啃真正的长程架构难题的;如果是面向 C 端用户的实时对话或秒级分类界面,务必手动切到 thinking_level=“low” 或 “medium”!
七、高频实战 Q&A:升级路上开发者最纠结的 7 个问题
Q1:既然 Hydrogen 也有了 Free Tier(免费层),能直接把线上小业务全部绑免费 Key 跑吗?
千万别在生产业务与涉密代码上混用 Free Tier!首先 Free Tier 有严格的速率(RPM/TPM)限制,随时可能 429 限流;更重要的是根据 Google 官方 AI Studio 定价页规则,Free Tier 下提交的数据与上下文可能会被用于改进 Google 产品。所有涉及企业私密代码库、客户数据和 SLA 要求的业务,请务必在 Paid Tier 账单项目中调用(Paid Tier 明确不会将 API 提示词用于模型训练)。
Q2:我已经在用 Gemini 4 Argon / Carbon 当主力,还需要折腾 Hydrogen 吗?
强烈建议把 70%~80% 的高频工程流迁入 Hydrogen(或使用 Antigravity 的 Orchestrator (Carbon/Argon) 模式自动调度)。原因很现实:2026 年 12 月 1 日起 Carbon 和 Argon 的标准价格将翻倍至 $4.00 / $20.00,而 Hydrogen($1.50 / $7.50)在 AA Intelligence Index 上已经打平甚至在 xhigh 档反超 Argon,且输出速度更快。让 Carbon 专心干最难的顶层设计,把繁重活甩给 Hydrogen 才是最合理的成本护城河。
Q3:我们在旧版本用了很多 generateContent 无状态循环,每次调用怎么带上多轮工具状态?
对于不使用服务端 stateful Conversations/Interactions 状态的纯无状态 generateContent 接口,开发者必须把模型前几轮输出的 thought_signature 原原本本、一个字节不改地原样拼回到 contents 历史数组里回传。特别注意:如果一轮里触发了并行(Parallel)多个 functionCall,只有第一个调用块上带有签名,千万不要自作聪明把第一个的签名复制粘贴给后面并行的函数调用。
Q4:为什么我开启了 background=True,长代码写到 6 万多 token 还是断掉了?
几乎 100% 是漏了一个细节:在服务端 background=True 模式下,max_output_tokens 的默认值依然继承自同步 64K 规则!你必须同时传入 store=True 并且把 max_output_tokens 显式设置成大于 65536 的整数(比如 200000),服务端接力循环才会真正启动。
Q5:gemini-4-hydrogen 已经全量了,为什么我写实时语音助手(Live API)或图生图工作流却调不通?
这不是额度问题,而是原生模态边界限制:官方 Model Specs 明确指出 gemini-4-hydrogen 目前 不支持 Live API(双向实时音视频流)、原生图像生成(Image generation)以及音频生成(Audio generation)(它专注文本与多模态输入理解 -> 纯文本/结构化/工具高密推理输出)。实时语音和生图任务请继续通过路由网关分流给对应专用多模态模型。
Q6:Implicit Caching 到底用不用写额外代码去“开启”?万一我的单次请求不够 4,096 tokens 怎么办?
完全不需要调用任何创建/绑定接口,只要你在同一个项目下连续发送的请求共享至少 4,096 tokens 的完全一致前缀,后端就会自动命中隐式缓存并在账单上按 $0.075 / 1M(省 95%)结算。如果不足 4,096 tokens 则按标准 $1.50/M 计费;只要记得把稳态的大段系统提示词、项目规范文档(例如类似 CLAUDE.md/AGENTS.md 的上下文骨架)和全量 Tool Schemas 永远放在请求数组的最开头,就能稳定吃满缓存红利。
Q7:Antigravity 里的 Extra 档位是不是就是 API 里的 xhigh?适合全程开着吗?
是的,Antigravity UI 里的 Extra 对应的就是 API 与 agy CLI 中的 thinking_level=“xhigh”(别名 gemini-4-hydrogen-xhigh)。但切记别把所有普通需求都死磕开到 xhigh——它在 AA 实测里平均首字等待要 40 秒以上,简单小修小补用默认的 high 甚至在 API 中降回 low/medium 体感才最爽,只有面对“全库死锁排查 / 复杂状态机跨模块重构”时再升 xhigh 一击必杀。
结语
站在 2026 年底的这个时间节点来看,Gemini 4 Hydrogen 的全量开放标志着大模型的竞争彻底迈出了“单纯卷跑分上限”的草莽期,正式进入“单位智能密度 × 并行速度 × 真实总包成本”的工业算账时代。
你既不需要再因为预算妥协去忍受轻量模型动辄跑飞的挫败感,也不必再每次让顶配大旗舰亲自下场帮你读成百上千个日志碎片。趁着 12 月 1 日与 1 月 1 日两道价差悬崖落锤之前,赶快用上面为你准备的三平台一键脚本跑一遍仓库体检,把那 6 个静默 HTTP 200 暗坑清理干净,把 Hydrogen 这把又快又准的闪电手术刀正式编入你的主力研发体系吧!