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