Federico Mariani created CAMEL-23963:
----------------------------------------

             Summary: camel-openai: configurable strategies for tool execution 
errors and hallucinated tool names in the agentic loop
                 Key: CAMEL-23963
                 URL: https://issues.apache.org/jira/browse/CAMEL-23963
             Project: Camel
          Issue Type: Improvement
          Components: camel-openai
    Affects Versions: 4.21.0
            Reporter: Federico Mariani


The MCP agentic loop currently hard-codes two policies 
({{OpenAIProducer.processNonStreamingAgentic}}):
* *Tool execution errors* are always stringified ({{"Error: Tool execution 
failed: " + e.getMessage()}}) and fed back to the model. This is a sane 
default, but (a) the Camel error handler ({{onException}}, dead-letter) can 
never observe tool failures, and (b) raw exception messages may leak internal 
details (connection strings, hostnames) to a third-party LLM provider — a 
concern the CAMEL-23382 design doc calls out explicitly.
* *Unknown/hallucinated tool names* always throw {{IllegalStateException}}, 
failing the exchange. Models do hallucinate tool names; the alternative 
strategy — returning a corrective tool result listing the available tools so 
the model retries — is what LangChain4j implements 
({{HallucinatedToolNameStrategy}}, cf. CAMEL-23928) and usually converges in 
one extra round trip.

Proposal: two endpoint options, names kept vendor-neutral so they can survive 
the migration to the unified tool abstraction (CAMEL-23382 step 6 will re-route 
dispatch through {{AiToolExecutor}}/{{AiToolResult}}, whose sealed result type 
distinguishes {{ArgumentError}} from {{ExecutionError}} and explicitly leaves 
the policy to each component):
* {{toolExecutionErrorStrategy=repromptModel|failExchange}} (default 
{{repromptModel}}, current behavior). {{failExchange}} sets the tool exception 
on the exchange so standard Camel error handling fires — the capability 
CAMEL-23944 is establishing for camel-langchain4j-agent.
* {{hallucinatedToolNameStrategy=failExchange|repromptModel}} (default 
{{failExchange}}, current documented behavior). {{repromptModel}} feeds back 
e.g. {{"Error: tool 'x' does not exist. Available tools: ..."}}.

The loop already has {{maxToolIterations}} to bound the extra round trips these 
strategies can cause. Documentation ({{openai-mcp.adoc}} error handling table) 
must be updated accordingly. Cross-references: CAMEL-23943/CAMEL-23944 
(langchain4j analogues), CAMEL-23393 (token budget also bounds reprompting), 
CAMEL-23382 (step 6 alignment).

_This issue was drafted by Claude Code on behalf of Federico Mariani_



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

Reply via email to