Common shared infrastructure for integrating Google Gemini AI models with Quarkus applications through the LangChain4j framework, providing base chat model functionality, schema mapping, and embedding model support.
Common shared infrastructure for integrating Google Gemini AI models with Quarkus applications through the LangChain4j framework. This module provides base implementations for chat models, embedding models, schema mapping utilities, request/response handlers, and function calling support for Google's Gemini API.
<dependency>
<groupId>io.quarkiverse.langchain4j</groupId>
<artifactId>quarkus-langchain4j-gemini-common</artifactId>
<version>1.7.4</version>
</dependency>import io.quarkiverse.langchain4j.gemini.common.*;Common specific imports:
// Chat Models
import io.quarkiverse.langchain4j.gemini.common.GeminiChatLanguageModel;
import io.quarkiverse.langchain4j.gemini.common.GeminiStreamingChatLanguageModel;
import io.quarkiverse.langchain4j.gemini.common.BaseGeminiChatModel;
// Embedding Models
import io.quarkiverse.langchain4j.gemini.common.GeminiEmbeddingModel;
// Content Types
import io.quarkiverse.langchain4j.gemini.common.Content;
import io.quarkiverse.langchain4j.gemini.common.Content.Part;
// Function Calling
import io.quarkiverse.langchain4j.gemini.common.FunctionDeclaration;
import io.quarkiverse.langchain4j.gemini.common.FunctionCall;
import io.quarkiverse.langchain4j.gemini.common.FunctionResponse;
// Configuration
import io.quarkiverse.langchain4j.gemini.common.GenerationConfig;
import io.quarkiverse.langchain4j.gemini.common.Schema;// Extend the abstract base class
public class MyGeminiChatModel extends GeminiChatLanguageModel {
public MyGeminiChatModel(String apiKey) {
super(
"gemini-1.5-pro", // modelId
0.7, // temperature
1024, // maxOutputTokens
40, // topK
0.9, // topP
null, // responseFormat
Collections.emptyList(), // listeners
null, // thinkingBudget
false, // includeThoughts
false // useGoogleSearch
);
}
@Override
protected GenerateContentResponse generateContext(GenerateContentRequest request) {
// Implementation specific to your Gemini API endpoint
return callGeminiApi(request);
}
}
// Use the model
MyGeminiChatModel model = new MyGeminiChatModel(apiKey);
ChatResponse response = model.chat(chatRequest);// Extend the abstract base class
public class MyGeminiEmbeddingModel extends GeminiEmbeddingModel {
public MyGeminiEmbeddingModel() {
super(
"text-embedding-004", // modelId
768, // dimension
"RETRIEVAL_DOCUMENT" // taskType
);
}
@Override
protected EmbedContentResponse embedContent(EmbedContentRequest request) {
// Implementation specific to your Gemini API endpoint
return callGeminiEmbeddingApi(request);
}
@Override
protected EmbedContentResponses batchEmbedContents(EmbedContentRequests requests) {
// Batch implementation
return callGeminiBatchEmbeddingApi(requests);
}
}
// Use the model
MyGeminiEmbeddingModel model = new MyGeminiEmbeddingModel();
Response<Embedding> response = model.embed("Hello, world!");This module is designed as a foundation component that provides:
The module integrates with:
Abstract base classes for implementing Gemini chat models with support for both synchronous and streaming responses. Includes configuration for temperature, token limits, thinking budgets, and Google Search integration.
public abstract class BaseGeminiChatModel {
public BaseGeminiChatModel(String modelId, Double temperature, Integer maxOutputTokens,
Integer topK, Double topP, ResponseFormat responseFormat,
List<ChatModelListener> listeners, Long thinkingBudget,
boolean includeThoughts, boolean useGoogleSearch);
protected Schema detectSchema(ResponseFormat effectiveResponseFormat);
protected Map<String, Object> detectRawSchema(ResponseFormat effectiveResponseFormat);
protected String computeMimeType(ResponseFormat responseFormat, Schema schema, Map<String, Object> rawSchema);
}
public abstract class GeminiChatLanguageModel extends BaseGeminiChatModel implements ChatModel {
public Set<Capability> supportedCapabilities();
public ChatResponse chat(ChatRequest chatRequest);
public ChatResponse doChat(ChatRequest chatRequest);
protected abstract GenerateContentResponse generateContext(GenerateContentRequest request);
}
public abstract class GeminiStreamingChatLanguageModel extends BaseGeminiChatModel implements StreamingChatModel {
public Set<Capability> supportedCapabilities();
public void doChat(ChatRequest chatRequest, StreamingChatResponseHandler handler);
protected abstract Multi<SseEvent<GenerateContentResponse>> generateStreamContext(GenerateContentRequest request);
}Abstract base class for implementing Gemini embedding models with support for single and batch embeddings, configurable output dimensions, and task-specific embeddings.
public abstract class GeminiEmbeddingModel implements EmbeddingModel {
public GeminiEmbeddingModel(String modelId, Integer dimension, String taskType);
public Response<Embedding> embed(String text);
public Response<List<Embedding>> embedAll(List<TextSegment> textSegments);
protected abstract EmbedContentResponse embedContent(EmbedContentRequest request);
protected abstract EmbedContentResponses batchEmbedContents(EmbedContentRequests requests);
}Multi-modal content structures supporting text, binary data (images), file references, function calls, and function responses. Content is organized into parts with role-based messaging.
public record Content(String role, List<Part> parts);
public record Blob(String mimeType, String data);
public record FileData(String mimeType, String fileUri);Complete support for Gemini's function calling capabilities, including function declarations with parameter schemas, function calls from the model, and function responses back to the model.
public record FunctionDeclaration(String name, String description, Parameters parameters);
public record FunctionCall(String name, Map<String, Object> args);
public record FunctionResponse(String name, Response response);Comprehensive request and response structures for content generation and embedding operations, including support for system instructions, tools, generation configuration, and usage metadata.
public record GenerateContentRequest(List<Content> contents, SystemInstruction systemInstruction,
List<Tool> tools, GenerationConfig generationConfig);
public record GenerateContentResponse(List<Candidate> candidates, UsageMetadata usageMetadata,
String modelVersion, String responseId);
public record EmbedContentRequest(String model, Content content, TaskType taskType,
String title, Integer outputDimensionality);
public record EmbedContentResponse(Embedding embedding);Configuration classes for controlling content generation behavior, including temperature, token limits, structured output schemas, thinking/reasoning budgets, and JSON schema definitions.
public class GenerationConfig {
public static Builder builder();
public Double getTemperature();
public Integer getMaxOutputTokens();
public Schema getResponseSchema();
public ThinkingConfig getThinkingConfig();
}
public class Schema {
public static Builder builder();
public Type getType();
public Map<String, Schema> getProperties();
public List<String> getRequired();
}
public class ThinkingConfig {
public ThinkingConfig(Long thinkingBudget, Boolean includeThoughts);
public Long getThinkingBudget();
public Boolean getIncludeThoughts();
}Utility classes for mapping between LangChain4j and Gemini formats, handling responses, and providing REST client authentication.
public final class ContentMapper {
public static GenerateContentRequest map(List<ChatMessage> messages,
List<ToolSpecification> toolSpecifications,
GenerationConfig generationConfig,
String modelId, boolean useGoogleSearch);
}
public final class SchemaMapper {
public static Schema fromJsonSchemaToSchema(JsonSchema jsonSchema);
}
public final class GenerateContentResponseHandler {
public static String getText(GenerateContentResponse response);
public static List<ToolExecutionRequest> getToolExecutionRequests(GenerateContentResponse response);
public static TokenUsage getTokenUsage(UsageMetadata usageMetadata);
}
public class ModelAuthProviderFilter implements ResteasyReactiveClientRequestFilter {
public ModelAuthProviderFilter(String modelId);
public void filter(ResteasyReactiveClientRequestContext requestContext);
}Install with Tessl CLI
npx tessl i tessl/maven-io-quarkiverse-langchain4j--quarkus-langchain4j-gemini-common@1.7.0