use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AgentCard {
pub id: String,
pub uri: String,
pub name: String,
pub description: String,
pub version: String,
pub capabilities: AgentCapabilities,
pub autonomy: AutonomyLevel,
pub constraints: Option<AutonomyConstraints>,
pub auth: AuthSpec,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub latency_class: Option<LatencyClass>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cost_class: Option<CostClass>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub reasoning_modes: Vec<String>,
#[serde(default)]
pub labels: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum LatencyClass {
Realtime,
Fast,
Medium,
Slow,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum CostClass {
Free,
Low,
Medium,
High,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AgentCapabilities {
pub skills: Vec<Skill>,
pub protocols: Vec<String>,
pub tools_provided: Vec<String>,
pub tools_consumed: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Skill {
pub name: String,
pub description: String,
pub input_schema: String,
pub output_schema: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AutonomyLevel {
Deterministic,
#[default]
Guided,
BoundedAutonomous,
FullyAutonomous,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AutonomyConstraints {
pub max_iterations: Option<u32>,
pub max_tool_calls: Option<u32>,
pub token_budget: Option<u64>,
pub cost_budget_usd: Option<f64>,
pub allowed_tools: Vec<String>,
pub blocked_tools: Vec<String>,
pub allowed_delegations: Vec<String>,
pub require_approval_for: Vec<String>,
pub time_budget_secs: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum AuthSpec {
BearerToken { scopes: Vec<String> },
ApiKey { header: String },
None,
}