Skip to main content

systemprompt_models/a2a/agent_card/
skill.rs

1//! Card-level skill, transport, provider and signature descriptors.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use crate::a2a::PROTOCOL_VERSION;
7use crate::a2a::security::SecurityRequirement;
8use crate::a2a::transport::ProtocolBinding;
9use serde::{Deserialize, Serialize};
10
11#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
12#[serde(rename_all = "camelCase")]
13pub struct AgentInterface {
14    pub url: String,
15    pub protocol_binding: ProtocolBinding,
16    #[serde(default, skip_serializing_if = "Option::is_none")]
17    pub tenant: Option<String>,
18    #[serde(default = "default_protocol_version")]
19    pub protocol_version: String,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
23pub struct AgentProvider {
24    pub organization: String,
25    pub url: String,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
29#[serde(rename_all = "camelCase")]
30pub struct AgentSkill {
31    pub id: String,
32    pub name: String,
33    pub description: String,
34    pub tags: Vec<String>,
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub examples: Option<Vec<String>>,
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub input_modes: Option<Vec<String>>,
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub output_modes: Option<Vec<String>>,
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub security_requirements: Option<Vec<SecurityRequirement>>,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
46pub struct AgentCardSignature {
47    pub protected: String,
48    pub signature: String,
49    #[serde(skip_serializing_if = "Option::is_none")]
50    // JSON: A2A `AgentSkill` extension header; spec-defined as free-form.
51    pub header: Option<serde_json::Value>,
52}
53
54fn default_protocol_version() -> String {
55    PROTOCOL_VERSION.to_owned()
56}