langChain4j

JVM since3.16.0 Native since3.16.0

LangChain4j high level api usage with Camel Quarkus

Maven coordinates

Or add the coordinates to your existing project:

<dependency>
    <groupId>org.apache.camel.quarkus</groupId>
    <artifactId>camel-quarkus-langchain4j</artifactId>
</dependency>

Check the User guide for more information about writing Camel Quarkus applications.

Ensure Quarkus LangChain4j dependencies version alignment with the Bom

In order to ensure alignment across all Quarkus and LangChain4j related dependencies, it is recommended to import the Quarkus LangChain4j bom as below:

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.quarkiverse.langchain4j</groupId>
      <artifactId>quarkus-langchain4j-bom</artifactId>
      <version>${insert your version here}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
  ...
</dependencyManagement>

Note that the import order is paramount when using maven dependencyManagement. As such, one might need to import the quarkus-langchain4j-bom before other related Camel and Quarkus boms.

Additional Camel Quarkus configuration

Using camel annotations from LangChain4j AI service method parameters

The camel-quarkus-langchain4j extension make it possible to use camel parameter binding annotations with LangChain4j AI services.

Let’s see an example below:

@RegisterAiService
@ApplicationScoped
public interface CustomAiService {

    @UserMessage("An LLM prompt that can use the method parameter {myHeaderInjectedIntoPrompt}.")
    @Handler
    String invokeLlm(@Header("myHeaderName") String myHeaderInjectedIntoPrompt);
}

You can find more details about Camel Parameter Binding annotations in the manual.

Resolving AI services by interface

With the camel-quarkus-langchain4j extension, the AI services are resolvable by interface when called from a bean statement.

For instance, let’s define an AI service below:

@RegisterAiService
@ApplicationScoped
public interface MyAiService {

    @UserMessage("My Prompt")
    @Handler
    String chat(String question);
}

The AI service could then be invoked from a Camel route like this:

@Override
public void configure() {
  from("...")
    .bean(MyAiService.class);
}