Skip to main content

sqlite_graphrag/
backend_choice.rs

1//! LLM / embedding backend CLI choices (Wave C1).
2
3/// LLM backend for embedding. Accepts `openrouter` (OpenRouter REST) or
4/// `none` (skips embedding; useful for tests).
5#[derive(Copy, Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
6pub enum LlmBackendChoice {
7    /// Open router variant.
8    OpenRouter,
9    /// None variant.
10    None,
11}
12
13/// v1.0.93: embedding backend selector. Separate from `--llm-backend` which
14/// controls enrichment (entity extraction, body enrichment).
15/// `auto` uses OpenRouter when a client is initialised.
16/// `openrouter` requires API key (exit 78 if absent).
17#[derive(Copy, Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
18pub enum EmbeddingBackendChoice {
19    /// Auto variant.
20    Auto,
21    /// Openrouter variant.
22    Openrouter,
23}
24
25impl EmbeddingBackendChoice {
26    /// v1.0.93: produces a fallback chain that prepends OpenRouter when
27    /// the client is initialised.
28    pub fn to_chain(self, llm_choice: LlmBackendChoice) -> Vec<crate::embedder::LlmBackendKind> {
29        use crate::embedder::LlmBackendKind;
30        match self {
31            EmbeddingBackendChoice::Openrouter => vec![LlmBackendKind::OpenRouter],
32            EmbeddingBackendChoice::Auto => {
33                if crate::embedder::is_openrouter_initialized() {
34                    let mut chain = vec![LlmBackendKind::OpenRouter];
35                    chain.extend(llm_choice.to_chain());
36                    chain
37                } else {
38                    llm_choice.to_chain()
39                }
40            }
41        }
42    }
43}
44
45impl LlmBackendChoice {
46    /// Converts the CLI choice into an ordered chain of backends that
47    /// `embedder::embed_with_fallback` iterates. The first element of the
48    /// chain is the preferred backend; subsequent elements are fallbacks
49    /// used when the preferred one fails with `LlmBackendError`.
50    pub fn to_chain(self) -> Vec<crate::embedder::LlmBackendKind> {
51        use crate::embedder::LlmBackendKind;
52        match self {
53            LlmBackendChoice::OpenRouter => {
54                vec![LlmBackendKind::OpenRouter, LlmBackendKind::None]
55            }
56            LlmBackendChoice::None => vec![LlmBackendKind::None],
57        }
58    }
59}