Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions camelBase/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,11 @@
<groupId>org.apache.camel</groupId>
<artifactId>camel-jq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-langchain4j-chat</artifactId>
</dependency>

<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-language</artifactId>
Expand Down
12 changes: 12 additions & 0 deletions commonBase/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,18 @@
</exclusions>
</dependency>

<!-- AI dependencies -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>${langchain4j.version}</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-google-ai-gemini</artifactId>
<version>${langchain4j-google-ai-gemini.version}</version>
</dependency>

</dependencies>

</project>
15 changes: 15 additions & 0 deletions dil/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,21 @@
<version>${activemq-classic.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-core</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-google-ai-gemini</artifactId>
<version>1.10.0</version>
</dependency>

</dependencies>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ private void startConnection() throws Exception{
case "rabbitmq", "spring-rabbitmq" ->
new RabbitMQConnection(context, decryptedProperties, connectionId, "spring-rabbitmq").start();

case "langchain4j" ->
new LangChain4jConnection(context, decryptedProperties, connectionId).start();

case "ibmq" ->
new IBMMQConnection(context, decryptedProperties, connectionId, connectionType).start();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package org.assimbly.dil.blocks.connections.broker;

import org.apache.camel.CamelContext;
import org.jasypt.properties.EncryptableProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.googleai.GoogleAiGeminiChatModel;
import java.time.Duration;

public class LangChain4jConnection {

protected Logger log = LoggerFactory.getLogger(getClass());

private final CamelContext context;
private final EncryptableProperties properties;
private final String connectionId;

private String apiKey;
private String modelName;
private String timeout;

public LangChain4jConnection(CamelContext context, EncryptableProperties properties, String connectionId) {
this.context = context;
this.properties = properties;
this.connectionId = connectionId;
}

public void start() {
setFields();

if (checkConnection()) {
log.info("Creating new LangChain4j GoogleAiGeminiChatModel connection with id={}", connectionId);
setConnection();
} else {
log.info("Reuse LangChain4j GoogleAiGeminiChatModel connection with id={}", connectionId);
}
}

private void setFields() {
apiKey = properties.getProperty("connection." + connectionId + ".apikey");
modelName = properties.getProperty("connection." + connectionId + ".modelname");
timeout = properties.getProperty("connection." + connectionId + ".timeout");
}

private boolean checkConnection() {
Object isRegistered = context.getRegistry().lookupByName(connectionId);
if (isRegistered != null) {
return false;
}

if (apiKey == null || apiKey.isEmpty()) {
throw new IllegalArgumentException("LangChain4j connection parameters are invalid. apikey is required");
}

return true;
}

private void setConnection() {
log.info("Setting up LangChain4j GoogleAiGeminiChatModel connection. API Key length: {}, prefix: {}",
apiKey != null ? apiKey.length() : 0,
apiKey != null && apiKey.length() >= 5 ? apiKey.substring(0, 5) : "N/A");

String resolvedModel = (modelName != null && !modelName.isEmpty()) ? modelName : "gemini-3-flash-preview";
long resolvedTimeout = 10;
if (timeout != null && !timeout.isEmpty()) {
try {
resolvedTimeout = Long.parseLong(timeout);
} catch (NumberFormatException e) {
log.warn("Invalid timeout value '{}', using default 10s", timeout);
}
}

ChatModel chatModel = GoogleAiGeminiChatModel.builder()
.apiKey(apiKey)
.modelName(resolvedModel)
.timeout(Duration.ofSeconds(resolvedTimeout))
.build();

context.getRegistry().bind(connectionId, chatModel);
log.info("Successfully bound LangChain4j ChatModel bean with id={} to the Camel registry", connectionId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
apiVersion: "camel.apache.org/v1"
kind: "Kamelet"
metadata:
name: "langchain4j-chat-action"
labels:
camel.apache.org/kamelet.type: "action"
spec:
definition:
title: "langchain4j-chat action"
description: "chat component for langchain4j"
type: "object"
properties:
path:
title: "Path"
description: "Path"
type: "string"
in:
title: "Source Endpoint"
type: "string"
default: "kamelet:source"
out:
title: "Sink Endpoint"
type: "string"
default: "kamelet:sink"
routeId:
title: "Route ID"
type: "string"
routeConfigurationId:
title: "Route Configuration ID"
type: "string"
default: "0"
chatModel:
title: "Chat Model Bean Name"
type: "string"
default: "#geminiChatModel"
dependencies:
- "camel:kamelet"
template:
route:
routeConfigurationId: "{{routeConfigurationId}}"
from:
uri: "{{in}}"
steps:
- step:
id: "{{routeId}}"
steps:
- convertBodyTo:
type: String
- to:
uri: "langchain4j-chat://{{routeId}}?chatModel={{chatModel}}"
- to:
uri: "{{out}}"
2 changes: 2 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@
<jackson.version>3.1.2</jackson.version>
<jakarta-activation-api.version>2.1.4</jakarta-activation-api.version>
<jakarta-annotation-api.version>3.0.0</jakarta-annotation-api.version>
<langchain4j.version>0.36.2</langchain4j.version>
<langchain4j-google-ai-gemini.version>1.10.0</langchain4j-google-ai-gemini.version>
<jakarta-json-api.version>2.1.3</jakarta-json-api.version>
<jakarta-servlet-api.version>6.1.0</jakarta-servlet-api.version>
<jakarta-xml-soap-api.version>3.0.2</jakarta-xml-soap-api.version>
Expand Down