googleapis / googleapis/java-genai

Support direct GCS output (storageUri) for 'gemini-2.5-flash-image' to prevent OOM in high concurrency

Open
#737 2 comments 0 reactions 1 assignee Claimed by @hemasekhar-p View on GitHub
priority: p3 type: feature request
Dominant language
Java
Stars
397
Forks
125
Avg merge
2d 8h
Merged PRs (30d)
41

Description

### SDK Version
`1.21.0`

### Model Used
`gemini-2.5-flash-image`

### Description
I am using the `google-genai` SDK to generate images using the `gemini-2.5-flash-image` model via the `client.models.generateContent` method.

Currently, the SDK returns the generated image directly as raw bytes (inline data) in the response memory. While this works for single requests, it causes significant **memory pressure (OOM)** in high-concurrency scenarios because the application server must hold multiple large image buffers in the heap before uploading them to storage (e.g., S3/GCS).

In the legacy Vertex AI Imagen API (e.g., `imagen-3.0`), we could provide a `storageUri` parameter to instruct the model to write the output directly to Google Cloud Storage (GCS), returning only the URI. This allowed for "zero-copy" handling on the client side.

**My question is:**
Is there a way to configure a GCS destination (similar to `storageUri` or `outputConfig`) in `GenerateContentConfig` for Gemini image generation models? If not, are there any plans to support this feature?

### Current Code Implementation
Here is how I am currently calling the API. The `imageByte` array is the bottleneck.

```java
public GoogleVertexAiResponse imageGenByNanoBanana(GoogleVertexAiRequest aiRequest){
// ... validation logic ...

GenerateContentConfig.Builder contentConfigBuilder =
GenerateContentConfig.builder()
.candidateCount(1)
.httpOptions(HttpOptions.builder()
.apiVersion("v1")
.timeout(60000)
.build());

if(!StringUtils.isEmpty(aiRequest.getAspectRatio())){
contentConfigBuilder.imageConfig(ImageConfig.builder()
.aspectRatio(aiRequest.getAspectRatio())
.build());
}

GenerateContentConfig contentConfig = contentConfigBuilder.build();

try {
// The response contains the full image bytes in memory
GenerateContentResponse response =
client.models.generateContent(
aiRequest.getModelVersion(), // gemini-2.5-flash-image
aiRequest.getPrompt(),
contentConfig);

List parts =
response
.candidates()
.flatMap(candidates -> candidates.stream().findFirst())
.flatMap(Candidate::content)
.flatMap(Content::parts)
.orElse(new ArrayList<>());

byte[] imageByte = null;
for(Part part: parts){
// Memory bottleneck here:
if(part.inlineData().flatMap(Blob::data).isPresent()){
imageByte = part.inlineData().flatMap(Blob::data).get();
break;
}
}

// ... upload logic ...

} catch (Exception e){
log.error("Google Vertex Ai Image Gen Occur An Error: {}", e.getMessage(), e);
return handleException(e);
}
}
```

### Expected Behavior
I would like to be able to specify a GCS URI in the config so that the response returns a reference to the file instead of the raw bytes.

Example (Hypothetical):
```java
GenerateContentConfig.builder()
.imageConfig(ImageConfig.builder()
.storageUri("gs://my-bucket/output/") // feature request
.build())
.build();
```

***

Thanks

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.