[
https://issues.apache.org/jira/browse/CAMEL-23063?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Luigi De Masi updated CAMEL-23063:
----------------------------------
Description:
Add a new camel-a2a component under camel-ai that implements the A2A
(Agent-to-Agent) protocol
([https://a2a-protocol.org|https://a2a-protocol.org/]), enabling Camel routes
to participate in A2A ecosystems as both
server (consumer) and client (producer).
h2. Overview
The A2A protocol is transport-level — it defines how AI agents discover each
other via Agent Cards,
advertise skills, and exchange tasks over HTTP. It does not mandate LLM usage;
agents can be rule
engines, keyword matchers, or LLM-powered, making it a natural fit for Camel's
integration-first
approach.
h2. Component
URI syntax: {{{}a2a:\{protocol}:{agentNameOrRemoteUrl{}}}}
* Consumer: {{a2a:rest:my-agent}} — exposes agent card and task endpoints
* Producer: {{a2a:rest:[http://remote-agent:8080|http://remote-agent:8080/]}}
— sends tasks to remote agents
h3. Consumer (A2A Server)
Hosts an A2A agent by exposing:
* {{/.well-known/a2a-agent-card}} — agent card discovery endpoint
* Task endpoints — {{{}message/send{}}}, {{{}message/stream{}}},
{{{}tasks/get{}}}, {{{}tasks/cancel{}}},
{{{}tasks/list{}}}, {{tasks/pushNotificationConfig/*}}
The consumer registers itself with the selected HTTP server component
(platform-http by default)
and routes incoming tasks to the Camel route processor.
h3. Producer (A2A Client)
Sends tasks to remote A2A agents. Fetches and caches the remote agent's card at
startup.
Operation selection via the {{A2AOperations}} header:
* {{messageSend}} — synchronous message send
* {{messageStream}} — SSE streaming message send
* {{{}taskGet{}}}, {{{}taskCancel{}}}, {{taskList}} — task management
* {{{}pushConfigCreate{}}}, {{{}pushConfigGet{}}}, {{pushConfigDelete}} — push
notification config
* {{taskSubscribe}} — subscribe to task updates
h2. Protocol Support
* A2A v1.0 specification
* REST and JSON-RPC 2.0 protocol bindings ({{{}A2AProtocol{}}} abstraction)
* Synchronous, asynchronous (push notifications via webhooks), and streaming
(SSE) delivery modes
* In-memory task store with configurable capacity, lazy eviction, and push
notification dispatch
h2. Data Format
The {{dataFormat}} endpoint option follows the CXF naming convention:
||Mode||Consumer body||Producer body||Default||
|{{PAYLOAD}}|Extracted text ({{{}String{}}})|Extracted text
({{{}String{}}})|Yes|
|{{POJO}}|Full {{Message}} object|{{Task}} or {{Message}} object|No|
|{{RAW}}|Raw JSON ({{{}String{}}})|Raw JSON ({{{}String{}}})|No|
h2. Simple Language Functions
* {{{}$\{a2a:card{}}}} — full agent card as JSON
* {{{}$\{a2a:card.name{}}}}, {{{}$\{a2a:card.description{}}}},
{{{}$\{a2a:card.skills{}}}} — card fields
* {{{}$\{a2a:card.skills.json{}}}} — skills as JSON array
* {{{}$\{a2a:emit(...){}}}} — emit progress updates from within Simple
expressions
h2. Authentication
Integrates with Camel's {{camel-oauth}} profiles through the {{oauthProfile}}
endpoint option.
Supports the A2A spec's per-scheme security model with a strategy-per-scheme
pattern: the agent
card advertises security schemes while {{oauthProfile}} bridges to Camel's
runtime enforcement
(OIDC discovery, JWKS validation, opaque token introspection). Configuration
follows a
card-as-base hierarchy with endpoint-level overrides.
h2. Example
{code:yaml}
- route:
from:
uri: 'a2a:rest:weather-agent'
parameters:
agentDescription: Provides real-time weather data
oauthProfile: keycloak
steps:
- process:
ref: weatherProcessor
{code}
{code:yaml}
- route:
from:
uri: "direct:query-agent"
steps: - to:
uri: "a2a:rest:http://remote-agent:8080"
parameters:
dataFormat: POJO
{code}
h2. Dependencies
* {{a2a-java-sdk-spec}} — A2A protocol model (reference implementation)
* Uses the selected HTTP server component for consumer hosting (platform-http,
undertow, etc.)
* {{camel-oauth}} for incoming token validation (optional)
h2. Related
* [A2A Protocol specification|https://a2a-protocol.org/]
* CAMEL-23685 — OAuth token validation SPI (prerequisite for {{oauthProfile}}
support)
* CAMEL-23723 — extends {{oauthProfile}} to additional HTTP consumer components
was:Add a new camel-a2a component under camel-ai that allows Camel routes to
participate in A2A ecosystems both as a server and as a client.
> Add camel-a2a component for Agent-to-Agent (A2A) protocol integration
> ---------------------------------------------------------------------
>
> Key: CAMEL-23063
> URL: https://issues.apache.org/jira/browse/CAMEL-23063
> Project: Camel
> Issue Type: New Feature
> Components: camel-ai
> Reporter: Luigi De Masi
> Assignee: Luigi De Masi
> Priority: Major
> Fix For: 4.21.0
>
>
> Add a new camel-a2a component under camel-ai that implements the A2A
> (Agent-to-Agent) protocol
> ([https://a2a-protocol.org|https://a2a-protocol.org/]), enabling Camel routes
> to participate in A2A ecosystems as both
> server (consumer) and client (producer).
> h2. Overview
> The A2A protocol is transport-level — it defines how AI agents discover each
> other via Agent Cards,
> advertise skills, and exchange tasks over HTTP. It does not mandate LLM
> usage; agents can be rule
> engines, keyword matchers, or LLM-powered, making it a natural fit for
> Camel's integration-first
> approach.
> h2. Component
> URI syntax: {{{}a2a:\{protocol}:{agentNameOrRemoteUrl{}}}}
> * Consumer: {{a2a:rest:my-agent}} — exposes agent card and task endpoints
> * Producer:
> {{a2a:rest:[http://remote-agent:8080|http://remote-agent:8080/]}} — sends
> tasks to remote agents
> h3. Consumer (A2A Server)
> Hosts an A2A agent by exposing:
> * {{/.well-known/a2a-agent-card}} — agent card discovery endpoint
> * Task endpoints — {{{}message/send{}}}, {{{}message/stream{}}},
> {{{}tasks/get{}}}, {{{}tasks/cancel{}}},
> {{{}tasks/list{}}}, {{tasks/pushNotificationConfig/*}}
> The consumer registers itself with the selected HTTP server component
> (platform-http by default)
> and routes incoming tasks to the Camel route processor.
> h3. Producer (A2A Client)
> Sends tasks to remote A2A agents. Fetches and caches the remote agent's card
> at startup.
> Operation selection via the {{A2AOperations}} header:
> * {{messageSend}} — synchronous message send
> * {{messageStream}} — SSE streaming message send
> * {{{}taskGet{}}}, {{{}taskCancel{}}}, {{taskList}} — task management
> * {{{}pushConfigCreate{}}}, {{{}pushConfigGet{}}}, {{pushConfigDelete}} —
> push notification config
> * {{taskSubscribe}} — subscribe to task updates
> h2. Protocol Support
> * A2A v1.0 specification
> * REST and JSON-RPC 2.0 protocol bindings ({{{}A2AProtocol{}}} abstraction)
> * Synchronous, asynchronous (push notifications via webhooks), and streaming
> (SSE) delivery modes
> * In-memory task store with configurable capacity, lazy eviction, and push
> notification dispatch
> h2. Data Format
> The {{dataFormat}} endpoint option follows the CXF naming convention:
> ||Mode||Consumer body||Producer body||Default||
> |{{PAYLOAD}}|Extracted text ({{{}String{}}})|Extracted text
> ({{{}String{}}})|Yes|
> |{{POJO}}|Full {{Message}} object|{{Task}} or {{Message}} object|No|
> |{{RAW}}|Raw JSON ({{{}String{}}})|Raw JSON ({{{}String{}}})|No|
> h2. Simple Language Functions
> * {{{}$\{a2a:card{}}}} — full agent card as JSON
> * {{{}$\{a2a:card.name{}}}}, {{{}$\{a2a:card.description{}}}},
> {{{}$\{a2a:card.skills{}}}} — card fields
> * {{{}$\{a2a:card.skills.json{}}}} — skills as JSON array
> * {{{}$\{a2a:emit(...){}}}} — emit progress updates from within Simple
> expressions
> h2. Authentication
> Integrates with Camel's {{camel-oauth}} profiles through the {{oauthProfile}}
> endpoint option.
> Supports the A2A spec's per-scheme security model with a strategy-per-scheme
> pattern: the agent
> card advertises security schemes while {{oauthProfile}} bridges to Camel's
> runtime enforcement
> (OIDC discovery, JWKS validation, opaque token introspection). Configuration
> follows a
> card-as-base hierarchy with endpoint-level overrides.
> h2. Example
> {code:yaml}
> - route:
> from:
> uri: 'a2a:rest:weather-agent'
> parameters:
> agentDescription: Provides real-time weather data
> oauthProfile: keycloak
> steps:
> - process:
> ref: weatherProcessor
> {code}
> {code:yaml}
> - route:
> from:
> uri: "direct:query-agent"
> steps: - to:
> uri: "a2a:rest:http://remote-agent:8080"
> parameters:
> dataFormat: POJO
> {code}
> h2. Dependencies
> * {{a2a-java-sdk-spec}} — A2A protocol model (reference implementation)
> * Uses the selected HTTP server component for consumer hosting
> (platform-http, undertow, etc.)
> * {{camel-oauth}} for incoming token validation (optional)
> h2. Related
> * [A2A Protocol specification|https://a2a-protocol.org/]
> * CAMEL-23685 — OAuth token validation SPI (prerequisite for
> {{oauthProfile}} support)
> * CAMEL-23723 — extends {{oauthProfile}} to additional HTTP consumer
> components
--
This message was sent by Atlassian Jira
(v8.20.10#820010)