Repository navigation
[Feature]: google-antigravity — route base model + reasoning effort to the correct tiered wire ID (collapsed picker rows) #2025
Description
Area
Provider integration — Google Antigravity (reasoning-effort routing)
What are you trying to accomplish?
Change Gemini Flash thinking effort on the google-antigravity provider without switching models. After #1897, discovery exposes each CCA thinking tier as a separate picker row (gemini-3.7-flash-low/-medium/-high, same for 3.5/3.6, gemini-3.1-pro-low/high), so the client's reasoning-effort control no longer has any effect on the rows users actually see.
What prevents this today?
Rule 1 of resolveAntigravityEffortWireModel (src/providers/antigravity-models.ts) treats any suffix ID as "the suffix IS the effort": it returns the resolved wire ID unchanged and deliberately sends no thinkingConfig, so an explicit effort from the client (e.g. low, or none) is silently discarded for suffix models. The smoother path already exists but is unreachable from the picker: rule 2 maps a base model + effort to the correct tiered wire ID (gemini-3.7-flash + high → the high-tier wire ID, thinkingLevel preserved), and ANTIGRAVITY_MODEL_EFFORTS already advertises the ladder for base IDs (gemini-3.7-flash: [low, medium, high]).
What should OpenCodex do?
- Expose collapsed base-model rows for discovered tiered models (by default or via an option) and drive the upstream wire ID from the request's reasoning effort through the existing rule-2 mapping — one model selection covers all thinking levels.
- Honor an explicit effort when a suffix ID was selected (strip the suffix, then apply rule 2), or at least surface a warning that the effort was ignored instead of silently dropping it.
- Document a
none/minimal→lowexpectation: CCA exposes no "thinking off" tier for Flash, sononecannot be honored upstream.
Possible implementation
- When discovery returns tier-suffixed rows, also register the derived base ID with its effort ladder from
ANTIGRAVITY_MODEL_EFFORTS(dedup per base), letting rule 2 resolvebase + effort → wire IDat request time insrc/adapters/google.ts. - In rule 1, when an explicit effort is present and differs from the suffix tier, either apply rule 2 on the stripped base or log a warning once per request.
Example usage or interface
model: gemini-3.7-flash, reasoning effort: low → wire: low tier
model: gemini-3.7-flash, reasoning effort: high → wire: high tier
Live-verified in commit a70bb78: the effort ladder reaches the wire (reasoning_tokens 0/27/84 for low/medium/high).
Alternatives or workarounds
- Keep one picker row per tier and switch models to change effort (current behavior).
- Pin
gemini-3.7-flash-lowas the near-"no thinking" choice (low measured 0 reasoning tokens in the commit above).
Additional context
Rule semantics reference: devlog _fin/260722_antigravity_effort_routing/010_models.md (precedence rules 1–3) and 020_adapter.md (suffix IDs receive no clamping; rule 1 returns thinkingLevel: undefined).
Checks
- I searched existing issues and documentation.
- I removed secrets and personal data.
Activity
github-actions commentedon Aug 18, 2026
Issue reopened
The report now contains the information required by the automated check. Thanks for updating it.
Ingwannu commentedon Aug 18, 2026
Re-checked against current
main/dev: the primary Gemini 3.7 path described here is already collapsed and effort-driven.parseAntigravityAvailableModelsmaps a discoveredgemini-3.7-flash-tieredrow to picker idgemini-3.7-flash;ANTIGRAVITY_MODEL_EFFORTSadvertiseslow / medium / highon that base row;resolveAntigravityEffortWireModelsends the single tiered wire id with the selectedthinkingLevel.Two narrower questions remain, but they need a current capture before changing behavior:
-low/-medium/-highpicker rows, please attach the redactedagentModelSorts,tieredModelIds, and relevantmodelskeys from that account. The current parser should collapse a complete tier set, so the exact payload shape matters.none/minimalcurrently fall back to the model default rather than being documented aslow. Please confirm whether this is an actual client-emitted request on the current base row, not only a desired alias.Marking this
needs-inforather than implementing a second collapse path on top of the one already shipped.lidge-jun commentedon Aug 19, 2026
리뷰 · 우선순위 26 / 80
google-antigravity에서 Flash thinking 강도를 모델 바꾸지 않고 조절하고 싶다. #1897 이후 발견이
gemini-3.7-flash-low/medium/high처럼 티어마다 피커 행을 만든다. 클라이언트의 reasoning-effort가 그 행에서는 무시된다. 옵트인 프로바이더 UX 요청이고 needs-info라 26이다. 티어 행을 바꿔 고르는 우회가 있다.src/providers/antigravity-models.ts의resolveAntigravityEffortWireModel()규칙 1은 맞다.isAntigravitySuffixModelId(modelId)이면{ wireModelId }만 주고thinkingLevel을 안 넣는다. 접미사가 effort라는 뜻이다. 규칙 2는 베이스 id + effort로 티어 와이어를 고른다.ANTIGRAVITY_MODEL_EFFORTS에 베이스 사다리가 있다.src/adapters/google.ts가 이 함수를 요청 때 호출한다.같은 파일의
pickerModelIdForDiscoveredWireId()는 알려진 베이스에 대해 모든 티어가 있으면 베이스 id로 접는다. 파일 머리 주석도 “CCA가 알려진 티어를 다 줄 때만 collapsed picker”다. 접히지 않으면 접미사 행이 남고 규칙 1이 effort를 버린다. 라벨을 먼저 보던 #1897 회귀를 되돌리지 않으려고 접미사 행을 다시 펼치는 쪽은 조심해야 한다.none/minimal→low는 CCA Flash에 thinking-off 티어가 없다는 전제다. 조용히 버리기보다 한 번 경고하는 편이 리포터 요구와 같다. 접미사 행을 골랐는데 클라이언트가 다른 effort를 내면, 접미사를 벗기고 규칙 2를 탈지, 경고만 할지를 정해야 한다. 둘 다 코드에 있는 규칙 2를 재사용하면 된다.해결방안
발견이 티어 접미사 행을 줄 때 베이스 id를
ANTIGRAVITY_MODEL_EFFORTS사다리와 함께 등록해, 피커 기본을 접힌 행으로 둔다. 요청은 기존 규칙 2로base + effort → wire를 탄다. 접미사 id가 선택된 채 명시 effort가 접미사와 다르면 규칙 1에서 경고하거나 베이스로 벗겨 규칙 2를 탄다.src/adapters/google.ts의 호출부는 그대로 두고resolveAntigravityEffortWireModel()만 손본다.none은 업스트림에 없다고 문서화하고low로만 기대한 값을 적는다. 새 와이어 id 테이블은 추측하지 않는다.이 댓글은 grok-bot이 작성했습니다
lidge-jun commentedon Aug 19, 2026
이미
dev에 들어옴.src/providers/antigravity-models.ts가 티어 suffix를 베이스 피커 한 줄로 접음.#1897이 다시 쪼개던 회귀도 주석으로 막아둠.gemini-3.7-flash는 effort → thinkingLevel,gemini-3.1-pro는 effort → 와이어 맵.resolveAntigravityEffortWireModelrule 2/1b가 그 길임.-high줄을 직접 고르면 effort를 무시하는 건 접미사가 곧 effort라서 의도임.none은 CCA에 꺼짐 티어가 없음.이 이슈는 여기까지. 닫음.
이 댓글은 grok-bot이 작성했습니다
pennytir commentedon Oct 11, 2026
I only see low, high, ultra. I do not see these options for antigravity in 3.1 pro