CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-dev-langchain4j--langchain4j-google-ai-gemini

LangChain4j integration for Google AI Gemini models providing chat, streaming, embeddings, image generation, and batch processing capabilities

Overview
Eval results
Files

images.mddocs/

Image Generation

Image generation model for Google AI Gemini that creates images from text prompts and edits existing images. Supports configurable aspect ratios, image sizes, safety settings, and Google Search grounding for enhanced image generation.

Capabilities

GoogleAiGeminiImageModel Class

Main image generation model class providing synchronous image creation and editing operations.

/**
 * Image generation model for Google AI Gemini.
 * Creates and edits images from text prompts.
 * Marked as experimental feature.
 */
public class GoogleAiGeminiImageModel {
    /**
     * Creates a new builder for configuring the image model.
     * @return GoogleAiGeminiImageModelBuilder instance
     */
    public static GoogleAiGeminiImageModelBuilder builder();

    /**
     * Returns the model name being used.
     * @return Model name string
     */
    public String modelName();

    /**
     * Generates an image from a text prompt.
     * @param prompt Text description of the desired image
     * @return Response containing the generated Image
     */
    public Response<Image> generate(String prompt);

    /**
     * Edits an existing image based on a text prompt.
     * @param image The image to edit
     * @param prompt Text description of desired edits
     * @return Response containing the edited Image
     */
    public Response<Image> edit(Image image, String prompt);

    /**
     * Edits an image using a mask to specify the edit region.
     * @param image The image to edit
     * @param mask Mask image indicating regions to edit (white = edit, black = preserve)
     * @param prompt Text description of desired edits
     * @return Response containing the edited Image
     */
    public Response<Image> edit(Image image, Image mask, String prompt);
}

GoogleAiGeminiImageModelBuilder

Builder class for constructing GoogleAiGeminiImageModel with extensive configuration options.

/**
 * Builder for GoogleAiGeminiImageModel.
 * Provides configuration for image generation parameters.
 */
public static class GoogleAiGeminiImageModelBuilder {
    /**
     * Sets the HTTP client builder for customizing requests.
     * @param httpClientBuilder HTTP client builder instance
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder httpClientBuilder(HttpClientBuilder httpClientBuilder);

    /**
     * Sets the API key for authentication (required).
     * @param apiKey Google AI API key
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder apiKey(String apiKey);

    /**
     * Sets the base URL for the API endpoint.
     * @param baseUrl Custom base URL (optional)
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder baseUrl(String baseUrl);

    /**
     * Sets the model name to use for image generation.
     * @param modelName Model identifier (e.g., "gemini-2.5-flash")
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder modelName(String modelName);

    /**
     * Sets the aspect ratio for generated images.
     * @param aspectRatio Aspect ratio string (e.g., "16:9", "4:3", "1:1")
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder aspectRatio(String aspectRatio);

    /**
     * Sets the size of generated images.
     * @param imageSize Image size specification
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder imageSize(String imageSize);

    /**
     * Sets the request timeout duration.
     * @param timeout Timeout duration
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder timeout(Duration timeout);

    /**
     * Sets the maximum number of retry attempts for failed requests.
     * @param maxRetries Number of retries (default: 3)
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder maxRetries(Integer maxRetries);

    /**
     * Enables logging of both requests and responses.
     * @param logRequestsAndResponses True to enable full logging
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder logRequestsAndResponses(Boolean logRequestsAndResponses);

    /**
     * Enables logging of requests only.
     * @param logRequests True to enable request logging
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder logRequests(Boolean logRequests);

    /**
     * Enables logging of responses only.
     * @param logResponses True to enable response logging
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder logResponses(Boolean logResponses);

    /**
     * Sets a custom logger for the model.
     * @param logger Logger instance
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder logger(Logger logger);

    /**
     * Sets safety settings for content filtering.
     * @param safetySettings List of safety settings
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder safetySettings(List<GeminiSafetySetting> safetySettings);

    /**
     * Enables Google Search grounding for enhanced image generation.
     * @param useGoogleSearchGrounding True to enable search grounding
     * @return Builder instance for chaining
     */
    public GoogleAiGeminiImageModelBuilder useGoogleSearchGrounding(Boolean useGoogleSearchGrounding);

    /**
     * Builds the GoogleAiGeminiImageModel instance.
     * @return Configured GoogleAiGeminiImageModel
     * @throws IllegalArgumentException if required fields are missing
     */
    public GoogleAiGeminiImageModel build();
}

GeminiImageGenerationException

Exception thrown when image generation fails.

/**
 * Exception thrown when image generation or editing fails.
 * Extends RuntimeException for unchecked exception handling.
 */
public static class GeminiImageGenerationException extends RuntimeException {
    /**
     * Creates a new exception with the specified message.
     * @param message Error message describing the failure
     */
    public GeminiImageGenerationException(String message);
}

Usage Examples

Basic Image Generation

import dev.langchain4j.model.googleai.GoogleAiGeminiImageModel;
import dev.langchain4j.data.image.Image;
import dev.langchain4j.model.output.Response;

// Create image generation model
GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .build();

// Generate an image
Response<Image> response = imageModel.generate(
    "A serene mountain landscape at sunset with snow-capped peaks and a lake"
);

Image image = response.content();
System.out.println("Generated image URL: " + image.url());

Image Generation with Aspect Ratio

// Generate with specific aspect ratio
GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .aspectRatio("16:9") // Wide format
    .build();

Response<Image> response = imageModel.generate(
    "A cinematic panoramic view of a futuristic city skyline at night"
);

// Save or display the image
Image image = response.content();

Different Aspect Ratios

// Square image
GoogleAiGeminiImageModel squareModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .aspectRatio("1:1")
    .build();

Response<Image> square = squareModel.generate("A mandala design with intricate patterns");

// Portrait image
GoogleAiGeminiImageModel portraitModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .aspectRatio("9:16")
    .build();

Response<Image> portrait = portraitModel.generate("A tall waterfall in a rainforest");

// Landscape image
GoogleAiGeminiImageModel landscapeModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .aspectRatio("16:9")
    .build();

Response<Image> landscape = landscapeModel.generate("A vast desert with sand dunes");

Image Editing

import java.net.URI;

// Load existing image
Image originalImage = Image.fromUrl(URI.create("https://example.com/photo.jpg"));

GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .build();

// Edit the image
Response<Image> response = imageModel.edit(
    originalImage,
    "Add a rainbow in the sky and make the colors more vibrant"
);

Image editedImage = response.content();
System.out.println("Edited image URL: " + editedImage.url());

Image Editing with Mask

// Load original image and mask
Image originalImage = Image.fromUrl(URI.create("https://example.com/scene.jpg"));
Image maskImage = Image.fromUrl(URI.create("https://example.com/mask.png"));

GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .build();

// Edit only the masked region
Response<Image> response = imageModel.edit(
    originalImage,
    maskImage, // White areas will be edited, black areas preserved
    "Replace with blooming flowers"
);

Image editedImage = response.content();

Google Search Grounding

// Enable Google Search for more accurate and up-to-date image generation
GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .useGoogleSearchGrounding(true)
    .build();

// Generate with search-informed context
Response<Image> response = imageModel.generate(
    "The latest SpaceX Starship rocket on the launch pad"
);

Image image = response.content();

Safety Settings

import dev.langchain4j.model.googleai.GeminiSafetySetting;
import dev.langchain4j.model.googleai.GeminiHarmCategory;
import dev.langchain4j.model.googleai.GeminiHarmBlockThreshold;
import java.util.List;

GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .safetySettings(List.of(
        new GeminiSafetySetting(
            GeminiHarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
            GeminiHarmBlockThreshold.BLOCK_LOW_AND_ABOVE
        ),
        new GeminiSafetySetting(
            GeminiHarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
            GeminiHarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE
        )
    ))
    .build();

// Model will block inappropriate content based on safety settings
Response<Image> response = imageModel.generate("A family-friendly park scene");

Advanced Configuration

import java.time.Duration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger("ImageModel");

GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .aspectRatio("16:9")
    .imageSize("1024x768")
    .timeout(Duration.ofMinutes(2))
    .maxRetries(3)
    .useGoogleSearchGrounding(true)
    .logRequestsAndResponses(true)
    .logger(logger)
    .safetySettings(List.of(
        new GeminiSafetySetting(
            GeminiHarmCategory.HARM_CATEGORY_HATE_SPEECH,
            GeminiHarmBlockThreshold.BLOCK_LOW_AND_ABOVE
        )
    ))
    .build();

Response<Image> response = imageModel.generate(
    "An abstract representation of artificial intelligence"
);

Saving Generated Images

import java.io.InputStream;
import java.io.FileOutputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;

GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .build();

Response<Image> response = imageModel.generate("A steampunk robot in a Victorian workshop");
Image image = response.content();

// Download and save the image
URL imageUrl = image.url().toURL();
try (InputStream in = imageUrl.openStream()) {
    Files.copy(in, Path.of("generated_image.png"));
    System.out.println("Image saved to generated_image.png");
}

Multiple Image Variations

GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .aspectRatio("1:1")
    .build();

String basePrompt = "A logo for a tech startup named 'InnovateAI'";

// Generate multiple variations by tweaking the prompt
List<String> prompts = List.of(
    basePrompt + " with modern minimalist design",
    basePrompt + " with bold geometric shapes",
    basePrompt + " with gradient colors and sleek typography"
);

List<Image> variations = new ArrayList<>();
for (String prompt : prompts) {
    Response<Image> response = imageModel.generate(prompt);
    variations.add(response.content());
}

System.out.println("Generated " + variations.size() + " logo variations");

Error Handling

GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .build();

try {
    Response<Image> response = imageModel.generate("A beautiful landscape");
    Image image = response.content();
    System.out.println("Image generated successfully: " + image.url());
} catch (GeminiImageGenerationException e) {
    System.err.println("Image generation failed: " + e.getMessage());
    // Handle error - possibly due to safety filters or invalid prompt
} catch (Exception e) {
    System.err.println("Unexpected error: " + e.getMessage());
}

Working with Base64 Images

import java.util.Base64;

GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .build();

Response<Image> response = imageModel.generate("A cosmic nebula with stars");
Image image = response.content();

// Convert to base64 if available
if (image.base64Data() != null) {
    String base64 = image.base64Data();
    byte[] imageBytes = Base64.getDecoder().decode(base64);
    System.out.println("Image size: " + imageBytes.length + " bytes");
}

Editing Workflow

GoogleAiGeminiImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .build();

// Step 1: Generate initial image
Response<Image> initial = imageModel.generate("A simple wooden house in a forest");
Image house = initial.content();

// Step 2: Edit to add details
Response<Image> enhanced = imageModel.edit(
    house,
    "Add smoke coming from the chimney and lights in the windows"
);
Image enhancedHouse = enhanced.content();

// Step 3: Further edit
Response<Image> final = imageModel.edit(
    enhancedHouse,
    "Add a path leading to the front door with flowers on both sides"
);
Image finalImage = final.content();

System.out.println("Final edited image: " + finalImage.url());

Integration with LangChain4j

import dev.langchain4j.model.image.ImageModel;

// Use as ImageModel interface
ImageModel imageModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .build();

// Works with any LangChain4j component expecting ImageModel
Response<Image> response = imageModel.generate("A concept art for a sci-fi movie");

Common Use Cases

Creative Content Generation

GoogleAiGeminiImageModel creativeModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .aspectRatio("16:9")
    .useGoogleSearchGrounding(true)
    .build();

// Marketing materials
Response<Image> banner = creativeModel.generate(
    "Professional banner for a software development company, modern and clean"
);

// Social media content
Response<Image> socialPost = creativeModel.generate(
    "Instagram post about healthy eating, vibrant colors, appetizing food"
);

// Product visualization
Response<Image> product = creativeModel.generate(
    "3D render of a smart watch with metallic finish on a minimalist background"
);

Concept Art and Design

GoogleAiGeminiImageModel designModel = GoogleAiGeminiImageModel.builder()
    .apiKey(System.getenv("GOOGLE_AI_API_KEY"))
    .modelName("gemini-2.5-flash")
    .aspectRatio("4:3")
    .build();

// Character design
Response<Image> character = designModel.generate(
    "Fantasy character design: female elven warrior with silver armor and bow"
);

// Environment concept
Response<Image> environment = designModel.generate(
    "Concept art of a floating island city with waterfalls and bridges"
);

// UI mockup
Response<Image> ui = designModel.generate(
    "Modern mobile app login screen with gradient background and clean forms"
);

Performance Considerations

  1. Timeout: Image generation can take longer than text generation; set appropriate timeouts (1-2 minutes recommended)
  2. Retry logic: Configure retries for handling transient network issues
  3. Caching: Cache generated images locally to avoid regenerating identical prompts
  4. Aspect ratio: Choose aspect ratio based on intended use (social media, print, web)
  5. Prompt engineering: Detailed prompts produce better results; include style, mood, composition details

Limitations

  • Image generation is an experimental feature and may have usage limits
  • Generated images are subject to safety filters
  • Edit operations require the original image to be accessible
  • Processing time varies based on complexity and server load
  • Not all aspect ratios may be supported on all models

Common Model Names

  • gemini-2.5-flash - Fast image generation model
  • gemini-2.5-pro - High-quality image generation model

Aspect Ratio Options

Common aspect ratios:

  • 1:1 - Square (social media posts, profile pictures)
  • 16:9 - Landscape (banners, presentations, video thumbnails)
  • 9:16 - Portrait (mobile screens, stories)
  • 4:3 - Standard (traditional displays)
  • 3:2 - Photo (standard photo format)

Utility Classes

GeneratedImageHelper

Utility class for extracting and working with generated images from AI messages.

/**
 * Utility class for working with generated images in AI messages.
 * Provides helper methods to extract images from responses.
 */
public class GeneratedImageHelper {
    /**
     * Extracts all generated images from an AI message.
     * @param aiMessage The AI message potentially containing images
     * @return List of Image objects (empty list if no images)
     */
    public static List<Image> getGeneratedImages(AiMessage aiMessage);

    /**
     * Checks if an AI message contains generated images.
     * @param aiMessage The AI message to check
     * @return True if the message contains generated images
     */
    public static boolean hasGeneratedImages(AiMessage aiMessage);
}

Using GeneratedImageHelper

import dev.langchain4j.model.googleai.GeneratedImageHelper;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.image.Image;

// After generating content with image response modality
Response<AiMessage> response = model.generate("Your prompt");
AiMessage message = response.content();

// Check if images were generated
if (GeneratedImageHelper.hasGeneratedImages(message)) {
    // Extract all generated images
    List<Image> images = GeneratedImageHelper.getGeneratedImages(message);

    System.out.println("Generated " + images.size() + " images");

    for (Image image : images) {
        System.out.println("Image URL: " + image.url());
        // Save or process the image
    }
} else {
    System.out.println("No images generated");
}

Install with Tessl CLI

npx tessl i tessl/maven-dev-langchain4j--langchain4j-google-ai-gemini

docs

advanced-configuration.md

batch-processing.md

chat-streaming.md

chat-synchronous.md

configuration.md

embeddings.md

file-management.md

images.md

index.md

model-catalog.md

response-metadata.md

token-counting.md

tile.json