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)

Reply via email to