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}