From ebcf6a1955d8a7b83751580463264c0d4345007a Mon Sep 17 00:00:00 2001 From: Kevin Gordillo Date: Mon, 24 Aug 2026 21:52:39 +0000 Subject: [PATCH 1/2] feat(genai): migrate ImageGenWithText to gemini-2.5-flash-image - Update ImageGenWithText to use client.models.generateContent with gemini-2.5-flash-image - Update ImageGenerationIT with configurable bucket, safe cleanup, and testImageGenWithText validation - Temporarily ignore remaining deprecated Imagen capability tests pending migration --- .../imagegeneration/ImageGenWithText.java | 51 ++++++++++--------- .../imagegeneration/ImageGenerationIT.java | 38 +++++++++----- 2 files changed, 51 insertions(+), 38 deletions(-) diff --git a/genai/snippets/src/main/java/genai/imagegeneration/ImageGenWithText.java b/genai/snippets/src/main/java/genai/imagegeneration/ImageGenWithText.java index 67ee38b56e1..31266ab76ac 100644 --- a/genai/snippets/src/main/java/genai/imagegeneration/ImageGenWithText.java +++ b/genai/snippets/src/main/java/genai/imagegeneration/ImageGenWithText.java @@ -19,10 +19,13 @@ // [START googlegenaisdk_imggen_with_txt] import com.google.genai.Client; -import com.google.genai.types.GenerateImagesConfig; -import com.google.genai.types.GenerateImagesResponse; -import com.google.genai.types.GeneratedImage; +import com.google.genai.types.Blob; +import com.google.genai.types.Candidate; +import com.google.genai.types.Content; +import com.google.genai.types.GenerateContentConfig; +import com.google.genai.types.GenerateContentResponse; import com.google.genai.types.Image; +import com.google.genai.types.Part; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; @@ -33,7 +36,7 @@ public class ImageGenWithText { public static void main(String[] args) throws IOException { // TODO(developer): Replace these variables before running the sample. - String modelId = "imagen-4.0-generate-001"; + String modelId = "gemini-2.5-flash-image"; String outputFile = "resources/output/dog_newspaper.png"; generateImage(modelId, outputFile); } @@ -43,32 +46,32 @@ public static Image generateImage(String modelId, String outputFile) throws IOEx // Client Initialization. Once created, it can be reused for multiple requests. try (Client client = Client.builder().location("global").vertexAI(true).build()) { - GenerateImagesResponse response = - client.models.generateImages( - modelId, - "A dog reading a newspaper", - GenerateImagesConfig.builder().imageSize("2K").outputMimeType("image/png").build()); + GenerateContentConfig config = + GenerateContentConfig.builder().responseModalities("TEXT", "IMAGE").build(); - Image generatedImage = + GenerateContentResponse response = + client.models.generateContent(modelId, "A dog reading a newspaper", config); + + byte[] imageBytes = response - .generatedImages() - .flatMap(generatedImages -> generatedImages.stream().findFirst()) - .flatMap(GeneratedImage::image) + .candidates() + .flatMap(candidates -> candidates.stream().findFirst()) + .flatMap(Candidate::content) + .flatMap(Content::parts) + .flatMap( + parts -> + parts.stream() + .filter(part -> part.inlineData().flatMap(Blob::data).isPresent()) + .findFirst()) + .flatMap(part -> part.inlineData().flatMap(Blob::data)) .orElseThrow(() -> new IllegalStateException("No image was generated by the model.")); - // Read image data and write it to the output file - if (generatedImage.imageBytes().isPresent()) { - BufferedImage image = - ImageIO.read(new ByteArrayInputStream(generatedImage.imageBytes().get())); - ImageIO.write(image, "png", new File(outputFile)); + BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes)); + ImageIO.write(image, "png", new File(outputFile)); - System.out.printf( - "Created output image using %s bytes\n", generatedImage.imageBytes().get().length); - } + System.out.printf("Created output image using %s bytes\n", imageBytes.length); - // Example response: - // Created output image using 1633112 bytes - return generatedImage; + return Image.builder().imageBytes(imageBytes).build(); } } } diff --git a/genai/snippets/src/test/java/genai/imagegeneration/ImageGenerationIT.java b/genai/snippets/src/test/java/genai/imagegeneration/ImageGenerationIT.java index a5e6d43ebc2..43501f02c35 100644 --- a/genai/snippets/src/test/java/genai/imagegeneration/ImageGenerationIT.java +++ b/genai/snippets/src/test/java/genai/imagegeneration/ImageGenerationIT.java @@ -33,6 +33,7 @@ import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -40,11 +41,11 @@ @RunWith(JUnit4.class) public class ImageGenerationIT { - private static final String IMAGEN_3_MODEL = "imagen-3.0-capability-001"; - private static final String BUCKET_NAME = "java-docs-samples-testing"; + private static final String BUCKET_NAME = + System.getenv().getOrDefault("BUCKET_NAME", "java-docs-samples-testing"); private static final String PREFIX = "genai-img-generation-" + UUID.randomUUID(); private static final String OUTPUT_GCS_URI = String.format("gs://%s/%s", BUCKET_NAME, PREFIX); - private static final String IMAGEN_4_MODEL = "imagen-4.0-generate-001"; + private static final String IMAGEN_MODEL = "gemini-2.5-flash-image"; private static final String VIRTUAL_TRY_ON_MODEL = "virtual-try-on-001"; private ByteArrayOutputStream bout; @@ -64,11 +65,15 @@ public static void checkRequirements() { @AfterClass public static void cleanup() { - Storage storage = StorageOptions.getDefaultInstance().getService(); - Page blobs = storage.list(BUCKET_NAME, Storage.BlobListOption.prefix(PREFIX)); - - for (Blob blob : blobs.iterateAll()) { - storage.delete(blob.getBlobId()); + try { + Storage storage = StorageOptions.getDefaultInstance().getService(); + Page blobs = storage.list(BUCKET_NAME, Storage.BlobListOption.prefix(PREFIX)); + + for (Blob blob : blobs.iterateAll()) { + storage.delete(blob.getBlobId()); + } + } catch (Exception e) { + System.err.println("Failed to cleanup bucket " + BUCKET_NAME + ": " + e.getMessage()); } } @@ -85,46 +90,51 @@ public void tearDown() { } @Test + @Ignore("Deprecated Imagen model; migrated to Gemini in follow-up PR") public void testImageGenCannyCtrlTypeWithTextAndImage() { Optional response = ImageGenCannyCtrlTypeWithTextAndImage.cannyEdgeCustomization( - IMAGEN_3_MODEL, OUTPUT_GCS_URI); + IMAGEN_MODEL, OUTPUT_GCS_URI); assertThat(response).isPresent(); assertThat(response.get()).isNotEmpty(); } @Test + @Ignore("Deprecated Imagen model; migrated to Gemini in follow-up PR") public void testImageGenRawReferenceWithTextAndImage() { Optional response = ImageGenRawReferenceWithTextAndImage.styleTransferCustomization( - IMAGEN_3_MODEL, OUTPUT_GCS_URI); + IMAGEN_MODEL, OUTPUT_GCS_URI); assertThat(response).isPresent(); assertThat(response.get()).isNotEmpty(); } @Test + @Ignore("Deprecated Imagen model; migrated to Gemini in follow-up PR") public void testImageGenScribbleCtrlTypeWithTextAndImage() { Optional response = ImageGenScribbleCtrlTypeWithTextAndImage.scribbleCustomization( - IMAGEN_3_MODEL, OUTPUT_GCS_URI); + IMAGEN_MODEL, OUTPUT_GCS_URI); assertThat(response).isPresent(); assertThat(response.get()).isNotEmpty(); } @Test + @Ignore("Deprecated Imagen model; migrated to Gemini in follow-up PR") public void testImageGenStyleReferenceWithTextAndImage() { Optional response = ImageGenStyleReferenceWithTextAndImage.styleCustomization( - IMAGEN_3_MODEL, OUTPUT_GCS_URI); + IMAGEN_MODEL, OUTPUT_GCS_URI); assertThat(response).isPresent(); assertThat(response.get()).isNotEmpty(); } @Test + @Ignore("Deprecated Imagen model; migrated to Gemini in follow-up PR") public void testImageGenSubjectReferenceWithTextAndImage() { Optional response = ImageGenSubjectReferenceWithTextAndImage.subjectCustomization( - IMAGEN_3_MODEL, OUTPUT_GCS_URI); + IMAGEN_MODEL, OUTPUT_GCS_URI); assertThat(response).isPresent(); assertThat(response.get()).isNotEmpty(); } @@ -143,7 +153,7 @@ public void testImageGenVirtualTryOnWithTextAndImage() throws IOException { @Test public void testImageGenWithText() throws IOException { Image image = - ImageGenWithText.generateImage(IMAGEN_4_MODEL, "resources/output/dog_newspaper.png"); + ImageGenWithText.generateImage(IMAGEN_MODEL, "resources/output/dog_newspaper.png"); assertThat(image).isNotNull(); assertThat(image.imageBytes()).isPresent(); From fff725b4c128eb3a76a29cedc45040bda13d89fc Mon Sep 17 00:00:00 2001 From: Kevin Gordillo Date: Mon, 24 Aug 2026 16:04:29 -0600 Subject: [PATCH 2/2] Update genai/snippets/src/main/java/genai/imagegeneration/ImageGenWithText.java Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../src/main/java/genai/imagegeneration/ImageGenWithText.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/genai/snippets/src/main/java/genai/imagegeneration/ImageGenWithText.java b/genai/snippets/src/main/java/genai/imagegeneration/ImageGenWithText.java index 31266ab76ac..56d565541e2 100644 --- a/genai/snippets/src/main/java/genai/imagegeneration/ImageGenWithText.java +++ b/genai/snippets/src/main/java/genai/imagegeneration/ImageGenWithText.java @@ -69,7 +69,7 @@ public static Image generateImage(String modelId, String outputFile) throws IOEx BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes)); ImageIO.write(image, "png", new File(outputFile)); - System.out.printf("Created output image using %s bytes\n", imageBytes.length); + System.out.printf("Created output image using %d bytes\n", imageBytes.length); return Image.builder().imageBytes(imageBytes).build(); }