diff --git a/camelBase/pom.xml b/camelBase/pom.xml
index f08d6eb2..72b89160 100644
--- a/camelBase/pom.xml
+++ b/camelBase/pom.xml
@@ -271,7 +271,23 @@
org.apache.camel
- camel-log
+ camel-langchain4j-agent
+
+
+ org.apache.camel
+ camel-ai-tool
+
+
+ org.apache.camel
+ camel-langchain4j-tools
+
+
+ org.apache.camel
+ camel-langchain4j-web-search
+
+
+ org.apache.camel
+ camel-mustache
org.apache.camel
diff --git a/commonBase/pom.xml b/commonBase/pom.xml
index a0938ffe..686062ac 100644
--- a/commonBase/pom.xml
+++ b/commonBase/pom.xml
@@ -307,7 +307,11 @@
langchain4j-google-ai-gemini
${langchain4j.version}
-
+
+ dev.langchain4j
+ langchain4j-web-search-engine-tavily
+ ${langchain4j-tavily.version}
+
org.springframework.ai
diff --git a/dil/src/main/java/org/assimbly/dil/blocks/connections/Connection.java b/dil/src/main/java/org/assimbly/dil/blocks/connections/Connection.java
index 2b44c831..9c5eccb2 100644
--- a/dil/src/main/java/org/assimbly/dil/blocks/connections/Connection.java
+++ b/dil/src/main/java/org/assimbly/dil/blocks/connections/Connection.java
@@ -2,6 +2,7 @@
import org.assimbly.dil.blocks.connections.ai.LangChain4jAgentConnection;
import org.assimbly.dil.blocks.connections.ai.LangChain4jConnection;
+import org.assimbly.dil.blocks.connections.ai.LangChain4jWebSearchConnection;
import org.assimbly.dil.blocks.connections.ai.SpringAiConnection;
import org.assimbly.dil.blocks.connections.auth.BasicAuthentication;
import org.assimbly.dil.blocks.connections.auth.MutualSSL;
@@ -73,10 +74,10 @@ private void startConnection() throws Exception{
case "rabbitmq", "spring-rabbitmq" ->
new RabbitMQConnection(context, decryptedProperties, connectionId, "spring-rabbitmq").start();
- case "springai" ->
+ case "springaichat" ->
new SpringAiConnection(context, decryptedProperties, connectionId).start();
- case "langchain4j" ->
+ case "langchain4jchat" ->
new LangChain4jConnection(context, decryptedProperties, connectionId).start();
case "ibmq" ->
@@ -94,9 +95,12 @@ private void startConnection() throws Exception{
case "imaps" ->
log.debug("Imaps connection will be configured on the component");
- case "langchain4j-agent" ->
+ case "langchain4jagent" ->
new LangChain4jAgentConnection(context, decryptedProperties, connectionId).start();
+ case "langchain4j-web-search" ->
+ new LangChain4jWebSearchConnection(context, decryptedProperties, connectionId).start();
+
default -> throw new IllegalArgumentException("Connection parameters for connection " + connectionType + " are not implemented");
}
diff --git a/dil/src/main/java/org/assimbly/dil/blocks/connections/ai/LangChain4jAgentConnection.java b/dil/src/main/java/org/assimbly/dil/blocks/connections/ai/LangChain4jAgentConnection.java
index 22294316..0e499c43 100644
--- a/dil/src/main/java/org/assimbly/dil/blocks/connections/ai/LangChain4jAgentConnection.java
+++ b/dil/src/main/java/org/assimbly/dil/blocks/connections/ai/LangChain4jAgentConnection.java
@@ -12,7 +12,11 @@
import dev.langchain4j.memory.chat.ChatMemoryProvider;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.store.memory.chat.InMemoryChatMemoryStore;
+import dev.langchain4j.web.search.WebSearchEngine;
+import dev.langchain4j.web.search.WebSearchTool;
+import dev.langchain4j.web.search.tavily.TavilyWebSearchEngine;
import java.time.Duration;
+import java.util.List;
public class LangChain4jAgentConnection {
@@ -25,6 +29,8 @@ public class LangChain4jAgentConnection {
private String apiKey;
private String modelName;
private String timeout;
+ private String webSearchApiKey;
+ private String maxMessages;
public LangChain4jAgentConnection(CamelContext context, EncryptableProperties properties, String connectionId) {
this.context = context;
@@ -47,6 +53,11 @@ private void setFields() {
apiKey = properties.getProperty("connection." + connectionId + ".apikey");
modelName = properties.getProperty("connection." + connectionId + ".modelname");
timeout = properties.getProperty("connection." + connectionId + ".timeout");
+ webSearchApiKey = properties.getProperty("connection." + connectionId + ".websearchapikey");
+ if (webSearchApiKey == null || webSearchApiKey.isEmpty()) {
+ webSearchApiKey = properties.getProperty("connection." + connectionId + ".tavilyapikey");
+ }
+ maxMessages = properties.getProperty("connection." + connectionId + ".maxmessages");
}
private boolean checkConnection() {
@@ -67,7 +78,7 @@ private void setConnection() {
apiKey != null ? apiKey.length() : 0,
apiKey != null && apiKey.length() >= 5 ? apiKey.substring(0, 5) : "N/A");
- String resolvedModel = (modelName != null && !modelName.isEmpty()) ? modelName : "gemini-2.5-flash";
+ String resolvedModel = (modelName != null && !modelName.isEmpty()) ? modelName : "gemini-3.6-flash";
long resolvedTimeout = 10;
if (timeout != null && !timeout.isEmpty()) {
try {
@@ -77,23 +88,58 @@ private void setConnection() {
}
}
+ int resolvedMaxMessages = 100;
+ if (maxMessages != null && !maxMessages.isEmpty()) {
+ try {
+ resolvedMaxMessages = Integer.parseInt(maxMessages);
+ } catch (NumberFormatException e) {
+ log.warn("Invalid maxMessages value '{}', using default 100", maxMessages);
+ }
+ }
+
ChatModel chatModel = GoogleAiGeminiChatModel.builder()
.apiKey(apiKey)
.modelName(resolvedModel)
.timeout(Duration.ofSeconds(resolvedTimeout))
+ .returnThinking(true)
+ .sendThinking(true)
.build();
+ final int finalMaxMessages = resolvedMaxMessages;
InMemoryChatMemoryStore chatMemoryStore = new InMemoryChatMemoryStore();
- ChatMemoryProvider chatMemoryProvider = memoryId -> MessageWindowChatMemory.builder()
- .id(memoryId)
- .maxMessages(100)
- .chatMemoryStore(chatMemoryStore)
- .build();
+ java.util.Map