This is an automated email from the ASF dual-hosted git repository. orpiske pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push: new f5eb3562a31 CAMEL-22096: Upgrade Langchain4j version for Langchain4j-chat and langchain4j-tools components f5eb3562a31 is described below commit f5eb3562a310445ee518bc3421554243a5faa5b8 Author: Zineb Bendhiba <bendhiba.zi...@gmail.com> AuthorDate: Tue May 20 17:03:48 2025 +0200 CAMEL-22096: Upgrade Langchain4j version for Langchain4j-chat and langchain4j-tools components --- .../camel/catalog/components/langchain4j-chat.json | 4 +- .../catalog/components/langchain4j-tools.json | 4 +- components/camel-ai/camel-langchain4j-chat/pom.xml | 17 ++++++-- .../chat/LangChain4jChatComponentConfigurer.java | 4 +- .../LangChain4jChatConfigurationConfigurer.java | 4 +- .../chat/LangChain4jChatEndpointConfigurer.java | 4 +- .../langchain4j/chat/langchain4j-chat.json | 4 +- .../src/main/docs/langchain4j-chat-component.adoc | 4 +- .../chat/LangChain4jChatConfiguration.java | 10 ++--- .../langchain4j/chat/LangChain4jChatProducer.java | 20 +++++----- .../openai/OpenAiChatLanguageModelBuilder.java | 4 +- .../chat/rag/LangChain4jRagAggregatorStrategy.java | 3 +- .../langchain4j.chat/LangChain4jChatIT.java | 9 +++-- .../LangChain4jRagAggregatorTest.java | 3 +- .../langchain4j.chat/OllamaTestSupport.java | 8 ++-- .../camel-ai/camel-langchain4j-tools/pom.xml | 10 ++++- .../tools/LangChain4jToolsComponentConfigurer.java | 4 +- .../LangChain4jToolsConfigurationConfigurer.java | 4 +- .../tools/LangChain4jToolsEndpointConfigurer.java | 4 +- .../langchain4j/tools/langchain4j-tools.json | 4 +- .../tools/LangChain4jToolsConfiguration.java | 10 ++--- .../tools/LangChain4jToolsEndpoint.java | 46 +++++++++++++++++++--- .../tools/LangChain4jToolsProducer.java | 29 +++++++++++--- .../tools/spec/NamedJsonSchemaProperty.java | 10 ++--- .../langchain4j/tools/LangChain4jToolIT.java | 14 +++---- .../tools/LangChain4jToolMultipleCallsIT.java | 17 ++++---- .../tools/LangChain4jToolMultipleGroupsIT.java | 14 +++---- .../LangChain4jToolMultipleMatchingGroupsIT.java | 14 +++---- .../tools/LangChain4jToolNoToolsExistIT.java | 14 +++---- .../tools/LangChain4jToolNoToolsToBeCalledIT.java | 14 +++---- .../Langchain4jChatComponentBuilderFactory.java | 10 ++--- .../Langchain4jToolsComponentBuilderFactory.java | 10 ++--- .../dsl/LangChain4jChatEndpointBuilderFactory.java | 42 +++++++++----------- .../LangChain4jToolsEndpointBuilderFactory.java | 42 +++++++++----------- 34 files changed, 235 insertions(+), 179 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-chat.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-chat.json index 52fd2ef86d2..98252eb5cb1 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-chat.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-chat.json @@ -29,7 +29,7 @@ "bridgeErrorHandler": { "index": 2, "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the like [...] "lazyStartProducer": { "index": 3, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...] "autowiredEnabled": { "index": 4, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...] - "chatModel": { "index": 5, "kind": "property", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatLanguageModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration", "configurationField": "configuration", "description": "Chat Language Model of type dev.langchai [...] + "chatModel": { "index": 5, "kind": "property", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration", "configurationField": "configuration", "description": "Chat Model of type dev.langchain4j.model.chat.Ch [...] }, "headers": { "CamelLangChain4jChatPromptTemplate": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The prompt Template.", "constantName": "org.apache.camel.component.langchain4j.chat.LangChain4jChat$Headers#PROMPT_TEMPLATE" }, @@ -42,6 +42,6 @@ "exceptionHandler": { "index": 3, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By def [...] "exchangePattern": { "index": 4, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, "lazyStartProducer": { "index": 5, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produc [...] - "chatModel": { "index": 6, "kind": "parameter", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatLanguageModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration", "configurationField": "configuration", "description": "Chat Language Model of type dev.langcha [...] + "chatModel": { "index": 6, "kind": "parameter", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration", "configurationField": "configuration", "description": "Chat Model of type dev.langchain4j.model.chat.C [...] } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-tools.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-tools.json index 634faab47b1..fd67b66e98b 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-tools.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/langchain4j-tools.json @@ -28,7 +28,7 @@ "bridgeErrorHandler": { "index": 1, "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the like [...] "lazyStartProducer": { "index": 2, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...] "autowiredEnabled": { "index": 3, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...] - "chatModel": { "index": 4, "kind": "property", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatLanguageModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration", "configurationField": "configuration", "description": "Chat Language Model of type dev.langch [...] + "chatModel": { "index": 4, "kind": "property", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration", "configurationField": "configuration", "description": "Chat Model of type dev.langchain4j.model.chat. [...] }, "properties": { "toolId": { "index": 0, "kind": "path", "displayName": "Tool Id", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tool name" }, @@ -40,6 +40,6 @@ "exceptionHandler": { "index": 6, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By def [...] "exchangePattern": { "index": 7, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produc [...] - "chatModel": { "index": 9, "kind": "parameter", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatLanguageModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration", "configurationField": "configuration", "description": "Chat Language Model of type dev.langc [...] + "chatModel": { "index": 9, "kind": "parameter", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration", "configurationField": "configuration", "description": "Chat Model of type dev.langchain4j.model.chat [...] } } diff --git a/components/camel-ai/camel-langchain4j-chat/pom.xml b/components/camel-ai/camel-langchain4j-chat/pom.xml index 66c5e0803df..fda1e0858e8 100644 --- a/components/camel-ai/camel-langchain4j-chat/pom.xml +++ b/components/camel-ai/camel-langchain4j-chat/pom.xml @@ -33,6 +33,11 @@ <name>Camel :: AI :: LangChain4j :: Chat</name> <description>LangChain4j Chat component</description> + <properties> + <langchain4j-version>1.0.1</langchain4j-version> + <langchain4j-hugging-face-ollama-version>1.0.1-beta6</langchain4j-hugging-face-ollama-version> + </properties> + <dependencies> <dependency> @@ -40,9 +45,12 @@ <artifactId>camel-support</artifactId> </dependency> <dependency> - <groupId>org.apache.camel</groupId> - <artifactId>camel-langchain4j-core</artifactId> + <groupId>dev.langchain4j</groupId> + <artifactId>langchain4j-core</artifactId> + <version>${langchain4j-version}</version> </dependency> + + <!-- these 2 model beans - we may want to check if they can be deleted in some future --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai</artifactId> @@ -51,8 +59,9 @@ <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-hugging-face</artifactId> - <version>${langchain4j-version}</version> + <version>${langchain4j-hugging-face-ollama-version}</version> </dependency> + <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> @@ -68,7 +77,7 @@ <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-ollama</artifactId> - <version>${langchain4j-version}</version> + <version>${langchain4j-hugging-face-ollama-version}</version> <scope>test</scope> </dependency> <dependency> diff --git a/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatComponentConfigurer.java b/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatComponentConfigurer.java index 740b9a308d0..49806b70111 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatComponentConfigurer.java +++ b/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatComponentConfigurer.java @@ -35,7 +35,7 @@ public class LangChain4jChatComponentConfigurer extends PropertyConfigurerSuppor case "bridgeerrorhandler": case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true; case "chatmodel": - case "chatModel": getOrCreateConfiguration(target).setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatLanguageModel.class, value)); return true; + case "chatModel": getOrCreateConfiguration(target).setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatModel.class, value)); return true; case "chatoperation": case "chatOperation": getOrCreateConfiguration(target).setChatOperation(property(camelContext, org.apache.camel.component.langchain4j.chat.LangChain4jChatOperations.class, value)); return true; case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration.class, value)); return true; @@ -58,7 +58,7 @@ public class LangChain4jChatComponentConfigurer extends PropertyConfigurerSuppor case "bridgeerrorhandler": case "bridgeErrorHandler": return boolean.class; case "chatmodel": - case "chatModel": return dev.langchain4j.model.chat.ChatLanguageModel.class; + case "chatModel": return dev.langchain4j.model.chat.ChatModel.class; case "chatoperation": case "chatOperation": return org.apache.camel.component.langchain4j.chat.LangChain4jChatOperations.class; case "configuration": return org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration.class; diff --git a/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatConfigurationConfigurer.java b/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatConfigurationConfigurer.java index ba1b6cf5701..34de06622ce 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatConfigurationConfigurer.java +++ b/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatConfigurationConfigurer.java @@ -24,7 +24,7 @@ public class LangChain4jChatConfigurationConfigurer extends org.apache.camel.sup org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration target = (org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "chatmodel": - case "chatModel": target.setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatLanguageModel.class, value)); return true; + case "chatModel": target.setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatModel.class, value)); return true; case "chatoperation": case "chatOperation": target.setChatOperation(property(camelContext, org.apache.camel.component.langchain4j.chat.LangChain4jChatOperations.class, value)); return true; default: return false; @@ -35,7 +35,7 @@ public class LangChain4jChatConfigurationConfigurer extends org.apache.camel.sup public Class<?> getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "chatmodel": - case "chatModel": return dev.langchain4j.model.chat.ChatLanguageModel.class; + case "chatModel": return dev.langchain4j.model.chat.ChatModel.class; case "chatoperation": case "chatOperation": return org.apache.camel.component.langchain4j.chat.LangChain4jChatOperations.class; default: return null; diff --git a/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpointConfigurer.java b/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpointConfigurer.java index 3cd66b4d8d0..55b3475d71c 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpointConfigurer.java +++ b/components/camel-ai/camel-langchain4j-chat/src/generated/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatEndpointConfigurer.java @@ -26,7 +26,7 @@ public class LangChain4jChatEndpointConfigurer extends PropertyConfigurerSupport case "bridgeerrorhandler": case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true; case "chatmodel": - case "chatModel": target.getConfiguration().setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatLanguageModel.class, value)); return true; + case "chatModel": target.getConfiguration().setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatModel.class, value)); return true; case "chatoperation": case "chatOperation": target.getConfiguration().setChatOperation(property(camelContext, org.apache.camel.component.langchain4j.chat.LangChain4jChatOperations.class, value)); return true; case "exceptionhandler": @@ -50,7 +50,7 @@ public class LangChain4jChatEndpointConfigurer extends PropertyConfigurerSupport case "bridgeerrorhandler": case "bridgeErrorHandler": return boolean.class; case "chatmodel": - case "chatModel": return dev.langchain4j.model.chat.ChatLanguageModel.class; + case "chatModel": return dev.langchain4j.model.chat.ChatModel.class; case "chatoperation": case "chatOperation": return org.apache.camel.component.langchain4j.chat.LangChain4jChatOperations.class; case "exceptionhandler": diff --git a/components/camel-ai/camel-langchain4j-chat/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/chat/langchain4j-chat.json b/components/camel-ai/camel-langchain4j-chat/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/chat/langchain4j-chat.json index 52fd2ef86d2..98252eb5cb1 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/chat/langchain4j-chat.json +++ b/components/camel-ai/camel-langchain4j-chat/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/chat/langchain4j-chat.json @@ -29,7 +29,7 @@ "bridgeErrorHandler": { "index": 2, "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the like [...] "lazyStartProducer": { "index": 3, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...] "autowiredEnabled": { "index": 4, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...] - "chatModel": { "index": 5, "kind": "property", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatLanguageModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration", "configurationField": "configuration", "description": "Chat Language Model of type dev.langchai [...] + "chatModel": { "index": 5, "kind": "property", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration", "configurationField": "configuration", "description": "Chat Model of type dev.langchain4j.model.chat.Ch [...] }, "headers": { "CamelLangChain4jChatPromptTemplate": { "index": 0, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The prompt Template.", "constantName": "org.apache.camel.component.langchain4j.chat.LangChain4jChat$Headers#PROMPT_TEMPLATE" }, @@ -42,6 +42,6 @@ "exceptionHandler": { "index": 3, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By def [...] "exchangePattern": { "index": 4, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, "lazyStartProducer": { "index": 5, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produc [...] - "chatModel": { "index": 6, "kind": "parameter", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatLanguageModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration", "configurationField": "configuration", "description": "Chat Language Model of type dev.langcha [...] + "chatModel": { "index": 6, "kind": "parameter", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.chat.LangChain4jChatConfiguration", "configurationField": "configuration", "description": "Chat Model of type dev.langchain4j.model.chat.C [...] } } 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 eb8db882165..74ef6d49b13 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 @@ -81,11 +81,11 @@ Add the dependency for LangChain4j OpenAI support: </dependency> ---- -Initialize the OpenAI Chat Language Model, and add it to the Camel Registry: +Initialize the OpenAI Chat Model, and add it to the Camel Registry: [source, java] ---- -ChatLanguageModel model = OpenAiChatModel.builder() +ChatModel model = OpenAiChatModel.builder() .apiKey(openApiKey) .modelName(GPT_3_5_TURBO) .temperature(0.3) diff --git a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatConfiguration.java b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatConfiguration.java index 8f84a47d4b2..821ceee04b0 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatConfiguration.java +++ b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatConfiguration.java @@ -16,7 +16,7 @@ */ package org.apache.camel.component.langchain4j.chat; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import org.apache.camel.RuntimeCamelException; import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; @@ -33,7 +33,7 @@ public class LangChain4jChatConfiguration implements Cloneable { @UriParam(label = "advanced") @Metadata(autowired = true) - private ChatLanguageModel chatModel; + private ChatModel chatModel; public LangChain4jChatConfiguration() { } @@ -53,15 +53,15 @@ public class LangChain4jChatConfiguration implements Cloneable { } /** - * Chat Language Model of type dev.langchain4j.model.chat.ChatLanguageModel + * Chat Model of type dev.langchain4j.model.chat.ChatModel * * @return */ - public ChatLanguageModel getChatModel() { + public ChatModel getChatModel() { return chatModel; } - public void setChatModel(ChatLanguageModel chatModel) { + public void setChatModel(ChatModel chatModel) { this.chatModel = chatModel; } diff --git a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatProducer.java b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatProducer.java index 7b1a990b44d..171d8874ad3 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatProducer.java +++ b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/LangChain4jChatProducer.java @@ -23,10 +23,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import dev.langchain4j.data.message.AiMessage; import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.data.message.UserMessage; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.input.Prompt; import dev.langchain4j.model.input.PromptTemplate; -import dev.langchain4j.model.output.Response; import dev.langchain4j.rag.content.Content; import dev.langchain4j.rag.content.injector.ContentInjector; import dev.langchain4j.rag.content.injector.DefaultContentInjector; @@ -42,7 +41,7 @@ public class LangChain4jChatProducer extends DefaultProducer { private final LangChain4jChatEndpoint endpoint; - private ChatLanguageModel chatLanguageModel; + private ChatModel chatModel; private final ObjectMapper objectMapper = new ObjectMapper(); @@ -100,8 +99,8 @@ public class LangChain4jChatProducer extends DefaultProducer { @Override protected void doStart() throws Exception { super.doStart(); - this.chatLanguageModel = this.endpoint.getConfiguration().getChatModel(); - ObjectHelper.notNull(chatLanguageModel, "chatLanguageModel"); + this.chatModel = this.endpoint.getConfiguration().getChatModel(); + ObjectHelper.notNull(chatModel, "chatModel"); } private void populateResponse(String response, Exchange exchange) { @@ -117,7 +116,7 @@ public class LangChain4jChatProducer extends DefaultProducer { private String sendChatMessage(ChatMessage chatMessage, Exchange exchange) { var augmentedChatMessage = addAugmentedData(chatMessage, exchange); - Response<AiMessage> response = this.chatLanguageModel.generate(augmentedChatMessage); + AiMessage response = this.chatModel.chat(augmentedChatMessage).aiMessage(); return extractAiResponse(response); } @@ -150,7 +149,7 @@ public class LangChain4jChatProducer extends DefaultProducer { private String sendListChatMessage(List<ChatMessage> chatMessages, Exchange exchange) { LangChain4jChatEndpoint langChain4jChatEndpoint = (LangChain4jChatEndpoint) getEndpoint(); - Response<AiMessage> response; + AiMessage response; // Check if the last message is a UserMessage and if there's a need to augment the message for RAG int size = chatMessages.size(); @@ -163,13 +162,12 @@ public class LangChain4jChatProducer extends DefaultProducer { } - response = this.chatLanguageModel.generate(chatMessages); + response = this.chatModel.chat(chatMessages).aiMessage(); return extractAiResponse(response); } - private String extractAiResponse(Response<AiMessage> response) { - AiMessage message = response.content(); - return message == null ? null : message.text(); + private String extractAiResponse(AiMessage response) { + return response == null ? null : response.text(); } public String sendWithPromptTemplate(String promptTemplate, Map<String, Object> variables, Exchange exchange) { diff --git a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/openai/OpenAiChatLanguageModelBuilder.java b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/openai/OpenAiChatLanguageModelBuilder.java index b4e9bdc8ebb..a9483434258 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/openai/OpenAiChatLanguageModelBuilder.java +++ b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/openai/OpenAiChatLanguageModelBuilder.java @@ -16,7 +16,7 @@ */ package org.apache.camel.component.langchain4j.chat.openai; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.openai.OpenAiChatModel; import static java.time.Duration.ofSeconds; @@ -66,7 +66,7 @@ public final class OpenAiChatLanguageModelBuilder { return this; } - public ChatLanguageModel build() { + public ChatModel build() { return OpenAiChatModel.builder() .apiKey(apiKey) .modelName(modelName) diff --git a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/rag/LangChain4jRagAggregatorStrategy.java b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/rag/LangChain4jRagAggregatorStrategy.java index b046a48996f..f9d77d45aa0 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/rag/LangChain4jRagAggregatorStrategy.java +++ b/components/camel-ai/camel-langchain4j-chat/src/main/java/org/apache/camel/component/langchain4j/chat/rag/LangChain4jRagAggregatorStrategy.java @@ -22,6 +22,7 @@ import java.util.Optional; import java.util.stream.Collectors; import dev.langchain4j.rag.content.Content; +import dev.langchain4j.rag.content.DefaultContent; import org.apache.camel.AggregationStrategy; import org.apache.camel.Exchange; @@ -43,7 +44,7 @@ public class LangChain4jRagAggregatorStrategy implements AggregationStrategy { // create a list of contents from the retrieved Strings List<Content> newContents = newAugmentedData.get().stream() - .map(Content::new) + .map(DefaultContent::new) .collect(Collectors.toList()); // Get or create the augmented data list from the old exchange diff --git a/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jChatIT.java b/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jChatIT.java index d03152978b4..0ef288196c4 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jChatIT.java +++ b/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jChatIT.java @@ -27,6 +27,7 @@ import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; import dev.langchain4j.rag.content.Content; +import dev.langchain4j.rag.content.DefaultContent; import org.apache.camel.InvalidPayloadException; import org.apache.camel.NoSuchHeaderException; import org.apache.camel.builder.RouteBuilder; @@ -50,7 +51,7 @@ public class LangChain4jChatIT extends OllamaTestSupport { @Override protected RouteBuilder createRouteBuilder() { - this.context.getRegistry().bind("chatModel", chatLanguageModel); + this.context.getRegistry().bind("chatModel", chatModel); LangChain4jRagAggregatorStrategy aggregatorStrategy = new LangChain4jRagAggregatorStrategy(); return new RouteBuilder() { @@ -237,7 +238,7 @@ public class LangChain4jChatIT extends OllamaTestSupport { MockEndpoint mockEndpoint = this.context.getEndpoint("mock:response", MockEndpoint.class); mockEndpoint.expectedMessageCount(1); - Content augmentedContent = new Content(AUGMENTEG_DATA_FOR_RAG); + Content augmentedContent = new DefaultContent(AUGMENTEG_DATA_FOR_RAG); List<Content> contents = List.of(augmentedContent); @@ -279,7 +280,7 @@ public class LangChain4jChatIT extends OllamaTestSupport { variables.put("field", "pole vault"); variables.put("competition", "Paris 2024"); - Content augmentedContent = new Content(AUGMENTEG_DATA_FOR_RAG); + Content augmentedContent = new DefaultContent(AUGMENTEG_DATA_FOR_RAG); List<Content> contents = List.of(augmentedContent); @@ -324,7 +325,7 @@ public class LangChain4jChatIT extends OllamaTestSupport { messages.add(new AiMessage("Hello Karen, how can I help you?")); messages.add(new UserMessage(QUESTION_FOR_RAG)); - Content augmentedContent = new Content(AUGMENTEG_DATA_FOR_RAG); + Content augmentedContent = new DefaultContent(AUGMENTEG_DATA_FOR_RAG); List<Content> contents = List.of(augmentedContent); String response diff --git a/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jRagAggregatorTest.java b/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jRagAggregatorTest.java index 76e22716a67..c15cd72f4dd 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jRagAggregatorTest.java +++ b/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/LangChain4jRagAggregatorTest.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.List; import dev.langchain4j.rag.content.Content; +import dev.langchain4j.rag.content.DefaultContent; import org.apache.camel.Exchange; import org.apache.camel.component.langchain4j.chat.rag.LangChain4jRagAggregatorStrategy; import org.apache.camel.impl.DefaultCamelContext; @@ -85,7 +86,7 @@ public class LangChain4jRagAggregatorTest { oldExchange.getIn().setBody("Prompt Test"); // setting a content in the old exchange - Content oldContent = new Content("Old data"); + Content oldContent = new DefaultContent("Old data"); List<Content> contents = new ArrayList<>(); contents.add(oldContent); oldExchange.getIn().setHeader(AUGMENTED_DATA, contents); diff --git a/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/OllamaTestSupport.java b/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/OllamaTestSupport.java index 24a3c0a3da4..e7f4324b0f6 100644 --- a/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/OllamaTestSupport.java +++ b/components/camel-ai/camel-langchain4j-chat/src/test/java/org/apache/camel/component/langchain4j.chat/OllamaTestSupport.java @@ -16,7 +16,7 @@ */ package org.apache.camel.component.langchain4j.chat; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.ollama.OllamaChatModel; import org.apache.camel.test.infra.ollama.services.OllamaService; import org.apache.camel.test.infra.ollama.services.OllamaServiceFactory; @@ -27,7 +27,7 @@ import static java.time.Duration.ofSeconds; public class OllamaTestSupport extends CamelTestSupport { - protected ChatLanguageModel chatLanguageModel; + protected ChatModel chatModel; @RegisterExtension static OllamaService OLLAMA = OllamaServiceFactory.createService(); @@ -36,10 +36,10 @@ public class OllamaTestSupport extends CamelTestSupport { protected void setupResources() throws Exception { super.setupResources(); - chatLanguageModel = createModel(); + chatModel = createModel(); } - protected ChatLanguageModel createModel() { + protected ChatModel createModel() { return OllamaChatModel.builder() .baseUrl(OLLAMA.getEndpoint()) .modelName(OLLAMA.getModel()) diff --git a/components/camel-ai/camel-langchain4j-tools/pom.xml b/components/camel-ai/camel-langchain4j-tools/pom.xml index dd2f9a9b196..0d25c3e31fd 100644 --- a/components/camel-ai/camel-langchain4j-tools/pom.xml +++ b/components/camel-ai/camel-langchain4j-tools/pom.xml @@ -38,6 +38,8 @@ <label>ai</label> <title>LangChain4j Tools</title> <supportLevel>Experimental</supportLevel> + <langchain4j-version>1.0.1</langchain4j-version> + <langchain4j-ollama-version>1.0.1-beta6</langchain4j-ollama-version> </properties> <dependencies> @@ -51,6 +53,11 @@ <artifactId>langchain4j</artifactId> <version>${langchain4j-version}</version> </dependency> + <dependency> + <groupId>dev.langchain4j</groupId> + <artifactId>langchain4j-core</artifactId> + <version>${langchain4j-version}</version> + </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> @@ -77,7 +84,7 @@ <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-ollama</artifactId> - <version>${langchain4j-version}</version> + <version>${langchain4j-ollama-version}</version> <scope>test</scope> </dependency> <dependency> @@ -104,6 +111,7 @@ <artifactId>assertj-core</artifactId> <scope>test</scope> </dependency> + </dependencies> </project> \ No newline at end of file diff --git a/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsComponentConfigurer.java b/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsComponentConfigurer.java index c2329a2fdd8..61f1fe5b86e 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsComponentConfigurer.java +++ b/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsComponentConfigurer.java @@ -35,7 +35,7 @@ public class LangChain4jToolsComponentConfigurer extends PropertyConfigurerSuppo case "bridgeerrorhandler": case "bridgeErrorHandler": target.setBridgeErrorHandler(property(camelContext, boolean.class, value)); return true; case "chatmodel": - case "chatModel": getOrCreateConfiguration(target).setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatLanguageModel.class, value)); return true; + case "chatModel": getOrCreateConfiguration(target).setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatModel.class, value)); return true; case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration.class, value)); return true; case "lazystartproducer": case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true; @@ -56,7 +56,7 @@ public class LangChain4jToolsComponentConfigurer extends PropertyConfigurerSuppo case "bridgeerrorhandler": case "bridgeErrorHandler": return boolean.class; case "chatmodel": - case "chatModel": return dev.langchain4j.model.chat.ChatLanguageModel.class; + case "chatModel": return dev.langchain4j.model.chat.ChatModel.class; case "configuration": return org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration.class; case "lazystartproducer": case "lazyStartProducer": return boolean.class; diff --git a/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsConfigurationConfigurer.java b/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsConfigurationConfigurer.java index 3fe5fae0cf7..d8c0a9ed1c8 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsConfigurationConfigurer.java +++ b/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsConfigurationConfigurer.java @@ -24,7 +24,7 @@ public class LangChain4jToolsConfigurationConfigurer extends org.apache.camel.su org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration target = (org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration) obj; switch (ignoreCase ? name.toLowerCase() : name) { case "chatmodel": - case "chatModel": target.setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatLanguageModel.class, value)); return true; + case "chatModel": target.setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatModel.class, value)); return true; default: return false; } } @@ -33,7 +33,7 @@ public class LangChain4jToolsConfigurationConfigurer extends org.apache.camel.su public Class<?> getOptionType(String name, boolean ignoreCase) { switch (ignoreCase ? name.toLowerCase() : name) { case "chatmodel": - case "chatModel": return dev.langchain4j.model.chat.ChatLanguageModel.class; + case "chatModel": return dev.langchain4j.model.chat.ChatModel.class; default: return null; } } diff --git a/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsEndpointConfigurer.java b/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsEndpointConfigurer.java index cc6582f51f2..2927bf3f20e 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsEndpointConfigurer.java +++ b/components/camel-ai/camel-langchain4j-tools/src/generated/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsEndpointConfigurer.java @@ -28,7 +28,7 @@ public class LangChain4jToolsEndpointConfigurer extends PropertyConfigurerSuppor case "cameltoolparameter": case "camelToolParameter": target.setCamelToolParameter(property(camelContext, org.apache.camel.component.langchain4j.tools.spec.CamelSimpleToolParameter.class, value)); return true; case "chatmodel": - case "chatModel": target.getConfiguration().setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatLanguageModel.class, value)); return true; + case "chatModel": target.getConfiguration().setChatModel(property(camelContext, dev.langchain4j.model.chat.ChatModel.class, value)); return true; case "description": target.setDescription(property(camelContext, java.lang.String.class, value)); return true; case "exceptionhandler": case "exceptionHandler": target.setExceptionHandler(property(camelContext, org.apache.camel.spi.ExceptionHandler.class, value)); return true; @@ -55,7 +55,7 @@ public class LangChain4jToolsEndpointConfigurer extends PropertyConfigurerSuppor case "cameltoolparameter": case "camelToolParameter": return org.apache.camel.component.langchain4j.tools.spec.CamelSimpleToolParameter.class; case "chatmodel": - case "chatModel": return dev.langchain4j.model.chat.ChatLanguageModel.class; + case "chatModel": return dev.langchain4j.model.chat.ChatModel.class; case "description": return java.lang.String.class; case "exceptionhandler": case "exceptionHandler": return org.apache.camel.spi.ExceptionHandler.class; diff --git a/components/camel-ai/camel-langchain4j-tools/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/tools/langchain4j-tools.json b/components/camel-ai/camel-langchain4j-tools/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/tools/langchain4j-tools.json index 634faab47b1..fd67b66e98b 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/tools/langchain4j-tools.json +++ b/components/camel-ai/camel-langchain4j-tools/src/generated/resources/META-INF/org/apache/camel/component/langchain4j/tools/langchain4j-tools.json @@ -28,7 +28,7 @@ "bridgeErrorHandler": { "index": 1, "kind": "property", "displayName": "Bridge Error Handler", "group": "consumer", "label": "consumer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the like [...] "lazyStartProducer": { "index": 2, "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail [...] "autowiredEnabled": { "index": 3, "kind": "property", "displayName": "Autowired Enabled", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching t [...] - "chatModel": { "index": 4, "kind": "property", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatLanguageModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration", "configurationField": "configuration", "description": "Chat Language Model of type dev.langch [...] + "chatModel": { "index": 4, "kind": "property", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration", "configurationField": "configuration", "description": "Chat Model of type dev.langchain4j.model.chat. [...] }, "properties": { "toolId": { "index": 0, "kind": "path", "displayName": "Tool Id", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tool name" }, @@ -40,6 +40,6 @@ "exceptionHandler": { "index": 6, "kind": "parameter", "displayName": "Exception Handler", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", "deprecated": false, "autowired": false, "secret": false, "description": "To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By def [...] "exchangePattern": { "index": 7, "kind": "parameter", "displayName": "Exchange Pattern", "group": "consumer (advanced)", "label": "consumer,advanced", "required": false, "type": "object", "javaType": "org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], "deprecated": false, "autowired": false, "secret": false, "description": "Sets the exchange pattern when the consumer creates an exchange." }, "lazyStartProducer": { "index": 8, "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a produc [...] - "chatModel": { "index": 9, "kind": "parameter", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatLanguageModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration", "configurationField": "configuration", "description": "Chat Language Model of type dev.langc [...] + "chatModel": { "index": 9, "kind": "parameter", "displayName": "Chat Model", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "dev.langchain4j.model.chat.ChatModel", "deprecated": false, "deprecationNote": "", "autowired": true, "secret": false, "configurationClass": "org.apache.camel.component.langchain4j.tools.LangChain4jToolsConfiguration", "configurationField": "configuration", "description": "Chat Model of type dev.langchain4j.model.chat [...] } } diff --git a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsConfiguration.java b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsConfiguration.java index 74f89f50871..a926be8be0a 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsConfiguration.java +++ b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsConfiguration.java @@ -16,7 +16,7 @@ */ package org.apache.camel.component.langchain4j.tools; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import org.apache.camel.RuntimeCamelException; import org.apache.camel.spi.Configurer; import org.apache.camel.spi.Metadata; @@ -29,21 +29,21 @@ public class LangChain4jToolsConfiguration implements Cloneable { @UriParam(label = "advanced") @Metadata(autowired = true) - private ChatLanguageModel chatModel; + private ChatModel chatModel; public LangChain4jToolsConfiguration() { } /** - * Chat Language Model of type dev.langchain4j.model.chat.ChatLanguageModel + * Chat Model of type dev.langchain4j.model.chat.ChatModel * * @return */ - public ChatLanguageModel getChatModel() { + public ChatModel getChatModel() { return chatModel; } - public void setChatModel(ChatLanguageModel chatModel) { + public void setChatModel(ChatModel chatModel) { this.chatModel = chatModel; } diff --git a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsEndpoint.java b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsEndpoint.java index 6403d963a92..cbdcb774be6 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsEndpoint.java +++ b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsEndpoint.java @@ -16,10 +16,16 @@ */ package org.apache.camel.component.langchain4j.tools; +import java.util.List; import java.util.Map; -import dev.langchain4j.agent.tool.JsonSchemaProperty; import dev.langchain4j.agent.tool.ToolSpecification; +import dev.langchain4j.model.chat.request.json.JsonBooleanSchema; +import dev.langchain4j.model.chat.request.json.JsonIntegerSchema; +import dev.langchain4j.model.chat.request.json.JsonNumberSchema; +import dev.langchain4j.model.chat.request.json.JsonObjectSchema; +import dev.langchain4j.model.chat.request.json.JsonSchemaElement; +import dev.langchain4j.model.chat.request.json.JsonStringSchema; import org.apache.camel.Category; import org.apache.camel.Consumer; import org.apache.camel.Processor; @@ -87,15 +93,28 @@ public class LangChain4jToolsEndpoint extends DefaultEndpoint { if (camelToolParameter != null) { toolSpecificationBuilder.description(camelToolParameter.getDescription()); - for (NamedJsonSchemaProperty namedJsonSchemaProperty : camelToolParameter.getProperties()) { - toolSpecificationBuilder.addParameter(namedJsonSchemaProperty.getName(), - namedJsonSchemaProperty.getProperties()); + JsonObjectSchema.Builder parametersBuilder = JsonObjectSchema.builder(); + + List<NamedJsonSchemaProperty> properties = camelToolParameter.getProperties(); + + for (NamedJsonSchemaProperty namedProperty : properties) { + parametersBuilder.addProperty( + namedProperty.getName(), + namedProperty.getProperties()); } + + toolSpecificationBuilder.parameters(parametersBuilder.build()); + } else if (description != null) { toolSpecificationBuilder.description(description); if (parameters != null) { - parameters.forEach((name, type) -> toolSpecificationBuilder.addParameter(name, JsonSchemaProperty.type(type))); + + JsonObjectSchema.Builder parametersBuilder = JsonObjectSchema.builder(); + + parameters.forEach((name, type) -> parametersBuilder.addProperty(name, createJsonSchema(type))); + + toolSpecificationBuilder.parameters(parametersBuilder.build()); } } else { // Consumer without toolParameter or description @@ -198,4 +217,21 @@ public class LangChain4jToolsEndpoint extends DefaultEndpoint { CamelToolExecutorCache.getInstance().getTools().clear(); } + + /** + * Creates a JsonScheùaElement based on a String type + * + * @param type + * @return + */ + private JsonSchemaElement createJsonSchema(String type) { + return switch (type.toLowerCase()) { + case "string" -> JsonStringSchema.builder().build(); + case "integer" -> JsonIntegerSchema.builder().build(); + case "number" -> JsonNumberSchema.builder().build(); + case "boolean" -> JsonBooleanSchema.builder().build(); + default -> JsonStringSchema.builder().build(); // fallback for unkown types + }; + } + } diff --git a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsProducer.java b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsProducer.java index 6a68d09b371..319b20441c9 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsProducer.java +++ b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolsProducer.java @@ -28,7 +28,9 @@ import dev.langchain4j.agent.tool.ToolSpecification; import dev.langchain4j.data.message.AiMessage; import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.data.message.ToolExecutionResultMessage; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; +import dev.langchain4j.model.chat.request.ChatRequest; +import dev.langchain4j.model.chat.response.ChatResponse; import dev.langchain4j.model.output.FinishReason; import dev.langchain4j.model.output.Response; import org.apache.camel.Exchange; @@ -45,7 +47,7 @@ public class LangChain4jToolsProducer extends DefaultProducer { private final LangChain4jToolsEndpoint endpoint; - private ChatLanguageModel chatLanguageModel; + private ChatModel chatModel; private final ObjectMapper objectMapper = new ObjectMapper(); @@ -70,8 +72,8 @@ public class LangChain4jToolsProducer extends DefaultProducer { @Override protected void doStart() throws Exception { super.doStart(); - this.chatLanguageModel = this.endpoint.getConfiguration().getChatModel(); - ObjectHelper.notNull(chatLanguageModel, "chatLanguageModel"); + this.chatModel = this.endpoint.getConfiguration().getChatModel(); + ObjectHelper.notNull(chatModel, "chatModel"); } private void populateResponse(String response, Exchange exchange) { @@ -178,7 +180,24 @@ public class LangChain4jToolsProducer extends DefaultProducer { * @return the response provided by the model */ private Response<AiMessage> chatWithLLM(List<ChatMessage> chatMessages, ToolPair toolPair, Exchange exchange) { - Response<AiMessage> response = this.chatLanguageModel.generate(chatMessages, toolPair.toolSpecifications()); + + ChatRequest.Builder requestBuilder = ChatRequest.builder() + .messages(chatMessages); + + // Add tools if available + if (toolPair != null && toolPair.toolSpecifications() != null) { + requestBuilder.toolSpecifications(toolPair.toolSpecifications()); + } + + // build request + ChatRequest chatRequest = requestBuilder.build(); + + // generate response + ChatResponse chatResponse = this.chatModel.chat(chatRequest); + + // Convert ChatResponse to Response<AiMessage> for compatibility + AiMessage aiMessage = chatResponse.aiMessage(); + Response<AiMessage> response = Response.from(aiMessage); if (!response.content().hasToolExecutionRequests()) { exchange.getMessage().setHeader(LangChain4jTools.NO_TOOLS_CALLED_HEADER, Boolean.TRUE); diff --git a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/spec/NamedJsonSchemaProperty.java b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/spec/NamedJsonSchemaProperty.java index c1b160d1d17..16b1d6ec3ec 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/spec/NamedJsonSchemaProperty.java +++ b/components/camel-ai/camel-langchain4j-tools/src/main/java/org/apache/camel/component/langchain4j/tools/spec/NamedJsonSchemaProperty.java @@ -16,16 +16,14 @@ */ package org.apache.camel.component.langchain4j.tools.spec; -import java.util.List; - -import dev.langchain4j.agent.tool.JsonSchemaProperty; +import dev.langchain4j.model.chat.request.json.JsonSchemaElement; public class NamedJsonSchemaProperty { private final String name; - private final List<JsonSchemaProperty> properties; + private final JsonSchemaElement properties; - public NamedJsonSchemaProperty(String name, List<JsonSchemaProperty> properties) { + public NamedJsonSchemaProperty(String name, JsonSchemaElement properties) { this.name = name; this.properties = properties; } @@ -34,7 +32,7 @@ public class NamedJsonSchemaProperty { return name; } - public List<JsonSchemaProperty> getProperties() { + public JsonSchemaElement getProperties() { return properties; } } diff --git a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolIT.java b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolIT.java index e2187d5be09..94c07a5b8a1 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolIT.java +++ b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolIT.java @@ -22,7 +22,7 @@ import java.util.List; import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.openai.OpenAiChatModel; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; @@ -42,7 +42,7 @@ public class LangChain4jToolIT extends CamelTestSupport { public static final String MODEL_NAME = "llama3.1:latest"; private final String nameFromDB = "pippo"; - private ChatLanguageModel chatLanguageModel; + private ChatModel chatModel; @RegisterExtension static OllamaService OLLAMA = OllamaServiceFactory.createServiceWithConfiguration(() -> MODEL_NAME); @@ -51,7 +51,7 @@ public class LangChain4jToolIT extends CamelTestSupport { protected void setupResources() throws Exception { super.setupResources(); - chatLanguageModel = createModel(); + chatModel = createModel(); } @Override @@ -61,13 +61,13 @@ public class LangChain4jToolIT extends CamelTestSupport { LangChain4jToolsComponent component = context.getComponent(LangChain4jTools.SCHEME, LangChain4jToolsComponent.class); - component.getConfiguration().setChatModel(chatLanguageModel); + component.getConfiguration().setChatModel(chatModel); return context; } - protected ChatLanguageModel createModel() { - chatLanguageModel = OpenAiChatModel.builder() + protected ChatModel createModel() { + chatModel = OpenAiChatModel.builder() .apiKey("NO_API_KEY") .modelName(MODEL_NAME) .baseUrl(OLLAMA.getEndpoint()) @@ -77,7 +77,7 @@ public class LangChain4jToolIT extends CamelTestSupport { .logResponses(true) .build(); - return chatLanguageModel; + return chatModel; } @Override diff --git a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleCallsIT.java b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleCallsIT.java index 3873976e79a..6120e5bbf39 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleCallsIT.java +++ b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleCallsIT.java @@ -22,7 +22,7 @@ import java.util.List; import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.openai.OpenAiChatModel; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; @@ -41,7 +41,7 @@ import static java.time.Duration.ofSeconds; public class LangChain4jToolMultipleCallsIT extends CamelTestSupport { public static final String MODEL_NAME = "llama3.1:latest"; - private ChatLanguageModel chatLanguageModel; + private ChatModel chatModel; @RegisterExtension static OllamaService OLLAMA = OllamaServiceFactory.createServiceWithConfiguration(() -> MODEL_NAME); @@ -53,7 +53,7 @@ public class LangChain4jToolMultipleCallsIT extends CamelTestSupport { protected void setupResources() throws Exception { super.setupResources(); - chatLanguageModel = createModel(); + chatModel = createModel(); } @Override @@ -63,13 +63,13 @@ public class LangChain4jToolMultipleCallsIT extends CamelTestSupport { LangChain4jToolsComponent component = context.getComponent(LangChain4jTools.SCHEME, LangChain4jToolsComponent.class); - component.getConfiguration().setChatModel(chatLanguageModel); + component.getConfiguration().setChatModel(chatModel); return context; } - protected ChatLanguageModel createModel() { - chatLanguageModel = OpenAiChatModel.builder() + protected ChatModel createModel() { + chatModel = OpenAiChatModel.builder() .apiKey("NO_API_KEY") .modelName(MODEL_NAME) .baseUrl(OLLAMA.getEndpoint()) @@ -79,7 +79,7 @@ public class LangChain4jToolMultipleCallsIT extends CamelTestSupport { .logResponses(true) .build(); - return chatLanguageModel; + return chatModel; } @Override @@ -146,7 +146,8 @@ public class LangChain4jToolMultipleCallsIT extends CamelTestSupport { Assertions.assertThat(message).isNotNull(); final String responseContent = message.getMessage().getBody().toString(); - Assertions.assertThat(responseContent).containsIgnoringCase("The weather in London"); + // depending on the reasoning model used to test, the result is different, but we asked for Celcius degree and 3 should be part of it + Assertions.assertThat(responseContent).containsIgnoringCase("3"); Assertions.assertThat(intermediateCalled).isTrue(); Assertions.assertThat(intermediateHasValidBody).isTrue(); } diff --git a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleGroupsIT.java b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleGroupsIT.java index 783c98a3fc7..a1798ab7ed3 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleGroupsIT.java +++ b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleGroupsIT.java @@ -22,7 +22,7 @@ import java.util.List; import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.openai.OpenAiChatModel; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; @@ -42,7 +42,7 @@ public class LangChain4jToolMultipleGroupsIT extends CamelTestSupport { public static final String MODEL_NAME = "llama3.1:latest"; private final String nameFromDB = "pippo"; - private ChatLanguageModel chatLanguageModel; + private ChatModel chatModel; @RegisterExtension static OllamaService OLLAMA = OllamaServiceFactory.createServiceWithConfiguration(() -> MODEL_NAME); @@ -51,7 +51,7 @@ public class LangChain4jToolMultipleGroupsIT extends CamelTestSupport { protected void setupResources() throws Exception { super.setupResources(); - chatLanguageModel = createModel(); + chatModel = createModel(); } @Override @@ -61,13 +61,13 @@ public class LangChain4jToolMultipleGroupsIT extends CamelTestSupport { LangChain4jToolsComponent component = context.getComponent(LangChain4jTools.SCHEME, LangChain4jToolsComponent.class); - component.getConfiguration().setChatModel(chatLanguageModel); + component.getConfiguration().setChatModel(chatModel); return context; } - protected ChatLanguageModel createModel() { - chatLanguageModel = OpenAiChatModel.builder() + protected ChatModel createModel() { + chatModel = OpenAiChatModel.builder() .apiKey("NO_API_KEY") .modelName(MODEL_NAME) .baseUrl(OLLAMA.getEndpoint()) @@ -77,7 +77,7 @@ public class LangChain4jToolMultipleGroupsIT extends CamelTestSupport { .logResponses(true) .build(); - return chatLanguageModel; + return chatModel; } @Override diff --git a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleMatchingGroupsIT.java b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleMatchingGroupsIT.java index cc6ab1c5397..3ab078aa20c 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleMatchingGroupsIT.java +++ b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolMultipleMatchingGroupsIT.java @@ -22,7 +22,7 @@ import java.util.List; import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.openai.OpenAiChatModel; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; @@ -42,7 +42,7 @@ public class LangChain4jToolMultipleMatchingGroupsIT extends CamelTestSupport { public static final String MODEL_NAME = "llama3.1:latest"; private final String nameFromDB = "Paul McFly"; - private ChatLanguageModel chatLanguageModel; + private ChatModel chatModel; @RegisterExtension static OllamaService OLLAMA = OllamaServiceFactory.createServiceWithConfiguration(() -> MODEL_NAME); @@ -51,7 +51,7 @@ public class LangChain4jToolMultipleMatchingGroupsIT extends CamelTestSupport { protected void setupResources() throws Exception { super.setupResources(); - chatLanguageModel = createModel(); + chatModel = createModel(); } @Override @@ -61,13 +61,13 @@ public class LangChain4jToolMultipleMatchingGroupsIT extends CamelTestSupport { LangChain4jToolsComponent component = context.getComponent(LangChain4jTools.SCHEME, LangChain4jToolsComponent.class); - component.getConfiguration().setChatModel(chatLanguageModel); + component.getConfiguration().setChatModel(chatModel); return context; } - protected ChatLanguageModel createModel() { - chatLanguageModel = OpenAiChatModel.builder() + protected ChatModel createModel() { + chatModel = OpenAiChatModel.builder() .apiKey("NO_API_KEY") .modelName(MODEL_NAME) .baseUrl(OLLAMA.getEndpoint()) @@ -77,7 +77,7 @@ public class LangChain4jToolMultipleMatchingGroupsIT extends CamelTestSupport { .logResponses(true) .build(); - return chatLanguageModel; + return chatModel; } @Override diff --git a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsExistIT.java b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsExistIT.java index d4bcd4e0728..04963354f7c 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsExistIT.java +++ b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsExistIT.java @@ -22,7 +22,7 @@ import java.util.List; import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.openai.OpenAiChatModel; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; @@ -41,7 +41,7 @@ import static java.time.Duration.ofSeconds; public class LangChain4jToolNoToolsExistIT extends CamelTestSupport { public static final String MODEL_NAME = "llama3.1:latest"; - private ChatLanguageModel chatLanguageModel; + private ChatModel chatModel; @RegisterExtension static OllamaService OLLAMA = OllamaServiceFactory.createServiceWithConfiguration(() -> MODEL_NAME); @@ -50,7 +50,7 @@ public class LangChain4jToolNoToolsExistIT extends CamelTestSupport { protected void setupResources() throws Exception { super.setupResources(); - chatLanguageModel = createModel(); + chatModel = createModel(); } @Override @@ -60,13 +60,13 @@ public class LangChain4jToolNoToolsExistIT extends CamelTestSupport { LangChain4jToolsComponent component = context.getComponent(LangChain4jTools.SCHEME, LangChain4jToolsComponent.class); - component.getConfiguration().setChatModel(chatLanguageModel); + component.getConfiguration().setChatModel(chatModel); return context; } - protected ChatLanguageModel createModel() { - chatLanguageModel = OpenAiChatModel.builder() + protected ChatModel createModel() { + chatModel = OpenAiChatModel.builder() .apiKey("NO_API_KEY") .modelName(MODEL_NAME) .baseUrl(OLLAMA.getEndpoint()) @@ -76,7 +76,7 @@ public class LangChain4jToolNoToolsExistIT extends CamelTestSupport { .logResponses(Boolean.TRUE) .build(); - return chatLanguageModel; + return chatModel; } @Override diff --git a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsToBeCalledIT.java b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsToBeCalledIT.java index 663ceff94ab..5a16c2c50ec 100644 --- a/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsToBeCalledIT.java +++ b/components/camel-ai/camel-langchain4j-tools/src/test/java/org/apache/camel/component/langchain4j/tools/LangChain4jToolNoToolsToBeCalledIT.java @@ -22,7 +22,7 @@ import java.util.List; import dev.langchain4j.data.message.ChatMessage; import dev.langchain4j.data.message.SystemMessage; import dev.langchain4j.data.message.UserMessage; -import dev.langchain4j.model.chat.ChatLanguageModel; +import dev.langchain4j.model.chat.ChatModel; import dev.langchain4j.model.openai.OpenAiChatModel; import org.apache.camel.CamelContext; import org.apache.camel.Exchange; @@ -41,7 +41,7 @@ import static java.time.Duration.ofSeconds; public class LangChain4jToolNoToolsToBeCalledIT extends CamelTestSupport { public static final String MODEL_NAME = "llama3.1:latest"; - private ChatLanguageModel chatLanguageModel; + private ChatModel chatModel; @RegisterExtension static OllamaService OLLAMA = OllamaServiceFactory.createServiceWithConfiguration(() -> MODEL_NAME); @@ -50,7 +50,7 @@ public class LangChain4jToolNoToolsToBeCalledIT extends CamelTestSupport { protected void setupResources() throws Exception { super.setupResources(); - chatLanguageModel = createModel(); + chatModel = createModel(); } @Override @@ -60,13 +60,13 @@ public class LangChain4jToolNoToolsToBeCalledIT extends CamelTestSupport { LangChain4jToolsComponent component = context.getComponent(LangChain4jTools.SCHEME, LangChain4jToolsComponent.class); - component.getConfiguration().setChatModel(chatLanguageModel); + component.getConfiguration().setChatModel(chatModel); return context; } - protected ChatLanguageModel createModel() { - chatLanguageModel = OpenAiChatModel.builder() + protected ChatModel createModel() { + chatModel = OpenAiChatModel.builder() .apiKey("NO_API_KEY") .modelName(MODEL_NAME) .baseUrl(OLLAMA.getEndpoint()) @@ -76,7 +76,7 @@ public class LangChain4jToolNoToolsToBeCalledIT extends CamelTestSupport { .logResponses(Boolean.TRUE) .build(); - return chatLanguageModel; + return chatModel; } @Override diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jChatComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jChatComponentBuilderFactory.java index d4f96d4e454..c295fddc3c0 100644 --- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jChatComponentBuilderFactory.java +++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jChatComponentBuilderFactory.java @@ -162,19 +162,17 @@ public interface Langchain4jChatComponentBuilderFactory { } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * * The option is a: - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> - * type. + * <code>dev.langchain4j.model.chat.ChatModel</code> type. * * Group: advanced * * @param chatModel the value to set * @return the dsl builder */ - default Langchain4jChatComponentBuilder chatModel(dev.langchain4j.model.chat.ChatLanguageModel chatModel) { + default Langchain4jChatComponentBuilder chatModel(dev.langchain4j.model.chat.ChatModel chatModel) { doSetProperty("chatModel", chatModel); return this; } @@ -204,7 +202,7 @@ public interface Langchain4jChatComponentBuilderFactory { case "bridgeErrorHandler": ((LangChain4jChatComponent) component).setBridgeErrorHandler((boolean) value); return true; case "lazyStartProducer": ((LangChain4jChatComponent) component).setLazyStartProducer((boolean) value); return true; case "autowiredEnabled": ((LangChain4jChatComponent) component).setAutowiredEnabled((boolean) value); return true; - case "chatModel": getOrCreateConfiguration((LangChain4jChatComponent) component).setChatModel((dev.langchain4j.model.chat.ChatLanguageModel) value); return true; + case "chatModel": getOrCreateConfiguration((LangChain4jChatComponent) component).setChatModel((dev.langchain4j.model.chat.ChatModel) value); return true; default: return false; } } diff --git a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jToolsComponentBuilderFactory.java b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jToolsComponentBuilderFactory.java index a21e53cd7a7..0b42a3d7fe4 100644 --- a/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jToolsComponentBuilderFactory.java +++ b/dsl/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Langchain4jToolsComponentBuilderFactory.java @@ -142,19 +142,17 @@ public interface Langchain4jToolsComponentBuilderFactory { } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * * The option is a: - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> - * type. + * <code>dev.langchain4j.model.chat.ChatModel</code> type. * * Group: advanced * * @param chatModel the value to set * @return the dsl builder */ - default Langchain4jToolsComponentBuilder chatModel(dev.langchain4j.model.chat.ChatLanguageModel chatModel) { + default Langchain4jToolsComponentBuilder chatModel(dev.langchain4j.model.chat.ChatModel chatModel) { doSetProperty("chatModel", chatModel); return this; } @@ -183,7 +181,7 @@ public interface Langchain4jToolsComponentBuilderFactory { case "bridgeErrorHandler": ((LangChain4jToolsComponent) component).setBridgeErrorHandler((boolean) value); return true; case "lazyStartProducer": ((LangChain4jToolsComponent) component).setLazyStartProducer((boolean) value); return true; case "autowiredEnabled": ((LangChain4jToolsComponent) component).setAutowiredEnabled((boolean) value); return true; - case "chatModel": getOrCreateConfiguration((LangChain4jToolsComponent) component).setChatModel((dev.langchain4j.model.chat.ChatLanguageModel) value); return true; + case "chatModel": getOrCreateConfiguration((LangChain4jToolsComponent) component).setChatModel((dev.langchain4j.model.chat.ChatModel) value); return true; default: return false; } } diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jChatEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jChatEndpointBuilderFactory.java index a7d7e5d2bd4..eee753b8dea 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jChatEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jChatEndpointBuilderFactory.java @@ -210,27 +210,25 @@ public interface LangChain4jChatEndpointBuilderFactory { return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * - * The option is a: - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * The option is a: <code>dev.langchain4j.model.chat.ChatModel</code> + * type. * * Group: advanced * * @param chatModel the value to set * @return the dsl builder */ - default AdvancedLangChain4jChatEndpointConsumerBuilder chatModel(dev.langchain4j.model.chat.ChatLanguageModel chatModel) { + default AdvancedLangChain4jChatEndpointConsumerBuilder chatModel(dev.langchain4j.model.chat.ChatModel chatModel) { doSetProperty("chatModel", chatModel); return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * * The option will be converted to a - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * <code>dev.langchain4j.model.chat.ChatModel</code> type. * * Group: advanced * @@ -348,27 +346,25 @@ public interface LangChain4jChatEndpointBuilderFactory { return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * - * The option is a: - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * The option is a: <code>dev.langchain4j.model.chat.ChatModel</code> + * type. * * Group: advanced * * @param chatModel the value to set * @return the dsl builder */ - default AdvancedLangChain4jChatEndpointProducerBuilder chatModel(dev.langchain4j.model.chat.ChatLanguageModel chatModel) { + default AdvancedLangChain4jChatEndpointProducerBuilder chatModel(dev.langchain4j.model.chat.ChatModel chatModel) { doSetProperty("chatModel", chatModel); return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * * The option will be converted to a - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * <code>dev.langchain4j.model.chat.ChatModel</code> type. * * Group: advanced * @@ -444,27 +440,25 @@ public interface LangChain4jChatEndpointBuilderFactory { } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * - * The option is a: - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * The option is a: <code>dev.langchain4j.model.chat.ChatModel</code> + * type. * * Group: advanced * * @param chatModel the value to set * @return the dsl builder */ - default AdvancedLangChain4jChatEndpointBuilder chatModel(dev.langchain4j.model.chat.ChatLanguageModel chatModel) { + default AdvancedLangChain4jChatEndpointBuilder chatModel(dev.langchain4j.model.chat.ChatModel chatModel) { doSetProperty("chatModel", chatModel); return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * * The option will be converted to a - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * <code>dev.langchain4j.model.chat.ChatModel</code> type. * * Group: advanced * diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jToolsEndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jToolsEndpointBuilderFactory.java index 94a93491079..386a572b434 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jToolsEndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/LangChain4jToolsEndpointBuilderFactory.java @@ -272,27 +272,25 @@ public interface LangChain4jToolsEndpointBuilderFactory { return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * - * The option is a: - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * The option is a: <code>dev.langchain4j.model.chat.ChatModel</code> + * type. * * Group: advanced * * @param chatModel the value to set * @return the dsl builder */ - default AdvancedLangChain4jToolsEndpointConsumerBuilder chatModel(dev.langchain4j.model.chat.ChatLanguageModel chatModel) { + default AdvancedLangChain4jToolsEndpointConsumerBuilder chatModel(dev.langchain4j.model.chat.ChatModel chatModel) { doSetProperty("chatModel", chatModel); return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * * The option will be converted to a - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * <code>dev.langchain4j.model.chat.ChatModel</code> type. * * Group: advanced * @@ -387,27 +385,25 @@ public interface LangChain4jToolsEndpointBuilderFactory { return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * - * The option is a: - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * The option is a: <code>dev.langchain4j.model.chat.ChatModel</code> + * type. * * Group: advanced * * @param chatModel the value to set * @return the dsl builder */ - default AdvancedLangChain4jToolsEndpointProducerBuilder chatModel(dev.langchain4j.model.chat.ChatLanguageModel chatModel) { + default AdvancedLangChain4jToolsEndpointProducerBuilder chatModel(dev.langchain4j.model.chat.ChatModel chatModel) { doSetProperty("chatModel", chatModel); return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * * The option will be converted to a - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * <code>dev.langchain4j.model.chat.ChatModel</code> type. * * Group: advanced * @@ -460,27 +456,25 @@ public interface LangChain4jToolsEndpointBuilderFactory { } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * - * The option is a: - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * The option is a: <code>dev.langchain4j.model.chat.ChatModel</code> + * type. * * Group: advanced * * @param chatModel the value to set * @return the dsl builder */ - default AdvancedLangChain4jToolsEndpointBuilder chatModel(dev.langchain4j.model.chat.ChatLanguageModel chatModel) { + default AdvancedLangChain4jToolsEndpointBuilder chatModel(dev.langchain4j.model.chat.ChatModel chatModel) { doSetProperty("chatModel", chatModel); return this; } /** - * Chat Language Model of type - * dev.langchain4j.model.chat.ChatLanguageModel. + * Chat Model of type dev.langchain4j.model.chat.ChatModel. * * The option will be converted to a - * <code>dev.langchain4j.model.chat.ChatLanguageModel</code> type. + * <code>dev.langchain4j.model.chat.ChatModel</code> type. * * Group: advanced *