[
https://issues.apache.org/jira/browse/CAMEL-23382?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Zineb Bendhiba updated CAMEL-23382:
-----------------------------------
Description:
tldr; as an user of camel-langchain4j, or camel-spring-ai or camel-openai, I'd
expect the same behaviour and workflow when implementing tools.
Currently, _camel-langchain4j-tools_ and _camel-spring-ai-tools_ independently
implement the same pattern: Camel routes register as LLM-invokable tools via a
consumer endpoint, a singleton registry ({_}CamelToolExecutorCache{_}) maps
tags to tool specs, and a producer dispatches tool calls to the matching route.
Each module has its own duplicated copy of this registry and specification
classes. *camel-openai* only supports external MCP server tools and has no way
to use Camel routes as tools.
This issue proposes extracting a shared, framework-agnostic tool abstraction
({*}camel-ai-tools{*}) that all AI components can use:
- *ai-tool:toolName* consumer endpoint — defines a Camel route as an
LLM-invokable tool with metadata (description, parameter schema). No AI
framework dependency.
- *AiToolRegistry* — shared singleton registry mapping tags to tool specs.
Replaces the duplicated _CamelToolExecutorCache_ in langchain4j-tools and
spring-ai-tools.
- *AiToolSpec* — framework-agnostic tool definition holding name, description,
JSON Schema parameters, and a reference to the Camel processor that implements
the tool.
Each AI component discovers tools from the shared registry via a _tags_
parameter and converts them to its native format
({_}ChatCompletionFunctionTool{_} for openai, _ToolSpecification_ for
langchain4j, _ToolCallback_ for spring-ai).
Example YAML DSL:
{code:java}
# Define a tool once (framework-agnostic)
- route:
from:
uri: ai-tools:getFacts
parameters:
tags: research
description: "Get facts about a given topic"
parameter.topic: string
parameter.topic.description: "The topic to get facts about"
steps:
- to: "direct:someRoute"
# Any AI component can use it
- route:
from:
uri: direct:researcher
steps:
- to: "openai:chat-completion?autoToolExecution=true&tags=research"
{code}
was:
tldr; as an user of camel-langchain4j, or camel-spring-ai or camel-openai, I'd
expect the same behaviour and workflow when implementing tools.
Currently, _camel-langchain4j-tools_ and _camel-spring-ai-tools_ independently
implement the same pattern: Camel routes register as LLM-invokable tools via a
consumer endpoint, a singleton registry (_CamelToolExecutorCache_) maps tags to
tool specs, and a producer dispatches tool calls to the matching route. Each
module has its own duplicated copy of this registry and specification classes.
*camel-openai* only supports external MCP server tools and has no way to use
Camel routes as tools.
This issue proposes extracting a shared, framework-agnostic tool abstraction
(*camel-ai-tools*) that all AI components can use:
- *ai-tools:toolName* consumer endpoint — defines a Camel route as an
LLM-invokable tool with metadata (description, parameter schema). No AI
framework dependency.
- *AiToolRegistry* — shared singleton registry mapping tags to tool specs.
Replaces the duplicated _CamelToolExecutorCache_ in langchain4j-tools and
spring-ai-tools.
- *AiToolSpec* — framework-agnostic tool definition holding name, description,
JSON Schema parameters, and a reference to the Camel processor that implements
the tool.
Each AI component discovers tools from the shared registry via a _tags_
parameter and converts them to its native format (_ChatCompletionFunctionTool_
for openai, _ToolSpecification_ for langchain4j, _ToolCallback_ for spring-ai).
Example YAML DSL:
{code:java}
# Define a tool once (framework-agnostic)
- route:
from:
uri: ai-tools:getFacts
parameters:
tags: research
description: "Get facts about a given topic"
parameter.topic: string
steps:
- to:
"openai:chat-completion?model=qwen3-8b&baseUrl=http://localhost:8001/v1"
# Any AI component can use it
- route:
from:
uri: direct:researcher
steps:
- to: "openai:chat-completion?autoToolExecution=true&tags=research"
{code}
> Unified Camel AI tool abstraction for route-based tools across AI components
> -----------------------------------------------------------------------------
>
> Key: CAMEL-23382
> URL: https://issues.apache.org/jira/browse/CAMEL-23382
> Project: Camel
> Issue Type: New Feature
> Components: camel-ai
> Affects Versions: 4.20.0
> Reporter: Federico Mariani
> Assignee: Zineb Bendhiba
> Priority: Major
> Fix For: 4.22.0
>
>
> tldr; as an user of camel-langchain4j, or camel-spring-ai or camel-openai,
> I'd expect the same behaviour and workflow when implementing tools.
> Currently, _camel-langchain4j-tools_ and _camel-spring-ai-tools_
> independently implement the same pattern: Camel routes register as
> LLM-invokable tools via a consumer endpoint, a singleton registry
> ({_}CamelToolExecutorCache{_}) maps tags to tool specs, and a producer
> dispatches tool calls to the matching route. Each module has its own
> duplicated copy of this registry and specification classes. *camel-openai*
> only supports external MCP server tools and has no way to use Camel routes as
> tools.
> This issue proposes extracting a shared, framework-agnostic tool abstraction
> ({*}camel-ai-tools{*}) that all AI components can use:
> - *ai-tool:toolName* consumer endpoint — defines a Camel route as an
> LLM-invokable tool with metadata (description, parameter schema). No AI
> framework dependency.
> - *AiToolRegistry* — shared singleton registry mapping tags to tool specs.
> Replaces the duplicated _CamelToolExecutorCache_ in langchain4j-tools and
> spring-ai-tools.
> - *AiToolSpec* — framework-agnostic tool definition holding name,
> description, JSON Schema parameters, and a reference to the Camel processor
> that implements the tool.
> Each AI component discovers tools from the shared registry via a _tags_
> parameter and converts them to its native format
> ({_}ChatCompletionFunctionTool{_} for openai, _ToolSpecification_ for
> langchain4j, _ToolCallback_ for spring-ai).
> Example YAML DSL:
> {code:java}
> # Define a tool once (framework-agnostic)
> - route:
>
>
>
> from:
> uri: ai-tools:getFacts
>
>
>
> parameters:
>
>
>
> tags: research
>
>
> description: "Get facts about a given topic"
>
>
>
> parameter.topic: string
> parameter.topic.description: "The topic to get facts about"
> steps:
>
>
> - to: "direct:someRoute"
>
>
>
>
>
>
> # Any AI component can use it
>
>
>
> - route:
>
>
>
> from:
> uri: direct:researcher
>
>
>
> steps:
> - to: "openai:chat-completion?autoToolExecution=true&tags=research"
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
