Skip to main content

systemprompt_agent/models/
agent_info.rs

1use crate::models::a2a::{AgentCard, AgentSkill};
2use serde::{Deserialize, Serialize};
3use systemprompt_identifiers::AgentId;
4use systemprompt_models::Config;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct AgentInfo {
8    pub agent_id: AgentId,
9    pub card: AgentCard,
10    pub enabled: bool,
11    pub skills: Option<Vec<AgentSkill>>,
12    pub mcp_servers: Option<Vec<String>>,
13}
14
15impl AgentInfo {
16    pub const fn from_repository_data(agent_id: AgentId, card: AgentCard, enabled: bool) -> Self {
17        Self {
18            agent_id,
19            card,
20            enabled,
21            skills: None,
22            mcp_servers: None,
23        }
24    }
25
26    pub const fn from_card(agent_id: AgentId, card: AgentCard, enabled: bool) -> Self {
27        Self {
28            agent_id,
29            card,
30            enabled,
31            skills: None,
32            mcp_servers: None,
33        }
34    }
35
36    pub fn id(&self) -> &str {
37        self.agent_id.as_str()
38    }
39
40    pub fn name(&self) -> &str {
41        &self.card.name
42    }
43
44    pub fn endpoint(&self) -> &str {
45        &self.card.url
46    }
47
48    pub fn full_endpoint(&self) -> String {
49        let endpoint = &self.card.url;
50        if endpoint.starts_with('/') {
51            let base_url = Config::get().map_or_else(
52                |_| "http://localhost:3000".to_string(),
53                |c| c.api_external_url.clone(),
54            );
55            format!("{}{}", base_url, endpoint)
56        } else {
57            endpoint.clone()
58        }
59    }
60
61    pub fn version(&self) -> &str {
62        &self.card.version
63    }
64
65    pub fn with_skills(mut self, skills: Vec<AgentSkill>) -> Self {
66        self.skills = Some(skills);
67        self
68    }
69
70    pub fn with_mcp_servers(mut self, servers: Vec<String>) -> Self {
71        self.mcp_servers = Some(servers);
72        self
73    }
74
75    pub fn skills_count(&self) -> usize {
76        self.skills.as_ref().map_or(0, Vec::len)
77    }
78
79    pub fn mcp_count(&self) -> usize {
80        self.mcp_servers.as_ref().map_or(0, Vec::len)
81    }
82}