use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub struct YamlAgentDefinition {
pub name: String,
#[serde(default)]
pub description: Option<String>,
pub model: ModelConfig,
#[serde(default)]
pub instructions: Option<String>,
#[serde(default)]
pub tools: Vec<ToolReference>,
#[serde(default)]
pub sub_agents: Vec<SubAgentReference>,
#[serde(default)]
pub config: HashMap<String, serde_json::Value>,
#[serde(default)]
pub plugins: Vec<PluginReference>,
#[serde(default)]
pub session: Option<SessionConfig>,
#[serde(default)]
pub memory: Option<MemoryConfig>,
#[serde(flatten)]
pub metadata: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub struct ModelConfig {
pub provider: String,
pub model_id: String,
#[serde(default)]
pub temperature: Option<f64>,
#[serde(default)]
pub max_tokens: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum ToolReference {
Named {
name: String,
},
Mcp {
mcp: McpToolReference,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct McpToolReference {
pub endpoint: String,
#[serde(default)]
pub args: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SubAgentReference {
#[serde(rename = "ref")]
pub reference: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PluginReference {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub config: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SessionConfig {
pub backend: String,
#[serde(flatten)]
pub options: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MemoryConfig {
pub backend: String,
#[serde(flatten)]
pub options: HashMap<String, serde_json::Value>,
}