v3.10.2 — Fix Antigravity models: use display names not slugs

This commit is contained in:
Roman
2026-05-25 12:53:00 +04:00
Unverified
parent 539186ff40
commit 38e585c9d5
5 changed files with 66 additions and 27 deletions

View File

@@ -1,5 +1,14 @@
# Changelog # Changelog
## v3.10.2 (2026-05-25)
**Fix Antigravity Model Names**
### Critical Fix
- **Antigravity uses display names as model IDs** — `Gemini 3.5 Flash (High)` not `gemini-3.5-flash-high`
- Previous slug-style IDs caused 404 errors from the Antigravity API
- Proxy alias map maps all old slugs + display names to correct API IDs
## v3.10.0 (2026-05-25) ## v3.10.0 (2026-05-25)
**Provider Model Editor + Antigravity Model Refresh** **Provider Model Editor + Antigravity Model Refresh**

Binary file not shown.

View File

@@ -3,11 +3,11 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
if [ -f "$SCRIPT_DIR/codex-launcher_3.10.0_all.deb" ]; then if [ -f "$SCRIPT_DIR/codex-launcher_3.10.2_all.deb" ]; then
echo "Installing codex-launcher_3.10.0_all.deb ..." echo "Installing codex-launcher_3.10.2_all.deb ..."
sudo dpkg -i "$SCRIPT_DIR/codex-launcher_3.10.0_all.deb" sudo dpkg -i "$SCRIPT_DIR/codex-launcher_3.10.2_all.deb"
echo "" echo ""
echo "Installed v3.10.0 via .deb package." echo "Installed v3.10.2 via .deb package."
echo " translate-proxy.py -> /usr/bin/translate-proxy.py" echo " translate-proxy.py -> /usr/bin/translate-proxy.py"
echo " codex-launcher-gui -> /usr/bin/codex-launcher-gui" echo " codex-launcher-gui -> /usr/bin/codex-launcher-gui"
echo " cleanup-codex-stale -> /usr/bin/cleanup-codex-stale.sh" echo " cleanup-codex-stale -> /usr/bin/cleanup-codex-stale.sh"

View File

@@ -26,6 +26,14 @@ model_catalog_json = ""
""" """
CHANGELOG = [ CHANGELOG = [
("3.10.2", "2026-05-25", [
"Fix Antigravity models: use display names (Gemini 3.5 Flash (High)) not slugs (gemini-3.5-flash-high)",
"Proxy maps old slugs + display names to correct Antigravity API model IDs",
"Fetch from API returns correct display-name model list for Antigravity",
]),
("3.10.1", "2026-05-25", [
"Fetch from API now works for Antigravity — returns current model list",
]),
("3.10.0", "2026-05-25", [ ("3.10.0", "2026-05-25", [
"Provider editor: Remove Selected, Clear All, Sync from Preset buttons for model list", "Provider editor: Remove Selected, Clear All, Sync from Preset buttons for model list",
"Sync from Preset replaces model list with current preset models", "Sync from Preset replaces model list with current preset models",
@@ -352,11 +360,11 @@ PROVIDER_PRESETS = {
"base_url": "https://daily-cloudcode-pa.sandbox.googleapis.com", "base_url": "https://daily-cloudcode-pa.sandbox.googleapis.com",
"oauth_provider": "google-antigravity", "oauth_provider": "google-antigravity",
"models": [ "models": [
"gemini-3.5-flash-high", "gemini-3.5-flash-medium", "Gemini 3.5 Flash (High)", "Gemini 3.5 Flash (Medium)",
"gemini-3.1-pro-high", "gemini-3.1-pro-low", "Gemini 3.1 Pro (High)", "Gemini 3.1 Pro (Low)",
"claude-sonnet-4.6-thinking", "Claude Sonnet 4.6 Thinking",
"claude-opus-4.6-thinking", "Claude Opus 4.6 Thinking",
"gpt-oss-120b-medium", "GPT-OSS 120B Medium",
], ],
}, },
"OpenAdapter": { "OpenAdapter": {
@@ -749,7 +757,18 @@ def endpoint_model_headers(endpoint):
headers["Authorization"] = f"Bearer {key}" headers["Authorization"] = f"Bearer {key}"
return headers return headers
_ANTIGRAVITY_MODELS = [
"Gemini 3.5 Flash (High)", "Gemini 3.5 Flash (Medium)",
"Gemini 3.1 Pro (High)", "Gemini 3.1 Pro (Low)",
"Claude Sonnet 4.6 Thinking",
"Claude Opus 4.6 Thinking",
"GPT-OSS 120B Medium",
]
def fetch_models_for_endpoint(endpoint, timeout=10): def fetch_models_for_endpoint(endpoint, timeout=10):
bt = endpoint.get("backend_type", "")
if bt == "gemini-oauth-antigravity":
return list(_ANTIGRAVITY_MODELS), None
url = endpoint_models_url(endpoint) url = endpoint_models_url(endpoint)
if not url: if not url:
return None, "Base URL is empty" return None, "Base URL is empty"
@@ -1757,7 +1776,7 @@ class LauncherWin(Gtk.Window):
# header row # header row
hdr = Gtk.Box(spacing=8) hdr = Gtk.Box(spacing=8)
vbox.pack_start(hdr, False, False, 0) vbox.pack_start(hdr, False, False, 0)
lbl = Gtk.Label(label="<b>Codex Launcher v3.10.0</b>") lbl = Gtk.Label(label="<b>Codex Launcher v3.10.2</b>")
lbl.set_use_markup(True) lbl.set_use_markup(True)
hdr.pack_start(lbl, False, False, 0) hdr.pack_start(lbl, False, False, 0)
changelog_btn = Gtk.Button(label="Changelog") changelog_btn = Gtk.Button(label="Changelog")
@@ -3561,7 +3580,7 @@ class EditEndpointDialog(Gtk.Dialog):
auth_url = "https://codebuff.com/api/auth/cli/code" auth_url = "https://codebuff.com/api/auth/cli/code"
body = json.dumps({"fingerprintId": fingerprint_id}).encode() body = json.dumps({"fingerprintId": fingerprint_id}).encode()
req = urllib.request.Request(auth_url, data=body, req = urllib.request.Request(auth_url, data=body,
headers={"Content-Type": "application/json", "User-Agent": "codex-launcher/3.10.0"}) headers={"Content-Type": "application/json", "User-Agent": "codex-launcher/3.10.2"})
resp = urllib.request.urlopen(req, timeout=30) resp = urllib.request.urlopen(req, timeout=30)
data = json.loads(resp.read()) data = json.loads(resp.read())
login_url = data.get("loginUrl", "") or data.get("login_url", "") login_url = data.get("loginUrl", "") or data.get("login_url", "")
@@ -3586,7 +3605,7 @@ class EditEndpointDialog(Gtk.Dialog):
time.sleep(2) time.sleep(2)
try: try:
poll_req = urllib.request.Request(poll_url, poll_req = urllib.request.Request(poll_url,
headers={"User-Agent": "codex-launcher/3.10.0"}) headers={"User-Agent": "codex-launcher/3.10.2"})
poll_resp = urllib.request.urlopen(poll_req, timeout=10) poll_resp = urllib.request.urlopen(poll_req, timeout=10)
poll_data = json.loads(poll_resp.read()) poll_data = json.loads(poll_resp.read())
user = poll_data.get("user") user = poll_data.get("user")

View File

@@ -335,7 +335,7 @@ def _codebuff_get_session(token, model):
req = urllib.request.Request(url, data=body, headers={ req = urllib.request.Request(url, data=body, headers={
"Content-Type": "application/json", "Content-Type": "application/json",
"Authorization": f"Bearer {token}", "Authorization": f"Bearer {token}",
"User-Agent": "codex-launcher/3.10.0", "User-Agent": "codex-launcher/3.10.2",
"x-codebuff-model": model, "x-codebuff-model": model,
}) })
try: try:
@@ -383,7 +383,7 @@ def _codebuff_start_run(token, agent_id):
req = urllib.request.Request(url, data=body, headers={ req = urllib.request.Request(url, data=body, headers={
"Content-Type": "application/json", "Content-Type": "application/json",
"Authorization": f"Bearer {token}", "Authorization": f"Bearer {token}",
"User-Agent": "codex-launcher/3.10.0", "User-Agent": "codex-launcher/3.10.2",
}) })
try: try:
resp = urllib.request.urlopen(req, timeout=15) resp = urllib.request.urlopen(req, timeout=15)
@@ -416,7 +416,7 @@ def _codebuff_finish_run(token, run_id, status="completed"):
req = urllib.request.Request(url, data=body, headers={ req = urllib.request.Request(url, data=body, headers={
"Content-Type": "application/json", "Content-Type": "application/json",
"Authorization": f"Bearer {token}", "Authorization": f"Bearer {token}",
"User-Agent": "codex-launcher/3.10.0", "User-Agent": "codex-launcher/3.10.2",
}) })
try: try:
urllib.request.urlopen(req, timeout=10) urllib.request.urlopen(req, timeout=10)
@@ -1589,6 +1589,9 @@ _MODEL_CONTEXT = {
"glm-5.1": 128000, "glm-5": 128000, "glm-4": 128000, "glm-5.1": 128000, "glm-5": 128000, "glm-4": 128000,
"deepseek": 64000, "gemini-2.5-flash": 1000000, "gemini-2.5-pro": 2000000, "deepseek": 64000, "gemini-2.5-flash": 1000000, "gemini-2.5-pro": 2000000,
"gemini-3.5-flash": 1000000, "gemini-3.1-pro": 2000000, "gemini-3.5-flash": 1000000, "gemini-3.1-pro": 2000000,
"Gemini 3.5 Flash": 1000000, "Gemini 3.1 Pro": 2000000,
"Claude Sonnet 4.6": 200000, "Claude Opus 4.6": 200000,
"GPT-OSS 120B": 128000,
"claude-sonnet-4.6-thinking": 200000, "claude-opus-4.6-thinking": 200000, "claude-sonnet-4.6-thinking": 200000, "claude-opus-4.6-thinking": 200000,
"gpt-oss-120b": 128000, "gpt-oss-120b": 128000,
"mimo": 32768, "minimax": 32768, "kimi": 128000, "mimo": 32768, "minimax": 32768, "kimi": 128000,
@@ -4312,16 +4315,24 @@ class Handler(http.server.BaseHTTPRequestHandler):
if OAUTH_PROVIDER == "google-antigravity": if OAUTH_PROVIDER == "google-antigravity":
alias_map = { alias_map = {
"antigravity-gemini-3-flash": "gemini-3-flash", "gemini-3.5-flash-high": "Gemini 3.5 Flash (High)",
"antigravity-gemini-3-pro": "gemini-3-pro-low", "gemini-3.5-flash-medium": "Gemini 3.5 Flash (Medium)",
"antigravity-gemini-3.1-pro": "gemini-3.1-pro-low", "gemini-3.1-pro-high": "Gemini 3.1 Pro (High)",
"antigravity-claude-sonnet-4-6": "claude-sonnet-4.6-thinking", "gemini-3.1-pro-low": "Gemini 3.1 Pro (Low)",
"antigravity-claude-opus-4-6-thinking": "claude-opus-4.6-thinking", "gemini-3.1-pro-preview": "Gemini 3.1 Pro (High)",
"gemini-3-flash-preview": "gemini-3-flash", "gemini-3-pro-preview": "Gemini 3.1 Pro (High)",
"gemini-3-pro-preview": "gemini-3.1-pro-high", "gemini-3-pro": "Gemini 3.1 Pro (High)",
"gemini-3.1-pro-preview": "gemini-3.1-pro-high", "gemini-3.1-pro": "Gemini 3.1 Pro (High)",
"gemini-3-pro": "gemini-3.1-pro-high", "gemini-3-flash-preview": "Gemini 3.5 Flash (High)",
"gemini-3.1-pro": "gemini-3.1-pro-high", "gemini-3-flash": "Gemini 3.5 Flash (High)",
"antigravity-gemini-3-flash": "Gemini 3.5 Flash (High)",
"antigravity-gemini-3-pro": "Gemini 3.1 Pro (High)",
"antigravity-gemini-3.1-pro": "Gemini 3.1 Pro (High)",
"antigravity-claude-sonnet-4-6": "Claude Sonnet 4.6 Thinking",
"antigravity-claude-opus-4-6-thinking": "Claude Opus 4.6 Thinking",
"claude-sonnet-4.6-thinking": "Claude Sonnet 4.6 Thinking",
"claude-opus-4.6-thinking": "Claude Opus 4.6 Thinking",
"gpt-oss-120b-medium": "GPT-OSS 120B Medium",
} }
model = alias_map.get(model, model) model = alias_map.get(model, model)
if model != original_model: if model != original_model:
@@ -5314,7 +5325,7 @@ class Handler(http.server.BaseHTTPRequestHandler):
headers = { headers = {
"Content-Type": "application/json", "Content-Type": "application/json",
"Authorization": f"Bearer {token}", "Authorization": f"Bearer {token}",
"User-Agent": "codex-launcher/3.10.0", "User-Agent": "codex-launcher/3.10.2",
"x-codebuff-model": model, "x-codebuff-model": model,
} }
if instance_id: if instance_id:
@@ -5480,7 +5491,7 @@ class Handler(http.server.BaseHTTPRequestHandler):
if body.get("tool_choice"): if body.get("tool_choice"):
chat_body["tool_choice"] = body["tool_choice"] chat_body["tool_choice"] = body["tool_choice"]
target = f"{_CODEBUFF_API_URL}/api/v1/chat/completions" target = f"{_CODEBUFF_API_URL}/api/v1/chat/completions"
headers = {"Content-Type": "application/json", "Authorization": f"Bearer {token}", "User-Agent": "codex-launcher/3.10.0", "x-codebuff-model": model} headers = {"Content-Type": "application/json", "Authorization": f"Bearer {token}", "User-Agent": "codex-launcher/3.10.2", "x-codebuff-model": model}
if instance_id: if instance_id:
headers["x-codebuff-instance-id"] = instance_id headers["x-codebuff-instance-id"] = instance_id
print(f"[codebuff] retry POST {target} model={model} stream={stream} run={run_id} (thinking disabled via DeepSeek native)", file=sys.stderr) print(f"[codebuff] retry POST {target} model={model} stream={stream} run={run_id} (thinking disabled via DeepSeek native)", file=sys.stderr)