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¶meterName=number¶meterType=integer")
+from("langchain4j-chat:test1?description=Query user database by number¶meter.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¶meterName=number¶meterType=integer")
+ from("langchain4j-chat:test1?description=Query user database by number¶meter.number=integer")
.process(exchange -> exchange.getIn().setBody(nameFromDB));
from("langchain4j-chat:test1?camelToolParameter=#parameters")