opencode_sdk/types/
config.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct Config {
9 #[serde(default, skip_serializing_if = "Option::is_none")]
11 pub provider: Option<serde_json::Value>,
12 #[serde(default, skip_serializing_if = "Option::is_none")]
14 pub model: Option<serde_json::Value>,
15 #[serde(default, skip_serializing_if = "Option::is_none")]
17 pub agent: Option<serde_json::Value>,
18 #[serde(default, skip_serializing_if = "Option::is_none")]
20 pub auto_compact: Option<AutoCompactConfig>,
21 #[serde(default, skip_serializing_if = "Option::is_none")]
23 pub mcp: Option<serde_json::Value>,
24 #[serde(flatten)]
26 pub extra: serde_json::Value,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
31#[serde(rename_all = "camelCase")]
32pub struct AutoCompactConfig {
33 #[serde(default)]
35 pub enabled: bool,
36 #[serde(default, skip_serializing_if = "Option::is_none")]
38 pub threshold: Option<u64>,
39}
40
41#[derive(Debug, Clone, Default, Serialize, Deserialize)]
43#[serde(rename_all = "camelCase")]
44pub struct UpdateConfigRequest {
45 #[serde(default, skip_serializing_if = "Option::is_none")]
47 pub provider: Option<String>,
48 #[serde(default, skip_serializing_if = "Option::is_none")]
50 pub model: Option<String>,
51 #[serde(default, skip_serializing_if = "Option::is_none")]
53 pub agent: Option<String>,
54 #[serde(flatten)]
56 pub extra: serde_json::Value,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
61#[serde(rename_all = "camelCase")]
62pub struct ConfigProviders {
63 #[serde(default)]
65 pub providers: Vec<ProviderConfig>,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
70#[serde(rename_all = "camelCase")]
71pub struct ProviderConfig {
72 pub id: String,
74 #[serde(default, skip_serializing_if = "Option::is_none")]
76 pub name: Option<String>,
77 #[serde(default)]
79 pub configured: bool,
80 #[serde(default, skip_serializing_if = "Option::is_none")]
82 pub auth_type: Option<String>,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
91#[serde(rename_all = "camelCase")]
92pub struct ConfigInfoLite {
93 #[serde(default, skip_serializing_if = "Option::is_none")]
95 pub model: Option<String>,
96 #[serde(default, skip_serializing_if = "Option::is_none")]
98 pub small_model: Option<String>,
99 #[serde(default, skip_serializing_if = "Option::is_none")]
101 pub default_agent: Option<String>,
102 #[serde(default, skip_serializing_if = "Option::is_none")]
104 pub share: Option<String>,
105 #[serde(default, skip_serializing_if = "Option::is_none")]
107 pub mcp: Option<serde_json::Value>,
108 #[serde(flatten)]
110 pub extra: serde_json::Value,
111}
112
113#[cfg(test)]
114mod tests {
115 use super::*;
116
117 #[test]
118 fn test_config_info_lite_deserialize() {
119 let json = r#"{
120 "model": "claude-3-opus",
121 "smallModel": "claude-3-haiku",
122 "defaultAgent": "code",
123 "share": "manual",
124 "otherField": "preserved"
125 }"#;
126 let config: ConfigInfoLite = serde_json::from_str(json).unwrap();
127 assert_eq!(config.model, Some("claude-3-opus".to_string()));
128 assert_eq!(config.small_model, Some("claude-3-haiku".to_string()));
129 assert_eq!(config.default_agent, Some("code".to_string()));
130 assert_eq!(config.share, Some("manual".to_string()));
131 assert_eq!(config.extra.get("otherField").unwrap(), "preserved");
132 }
133
134 #[test]
135 fn test_config_info_lite_minimal() {
136 let json = r#"{}"#;
137 let config: ConfigInfoLite = serde_json::from_str(json).unwrap();
138 assert!(config.model.is_none());
139 assert!(config.small_model.is_none());
140 }
141}