| | import time |
| | from fastapi import APIRouter, Depends, Request |
| | from typing import List, Dict, Any |
| | from auth import get_api_key |
| | from model_loader import get_vertex_models, get_vertex_express_models, refresh_models_config_cache |
| | import config as app_config |
| | from credentials_manager import CredentialManager |
| |
|
| | router = APIRouter() |
| |
|
| | @router.get("/v1/models") |
| | async def list_models(fastapi_request: Request, api_key: str = Depends(get_api_key)): |
| | await refresh_models_config_cache() |
| | |
| | OPENAI_DIRECT_SUFFIX = "-openai" |
| | EXPERIMENTAL_MARKER = "-exp-" |
| | PAY_PREFIX = "[PAY]" |
| | |
| | credential_manager_instance: CredentialManager = fastapi_request.app.state.credential_manager |
| |
|
| | has_sa_creds = credential_manager_instance.get_total_credentials() > 0 |
| | has_express_key = bool(app_config.VERTEX_EXPRESS_API_KEY_VAL) |
| |
|
| | raw_vertex_models = await get_vertex_models() |
| | raw_express_models = await get_vertex_express_models() |
| | |
| | candidate_model_ids = set() |
| | raw_vertex_models_set = set(raw_vertex_models) |
| |
|
| | if has_express_key: |
| | candidate_model_ids.update(raw_express_models) |
| | |
| | |
| | |
| | if not has_sa_creds: |
| | |
| | |
| | all_model_ids = set(raw_express_models) |
| | else: |
| | |
| | all_model_ids = set(raw_vertex_models + raw_express_models) |
| | elif has_sa_creds: |
| | |
| | all_model_ids = set(raw_vertex_models) |
| | else: |
| | |
| | all_model_ids = set() |
| | |
| | |
| | |
| | |
| | |
| | |
| | dynamic_models_data: List[Dict[str, Any]] = [] |
| | current_time = int(time.time()) |
| |
|
| | |
| | for original_model_id in sorted(list(all_model_ids)): |
| | current_display_prefix = "" |
| | |
| | |
| | |
| | if has_sa_creds and \ |
| | original_model_id in raw_vertex_models_set and \ |
| | EXPERIMENTAL_MARKER not in original_model_id and \ |
| | not original_model_id.startswith("[EXPRESS]"): |
| | current_display_prefix = PAY_PREFIX |
| | |
| | base_display_id = f"{current_display_prefix}{original_model_id}" |
| | |
| | dynamic_models_data.append({ |
| | "id": base_display_id, "object": "model", "created": current_time, "owned_by": "google", |
| | "permission": [], "root": original_model_id, "parent": None |
| | }) |
| | |
| | |
| | if not original_model_id.startswith("gemini-2.0"): |
| | standard_suffixes = ["-search", "-encrypt", "-encrypt-full", "-auto"] |
| | for suffix in standard_suffixes: |
| | |
| | suffixed_model_part = f"{original_model_id}{suffix}" |
| | |
| | final_suffixed_display_id = f"{current_display_prefix}{suffixed_model_part}" |
| | |
| | |
| | if final_suffixed_display_id not in all_model_ids and not any(m['id'] == final_suffixed_display_id for m in dynamic_models_data): |
| | dynamic_models_data.append({ |
| | "id": final_suffixed_display_id, "object": "model", "created": current_time, "owned_by": "google", |
| | "permission": [], "root": original_model_id, "parent": None |
| | }) |
| | |
| | |
| | if original_model_id.startswith("gemini-2.5-flash"): |
| | special_flash_suffixes = ["-nothinking", "-max"] |
| | for special_suffix in special_flash_suffixes: |
| | suffixed_model_part = f"{original_model_id}{special_suffix}" |
| | final_special_suffixed_display_id = f"{current_display_prefix}{suffixed_model_part}" |
| |
|
| | if final_special_suffixed_display_id not in all_model_ids and not any(m['id'] == final_special_suffixed_display_id for m in dynamic_models_data): |
| | dynamic_models_data.append({ |
| | "id": final_special_suffixed_display_id, "object": "model", "created": current_time, "owned_by": "google", |
| | "permission": [], "root": original_model_id, "parent": None |
| | }) |
| |
|
| | |
| | |
| | if has_sa_creds: |
| | |
| | |
| | |
| | |
| | |
| | |
| | for base_model_id_for_openai in raw_vertex_models: |
| | display_model_id = "" |
| | if EXPERIMENTAL_MARKER in base_model_id_for_openai: |
| | display_model_id = f"{base_model_id_for_openai}{OPENAI_DIRECT_SUFFIX}" |
| | else: |
| | display_model_id = f"{PAY_PREFIX}{base_model_id_for_openai}{OPENAI_DIRECT_SUFFIX}" |
| | |
| | |
| | if display_model_id and not any(m['id'] == display_model_id for m in dynamic_models_data): |
| | dynamic_models_data.append({ |
| | "id": display_model_id, "object": "model", "created": current_time, "owned_by": "google", |
| | "permission": [], "root": base_model_id_for_openai, "parent": None |
| | }) |
| | |
| | |
| | |
| | |
| | return {"object": "list", "data": sorted(dynamic_models_data, key=lambda x: x['id'])} |