from __future__ import annotations from ..core.llm import FakeLLMClient, LLMClient, default_failover_from_env from ..core.loader import load_index from ..ingest.embedder import Embedder, FakeEmbedder from .config import Settings from .service import StudyService def build_embedder(kind: str) -> Embedder: if kind == "fake": return FakeEmbedder() from ..ingest.embedder import BGEM3Embedder return BGEM3Embedder() def build_llm(settings: Settings) -> LLMClient: if settings.fake_llm: return FakeLLMClient("This is a local demo answer grounded in your notes [S1].") return default_failover_from_env() def build_reranker(settings: Settings): kind = settings.rerank_kind if kind == "fake": from ..core.rerank import FakeReranker return FakeReranker() if kind == "bge": from ..core.rerank import BGEReranker return BGEReranker() return None def build_service(settings: Settings) -> StudyService: from pathlib import Path from ..graph.store import load_graph index = load_index(settings.index_dir) embedder = build_embedder(settings.embedder_kind) llm = build_llm(settings) reranker = build_reranker(settings) graph = load_graph(Path(settings.index_dir) / "graph.json") return StudyService(index, embedder, llm, settings.materials_dir, reranker=reranker, graph=graph)