| """Model definitions and mapping from Gemini frontend JS source.""" |
|
|
| |
| |
|
|
| 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 |
|
|