1use crate::ai::model::Model;
2use crate::ai::provider::AiProvider;
3use crate::file::config::File;
4use crate::settings::config::{FileModificationApi, Settings, ToolCallStyle};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum RegistryFileModificationApi {
8 Patch,
9 FindReplace,
10 ClineSearchReplace,
11}
12
13#[derive(Debug, Clone, Default)]
14pub struct ModelTweaks {
15 pub file_modification_api: Option<RegistryFileModificationApi>,
16 pub tool_call_style: Option<ToolCallStyle>,
17}
18
19impl ModelTweaks {
20 pub fn merge_with(&self, other: &ModelTweaks) -> ModelTweaks {
21 ModelTweaks {
22 file_modification_api: other.file_modification_api.or(self.file_modification_api),
23 tool_call_style: other.tool_call_style.or(self.tool_call_style),
24 }
25 }
26}
27
28#[derive(Debug, Clone)]
29pub struct ResolvedTweaks {
30 pub file_modification_api: RegistryFileModificationApi,
31 pub tool_call_style: ToolCallStyle,
32}
33
34pub fn resolve_tweaks(
35 settings_file_api: FileModificationApi,
36 settings_tool_style: Option<ToolCallStyle>,
37 provider: &dyn AiProvider,
38 model: Model,
39) -> ResolvedTweaks {
40 let model_tweaks = model.tweaks();
41 let provider_tweaks = provider.tweaks();
42
43 let merged = model_tweaks.merge_with(&provider_tweaks);
44
45 let file_modification_api = match settings_file_api {
46 FileModificationApi::Patch => RegistryFileModificationApi::Patch,
47 FileModificationApi::FindReplace => RegistryFileModificationApi::FindReplace,
48 FileModificationApi::ClineSearchReplace => RegistryFileModificationApi::ClineSearchReplace,
49 FileModificationApi::Default => merged
50 .file_modification_api
51 .unwrap_or(RegistryFileModificationApi::FindReplace),
52 };
53
54 let tool_call_style = settings_tool_style
55 .or(merged.tool_call_style)
56 .unwrap_or(ToolCallStyle::Json);
57
58 ResolvedTweaks {
59 file_modification_api,
60 tool_call_style,
61 }
62}
63
64pub fn resolve_from_settings(
65 settings: &Settings,
66 provider: &dyn AiProvider,
67 model: crate::ai::model::Model,
68) -> ResolvedTweaks {
69 let file_config: File = settings.get_module_config(File::NAMESPACE);
70 let settings_tool_style = if settings.xml_tool_mode {
71 Some(ToolCallStyle::Xml)
72 } else {
73 None
74 };
75 resolve_tweaks(
76 file_config.file_modification_api,
77 settings_tool_style,
78 provider,
79 model,
80 )
81}