[ 
https://issues.apache.org/jira/browse/CAMEL-24832?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen reassigned CAMEL-24832:
-----------------------------------

    Assignee: Andrea Cosentino

> camel-openai, camel-spring-ai-chat - propagate the calling exchange into 
> ai-tool route invocations like langchain4j-agent
> -------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24832
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24832
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-openai, camel-spring-ai
>            Reporter: Claus Ibsen
>            Assignee: Andrea Cosentino
>            Priority: Major
>
> h2. Problem
> The {{camel-ai-tool}} contract, as documented in the blog post "Authorizing 
> what an AI agent may do in Apache Camel", is that Camel copies the calling 
> exchange into each tool call, so context set before the agent runs - most 
> importantly the authenticated caller's identity kept as an exchange property 
> - reaches the tool route and the model cannot set it. That is only true for 
> one runtime:
> * {{camel-langchain4j-agent}} copies the exchange: 
> {{ExchangeHelper.createCopy(exchange, true)}} in {{LangChain4jAgentProducer}} 
> (CAMEL-23944).
> * {{camel-openai}} creates a fresh exchange: 
> {{spec.getConsumer().createExchange(false)}} in {{McpToolCallExecutor}} 
> (route tools exposed via the {{tags}} option).
> * {{camel-spring-ai-chat}} creates a fresh exchange: 
> {{spec.getConsumer().getEndpoint().createExchange()}} in 
> {{AiToolSpecToSpringAi}}.
> With camel-openai or spring-ai driving the loop, a tool route guarded on 
> {{exchangeProperty.subject}} sees {{null}} and denies every call 
> (fail-closed, but the pattern silently does not work), and any other context 
> (correlation ids, tenant, variables) is lost too. This bites the YAML DSL in 
> particular: 
> {{openai:chat-completion?baseUrl=...&tags=support&systemMessage=...}} against 
> an OpenAI-compatible endpoint (e.g. Ollama) is the only agent loop that needs 
> no Java bean, and it is the one that drops the identity.
> h2. Proposal
> * In {{camel-openai}} and {{camel-spring-ai-chat}}, create the tool exchange 
> as a copy of the calling exchange (properties and variables included), 
> isolating headers, body and exceptions the same way CAMEL-23944 did for 
> langchain4j-agent.
> * State the contract once in the {{camel-ai-tool}} documentation: every 
> runtime that executes route tools passes the caller's exchange context 
> through, and which parts are isolated.
> * Consider a shared helper in {{camel-ai-tool}} (next to {{AiToolExecutor}}) 
> that builds the tool exchange, so the runtimes cannot drift again.
> The MCP server bridge ({{McpServerBridge}}) also creates a fresh exchange, 
> but there is no calling exchange there; carrying the MCP caller's identity 
> into an exchange property is tracked with CAMEL-24831.
> Related: CAMEL-23944, CAMEL-24831.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to