File size: 2,264 Bytes
a5784e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import asyncio
import logging
import time
from asyncio import Event
from typing import Any, Dict, List, Set

from fastapi import Depends
from playwright.async_api import Page as AsyncPage

from config import DEFAULT_FALLBACK_MODEL_ID

from ..dependencies import (
    ensure_request_lock,
    get_excluded_model_ids,
    get_logger,
    get_model_list_fetch_event,
    get_page_instance,
    get_parsed_model_list,
)


async def list_models(
    logger: logging.Logger = Depends(get_logger),
    model_list_fetch_event: Event = Depends(get_model_list_fetch_event),
    page_instance: AsyncPage = Depends(get_page_instance),
    parsed_model_list: List[Dict[str, Any]] = Depends(get_parsed_model_list),
    excluded_model_ids: Set[str] = Depends(get_excluded_model_ids),
    _lock: None = Depends(ensure_request_lock),
):
    logger.debug("[API] Received /v1/models request.")

    if (
        not model_list_fetch_event.is_set()
        and page_instance
        and not page_instance.is_closed()
    ):
        logger.info(
            "/v1/models: Model list event not set, attempting to refresh page..."
        )
        try:
            await page_instance.reload(wait_until="domcontentloaded", timeout=20000)
            await asyncio.wait_for(model_list_fetch_event.wait(), timeout=10.0)
        except asyncio.CancelledError:
            raise
        except Exception as e:
            logger.error(f"/v1/models: Error refreshing or waiting for model list: {e}")
        finally:
            if not model_list_fetch_event.is_set():
                model_list_fetch_event.set()

    if parsed_model_list:
        final_model_list = [
            m
            for m in parsed_model_list
            if isinstance(m, dict) and m.get("id") not in excluded_model_ids
        ]
        return {"object": "list", "data": final_model_list}
    else:
        logger.warning("Model list is empty, returning default fallback model.")
        return {
            "object": "list",
            "data": [
                {
                    "id": DEFAULT_FALLBACK_MODEL_ID,
                    "object": "model",
                    "created": int(time.time()),
                    "owned_by": "camoufox-proxy-fallback",
                }
            ],
        }