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