code_repo_wiki/config/
schema.rs1use serde::{Deserialize, Serialize};
2
3pub const LLM_MAX_CONCURRENT: usize = 16;
7pub const EMBED_BATCH_SIZE: usize = 20;
9pub const SEARCH_INDEX_DIR: &str = ".search";
11pub const SEARCH_DEFAULT_ENGINE: SearchEngineType = SearchEngineType::Hybrid;
16pub const SEARCH_DEFAULT_TOP_K: usize = 10;
17pub const SEARCH_RRF_K: f64 = 60.0;
19pub const IMPACT_MAX_DEPTH: usize = 3;
21pub const OUTPUT_DIR: &str = ".code-repo-wiki";
24
25#[derive(Debug, Clone, Serialize, Deserialize, Default)]
31pub struct WikiConfig {
32 #[serde(default)]
33 pub wiki: WikiSection,
34 #[serde(default)]
35 pub llm: LlmSection,
36 #[serde(default)]
37 pub embed: EmbedSection,
38 #[serde(skip)]
43 pub output_dir: Option<std::path::PathBuf>,
44}
45
46impl WikiConfig {
47 pub fn output_dir(&self) -> &std::path::Path {
50 match &self.output_dir {
51 Some(p) => p,
52 None => std::path::Path::new(crate::config::schema::OUTPUT_DIR),
53 }
54 }
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct WikiSection {
61 #[serde(default = "default_language")]
62 pub language: String,
63 #[serde(default)]
66 pub guide: WikiGuideSection,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize, Default)]
78pub struct WikiGuideSection {
79 #[serde(default)]
80 pub pages: Vec<String>,
81 #[serde(default)]
82 pub priority: Vec<String>,
83 #[serde(default)]
84 pub notes: Vec<String>,
85}
86
87fn default_language() -> String {
88 "zh".to_string()
89}
90
91impl Default for WikiSection {
92 fn default() -> Self {
93 Self {
94 language: "zh".to_string(),
95 guide: WikiGuideSection::default(),
96 }
97 }
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct LlmSection {
104 #[serde(default = "default_llm_provider")]
105 pub provider: LlmProviderType,
106 #[serde(default = "default_llm_model")]
107 pub model: String,
108 #[serde(default = "default_llm_base_url")]
109 pub base_url: Option<String>,
110 #[serde(default)]
112 pub api_key: Option<String>,
113 #[serde(default = "default_llm_api_key_env")]
115 pub api_key_env: String,
116}
117
118fn default_llm_model() -> String {
119 "deepseek-v4-flash".to_string()
120}
121
122fn default_llm_provider() -> LlmProviderType {
123 LlmProviderType::OpenAiCompatible
124}
125
126fn default_llm_base_url() -> Option<String> {
127 Some("https://opencode.ai/zen/go/v1".to_string())
128}
129
130fn default_llm_api_key_env() -> String {
131 "OPENCODEGO2_API_KEY".to_string()
132}
133
134impl Default for LlmSection {
135 fn default() -> Self {
136 Self {
142 provider: LlmProviderType::OpenAiCompatible,
143 model: "deepseek-v4-flash".to_string(),
144 base_url: Some("https://opencode.ai/zen/go/v1".to_string()),
145 api_key: None,
146 api_key_env: "OPENCODEGO2_API_KEY".to_string(),
147 }
148 }
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
164pub enum LlmProviderType {
165 #[serde(rename = "openai")]
166 OpenAI,
167 #[serde(rename = "openai-compatible")]
168 OpenAiCompatible,
169 #[serde(rename = "anthropic")]
170 Anthropic,
171 #[serde(rename = "mock")]
174 Mock,
175}
176
177#[derive(Debug, Clone, Serialize, Deserialize)]
181pub struct EmbedSection {
182 #[serde(default = "default_embed_model")]
183 pub model: String,
184 #[serde(default = "default_embed_base_url")]
185 pub base_url: Option<String>,
186 #[serde(default)]
187 pub api_key: Option<String>,
188 #[serde(default = "default_embed_api_key_env")]
189 pub api_key_env: String,
190}
191
192fn default_embed_model() -> String {
193 "qwen3.7-text-embedding".to_string()
194}
195
196fn default_embed_base_url() -> Option<String> {
197 Some(
198 "https://llm-q0265e4he9m0qs23.cn-beijing.maas.aliyuncs.com/compatible-mode/v1"
199 .to_string(),
200 )
201}
202
203fn default_embed_api_key_env() -> String {
204 "BAILIAN_API_KEY".to_string()
205}
206
207impl Default for EmbedSection {
208 fn default() -> Self {
209 Self {
212 model: "qwen3.7-text-embedding".to_string(),
213 base_url: Some(
214 "https://llm-q0265e4he9m0qs23.cn-beijing.maas.aliyuncs.com/compatible-mode/v1"
215 .to_string(),
216 ),
217 api_key: None,
218 api_key_env: "BAILIAN_API_KEY".to_string(),
219 }
220 }
221}
222
223#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
225pub enum SearchEngineType {
226 #[serde(rename = "text")]
228 Text,
229 #[serde(rename = "semantic")]
231 Semantic,
232 #[serde(rename = "hybrid")]
234 Hybrid,
235}