Claus Ibsen created CAMEL-25931:
-----------------------------------
Summary: camel-a2a - an agent that calls another agent mixes their
headers: the producer runs the operation of the consumer, and the reply takes
the other agent's task
Key: CAMEL-25931
URL: https://issues.apache.org/jira/browse/CAMEL-25931
Project: Camel
Issue Type: Bug
Components: camel-ai
Affects Versions: 4.21.0, 4.22.0, 4.23.0
Reporter: Claus Ibsen
Fix For: 4.24.0
An agent route that calls another agent, as an orchestrator does, shares the
{{CamelA2A*}} headers between its consumer and the producer, in both directions.
*1. The producer runs the operation of the consumer.* The consumer sets
{{CamelA2AOperation}} on the exchange of the route to the method of the call:
{{SendMessage}}, or {{SendStreamingMessage}} for a streaming call
({{MessageSendOperation.java:139}} and {{A2AConsumer.java:1508}} on main). The
producer takes its operation from that header first, and uses its {{operation}}
option only when the header is absent ({{A2AProducer.resolveOperation}},
{{A2AProducer.java:239-253}}):
{code:java}
String headerOp = exchange.getMessage().getHeader(A2AConstants.OPERATION,
String.class);
if (headerOp != null) {
// Try method name first
A2AOperations operation = A2AOperations.fromMethodName(headerOp);
if (operation != null) {
return operation;
}
{code}
So, in the route of an agent:
* {{to("a2a:...?operation=TASK_GET")}}, or any other operation, sends a
SendMessage;
* a call with the default operation (MESSAGE_SEND) streams when the caller
streamed, and the body is then an {{SseEventIterator}} instead of the text of
the answer.
*2. The reply takes the task of the other agent.* The consumer puts the id of
its own task in {{CamelA2ATaskId}} before the route ({{A2AConsumer.java:1202}}
and {{:1506}}). A SendMessage that gets a Task back overwrites
{{CamelA2ATaskId}}, {{CamelA2AContextId}}, {{CamelA2ATaskState}} and
{{CamelA2AResponseType}} with the values of the other agent
({{MessageSendOperation.java:84-96}}). After the route, the consumer builds its
reply from these headers ({{MessageSendOperation.buildResponse}},
{{:146-149}}), so the caller gets a Task with the id, the context and the state
of the other agent's task.
Found by reading the code on 4.24.0-SNAPSHOT. It is so since the component was
added (CAMEL-23063, 4.21.0).
*Proposed change*: keep what the consumer needs for its reply apart from the
headers that steer a producer, for example in exchange properties, so a
producer in the route neither reads the consumer's operation nor changes the
consumer's task. Until then, the documentation can say to remove the
{{CamelA2A*}} headers before calling another agent.
_Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v8.20.10#820010)