magi_code/config/settings/
providers.rs1use 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}