Coverage for src/lilbee/app/setup_state.py: 100%

26 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-08-14 11:46 +0000

1"""Per-role model readiness: can each configured model role serve right now.""" 

2 

3from __future__ import annotations 

4 

5import logging 

6 

7from lilbee.core.config import cfg 

8from lilbee.providers.model_ref import parse_model_ref 

9 

10log = logging.getLogger(__name__) 

11 

12 

13def chat_ready() -> bool: 

14 """True when the chat ref resolves to something usable now.""" 

15 return _role_ready(cfg.chat_model) 

16 

17 

18def embedding_ready() -> bool: 

19 """True when the embedding ref resolves to something usable now.""" 

20 return _role_ready(cfg.embedding_model) 

21 

22 

23def _role_ready(model: str) -> bool: 

24 """Whether *model* can serve. Empty means unconfigured: not ready, not an error. 

25 

26 Remote-prefixed refs (ollama/lm_studio/API) are validated against current 

27 state instead of probed on disk: an ``ollama/`` ref whose litellm extra is 

28 missing or whose server is down is unusable. Does disk reads and, for 

29 local-server refs, an HTTP probe, so callers run it off the UI thread. 

30 """ 

31 from lilbee.modelhub.model_manager import ValidationResult, validate_persisted_model 

32 from lilbee.providers.base import ProviderError 

33 from lilbee.providers.engine_params import resolve_model_path 

34 

35 if not model: 

36 return False 

37 if parse_model_ref(model).is_remote: 

38 if validate_persisted_model(model) != ValidationResult.OK: 

39 log.debug("role_ready: remote model %r not usable", model) 

40 return False 

41 return True 

42 try: 

43 resolve_model_path(model) 

44 except (ProviderError, KeyError, ValueError) as exc: 

45 log.debug("role_ready: model %r unresolved: %s", model, exc) 

46 return False 

47 return True