Quarkus extension deployment module for integrating Ollama LLM models with Quarkus applications through the LangChain4j framework
The Quarkus LangChain4j Ollama Deployment module is a build-time extension that enables seamless integration of Ollama LLM models with Quarkus applications through the LangChain4j framework. This deployment module performs build-time processing to configure Ollama-based chat models, embedding models, and streaming chat models, with automatic DevServices provisioning for development environments.
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-ollama-deployment</artifactId>
<version>1.7.4</version>
</dependency>This is a Quarkus deployment module that operates during the build phase of Quarkus applications. It does not provide runtime APIs for end-user applications. Instead, it:
The deployment module works in conjunction with its runtime counterpart (quarkus-langchain4j-ollama) to provide a complete solution for developers building AI-powered applications with Ollama.
As a Quarkus extension deployment module, this package is used by the Quarkus Maven/Gradle plugins during the application build process. It participates in the Quarkus build chain through annotated build step methods that:
Important: While this is a deployment module that operates at build time, end users primarily interact with it through runtime configuration properties and CDI bean injection. The deployment module creates beans that are configured at runtime via application.properties.
Application code typically imports LangChain4j model interfaces and Quarkus CDI annotations:
// LangChain4j model interfaces
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
// CDI injection
import jakarta.inject.Inject;
// Named configuration qualifier (for multiple Ollama instances)
import io.quarkiverse.langchain4j.ModelName;For advanced use cases, you may also import:
// Chat model listeners for observability
import io.quarkiverse.langchain4j.ChatModelListener;
// Message types
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.data.message.SystemMessage;import jakarta.inject.Inject;
import dev.langchain4j.model.chat.ChatModel;
public class MyService {
@Inject
ChatModel chatModel;
public String chat(String userMessage) {
return chatModel.generate(userMessage);
}
}Configuration (application.properties):
# Ollama connection (optional if using DevServices)
quarkus.langchain4j.ollama.base-url=http://localhost:11434
# Model selection
quarkus.langchain4j.ollama.chat-model.model-id=llama3.2
# Model parameters
quarkus.langchain4j.ollama.chat-model.temperature=0.7For multiple Ollama instances:
import jakarta.inject.Inject;
import dev.langchain4j.model.chat.ChatModel;
import io.quarkiverse.langchain4j.ModelName;
public class MyService {
@Inject
@ModelName("creative")
ChatModel creativeModel;
@Inject
@ModelName("precise")
ChatModel preciseModel;
}Configuration:
# Creative instance
quarkus.langchain4j.ollama.creative.base-url=http://localhost:11434
quarkus.langchain4j.ollama.creative.chat-model.model-id=llama3.2
quarkus.langchain4j.ollama.creative.chat-model.temperature=1.2
# Precise instance
quarkus.langchain4j.ollama.precise.base-url=http://localhost:11434
quarkus.langchain4j.ollama.precise.chat-model.model-id=llama3.2
quarkus.langchain4j.ollama.precise.chat-model.temperature=0.2This deployment module follows the standard Quarkus extension architecture with multiple processors participating in the build chain, DevServices integration, and synthetic bean generation.
Configure Ollama connection, model selection, and model parameters at runtime.
@ConfigRoot(phase = RUN_TIME)
@ConfigMapping(prefix = "quarkus.langchain4j.ollama")
public interface LangChain4jOllamaConfig {
OllamaConfig defaultConfig();
Map<String, OllamaConfig> namedConfig();
}Runtime type definitions and data structures used by Ollama models.
Configure Ollama integration at build time through application properties.
@ConfigRoot(phase = BUILD_TIME)
@ConfigMapping(prefix = "quarkus.langchain4j.ollama")
public interface LangChain4jOllamaOpenAiBuildConfig {
ChatModelBuildConfig chatModel();
EmbeddingModelBuildConfig embeddingModel();
OllamaDevServicesBuildConfig devservices();
}Configure automatic Ollama container provisioning for development environments.
@ConfigGroup
public interface OllamaDevServicesBuildConfig {
boolean enabled();
String imageName();
OptionalInt port();
}The module participates in the Quarkus build chain through processor classes.
public class OllamaProcessor {
@BuildStep
FeatureBuildItem feature();
@BuildStep
IndexDependencyBuildItem indexUpstreamOllamaModule();
@BuildStep
void nativeSupport(
BuildProducer<ServiceProviderBuildItem> serviceProviderProducer,
BuildProducer<ReflectiveClassBuildItem> reflectiveClassProducer,
BuildProducer<ReflectiveHierarchyBuildItem> reflectiveHierarchyProducer
);
@BuildStep
void providerCandidates(
BuildProducer<ChatModelProviderCandidateBuildItem> chatProducer,
BuildProducer<EmbeddingModelProviderCandidateBuildItem> embeddingProducer,
LangChain4jOllamaOpenAiBuildConfig config
);
@BuildStep
void implicitlyConfiguredProviders(
LangChain4jOllamaFixedRuntimeConfig fixedRuntimeConfig,
BuildProducer<ImplicitlyUserConfiguredChatProviderBuildItem> producer
);
@BuildStep(onlyIfNot = IsNormal.class, onlyIf = Langchain4jDevServicesEnabled.class)
void devServicesSupport(
List<SelectedChatModelProviderBuildItem> selectedChatModels,
List<SelectedEmbeddingModelCandidateBuildItem> selectedEmbeddingModels,
LangChain4jOllamaFixedRuntimeConfig fixedRuntimeConfig,
BuildProducer<DevServicesChatModelRequiredBuildItem> chatProducer,
BuildProducer<DevServicesEmbeddingModelRequiredBuildItem> embeddingProducer
);
@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
void generateBeans(
OllamaRecorder recorder,
List<SelectedChatModelProviderBuildItem> selectedChatItem,
List<SelectedEmbeddingModelCandidateBuildItem> selectedEmbedding,
BuildProducer<SyntheticBeanBuildItem> beanProducer
);
@BuildStep
void deprioritizeJsonb(
Capabilities capabilities,
BuildProducer<MessageBodyReaderOverrideBuildItem> readerOverrideProducer,
BuildProducer<MessageBodyWriterOverrideBuildItem> writerOverrideProducer
);
}Configure GraalVM native image compilation support for Ollama classes.
Create CDI beans programmatically at runtime initialization for injection into application code.
This section provides a quick reference for common configuration properties. See Runtime Configuration for complete runtime configuration documentation and Build-Time Configuration for build-time configuration details.
These properties configure Ollama connection and model behavior at runtime (can be changed without rebuilding):
| Property | Type | Default | Description |
|---|---|---|---|
quarkus.langchain4j.ollama.base-url | Optional<String> | http://localhost:11434 | Ollama service URL |
quarkus.langchain4j.ollama.timeout | Optional<Duration> | 10s | Request timeout |
quarkus.langchain4j.ollama.chat-model.model-id | String | llama3.2 | Chat model identifier |
quarkus.langchain4j.ollama.chat-model.temperature | Double | 0.8 | Sampling temperature (0-2) |
quarkus.langchain4j.ollama.chat-model.top-p | Double | 0.9 | Nucleus sampling threshold |
quarkus.langchain4j.ollama.chat-model.top-k | Integer | 40 | Top-k sampling limit |
quarkus.langchain4j.ollama.chat-model.num-predict | OptionalInt | (unlimited) | Max tokens to generate |
quarkus.langchain4j.ollama.embedding-model.model-id | String | nomic-embed-text | Embedding model identifier |
quarkus.langchain4j.ollama.log-requests | Optional<Boolean> | false | Enable request logging |
quarkus.langchain4j.ollama.log-responses | Optional<Boolean> | false | Enable response logging |
These properties control build-time behavior and model enablement (requires rebuild to change):
| Property | Type | Default | Description |
|---|---|---|---|
quarkus.langchain4j.ollama.chat-model.enabled | Optional<Boolean> | true | Enable/disable chat model |
quarkus.langchain4j.ollama.embedding-model.enabled | Optional<Boolean> | true | Enable/disable embedding model |
quarkus.langchain4j.ollama.devservices.enabled | boolean | true | Enable/disable DevServices |
quarkus.langchain4j.ollama.devservices.image-name | String | ollama/ollama:latest | Docker image for DevServices |
quarkus.langchain4j.ollama.devservices.port | OptionalInt | (random) | Fixed port for DevServices |
All properties support named instances using the pattern:
quarkus.langchain4j.ollama.<config-name>.*For example:
quarkus.langchain4j.ollama.my-ollama.chat-model.enabled=true
quarkus.langchain4j.ollama.my-ollama.devservices.enabled=trueThe deployment module creates the following synthetic CDI beans at runtime initialization:
dev.langchain4j.model.chat.ChatModel@ApplicationScoped@ModelName (for named configurations)Instance<ChatModelListener> injection pointdev.langchain4j.model.chat.StreamingChatModel@ApplicationScoped@ModelName (for named configurations)Instance<ChatModelListener> injection pointdev.langchain4j.model.embedding.EmbeddingModel@ApplicationScoped@ModelName (for named configurations)DevServices automatically starts an Ollama container during development and testing when:
IsNormal.class is false)Langchain4jDevServicesEnabled condition is true)The DevServices container:
ollama/ollama:latest)~/.ollama directory for model cachingquarkus-dev-service-ollamaThe deployment module produces these build items for the Quarkus build chain:
FeatureBuildItem - Registers featuresIndexDependencyBuildItem - Indexes upstream dependenciesServiceProviderBuildItem - Registers service providersReflectiveClassBuildItem - Registers classes for reflectionReflectiveHierarchyBuildItem - Registers class hierarchies for reflectionChatModelProviderCandidateBuildItem - Registers chat model providerEmbeddingModelProviderCandidateBuildItem - Registers embedding model providerImplicitlyUserConfiguredChatProviderBuildItem - Registers named configurationsDevServicesChatModelRequiredBuildItem - Indicates chat model DevServices requirementDevServicesEmbeddingModelRequiredBuildItem - Indicates embedding model DevServices requirementDevServicesOllamaConfigBuildItem - Provides DevServices configurationDevServicesResultBuildItem - Provides DevServices lifecycle informationSyntheticBeanBuildItem - Creates synthetic CDI beansMessageBodyReaderOverrideBuildItem - Overrides reader priorityMessageBodyWriterOverrideBuildItem - Overrides writer priorityAdditionalDevUiCardBuildItem - Adds Dev UI cardThe deployment module consumes these build items:
DockerStatusBuildItem - Docker availabilityLaunchModeBuildItem - Application launch modeConsoleInstalledBuildItem - Console availabilityLoggingSetupBuildItem - Logging configurationDevServicesSharedNetworkBuildItem - Shared network configurationSelectedChatModelProviderBuildItem - Selected chat model providerSelectedEmbeddingModelCandidateBuildItem - Selected embedding model providerCapabilities - Quarkus capabilities// Root build-time configuration
@ConfigRoot(phase = BUILD_TIME)
@ConfigMapping(prefix = "quarkus.langchain4j.ollama")
public interface LangChain4jOllamaOpenAiBuildConfig {
ChatModelBuildConfig chatModel();
EmbeddingModelBuildConfig embeddingModel();
OllamaDevServicesBuildConfig devservices();
}
// Chat model build configuration
@ConfigGroup
public interface ChatModelBuildConfig {
@ConfigDocDefault("true")
Optional<Boolean> enabled();
}
// Embedding model build configuration
@ConfigGroup
public interface EmbeddingModelBuildConfig {
@ConfigDocDefault("true")
Optional<Boolean> enabled();
}
// DevServices configuration
@ConfigGroup
public interface OllamaDevServicesBuildConfig {
String OLLAMA_IMAGE = "ollama/ollama:latest";
@WithDefault("true")
boolean enabled();
@WithDefault(OLLAMA_IMAGE)
String imageName();
OptionalInt port();
}io.quarkus:quarkus-arc-deployment - CDI container deployment supportio.quarkus:quarkus-rest-client-jackson-deployment - REST client Jackson supportio.quarkus:quarkus-qute-deployment - Qute templating supportio.quarkiverse.langchain4j:quarkus-langchain4j-core-deployment - Core LangChain4j deploymentio.quarkiverse.langchain4j:quarkus-langchain4j-ollama - Ollama runtime moduleorg.testcontainers:ollama:1.21.3 - Testcontainers Ollama supportThis deployment module is typically added as a dependency in a Quarkus application's pom.xml when using the Ollama extension. Application developers interact with the runtime beans (ChatModel, StreamingChatModel, EmbeddingModel) created by this module, not with the deployment module directly.
Example application dependency:
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-ollama</artifactId>
</dependency>The deployment module is automatically included as a transitive dependency and participates in the Quarkus build process.
application.properties or application.ymlInstall with Tessl CLI
npx tessl i tessl/maven-io-quarkiverse-langchain4j--quarkus-langchain4j-ollama-deployment