use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum AgentConfig {
DeepResearch {
#[serde(default, skip_serializing_if = "Option::is_none")]
thinking_summaries: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
visualization: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
collaborative_planning: Option<bool>,
},
#[serde(untagged)]
Other(serde_json::Value),
}
impl AgentConfig {
pub fn deep_research() -> Self {
AgentConfig::DeepResearch {
thinking_summaries: Some(true),
visualization: Some(true),
collaborative_planning: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deep_research_serialization() {
let config = AgentConfig::deep_research();
let json = serde_json::to_value(&config).unwrap();
assert_eq!(json["type"], "deep-research");
assert_eq!(json["thinking_summaries"], true);
assert_eq!(json["visualization"], true);
assert!(json.get("collaborative_planning").is_none());
}
#[test]
fn test_deep_research_round_trip() {
let config = AgentConfig::DeepResearch {
thinking_summaries: Some(true),
visualization: Some(false),
collaborative_planning: Some(true),
};
let json = serde_json::to_string(&config).unwrap();
let deserialized: AgentConfig = serde_json::from_str(&json).unwrap();
assert_eq!(config, deserialized);
}
#[test]
fn test_deep_research_omits_none_fields() {
let config = AgentConfig::DeepResearch {
thinking_summaries: None,
visualization: None,
collaborative_planning: None,
};
let json = serde_json::to_value(&config).unwrap();
assert_eq!(json["type"], "deep-research");
assert!(json.get("thinking_summaries").is_none());
assert!(json.get("visualization").is_none());
assert!(json.get("collaborative_planning").is_none());
}
#[test]
fn test_unknown_type_deserializes_to_other() {
let json = r#"{"type": "future-agent", "some_field": 42}"#;
let config: AgentConfig = serde_json::from_str(json).unwrap();
assert!(matches!(config, AgentConfig::Other(_)));
}
#[test]
fn test_deep_research_convenience_constructor() {
let config = AgentConfig::deep_research();
match config {
AgentConfig::DeepResearch {
thinking_summaries,
visualization,
collaborative_planning,
} => {
assert_eq!(thinking_summaries, Some(true));
assert_eq!(visualization, Some(true));
assert_eq!(collaborative_planning, None);
}
_ => panic!("expected DeepResearch variant"),
}
}
}