Skip to main content

magi_code/config/settings/
providers.rs

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