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
« 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."""
3from __future__ import annotations
5import logging
7from lilbee.core.config import cfg
8from lilbee.providers.model_ref import parse_model_ref
10log = logging.getLogger(__name__)
13def chat_ready() -> bool:
14 """True when the chat ref resolves to something usable now."""
15 return _role_ready(cfg.chat_model)
18def embedding_ready() -> bool:
19 """True when the embedding ref resolves to something usable now."""
20 return _role_ready(cfg.embedding_model)
23def _role_ready(model: str) -> bool:
24 """Whether *model* can serve. Empty means unconfigured: not ready, not an error.
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
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