sqlite_graphrag/
backend_choice.rs1#[derive(Copy, Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
8pub enum LlmBackendChoice {
9 Auto,
11 Claude,
13 Codex,
15 Opencode,
17 OpenRouter,
19 None,
21}
22
23#[derive(Copy, Clone, Debug, PartialEq, Eq, clap::ValueEnum)]
29pub enum EmbeddingBackendChoice {
30 Auto,
32 Openrouter,
34 Llm,
36}
37
38impl EmbeddingBackendChoice {
39 pub fn to_chain(self, llm_choice: LlmBackendChoice) -> Vec<crate::embedder::LlmBackendKind> {
42 use crate::embedder::LlmBackendKind;
43 match self {
44 EmbeddingBackendChoice::Openrouter => vec![LlmBackendKind::OpenRouter],
45 EmbeddingBackendChoice::Llm => llm_choice.to_chain(),
46 EmbeddingBackendChoice::Auto => {
47 if crate::embedder::is_openrouter_initialized() {
48 let mut chain = vec![LlmBackendKind::OpenRouter];
49 chain.extend(llm_choice.to_chain());
50 chain
51 } else {
52 llm_choice.to_chain()
53 }
54 }
55 }
56 }
57}
58
59impl LlmBackendChoice {
60 pub fn to_chain(self) -> Vec<crate::embedder::LlmBackendKind> {
70 use crate::embedder::LlmBackendKind;
71 match self {
72 LlmBackendChoice::Codex => vec![LlmBackendKind::Codex, LlmBackendKind::None],
73 LlmBackendChoice::Claude => vec![LlmBackendKind::Claude, LlmBackendKind::None],
74 LlmBackendChoice::Opencode => vec![
75 LlmBackendKind::Opencode,
76 LlmBackendKind::Codex,
77 LlmBackendKind::Claude,
78 LlmBackendKind::None,
79 ],
80 LlmBackendChoice::OpenRouter => vec![
81 LlmBackendKind::OpenRouter,
82 LlmBackendKind::Codex,
83 LlmBackendKind::None,
84 ],
85 LlmBackendChoice::None => vec![LlmBackendKind::None],
86 LlmBackendChoice::Auto => parse_fallback_chain(
87 &crate::runtime_config::llm_fallback("codex,claude,none"),
88 ),
89 }
90 }
91}
92
93fn parse_fallback_chain(s: &str) -> Vec<crate::embedder::LlmBackendKind> {
94 use crate::embedder::LlmBackendKind;
95 let mut chain: Vec<LlmBackendKind> = s
96 .split(',')
97 .filter_map(|tok| match tok.trim().to_ascii_lowercase().as_str() {
98 "codex" => Some(LlmBackendKind::Codex),
99 "claude" | "claude-code" => Some(LlmBackendKind::Claude),
100 "opencode" => Some(LlmBackendKind::Opencode),
101 "openrouter" => Some(LlmBackendKind::OpenRouter),
102 "none" => Some(LlmBackendKind::None),
103 _ => {
104 tracing::warn!(
105 token = tok.trim(),
106 "unknown backend in --llm-fallback, skipping"
107 );
108 Option::None
109 }
110 })
111 .collect();
112 if chain.is_empty() {
113 chain = vec![
114 LlmBackendKind::Codex,
115 LlmBackendKind::Claude,
116 LlmBackendKind::None,
117 ];
118 }
119 chain
120}
121