File size: 1,477 Bytes
1c8d1ba
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

import logging
from typing import Any

from src.config import load_settings
from src.search_service import SearchService


logger = logging.getLogger(__name__)


class AppRuntime:
    """Owns expensive application services that should be reused across callbacks."""

    def __init__(self) -> None:
        self._search_service: SearchService | None = None
        self._preloaded_embedder: Any | None = None
        self._preload_error: str | None = None

    @property
    def preload_error(self) -> str | None:
        return self._preload_error

    def preload_clip_model(self) -> None:
        if self._preloaded_embedder is not None:
            return

        try:
            from src.clip_embedder import ClipEmbedder

            settings = load_settings()
            logger.info("Preloading CLIP model before Gradio launches")
            self._preloaded_embedder = ClipEmbedder(settings.clip_model_name)
            self._preload_error = None
            logger.info("CLIP model preload complete")
        except Exception as exc:
            self._preload_error = str(exc)
            logger.exception("CLIP model preload failed")

    def get_search_service(self) -> SearchService:
        if self._search_service is None:
            self._search_service = SearchService(embedder=self._preloaded_embedder)
        return self._search_service

    def reset_search_service(self) -> None:
        self._search_service = None