You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by fm...@apache.org on 2024/06/04 13:00:10 UTC

(camel) 02/03: Use multiValue map for Tool parameters

This is an automated email from the ASF dual-hosted git repository.

fmariani pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 924f29223b69ca5fae6580f8dd6ac7e659b88578
Author: Croway <fe...@gmail.com>
AuthorDate: Mon Jun 3 10:35:41 2024 +0200

    Use multiValue map for Tool parameters
---
 .../src/main/docs/langchain4j-chat-component.adoc  | 13 ++++-----
 .../langchain4j/chat/LangChain4jChatComponent.java |  5 ++++
 .../langchain4j/chat/LangChain4jChatEndpoint.java  | 34 ++++++++--------------
 .../langchain4j.chat/LangChain4jConsumerIT.java    |  2 +-
 4 files changed, 24 insertions(+), 30 deletions(-)

diff --git a/components/camel-ai/camel-langchain4j-chat/src/main/docs/langchain4j-chat-component.adoc b/components/camel-ai/camel-langchain4j-chat/src/main/docs/langchain4j-chat-component.adoc
index 792d6c209ba..dce9cfef48d 100644
--- a/components/camel-ai/camel-langchain4j-chat/src/main/docs/langchain4j-chat-component.adoc
+++ b/components/camel-ai/camel-langchain4j-chat/src/main/docs/langchain4j-chat-component.adoc
@@ -145,13 +145,12 @@ String response = template.requestBody("direct:send-multiple", messages, String.
 ----
 
 == Chat with Tool
-Camel langchain4j-chat used as a consumer can be used to implement a Tool,
-right now Tools are supported only via the OpenAiChatModel
-backed by OpenAI APIs.
+Camel langchain4j-chat component as a consumer can be used to implement a LangChain Tool,
+right now Tools are supported only via the OpenAiChatModel backed by OpenAI APIs.
 
-Tool Input parameter can be defined via parameterName and parameterType in case of only one parameter,
-or via the endpoint option camelToolParameter in case of multiple parameters.
-The parameters can be found as headers in the consumer route, in particular, if you define a `parameterName=userId`,
+Tool Input parameter can be defined as an Endpoint multiValue option in the form of `parameter.<name>=<type>`,
+or via the endpoint option camelToolParameter for a programmatic approach.
+The parameters can be found as headers in the consumer route, in particular, if you define `parameter.userId=5`,
 in the consumer route `${header.userId}` can be used.
 
 Example of a producer and a consumer:
@@ -160,7 +159,7 @@ Example of a producer and a consumer:
 from("direct:test")
     .to("langchain4j-chat:test1?chatOperation=CHAT_MULTIPLE_MESSAGES");
 
-from("langchain4j-chat:test1?description=Query user database by number&parameterName=number&parameterType=integer")
+from("langchain4j-chat:test1?description=Query user database by number&parameter.number=integer")
     .to("sql:SELECT name FROM users WHERE id = :#number");
 ----
 
diff --git a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatComponent.java b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatComponent.java
index 4138f406f59..08412be9e1b 100644
--- a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatComponent.java
+++ b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatComponent.java
@@ -17,12 +17,14 @@
 package org.apache.camel.component.langchain4j.chat;
 
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.Component;
 import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.util.PropertiesHelper;
 
 import static org.apache.camel.component.langchain4j.chat.LangChain4jChat.SCHEME;
 
@@ -58,7 +60,10 @@ public class LangChain4jChatComponent extends DefaultComponent {
 
         LangChain4jChatConfiguration langchain4jChatConfiguration = this.configuration.copy();
 
+        Map<String, Object> toolParameters = PropertiesHelper.extractProperties(parameters, "parameter.");
         Endpoint endpoint = new LangChain4jChatEndpoint(uri, this, remaining, langchain4jChatConfiguration);
+        ((LangChain4jChatEndpoint) endpoint).setParameters(toolParameters.entrySet().stream()
+                .collect(Collectors.toMap(Map.Entry::getKey, e -> (String) e.getValue())));
 
         setProperties(endpoint, parameters);
         return endpoint;
diff --git a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpoint.java b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpoint.java
index b8598b45852..23b7be1d852 100644
--- a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpoint.java
+++ b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpoint.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.langchain4j.chat;
 
+import java.util.Map;
 import java.util.UUID;
 
 import dev.langchain4j.agent.tool.JsonSchemaProperty;
@@ -50,19 +51,16 @@ public class LangChain4jChatEndpoint extends DefaultEndpoint {
     private LangChain4jChatConfiguration configuration;
 
     @Metadata(label = "consumer")
-    @UriParam(description = "simple Tool description")
+    @UriParam(description = "Tool description")
     private String description;
 
     @Metadata(label = "consumer")
-    @UriParam(description = "simple Tool paramenter name")
-    private String parameterName;
-
-    @Metadata(label = "consumer")
-    @UriParam(description = "Simple Tool parameter type", enums = "string,integer,number,object,array,boolean,null")
-    private String parameterType;
+    @UriParam(description = "List of Tool parameters in the form of parameter.<name>=<type>", prefix = "parameter.",
+              multiValue = true, enums = "string,integer,number,object,array,boolean,null")
+    private Map<String, String> parameters;
 
     @Metadata(label = "consumer,advanced")
-    @UriParam(description = "Tool's Parameters, to be used in case of multiple arguments")
+    @UriParam(description = "Tool's Camel Parameters, programmatically define Tool description and parameters")
     private CamelSimpleToolParameter camelToolParameter;
 
     public LangChain4jChatEndpoint(String uri, LangChain4jChatComponent component, String chatId,
@@ -91,8 +89,8 @@ public class LangChain4jChatEndpoint extends DefaultEndpoint {
         } else if (description != null) {
             toolSpecificationBuilder.description(description);
 
-            if (parameterName != null) {
-                toolSpecificationBuilder.addParameter(parameterName, JsonSchemaProperty.type(parameterType));
+            if (parameters != null) {
+                parameters.forEach((name, type) -> toolSpecificationBuilder.addParameter(name, JsonSchemaProperty.type(type)));
             }
         } else {
             // Consumer without toolParameter or description
@@ -129,20 +127,12 @@ public class LangChain4jChatEndpoint extends DefaultEndpoint {
         this.description = description;
     }
 
-    public String getParameterName() {
-        return parameterName;
-    }
-
-    public void setParameterName(String parameterName) {
-        this.parameterName = parameterName;
-    }
-
-    public String getParameterType() {
-        return parameterType;
+    public Map<String, String> getParameters() {
+        return parameters;
     }
 
-    public void setParameterType(String parameterType) {
-        this.parameterType = parameterType;
+    public void setParameters(Map<String, String> parameters) {
+        this.parameters = parameters;
     }
 
     public CamelSimpleToolParameter getCamelToolParameter() {
diff --git a/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jConsumerIT.java b/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jConsumerIT.java
index de4018ce1a3..53186b8d1f2 100644
--- a/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jConsumerIT.java
+++ b/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jConsumerIT.java
@@ -67,7 +67,7 @@ public class LangChain4jConsumerIT extends CamelTestSupport {
                 from("direct:test")
                         .to("langchain4j-chat:test1?chatOperation=CHAT_MULTIPLE_MESSAGES");
 
-                from("langchain4j-chat:test1?description=Query user database by number&parameterName=number&parameterType=integer")
+                from("langchain4j-chat:test1?description=Query user database by number&parameter.number=integer")
                         .process(exchange -> exchange.getIn().setBody(nameFromDB));
 
                 from("langchain4j-chat:test1?camelToolParameter=#parameters")