File size: 1,389 Bytes
8db761b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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)