Class: A2A::Types::AgentCard

Inherits:
BaseModel show all
Defined in:
lib/a2a/types/agent_card.rb

Overview

Represents an agent card in the A2A protocol

Agent cards describe an agent's capabilities, interfaces, and metadata. They are used for agent discovery and capability negotiation.

Examples:

Creating a basic agent card

card = A2A::Types::AgentCard.new(
  name: "My Agent",
  description: "A helpful agent",
  version: "1.0.0",
  url: "https://example.com/agent",
  preferred_transport: "JSONRPC",
  skills: [skill],
  capabilities: capabilities,
  default_input_modes: ["text"],
  default_output_modes: ["text"]
)

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from BaseModel

#==, #camelize, from_h, from_json, #hash, #to_h, #to_json, underscore, #valid?, #validate_array_type, #validate_inclusion, #validate_required, #validate_type

Constructor Details

#initialize(name:, description:, version:, url:, preferred_transport:, skills:, capabilities:, default_input_modes:, default_output_modes:, additional_interfaces: nil, security: nil, security_schemes: nil, provider: nil, protocol_version: nil, supports_authenticated_extended_card: nil, signatures: nil, documentation_url: nil, icon_url: nil) ⇒ AgentCard

Initialize a new agent card

Parameters:

  • Agent name (required)

  • Agent description (required)

  • Agent version (required)

  • Primary agent URL (required)

  • Preferred transport protocol (required)

  • Agent skills (required)

  • Agent capabilities (required)

  • Default input modes (required)

  • Default output modes (required)

  • (defaults to: nil)

    Additional interfaces

  • (defaults to: nil)

    Security requirements

  • (defaults to: nil)

    Security scheme definitions

  • (defaults to: nil)

    Provider information

  • (defaults to: nil)

    A2A protocol version

  • (defaults to: nil)

    Extended card support

  • (defaults to: nil)

    JWS signatures

  • (defaults to: nil)

    Documentation URL

  • (defaults to: nil)

    Icon URL



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/a2a/types/agent_card.rb', line 54

def initialize(name:, description:, version:, url:, preferred_transport:, skills:,
               capabilities:, default_input_modes:, default_output_modes:,
               additional_interfaces: nil, security: nil, security_schemes: nil,
               provider: nil, protocol_version: nil, supports_authenticated_extended_card: nil,
               signatures: nil, documentation_url: nil, icon_url: nil)
  @name = name
  @description = description
  @version = version
  @url = url
  @preferred_transport = preferred_transport
  @skills = skills.map { |s| s.is_a?(AgentSkill) ? s : AgentSkill.from_h(s) }
  @capabilities = capabilities.is_a?(AgentCapabilities) ? capabilities : AgentCapabilities.from_h(capabilities)
  @default_input_modes = default_input_modes
  @default_output_modes = default_output_modes
  @additional_interfaces = additional_interfaces&.map do |i|
    i.is_a?(AgentInterface) ? i : AgentInterface.from_h(i)
  end
  @security = security
  @security_schemes = process_security_schemes(security_schemes)
  @provider = provider
  @protocol_version = protocol_version || "1.0"
  @supports_authenticated_extended_card = supports_authenticated_extended_card
  @signatures = signatures&.map { |s| s.is_a?(AgentCardSignature) ? s : AgentCardSignature.from_h(s) }
  @documentation_url = documentation_url
  @icon_url = icon_url

  validate!
end

Instance Attribute Details

#additional_interfacesObject (readonly)

Returns the value of attribute additional_interfaces.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def additional_interfaces
  @additional_interfaces
end

#capabilitiesObject (readonly)

Returns the value of attribute capabilities.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def capabilities
  @capabilities
end

#default_input_modesObject (readonly)

Returns the value of attribute default_input_modes.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def default_input_modes
  @default_input_modes
end

#default_output_modesObject (readonly)

Returns the value of attribute default_output_modes.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def default_output_modes
  @default_output_modes
end

#descriptionObject (readonly)

Returns the value of attribute description.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def description
  @description
end

#documentation_urlObject (readonly)

Returns the value of attribute documentation_url.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def documentation_url
  @documentation_url
end

#icon_urlObject (readonly)

Returns the value of attribute icon_url.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def icon_url
  @icon_url
end

#nameObject (readonly)

Returns the value of attribute name.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def name
  @name
end

#preferred_transportObject (readonly)

Returns the value of attribute preferred_transport.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def preferred_transport
  @preferred_transport
end

#protocol_versionObject (readonly)

Returns the value of attribute protocol_version.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def protocol_version
  @protocol_version
end

#providerObject (readonly)

Returns the value of attribute provider.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def provider
  @provider
end

#securityObject (readonly)

Returns the value of attribute security.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def security
  @security
end

#security_schemesObject (readonly)

Returns the value of attribute security_schemes.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def security_schemes
  @security_schemes
end

#signaturesObject (readonly)

Returns the value of attribute signatures.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def signatures
  @signatures
end

#skillsObject (readonly)

Returns the value of attribute skills.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def skills
  @skills
end

#supports_authenticated_extended_cardObject (readonly)

Returns the value of attribute supports_authenticated_extended_card.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def supports_authenticated_extended_card
  @supports_authenticated_extended_card
end

#urlObject (readonly)

Returns the value of attribute url.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def url
  @url
end

#versionObject (readonly)

Returns the value of attribute version.



27
28
29
# File 'lib/a2a/types/agent_card.rb', line 27

def version
  @version
end

Instance Method Details

#all_interfacesArray<AgentInterface>

Get all available interfaces (primary + additional)

Returns:

  • All interfaces



87
88
89
90
91
# File 'lib/a2a/types/agent_card.rb', line 87

def all_interfaces
  interfaces = [AgentInterface.new(transport: @preferred_transport, url: @url)]
  interfaces.concat(@additional_interfaces) if @additional_interfaces
  interfaces
end

#process_security_schemes(schemes) ⇒ Hash<String, SecurityScheme>? (private)

Process security schemes hash into SecurityScheme objects

Parameters:

  • Security schemes hash

Returns:

  • Processed security schemes



119
120
121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/a2a/types/agent_card.rb', line 119

def process_security_schemes(schemes)
  return nil if schemes.nil?
  return schemes if schemes.is_a?(Hash) && schemes.values.all?(SecurityScheme)

  processed = {}
  schemes.each do |name, scheme_data|
    processed[name.to_s] = if scheme_data.is_a?(SecurityScheme)
                             scheme_data
                           else
                             SecurityScheme.from_h(scheme_data)
                           end
  end
  processed
end

#supports_transport?(transport) ⇒ Boolean

Check if the agent supports a specific transport

Parameters:

  • The transport to check

Returns:

  • True if supported



98
99
100
# File 'lib/a2a/types/agent_card.rb', line 98

def supports_transport?(transport)
  all_interfaces.any? { |i| i.transport == transport }
end

#url_for_transport(transport) ⇒ String?

Get the URL for a specific transport

Parameters:

  • The transport to get URL for

Returns:

  • The URL or nil if not supported



107
108
109
110
# File 'lib/a2a/types/agent_card.rb', line 107

def url_for_transport(transport)
  interface = all_interfaces.find { |i| i.transport == transport }
  interface&.url
end

#validate!Object (private)



134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/a2a/types/agent_card.rb', line 134

def validate!
  validate_required(:name, :description, :version, :url, :preferred_transport,
                    :skills, :capabilities, :default_input_modes, :default_output_modes)
  validate_inclusion(:preferred_transport, VALID_TRANSPORTS)
  validate_array_type(:skills, AgentSkill)
  validate_type(:capabilities, AgentCapabilities)
  validate_array_type(:additional_interfaces, AgentInterface) if @additional_interfaces
  validate_array_type(:signatures, AgentCardSignature) if @signatures
  validate_array_type(:default_input_modes, String)
  validate_array_type(:default_output_modes, String)
  validate_array_type(:security, String) if @security
  validate_security_schemes if @security_schemes
  if @supports_authenticated_extended_card
    validate_type(:supports_authenticated_extended_card,
                  [TrueClass, FalseClass])
  end
  validate_url_format(:url)
  validate_url_format(:documentation_url) if @documentation_url
  validate_url_format(:icon_url) if @icon_url
end

#validate_security_schemesObject (private)

Validate security schemes



157
158
159
160
161
162
# File 'lib/a2a/types/agent_card.rb', line 157

def validate_security_schemes
  validate_type(:security_schemes, Hash)
  @security_schemes.each do |name, scheme|
    raise ArgumentError, "security_schemes[#{name}] must be a SecurityScheme" unless scheme.is_a?(SecurityScheme)
  end
end

#validate_url_format(field) ⇒ Object (private)

Validate URL format

Parameters:

  • The field name containing the URL



168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/a2a/types/agent_card.rb', line 168

def validate_url_format(field)
  value = instance_variable_get("@#{field}")
  return if value.nil?

  validate_type(field, String)

  begin
    uri = URI.parse(value)
    raise ArgumentError, "#{field} must be a valid HTTP or HTTPS URL" unless uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
  rescue URI::InvalidURIError
    raise ArgumentError, "#{field} must be a valid URL"
  end
end