sqlite_graphrag/
backend_choice.rs1#[derive(Copy, Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
8pub enum LlmBackendChoice {
9 Auto,
10 Claude,
11 Codex,
12 Opencode,
13 OpenRouter,
14 None,
15}
16
17#[derive(Copy, Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
23pub enum EmbeddingBackendChoice {
24 Auto,
25 Openrouter,
26 Llm,
27}
28
29impl EmbeddingBackendChoice {
30 pub fn to_chain(self, llm_choice: LlmBackendChoice) -> Vec<crate::embedder::LlmBackendKind> {
33 use crate::embedder::LlmBackendKind;
34 match self {
35 EmbeddingBackendChoice::Openrouter => vec![LlmBackendKind::OpenRouter],
36 EmbeddingBackendChoice::Llm => llm_choice.to_chain(),
37 EmbeddingBackendChoice::Auto => {
38 if crate::embedder::is_openrouter_initialized() {
39 let mut chain = vec![LlmBackendKind::OpenRouter];
40 chain.extend(llm_choice.to_chain());
41 chain
42 } else {
43 llm_choice.to_chain()
44 }
45 }
46 }
47 }
48}
49
50impl LlmBackendChoice {
51 pub fn to_chain(self) -> Vec<crate::embedder::LlmBackendKind> {
61 use crate::embedder::LlmBackendKind;
62 match self {
63 LlmBackendChoice::Codex => vec![LlmBackendKind::Codex, LlmBackendKind::None],
64 LlmBackendChoice::Claude => vec![LlmBackendKind::Claude, LlmBackendKind::None],
65 LlmBackendChoice::Opencode => vec![
66 LlmBackendKind::Opencode,
67 LlmBackendKind::Codex,
68 LlmBackendKind::Claude,
69 LlmBackendKind::None,
70 ],
71 LlmBackendChoice::OpenRouter => vec![
72 LlmBackendKind::OpenRouter,
73 LlmBackendKind::Codex,
74 LlmBackendKind::None,
75 ],
76 LlmBackendChoice::None => vec![LlmBackendKind::None],
77 LlmBackendChoice::Auto => parse_fallback_chain(
78 &crate::runtime_config::llm_fallback("codex,claude,none"),
79 ),
80 }
81 }
82}
83
84fn parse_fallback_chain(s: &str) -> Vec<crate::embedder::LlmBackendKind> {
85 use crate::embedder::LlmBackendKind;
86 let mut chain: Vec<LlmBackendKind> = s
87 .split(',')
88 .filter_map(|tok| match tok.trim().to_ascii_lowercase().as_str() {
89 "codex" => Some(LlmBackendKind::Codex),
90 "claude" | "claude-code" => Some(LlmBackendKind::Claude),
91 "opencode" => Some(LlmBackendKind::Opencode),
92 "openrouter" => Some(LlmBackendKind::OpenRouter),
93 "none" => Some(LlmBackendKind::None),
94 _ => {
95 tracing::warn!(
96 token = tok.trim(),
97 "unknown backend in --llm-fallback, skipping"
98 );
99 Option::None
100 }
101 })
102 .collect();
103 if chain.is_empty() {
104 chain = vec![
105 LlmBackendKind::Codex,
106 LlmBackendKind::Claude,
107 LlmBackendKind::None,
108 ];
109 }
110 chain
111}
112