Skip to main content

magi_code/config/settings/
providers.rs

1use schemars::JsonSchema;
2use serde::{Deserialize, Serialize};
3use std::time::Duration;
4
5use super::helpers::is_false;
6
7use crate::thinking::ThinkingLevel;
8
9#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
10pub struct ProviderStreamSettings {
11    #[serde(default, skip_serializing_if = "Option::is_none")]
12    pub semantic_progress_timeout_seconds: Option<u64>,
13    #[serde(default, skip_serializing_if = "Option::is_none")]
14    pub subagent_semantic_progress_timeout_seconds: Option<u64>,
15}
16
17pub const DEFAULT_PROVIDER_STREAM_SEMANTIC_PROGRESS_TIMEOUT_SECONDS: u64 = 60;
18pub const DEFAULT_SUBAGENT_STREAM_SEMANTIC_PROGRESS_TIMEOUT_SECONDS: u64 = 120;
19pub const MAX_PROVIDER_STREAM_SEMANTIC_PROGRESS_TIMEOUT_SECONDS: u64 = 600;
20
21impl ProviderStreamSettings {
22    pub(crate) fn is_default(&self) -> bool {
23        self == &Self::default()
24    }
25
26    pub(crate) fn semantic_progress_timeout(&self) -> Duration {
27        Duration::from_secs(
28            self.semantic_progress_timeout_seconds
29                .unwrap_or(DEFAULT_PROVIDER_STREAM_SEMANTIC_PROGRESS_TIMEOUT_SECONDS),
30        )
31    }
32
33    pub(crate) fn subagent_semantic_progress_timeout(&self) -> Duration {
34        Duration::from_secs(
35            self.subagent_semantic_progress_timeout_seconds
36                .unwrap_or(DEFAULT_SUBAGENT_STREAM_SEMANTIC_PROGRESS_TIMEOUT_SECONDS),
37        )
38    }
39}
40
41#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
42pub struct TtsrSettings {
43    #[serde(default, skip_serializing_if = "is_false")]
44    pub enabled: bool,
45    #[serde(default, skip_serializing_if = "Vec::is_empty")]
46    pub rules: Vec<TtsrRuleSetting>,
47}
48
49impl TtsrSettings {
50    pub(crate) fn is_default(&self) -> bool {
51        self == &Self::default()
52    }
53}
54
55#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
56pub struct TtsrRuleSetting {
57    pub pattern: String,
58    pub reminder: String,
59}
60
61#[derive(Debug, Clone, Default, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
62pub struct SelectedModelSettings {
63    #[serde(default, skip_serializing_if = "Option::is_none")]
64    pub provider: Option<String>,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub model: Option<String>,
67    #[serde(default, skip_serializing_if = "Option::is_none")]
68    pub thinking_level: Option<ThinkingLevel>,
69    #[serde(default, flatten)]
70    pub(crate) extra: std::collections::BTreeMap<String, serde_json::Value>,
71}
72
73impl SelectedModelSettings {
74    pub(crate) fn is_default(&self) -> bool {
75        self == &Self::default()
76    }
77}