"""Model definitions and mapping from Gemini frontend JS source.""" # MODE_CATEGORY enum from 028-6eb337387583.js: # 1=FAST, 2=THINKING, 3=PRO, 4=AUTO, 5=FAST_DYNAMIC_THINKING, 6=FLASH_LITE MODELS = { "gemini-3.5-flash": { "mode": 1, "think": 4, "desc": "Fast general-purpose model", }, "gemini-3.5-flash-thinking": { "mode": 2, "think": 0, "desc": "Deep thinking mode, longest output (~20k chars)", }, "gemini-3.1-pro": { "mode": 3, "think": 4, "desc": "Pro model (requires cookie for real routing)", }, "gemini-3.1-pro-enhanced": { "mode": 3, "think": 4, "extra": {31: 2, 80: 3}, "desc": "Pro with enhanced output (experimental)", }, "gemini-auto": { "mode": 4, "think": 4, "desc": "Auto model selection", }, "gemini-3.5-flash-thinking-lite": { "mode": 5, "think": 0, "desc": "Dynamic thinking with adaptive depth", }, "gemini-flash-lite": { "mode": 6, "think": 4, "desc": "Lightweight fast model", }, } def resolve_model(model_name: str, default: str = "gemini-3.5-flash"): """Resolve model name to (name, mode_id, think_mode, error, extra_fields). Unknown model names fall back to default rather than erroring, since upstream clients may request arbitrary model identifiers. """ think_override = None if "@think=" in model_name: model_name, think_str = model_name.rsplit("@think=", 1) try: think_override = int(think_str) except ValueError: return None, None, None, f"Invalid think level: {think_str}", None cfg = MODELS.get(model_name) if not cfg: from .gemini import log log(f"Unknown model '{model_name}', falling back to '{default}'") model_name = default cfg = MODELS[default] mode_id = cfg["mode"] think_mode = think_override if think_override is not None else cfg["think"] extra = cfg.get("extra") return model_name, mode_id, think_mode, None, extra