[
https://issues.apache.org/jira/browse/CAMEL-23928?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen updated CAMEL-23928:
--------------------------------
Description:
AgentConfiguration does not expose several important LangChain4j AiServices
builder options that are needed for agent runtimes, specifically around
tool-calling error handling and control:
- hallucinatedToolNameStrategy
- toolArgumentsErrorHandler
- toolExecutionErrorHandler
- maxToolCallingRoundTrips
- beforeToolExecution / afterToolExecution
- executeToolsConcurrently
- toolSearchStrategy
- compensateOnToolErrors
*Concrete use case:* an LLM hallucinated a task_complete tool name, and
LangChain4j's hallucinatedToolNameStrategy would handle this gracefully, but it
is not reachable through Camel's agent abstraction.
The createAiAgentService() methods in AgentWithMemory / AgentWithoutMemory are
private, so subclassing cannot intercept the builder. The only current
workaround is implementing AgentFactory to return a fully custom Agent, but
that requires reimplementing all the common setup logic from
AbstractAgent.configureBuilder() (tool providers, MCP, guardrails, RAG,
response format).
*Proposed solution (two parts):*
1. *First-class options:* Expose the most important tool-calling options
directly on AgentConfiguration as dedicated fields with fluent setters, so they
are easy to discover and configure in Camel (e.g.
withMaxToolCallingRoundTrips(), withHallucinatedToolNameStrategy(),
withToolExecutionErrorHandler(), etc.).
2. *Customizer escape hatch:* Add a Consumer<AiServices<?>> customizer callback
to AgentConfiguration that is invoked in AbstractAgent.configureBuilder() just
before the method returns. This lets users configure any AiServices builder
option (including future ones) without Camel needing to individually wrap each
one, and avoids having to reimplement configureBuilder() via AgentFactory.
was:
AgentConfiguration does not expose several important LangChain4j AiServices
builder options that are needed for agent runtimes, specifically around
tool-calling error handling and control:
- hallucinatedToolNameStrategy
- toolArgumentsErrorHandler
- toolExecutionErrorHandler
- maxToolCallingRoundTrips
- beforeToolExecution / afterToolExecution
- executeToolsConcurrently
- toolSearchStrategy
- compensateOnToolErrors
*Concrete use case:* an LLM hallucinated a task_complete tool name, and
LangChain4j's hallucinatedToolNameStrategy would handle this gracefully, but it
is not reachable through Camel's agent abstraction.
The createAiAgentService() methods in AgentWithMemory / AgentWithoutMemory are
private, so subclassing cannot intercept the builder. The only current
workaround is implementing AgentFactory to return a fully custom Agent, but
that requires reimplementing all the common setup logic from
AbstractAgent.configureBuilder() (tool providers, MCP, guardrails, RAG,
response format).
*Proposed solution:* add a Consumer<AiServices<?>> customizer callback to
AgentConfiguration that is invoked in AbstractAgent.configureBuilder() just
before the method returns. This lets users configure any AiServices builder
option without Camel needing to individually wrap each one, and avoids having
to reimplement configureBuilder() via AgentFactory.
> camel-langchain4j-agent - Add AiServices builder customizer hook to
> AgentConfiguration
> --------------------------------------------------------------------------------------
>
> Key: CAMEL-23928
> URL: https://issues.apache.org/jira/browse/CAMEL-23928
> Project: Camel
> Issue Type: Improvement
> Components: camel-langchain4j-agent
> Reporter: Claus Ibsen
> Priority: Major
>
> AgentConfiguration does not expose several important LangChain4j AiServices
> builder options that are needed for agent runtimes, specifically around
> tool-calling error handling and control:
> - hallucinatedToolNameStrategy
> - toolArgumentsErrorHandler
> - toolExecutionErrorHandler
> - maxToolCallingRoundTrips
> - beforeToolExecution / afterToolExecution
> - executeToolsConcurrently
> - toolSearchStrategy
> - compensateOnToolErrors
> *Concrete use case:* an LLM hallucinated a task_complete tool name, and
> LangChain4j's hallucinatedToolNameStrategy would handle this gracefully, but
> it is not reachable through Camel's agent abstraction.
> The createAiAgentService() methods in AgentWithMemory / AgentWithoutMemory
> are private, so subclassing cannot intercept the builder. The only current
> workaround is implementing AgentFactory to return a fully custom Agent, but
> that requires reimplementing all the common setup logic from
> AbstractAgent.configureBuilder() (tool providers, MCP, guardrails, RAG,
> response format).
> *Proposed solution (two parts):*
> 1. *First-class options:* Expose the most important tool-calling options
> directly on AgentConfiguration as dedicated fields with fluent setters, so
> they are easy to discover and configure in Camel (e.g.
> withMaxToolCallingRoundTrips(), withHallucinatedToolNameStrategy(),
> withToolExecutionErrorHandler(), etc.).
> 2. *Customizer escape hatch:* Add a Consumer<AiServices<?>> customizer
> callback to AgentConfiguration that is invoked in
> AbstractAgent.configureBuilder() just before the method returns. This lets
> users configure any AiServices builder option (including future ones) without
> Camel needing to individually wrap each one, and avoids having to reimplement
> configureBuilder() via AgentFactory.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)