1use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct AgentCard {
9 pub name: String,
11 pub description: String,
13 pub version: String,
15 #[serde(rename = "supportedInterfaces")]
17 pub supported_interfaces: Vec<AgentInterface>,
18 pub capabilities: AgentCapabilities,
20 pub skills: Vec<AgentSkill>,
22 #[serde(rename = "defaultInputModes")]
24 pub default_input_modes: Vec<String>,
25 #[serde(rename = "defaultOutputModes")]
27 pub default_output_modes: Vec<String>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub provider: Option<AgentProvider>,
31 #[serde(rename = "securitySchemes", skip_serializing_if = "Option::is_none")]
33 pub security_schemes: Option<HashMap<String, SecurityScheme>>,
34 #[serde(
36 rename = "securityRequirements",
37 skip_serializing_if = "Option::is_none"
38 )]
39 pub security_requirements: Option<Vec<SecurityRequirement>>,
40 #[serde(rename = "documentationUrl", skip_serializing_if = "Option::is_none")]
42 pub documentation_url: Option<String>,
43 #[serde(rename = "iconUrl", skip_serializing_if = "Option::is_none")]
45 pub icon_url: Option<String>,
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub signatures: Option<Vec<AgentCardSignature>>,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
53pub struct AgentInterface {
54 pub url: String,
56 #[serde(rename = "protocolBinding")]
58 pub protocol_binding: String,
59 #[serde(skip_serializing_if = "Option::is_none")]
61 pub tenant: Option<String>,
62 #[serde(rename = "protocolVersion")]
64 pub protocol_version: String,
65}
66
67#[derive(Debug, Clone, Default, Serialize, Deserialize)]
69pub struct AgentCapabilities {
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub streaming: Option<bool>,
73 #[serde(rename = "pushNotifications", skip_serializing_if = "Option::is_none")]
75 pub push_notifications: Option<bool>,
76 #[serde(rename = "extendedAgentCard", skip_serializing_if = "Option::is_none")]
78 pub extended_agent_card: Option<bool>,
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub extensions: Option<Vec<AgentExtension>>,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
86pub struct AgentExtension {
87 pub uri: String,
89 #[serde(skip_serializing_if = "Option::is_none")]
91 pub description: Option<String>,
92 #[serde(default)]
94 pub required: bool,
95 #[serde(skip_serializing_if = "Option::is_none")]
97 pub params: Option<HashMap<String, serde_json::Value>>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
102pub struct AgentSkill {
103 pub id: String,
105 pub name: String,
107 pub description: String,
109 pub tags: Vec<String>,
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub examples: Option<Vec<String>>,
114 #[serde(rename = "inputModes", skip_serializing_if = "Option::is_none")]
116 pub input_modes: Option<Vec<String>>,
117 #[serde(rename = "outputModes", skip_serializing_if = "Option::is_none")]
119 pub output_modes: Option<Vec<String>>,
120 #[serde(
122 rename = "securityRequirements",
123 skip_serializing_if = "Option::is_none"
124 )]
125 pub security_requirements: Option<Vec<SecurityRequirement>>,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct AgentProvider {
131 pub url: String,
133 pub organization: String,
135}
136
137#[derive(Debug, Clone, Serialize, Deserialize)]
139pub struct AgentCardSignature {
140 pub protected: String,
142 pub signature: String,
144 #[serde(skip_serializing_if = "Option::is_none")]
146 pub header: Option<HashMap<String, serde_json::Value>>,
147}
148
149#[derive(Debug, Clone, Default, Serialize, Deserialize)]
151pub struct SecurityRequirement {
152 pub schemes: HashMap<String, Vec<String>>,
154}
155
156#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
158pub struct SecurityScheme {
159 #[serde(skip_serializing_if = "Option::is_none", rename = "apiKeySecurityScheme")]
161 pub api_key: Option<ApiKeySecurityScheme>,
162 #[serde(skip_serializing_if = "Option::is_none", rename = "httpAuthSecurityScheme")]
164 pub http_auth: Option<HttpAuthSecurityScheme>,
165 #[serde(skip_serializing_if = "Option::is_none", rename = "oauth2SecurityScheme")]
167 pub oauth2: Option<OAuth2SecurityScheme>,
168 #[serde(skip_serializing_if = "Option::is_none", rename = "openIdConnectSecurityScheme")]
170 pub open_id_connect: Option<OpenIdConnectSecurityScheme>,
171 #[serde(skip_serializing_if = "Option::is_none", rename = "mtlsSecurityScheme")]
173 pub mtls: Option<MutualTlsSecurityScheme>,
174}
175
176#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
178pub struct ApiKeySecurityScheme {
179 pub name: String,
181 #[serde(rename = "in")]
183 pub location: String,
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub description: Option<String>,
187}
188
189#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
191pub struct HttpAuthSecurityScheme {
192 pub scheme: String,
194 #[serde(rename = "bearerFormat", skip_serializing_if = "Option::is_none")]
196 pub bearer_format: Option<String>,
197 #[serde(skip_serializing_if = "Option::is_none")]
199 pub description: Option<String>,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
204pub struct OAuth2SecurityScheme {
205 pub flows: OAuthFlows,
207 #[serde(skip_serializing_if = "Option::is_none")]
209 pub description: Option<String>,
210 #[serde(rename = "oauth2MetadataUrl", skip_serializing_if = "Option::is_none")]
212 pub oauth2_metadata_url: Option<String>,
213}
214
215#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
217pub struct OpenIdConnectSecurityScheme {
218 #[serde(rename = "openIdConnectUrl")]
220 pub open_id_connect_url: String,
221 #[serde(skip_serializing_if = "Option::is_none")]
223 pub description: Option<String>,
224}
225
226#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
228pub struct MutualTlsSecurityScheme {
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub description: Option<String>,
232}
233
234#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
236pub struct OAuthFlows {
237 #[serde(skip_serializing_if = "Option::is_none", rename = "authorizationCode")]
239 pub authorization_code: Option<AuthorizationCodeOAuthFlow>,
240 #[serde(skip_serializing_if = "Option::is_none", rename = "clientCredentials")]
242 pub client_credentials: Option<ClientCredentialsOAuthFlow>,
243 #[serde(skip_serializing_if = "Option::is_none")]
245 pub implicit: Option<ImplicitOAuthFlow>,
246 #[serde(skip_serializing_if = "Option::is_none")]
248 pub password: Option<PasswordOAuthFlow>,
249 #[serde(skip_serializing_if = "Option::is_none", rename = "deviceCode")]
251 pub device_code: Option<DeviceCodeOAuthFlow>,
252}
253
254#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
256pub struct AuthorizationCodeOAuthFlow {
257 #[serde(rename = "authorizationUrl")]
259 pub authorization_url: String,
260 #[serde(rename = "tokenUrl")]
262 pub token_url: String,
263 #[serde(rename = "refreshUrl", skip_serializing_if = "Option::is_none")]
265 pub refresh_url: Option<String>,
266 pub scopes: HashMap<String, String>,
268 #[serde(rename = "pkceRequired", skip_serializing_if = "Option::is_none")]
270 pub pkce_required: Option<bool>,
271}
272
273#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
275pub struct ClientCredentialsOAuthFlow {
276 #[serde(rename = "tokenUrl")]
278 pub token_url: String,
279 #[serde(rename = "refreshUrl", skip_serializing_if = "Option::is_none")]
281 pub refresh_url: Option<String>,
282 pub scopes: HashMap<String, String>,
284}
285
286#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
288pub struct ImplicitOAuthFlow {
289 #[serde(rename = "authorizationUrl", skip_serializing_if = "Option::is_none")]
291 pub authorization_url: Option<String>,
292 #[serde(rename = "refreshUrl", skip_serializing_if = "Option::is_none")]
294 pub refresh_url: Option<String>,
295 #[serde(default)]
297 pub scopes: HashMap<String, String>,
298}
299
300#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
302pub struct PasswordOAuthFlow {
303 #[serde(rename = "tokenUrl", skip_serializing_if = "Option::is_none")]
305 pub token_url: Option<String>,
306 #[serde(rename = "refreshUrl", skip_serializing_if = "Option::is_none")]
308 pub refresh_url: Option<String>,
309 #[serde(default)]
311 pub scopes: HashMap<String, String>,
312}
313
314#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
316pub struct DeviceCodeOAuthFlow {
317 #[serde(rename = "deviceAuthorizationUrl")]
319 pub device_authorization_url: String,
320 #[serde(rename = "tokenUrl")]
322 pub token_url: String,
323 #[serde(rename = "refreshUrl", skip_serializing_if = "Option::is_none")]
325 pub refresh_url: Option<String>,
326 pub scopes: HashMap<String, String>,
328}