Skip to main content

tycode_core/ai/
tweaks.rs

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}