Skip to content

Commit 809f0e3

Browse files
matthew29tangcopybara-github
authored andcommitted
feat: Add async editImage support for Java SDK
PiperOrigin-RevId: 743281229
1 parent 5a9892f commit 809f0e3

File tree

2 files changed

+150
-0
lines changed

2 files changed

+150
-0
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/*
2+
* Copyright 2025 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
/**
18+
* Usage:
19+
*
20+
* <p>1a. If you are using Vertex AI, setup ADC to get credentials:
21+
* https://cloud.google.com/docs/authentication/provide-credentials-adc#google-idp
22+
*
23+
* <p>Then set Project, Location, and USE_VERTEXAI flag as environment variables:
24+
*
25+
* <p>export GOOGLE_CLOUD_PROJECT=YOUR_PROJECT
26+
*
27+
* <p>export GOOGLE_CLOUD_LOCATION=YOUR_LOCATION
28+
*
29+
* <p>1b. If you are using Gemini Developer AI, set an API key environment variable. You can find a
30+
* list of available API keys here: https://aistudio.google.com/app/apikey
31+
*
32+
* <p>export GOOGLE_API_KEY=YOUR_API_KEY
33+
*
34+
* <p>2. Compile the java package and run the sample code.
35+
*
36+
* <p>mvn clean compile exec:java -Dexec.mainClass="com.google.genai.examples.EditImageAsync"
37+
*/
38+
package com.google.genai.examples;
39+
40+
import com.google.genai.Client;
41+
import com.google.genai.types.EditImageConfig;
42+
import com.google.genai.types.EditImageResponse;
43+
import com.google.genai.types.GenerateImagesConfig;
44+
import com.google.genai.types.GenerateImagesResponse;
45+
import com.google.genai.types.Image;
46+
import com.google.genai.types.MaskReferenceConfig;
47+
import com.google.genai.types.MaskReferenceImage;
48+
import com.google.genai.types.RawReferenceImage;
49+
import com.google.genai.types.ReferenceImage;
50+
import java.io.IOException;
51+
import java.util.ArrayList;
52+
import java.util.concurrent.CompletableFuture;
53+
import org.apache.http.HttpException;
54+
55+
/** An example of using the Unified Gen AI Java SDK to edit an image asynchronously. */
56+
public class EditImageAsync {
57+
public static void main(String[] args) throws IOException, HttpException {
58+
// Instantiates the client using Vertex AI, and sets the project and location in the builder.
59+
Client client =
60+
Client.builder()
61+
.vertexAI(true)
62+
.project(System.getenv("GOOGLE_CLOUD_PROJECT"))
63+
.location(System.getenv("GOOGLE_CLOUD_LOCATION"))
64+
.build();
65+
66+
GenerateImagesConfig generateImagesConfig =
67+
GenerateImagesConfig.builder().numberOfImages(1).outputMimeType("image/jpeg").build();
68+
69+
CompletableFuture<GenerateImagesResponse> generateImagesResponseFuture =
70+
client.async.models.generateImages(
71+
"imagen-3.0-generate-001",
72+
"An umbrella in the foreground, and a rainy night sky in the background",
73+
generateImagesConfig);
74+
75+
generateImagesResponseFuture
76+
.thenAccept(
77+
generatedImagesResponse -> {
78+
Image generatedImage =
79+
generatedImagesResponse.generatedImages().get().get(0).image().get();
80+
81+
// Edit image with a mask.
82+
EditImageConfig editImageConfig =
83+
EditImageConfig.builder()
84+
.editMode("EDIT_MODE_INPAINT_INSERTION")
85+
.numberOfImages(1)
86+
.outputMimeType("image/jpeg")
87+
.build();
88+
89+
ArrayList<ReferenceImage> referenceImages = new ArrayList<>();
90+
RawReferenceImage rawReferenceImage =
91+
RawReferenceImage.builder().referenceImage(generatedImage).referenceId(1).build();
92+
referenceImages.add(rawReferenceImage);
93+
94+
MaskReferenceImage maskReferenceImage =
95+
MaskReferenceImage.builder()
96+
.referenceId(2)
97+
.config(
98+
MaskReferenceConfig.builder()
99+
.maskMode("MASK_MODE_BACKGROUND")
100+
.maskDilation(0.0f)
101+
.build())
102+
.build();
103+
referenceImages.add(maskReferenceImage);
104+
105+
CompletableFuture<EditImageResponse> editImageResponseFuture =
106+
client.async.models.editImage(
107+
"imagen-3.0-capability-001",
108+
"Sunlight and clear sky",
109+
referenceImages,
110+
editImageConfig);
111+
112+
editImageResponseFuture
113+
.thenAccept(
114+
editImageResponse -> {
115+
Image editedImage =
116+
editImageResponse.generatedImages().get().get(0).image().get();
117+
// Do something with editedImage.
118+
})
119+
.join();
120+
})
121+
.join();
122+
}
123+
}

src/main/java/com/google/genai/AsyncModels.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
package com.google.genai;
2020

2121
import com.google.genai.types.Content;
22+
import com.google.genai.types.EditImageConfig;
23+
import com.google.genai.types.EditImageResponse;
2224
import com.google.genai.types.EmbedContentConfig;
2325
import com.google.genai.types.EmbedContentResponse;
2426
import com.google.genai.types.GenerateContentConfig;
@@ -28,6 +30,7 @@
2830
import com.google.genai.types.GenerateVideosConfig;
2931
import com.google.genai.types.GenerateVideosOperation;
3032
import com.google.genai.types.Image;
33+
import com.google.genai.types.ReferenceImage;
3134
import com.google.genai.types.UpscaleImageConfig;
3235
import com.google.genai.types.UpscaleImageResponse;
3336
import java.util.List;
@@ -153,6 +156,30 @@ public CompletableFuture<GenerateImagesResponse> generateImages(
153156
return CompletableFuture.supplyAsync(() -> models.generateImages(model, prompt, config));
154157
}
155158

159+
/**
160+
* Asynchronously edits an image given a GenAI model, a prompt, and a list of reference images.
161+
*
162+
* @param model the name of the GenAI model to use for editing capabilities
163+
* @param prompt the prompt to edit the image
164+
* @param referenceImages a {@link List<com.google.genai.types.ReferenceImage>} to send to use for
165+
* editing. The 5 types of reference images are: {@link
166+
* com.google.genai.types.RawReferenceImage}, {@link
167+
* com.google.genai.types.MaskReferenceImage}, {@link
168+
* com.google.genai.types.ControlReferenceImage}, {@link
169+
* com.google.genai.types.StyleReferenceImage}, {@link
170+
* com.google.genai.types.SubjectReferenceImage},
171+
* @param config a {@link com.google.genai.types.EditImageConfig} instance that specifies the
172+
* optional configurations
173+
* @return a {@link com.google.genai.types.EditImageResponse} instance that contains the edited
174+
* image.
175+
*/
176+
public CompletableFuture<EditImageResponse> editImage(
177+
String model, String prompt, List<ReferenceImage> referenceImages, EditImageConfig config) {
178+
179+
return CompletableFuture.supplyAsync(
180+
() -> models.editImage(model, prompt, referenceImages, config));
181+
}
182+
156183
/**
157184
* Asynchronously upscales an image given a GenAI model and an image and an upscale factor.
158185
*

0 commit comments

Comments
 (0)