systemprompt_agent/models/
agent_info.rs1use 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}