You can ask a Gemini Image model to generate and edit images using both text-only and text-and-file prompts. When you use Firebase AI Logic , you can make this request directly from your app.
With this capability, you can do things like:
-
Iteratively generate images through conversation with natural language, adjusting images while maintaining consistency and context.
-
Generate images with high-quality text rendering, including long strings of text.
-
Generate interleaved text-image output. For example, a blog post with text and images in a single turn. Previously, this required stringing together multiple models.
-
Generate images using Gemini's world knowledge and reasoning capabilities.
You can find a complete list of supported features (along with example prompts) later on this page.
Jump to code for text-to-image Jump to code for interleaved text & images
Jump to code for image editing Jump to code for iterative image editing
Analyze images Analyze images on-device Generate structured output
Before you begin
Click your Gemini API provider to view provider-specific content and code on this page.
If you haven't already, complete the getting started guide
, which describes how to
set up your Firebase project, connect your app to Firebase, add the SDK,
initialize the backend service for your chosen Gemini API
provider, and
create a GenerativeModel
instance.
For testing and iterating on your prompts, we recommend using Google AI Studio .
Models that support this capability
-
gemini-3-pro-image(aka "Nano Banana Pro") -
gemini-3.1-flash-image(aka "Nano Banana 2") -
gemini-2.5-flash-image(aka "Nano Banana")
Generate and edit images
You can generate and edit images using a Gemini model.
Generate images (text-only input)
In that section, you'll also click a button for your chosen Gemini API provider so that you see provider-specific content on this page.
You can ask a Gemini model to generate images by prompting with text.
Make sure to create a GenerativeModel
instance,
include response modalities of TEXT
and IMAGE
in your model configuration
(or exclude TEXT
if you only want image output),
and call generateContent
.
Swift
import
FirebaseAILogic
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
let
generativeModel
=
FirebaseAI
.
firebaseAI
(
backend
:
.
googleAI
()).
generativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required).
generationConfig
:
GenerationConfig
(
responseModalities
:
[.
text
,
.
image
])
)
// Provide a text prompt instructing the model to generate an image
let
prompt
=
"Generate an image of the Eiffel tower with fireworks in the background."
// To generate an image, call `generateContent` with the text input
let
response
=
try
await
model
.
generateContent
(
prompt
)
// Handle the generated image
guard
let
inlineDataPart
=
response
.
inlineDataParts
.
first
else
{
fatalError
(
"No image data in response."
)
}
guard
let
uiImage
=
UIImage
(
data
:
inlineDataPart
.
data
)
else
{
fatalError
(
"Failed to convert data to UIImage."
)
}
Kotlin
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
val
model
=
Firebase
.
ai
(
backend
=
GenerativeBackend
.
googleAI
()).
generativeModel
(
modelName
=
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
generationConfig
=
generationConfig
{
responseModalities
=
listOf
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
)
}
)
// Provide a text prompt instructing the model to generate an image
val
prompt
=
"Generate an image of the Eiffel tower with fireworks in the background."
// To generate image output, call `generateContent` with the text input
val
generatedImageAsBitmap
=
model
.
generateContent
(
prompt
)
// Handle the generated image
.
candidates
.
first
().
content
.
parts
.
filterIsInstance<ImagePart>
().
firstOrNull
()
?.
image
Java
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output
GenerativeModel
ai
=
FirebaseAI
.
getInstance
(
GenerativeBackend
.
googleAI
()).
generativeModel
(
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
new
GenerationConfig
.
Builder
()
.
setResponseModalities
(
Arrays
.
asList
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
))
.
build
()
);
GenerativeModelFutures
model
=
GenerativeModelFutures
.
from
(
ai
);
// Provide a text prompt instructing the model to generate an image
Content
prompt
=
new
Content
.
Builder
()
.
addText
(
"Generate an image of the Eiffel Tower with fireworks in the background."
)
.
build
();
// To generate an image, call `generateContent` with the text input
ListenableFuture<GenerateContentResponse>
response
=
model
.
generateContent
(
prompt
);
Futures
.
addCallback
(
response
,
new
FutureCallback<GenerateContentResponse>
()
{
@Override
public
void
onSuccess
(
GenerateContentResponse
result
)
{
// iterate over all the parts in the first candidate in the result object
for
(
Part
part
:
result
.
getCandidates
().
get
(
0
).
getContent
().
getParts
())
{
if
(
part
instanceof
ImagePart
)
{
ImagePart
imagePart
=
(
ImagePart
)
part
;
// The returned image as a bitmap
Bitmap
generatedImageAsBitmap
=
imagePart
.
getImage
();
break
;
}
}
}
@Override
public
void
onFailure
(
Throwable
t
)
{
t
.
printStackTrace
();
}
},
executor
);
Web
import
{
initializeApp
}
from
"firebase/app"
;
import
{
getAI
,
getGenerativeModel
,
GoogleAIBackend
,
ResponseModality
}
from
"firebase/ai"
;
// TODO(developer) Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const
firebaseConfig
=
{
// ...
};
// Initialize FirebaseApp
const
firebaseApp
=
initializeApp
(
firebaseConfig
);
// Initialize the Gemini Developer API backend service.
const
ai
=
getAI
(
firebaseApp
,
{
backend
:
new
GoogleAIBackend
()
});
// Create a `GenerativeModel` instance with a model that supports your use case
const
model
=
getGenerativeModel
(
ai
,
{
model
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
generationConfig
:
{
responseModalities
:
[
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
],
},
});
// Provide a text prompt instructing the model to generate an image
const
prompt
=
'Generate an image of the Eiffel Tower with fireworks in the background.'
;
// To generate an image, call `generateContent` with the text input
const
result
=
model
.
generateContent
(
prompt
);
// Handle the generated image
try
{
const
inlineDataParts
=
result
.
response
.
inlineDataParts
();
if
(
inlineDataParts
?
.[
0
])
{
const
image
=
inlineDataParts
[
0
].
inlineData
;
console
.
log
(
image
.
mimeType
,
image
.
data
);
}
}
catch
(
err
)
{
console
.
error
(
'Prompt or candidate was blocked:'
,
err
);
}
Dart
import
'package:firebase_ai/firebase_ai.dart'
;
import
'package:firebase_core/firebase_core.dart'
;
import
'firebase_options.dart'
;
await
Firebase
.
initializeApp
(
options:
DefaultFirebaseOptions
.
currentPlatform
,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
final
model
=
FirebaseAI
.
googleAI
().
generativeModel
(
model:
'gemini-3.1-flash-image'
,
// Configure the model to respond with text and images (required).
generationConfig:
GenerationConfig
(
responseModalities:
[
ResponseModalities
.
text
,
ResponseModalities
.
image
]),
);
// Provide a text prompt instructing the model to generate an image
final
prompt
=
[
Content
.
text
(
'Generate an image of the Eiffel Tower with fireworks in the background.'
)];
// To generate an image, call `generateContent` with the text input
final
response
=
await
model
.
generateContent
(
prompt
);
if
(
response
.
inlineDataParts
.
isNotEmpty
)
{
final
imageBytes
=
response
.
inlineDataParts
[
0
].
bytes
;
// Process the image
}
else
{
// Handle the case where no images were generated
print
(
'Error: No images were generated.'
);
}
Unity
using
Firebase
;
using
Firebase.AI
;
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
var
model
=
FirebaseAI
.
GetInstance
(
FirebaseAI
.
Backend
.
GoogleAI
()).
GetGenerativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required).
generationConfig
:
new
GenerationConfig
(
responseModalities
:
new
[]
{
ResponseModality
.
Text
,
ResponseModality
.
Image
})
);
// Provide a text prompt instructing the model to generate an image
var
prompt
=
"Generate an image of the Eiffel Tower with fireworks in the background."
;
// To generate an image, call `GenerateContentAsync` with the text input
var
response
=
await
model
.
GenerateContentAsync
(
prompt
);
var
text
=
response
.
Text
;
if
(
!
string
.
IsNullOrWhiteSpace
(
text
))
{
// Do something with the text
}
// Handle the generated image
var
imageParts
=
response
.
Candidates
.
First
().
Content
.
Parts
.
OfType
<
ModelContent
.
InlineDataPart
>
()
.
Where
(
part
=>
part
.
MimeType
==
"image/png"
);
foreach
(
var
imagePart
in
imageParts
)
{
// Load the Image into a Unity Texture2D object
UnityEngine
.
Texture2D
texture2D
=
new
(
2
,
2
);
if
(
texture2D
.
LoadImage
(
imagePart
.
Data
.
ToArray
()))
{
// Do something with the image
}
}
Generate interleaved images and text
In that section, you'll also click a button for your chosen Gemini API provider so that you see provider-specific content on this page.
You can ask a Gemini model to generate interleaved images with its text responses. For example, you can generate images of what each step of a generated recipe might look like along with the step's instructions, and you don't have to make separate requests to the model or different models.
Make sure to create a GenerativeModel
instance,
include response modalities of TEXT
and IMAGE
in your model configuration,
and call generateContent
.
Swift
import
FirebaseAILogic
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
let
generativeModel
=
FirebaseAI
.
firebaseAI
(
backend
:
.
googleAI
()).
generativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required).
generationConfig
:
GenerationConfig
(
responseModalities
:
[.
text
,
.
image
])
)
// Provide a text prompt instructing the model to generate interleaved text and images
let
prompt
=
"""
Generate an illustrated recipe for a paella.
Create images to go alongside the text as you generate the recipe
"""
// To generate interleaved text and images, call `generateContent` with the text input
let
response
=
try
await
model
.
generateContent
(
prompt
)
// Handle the generated text and image
guard
let
candidate
=
response
.
candidates
.
first
else
{
fatalError
(
"No candidates in response."
)
}
for
part
in
candidate
.
content
.
parts
{
switch
part
{
case
let
textPart
as
TextPart
:
// Do something with the generated text
let
text
=
textPart
.
text
case
let
inlineDataPart
as
InlineDataPart
:
// Do something with the generated image
guard
let
uiImage
=
UIImage
(
data
:
inlineDataPart
.
data
)
else
{
fatalError
(
"Failed to convert data to UIImage."
)
}
default
:
fatalError
(
"Unsupported part type:
\(
part
)
"
)
}
}
Kotlin
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
val
model
=
Firebase
.
ai
(
backend
=
GenerativeBackend
.
googleAI
()).
generativeModel
(
modelName
=
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
generationConfig
=
generationConfig
{
responseModalities
=
listOf
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
)
}
)
// Provide a text prompt instructing the model to generate interleaved text and images
val
prompt
=
"""
Generate an illustrated recipe for a paella.
Create images to go alongside the text as you generate the recipe
"""
.
trimIndent
()
// To generate interleaved text and images, call `generateContent` with the text input
val
responseContent
=
model
.
generateContent
(
prompt
).
candidates
.
first
().
content
// The response will contain image and text parts interleaved
for
(
part
in
responseContent
.
parts
)
{
when
(
part
)
{
is
ImagePart
->
{
// ImagePart as a bitmap
val
generatedImageAsBitmap
:
Bitmap?
=
part
.
asImageOrNull
()
}
is
TextPart
->
{
// Text content from the TextPart
val
text
=
part
.
text
}
}
}
Java
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output
GenerativeModel
ai
=
FirebaseAI
.
getInstance
(
GenerativeBackend
.
googleAI
()).
generativeModel
(
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
new
GenerationConfig
.
Builder
()
.
setResponseModalities
(
Arrays
.
asList
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
))
.
build
()
);
GenerativeModelFutures
model
=
GenerativeModelFutures
.
from
(
ai
);
// Provide a text prompt instructing the model to generate interleaved text and images
Content
prompt
=
new
Content
.
Builder
()
.
addText
(
"Generate an illustrated recipe for a paella.\n"
+
"Create images to go alongside the text as you generate the recipe"
)
.
build
();
// To generate interleaved text and images, call `generateContent` with the text input
ListenableFuture<GenerateContentResponse>
response
=
model
.
generateContent
(
prompt
);
Futures
.
addCallback
(
response
,
new
FutureCallback<GenerateContentResponse>
()
{
@Override
public
void
onSuccess
(
GenerateContentResponse
result
)
{
Content
responseContent
=
result
.
getCandidates
().
get
(
0
).
getContent
();
// The response will contain image and text parts interleaved
for
(
Part
part
:
responseContent
.
getParts
())
{
if
(
part
instanceof
ImagePart
)
{
// ImagePart as a bitmap
Bitmap
generatedImageAsBitmap
=
((
ImagePart
)
part
).
getImage
();
}
else
if
(
part
instanceof
TextPart
){
// Text content from the TextPart
String
text
=
((
TextPart
)
part
).
getText
();
}
}
}
@Override
public
void
onFailure
(
Throwable
t
)
{
System
.
err
.
println
(
t
);
}
},
executor
);
Web
import
{
initializeApp
}
from
"firebase/app"
;
import
{
getAI
,
getGenerativeModel
,
GoogleAIBackend
,
ResponseModality
}
from
"firebase/ai"
;
// TODO(developer) Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const
firebaseConfig
=
{
// ...
};
// Initialize FirebaseApp
const
firebaseApp
=
initializeApp
(
firebaseConfig
);
// Initialize the Gemini Developer API backend service.
const
ai
=
getAI
(
firebaseApp
,
{
backend
:
new
GoogleAIBackend
()
});
// Create a `GenerativeModel` instance with a model that supports your use case
const
model
=
getGenerativeModel
(
ai
,
{
model
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
generationConfig
:
{
responseModalities
:
[
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
],
},
});
// Provide a text prompt instructing the model to generate interleaved text and images
const
prompt
=
'Generate an illustrated recipe for a paella.\n.'
+
'Create images to go alongside the text as you generate the recipe'
;
// To generate interleaved text and images, call `generateContent` with the text input
const
result
=
await
model
.
generateContent
(
prompt
);
// Handle the generated text and image
try
{
const
response
=
result
.
response
;
if
(
response
.
candidates
?
.[
0
].
content
?
.
parts
)
{
for
(
const
part
of
response
.
candidates
?
.[
0
].
content
?
.
parts
)
{
if
(
part
.
text
)
{
// Do something with the text
console
.
log
(
part
.
text
)
}
if
(
part
.
inlineData
)
{
// Do something with the image
const
image
=
part
.
inlineData
;
console
.
log
(
image
.
mimeType
,
image
.
data
);
}
}
}
}
catch
(
err
)
{
console
.
error
(
'Prompt or candidate was blocked:'
,
err
);
}
Dart
import
'package:firebase_ai/firebase_ai.dart'
;
import
'package:firebase_core/firebase_core.dart'
;
import
'firebase_options.dart'
;
await
Firebase
.
initializeApp
(
options:
DefaultFirebaseOptions
.
currentPlatform
,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
final
model
=
FirebaseAI
.
googleAI
().
generativeModel
(
model:
'gemini-3.1-flash-image'
,
// Configure the model to respond with text and images (required).
generationConfig:
GenerationConfig
(
responseModalities:
[
ResponseModalities
.
text
,
ResponseModalities
.
image
]),
);
// Provide a text prompt instructing the model to generate interleaved text and images
final
prompt
=
[
Content
.
text
(
'Generate an illustrated recipe for a paella
\n
'
+
'Create images to go alongside the text as you generate the recipe'
)];
// To generate interleaved text and images, call `generateContent` with the text input
final
response
=
await
model
.
generateContent
(
prompt
);
// Handle the generated text and image
final
parts
=
response
.
candidates
.
firstOrNull
?
.
content
.
parts
if
(
parts
.
isNotEmpty
)
{
for
(
final
part
in
parts
)
{
if
(
part
is
TextPart
)
{
// Do something with text part
final
text
=
part
.
text
}
if
(
part
is
InlineDataPart
)
{
// Process image
final
imageBytes
=
part
.
bytes
}
}
}
else
{
// Handle the case where no images were generated
print
(
'Error: No images were generated.'
);
}
Unity
using
Firebase
;
using
Firebase.AI
;
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
var
model
=
FirebaseAI
.
GetInstance
(
FirebaseAI
.
Backend
.
GoogleAI
()).
GetGenerativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required).
generationConfig
:
new
GenerationConfig
(
responseModalities
:
new
[]
{
ResponseModality
.
Text
,
ResponseModality
.
Image
})
);
// Provide a text prompt instructing the model to generate interleaved text and images
var
prompt
=
"Generate an illustrated recipe for a paella \n"
+
"Create images to go alongside the text as you generate the recipe"
;
// To generate interleaved text and images, call `GenerateContentAsync` with the text input
var
response
=
await
model
.
GenerateContentAsync
(
prompt
);
// Handle the generated text and image
foreach
(
var
part
in
response
.
Candidates
.
First
().
Content
.
Parts
)
{
if
(
part
is
ModelContent
.
TextPart
textPart
)
{
if
(
!
string
.
IsNullOrWhiteSpace
(
textPart
.
Text
))
{
// Do something with the text
}
}
else
if
(
part
is
ModelContent
.
InlineDataPart
dataPart
)
{
if
(
dataPart
.
MimeType
==
"image/png"
)
{
// Load the Image into a Unity Texture2D object
UnityEngine
.
Texture2D
texture2D
=
new
(
2
,
2
);
if
(
texture2D
.
LoadImage
(
dataPart
.
Data
.
ToArray
()))
{
// Do something with the image
}
}
}
}
Edit images (text-and-image input)
In that section, you'll also click a button for your chosen Gemini API provider so that you see provider-specific content on this page.
You can ask a Gemini model to edit images by prompting with text and one or more images.
Make sure to create a GenerativeModel
instance,
include response modalities of TEXT
and IMAGE
in your model configuration
(or exclude TEXT
if you only want image output),
and call generateContent
.
Swift
import
FirebaseAILogic
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
let
generativeModel
=
FirebaseAI
.
firebaseAI
(
backend
:
.
googleAI
()).
generativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required).
generationConfig
:
GenerationConfig
(
responseModalities
:
[.
text
,
.
image
])
)
// Provide an image for the model to edit
guard
let
image
=
UIImage
(
named
:
"scones"
)
else
{
fatalError
(
"Image file not found."
)
}
// Provide a text prompt instructing the model to edit the image
let
prompt
=
"Edit this image to make it look like a cartoon"
// To edit the image, call `generateContent` with the image and text input
let
response
=
try
await
model
.
generateContent
(
image
,
prompt
)
// Handle the generated image
guard
let
inlineDataPart
=
response
.
inlineDataParts
.
first
else
{
fatalError
(
"No image data in response."
)
}
guard
let
uiImage
=
UIImage
(
data
:
inlineDataPart
.
data
)
else
{
fatalError
(
"Failed to convert data to UIImage."
)
}
Kotlin
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
val
model
=
Firebase
.
ai
(
backend
=
GenerativeBackend
.
googleAI
()).
generativeModel
(
modelName
=
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
generationConfig
=
generationConfig
{
responseModalities
=
listOf
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
)
}
)
// Provide an image for the model to edit
val
bitmap
=
BitmapFactory
.
decodeResource
(
context
.
resources
,
R
.
drawable
.
scones
)
// Provide a text prompt instructing the model to edit the image
val
prompt
=
content
{
image
(
bitmap
)
text
(
"Edit this image to make it look like a cartoon"
)
}
// To edit the image, call `generateContent` with the prompt (image and text input)
val
generatedImageAsBitmap
=
model
.
generateContent
(
prompt
)
// Handle the generated text and image
.
candidates
.
first
().
content
.
parts
.
filterIsInstance<ImagePart>
().
firstOrNull
()
?.
image
Java
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output
GenerativeModel
ai
=
FirebaseAI
.
getInstance
(
GenerativeBackend
.
googleAI
()).
generativeModel
(
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
new
GenerationConfig
.
Builder
()
.
setResponseModalities
(
Arrays
.
asList
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
))
.
build
()
);
GenerativeModelFutures
model
=
GenerativeModelFutures
.
from
(
ai
);
// Provide an image for the model to edit
Bitmap
bitmap
=
BitmapFactory
.
decodeResource
(
resources
,
R
.
drawable
.
scones
);
// Provide a text prompt instructing the model to edit the image
Content
promptcontent
=
new
Content
.
Builder
()
.
addImage
(
bitmap
)
.
addText
(
"Edit this image to make it look like a cartoon"
)
.
build
();
// To edit the image, call `generateContent` with the prompt (image and text input)
ListenableFuture<GenerateContentResponse>
response
=
model
.
generateContent
(
promptcontent
);
Futures
.
addCallback
(
response
,
new
FutureCallback<GenerateContentResponse>
()
{
@Override
public
void
onSuccess
(
GenerateContentResponse
result
)
{
// iterate over all the parts in the first candidate in the result object
for
(
Part
part
:
result
.
getCandidates
().
get
(
0
).
getContent
().
getParts
())
{
if
(
part
instanceof
ImagePart
)
{
ImagePart
imagePart
=
(
ImagePart
)
part
;
Bitmap
generatedImageAsBitmap
=
imagePart
.
getImage
();
break
;
}
}
}
@Override
public
void
onFailure
(
Throwable
t
)
{
t
.
printStackTrace
();
}
},
executor
);
Web
import
{
initializeApp
}
from
"firebase/app"
;
import
{
getAI
,
getGenerativeModel
,
GoogleAIBackend
,
ResponseModality
}
from
"firebase/ai"
;
// TODO(developer) Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const
firebaseConfig
=
{
// ...
};
// Initialize FirebaseApp
const
firebaseApp
=
initializeApp
(
firebaseConfig
);
// Initialize the Gemini Developer API backend service.
const
ai
=
getAI
(
firebaseApp
,
{
backend
:
new
GoogleAIBackend
()
});
// Create a `GenerativeModel` instance with a model that supports your use case
const
model
=
getGenerativeModel
(
ai
,
{
model
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
generationConfig
:
{
responseModalities
:
[
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
],
},
});
// Prepare an image for the model to edit
async
function
fileToGenerativePart
(
file
)
{
const
base64EncodedDataPromise
=
new
Promise
((
resolve
)
=>
{
const
reader
=
new
FileReader
();
reader
.
onloadend
=
()
=>
resolve
(
reader
.
result
.
split
(
','
)[
1
]);
reader
.
readAsDataURL
(
file
);
});
return
{
inlineData
:
{
data
:
await
base64EncodedDataPromise
,
mimeType
:
file
.
type
},
};
}
// Provide a text prompt instructing the model to edit the image
const
prompt
=
"Edit this image to make it look like a cartoon"
;
const
fileInputEl
=
document
.
querySelector
(
"input[type=file]"
);
const
imagePart
=
await
fileToGenerativePart
(
fileInputEl
.
files
[
0
]);
// To edit the image, call `generateContent` with the image and text input
const
result
=
await
model
.
generateContent
([
prompt
,
imagePart
]);
// Handle the generated image
try
{
const
inlineDataParts
=
result
.
response
.
inlineDataParts
();
if
(
inlineDataParts
?
.[
0
])
{
const
image
=
inlineDataParts
[
0
].
inlineData
;
console
.
log
(
image
.
mimeType
,
image
.
data
);
}
}
catch
(
err
)
{
console
.
error
(
'Prompt or candidate was blocked:'
,
err
);
}
Dart
import
'package:firebase_ai/firebase_ai.dart'
;
import
'package:firebase_core/firebase_core.dart'
;
import
'firebase_options.dart'
;
await
Firebase
.
initializeApp
(
options:
DefaultFirebaseOptions
.
currentPlatform
,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
final
model
=
FirebaseAI
.
googleAI
().
generativeModel
(
model:
'gemini-3.1-flash-image'
,
// Configure the model to respond with text and images (required).
generationConfig:
GenerationConfig
(
responseModalities:
[
ResponseModalities
.
text
,
ResponseModalities
.
image
]),
);
// Prepare an image for the model to edit
final
image
=
await
File
(
'scones.jpg'
).
readAsBytes
();
final
imagePart
=
InlineDataPart
(
'image/jpeg'
,
image
);
// Provide a text prompt instructing the model to edit the image
final
prompt
=
TextPart
(
"Edit this image to make it look like a cartoon"
);
// To edit the image, call `generateContent` with the image and text input
final
response
=
await
model
.
generateContent
([
Content
.
multi
([
prompt
,
imagePart
])
]);
// Handle the generated image
if
(
response
.
inlineDataParts
.
isNotEmpty
)
{
final
imageBytes
=
response
.
inlineDataParts
[
0
].
bytes
;
// Process the image
}
else
{
// Handle the case where no images were generated
print
(
'Error: No images were generated.'
);
}
Unity
using
Firebase
;
using
Firebase.AI
;
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
var
model
=
FirebaseAI
.
GetInstance
(
FirebaseAI
.
Backend
.
GoogleAI
()).
GetGenerativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required).
generationConfig
:
new
GenerationConfig
(
responseModalities
:
new
[]
{
ResponseModality
.
Text
,
ResponseModality
.
Image
})
);
// Prepare an image for the model to edit
var
imageFile
=
System
.
IO
.
File
.
ReadAllBytes
(
System
.
IO
.
Path
.
Combine
(
UnityEngine
.
Application
.
streamingAssetsPath
,
"scones.jpg"
));
var
image
=
ModelContent
.
InlineData
(
"image/jpeg"
,
imageFile
);
// Provide a text prompt instructing the model to edit the image
var
prompt
=
ModelContent
.
Text
(
"Edit this image to make it look like a cartoon."
);
// To edit the image, call `GenerateContent` with the image and text input
var
response
=
await
model
.
GenerateContentAsync
(
new
[]
{
prompt
,
image
});
var
text
=
response
.
Text
;
if
(
!
string
.
IsNullOrWhiteSpace
(
text
))
{
// Do something with the text
}
// Handle the generated image
var
imageParts
=
response
.
Candidates
.
First
().
Content
.
Parts
.
OfType
<
ModelContent
.
InlineDataPart
>
()
.
Where
(
part
=>
part
.
MimeType
==
"image/png"
);
foreach
(
var
imagePart
in
imageParts
)
{
// Load the Image into a Unity Texture2D object
Texture2D
texture2D
=
new
Texture2D
(
2
,
2
);
if
(
texture2D
.
LoadImage
(
imagePart
.
Data
.
ToArray
()))
{
// Do something with the image
}
}
Iterate and edit images using multi-turn chat
In that section, you'll also click a button for your chosen Gemini API provider so that you see provider-specific content on this page.
Using multi-turn chat, you can iterate with a Gemini model on the images that it generates or that you supply.
Make sure to create a GenerativeModel
instance,
include response modalities of TEXT
and IMAGE
in your model configuration
(or exclude TEXT
if you only want image output),
and call startChat()
and sendMessage()
to send new user messages.
Swift
import
FirebaseAILogic
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
let
generativeModel
=
FirebaseAI
.
firebaseAI
(
backend
:
.
googleAI
()).
generativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required).
generationConfig
:
GenerationConfig
(
responseModalities
:
[.
text
,
.
image
])
)
// Initialize the chat
let
chat
=
model
.
startChat
()
guard
let
image
=
UIImage
(
named
:
"scones"
)
else
{
fatalError
(
"Image file not found."
)
}
// Provide an initial text prompt instructing the model to edit the image
let
prompt
=
"Edit this image to make it look like a cartoon"
// To generate an initial response, send a user message with the image and text prompt
let
response
=
try
await
chat
.
sendMessage
(
image
,
prompt
)
// Inspect the generated image
guard
let
inlineDataPart
=
response
.
inlineDataParts
.
first
else
{
fatalError
(
"No image data in response."
)
}
guard
let
uiImage
=
UIImage
(
data
:
inlineDataPart
.
data
)
else
{
fatalError
(
"Failed to convert data to UIImage."
)
}
// Follow up requests do not need to specify the image again
let
followUpResponse
=
try
await
chat
.
sendMessage
(
"But make it old-school line drawing style"
)
// Inspect the edited image after the follow up request
guard
let
followUpInlineDataPart
=
followUpResponse
.
inlineDataParts
.
first
else
{
fatalError
(
"No image data in response."
)
}
guard
let
followUpUIImage
=
UIImage
(
data
:
followUpInlineDataPart
.
data
)
else
{
fatalError
(
"Failed to convert data to UIImage."
)
}
Kotlin
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
val
model
=
Firebase
.
ai
(
backend
=
GenerativeBackend
.
googleAI
()).
generativeModel
(
modelName
=
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
generationConfig
=
generationConfig
{
responseModalities
=
listOf
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
)
}
)
// Provide an image for the model to edit
val
bitmap
=
BitmapFactory
.
decodeResource
(
context
.
resources
,
R
.
drawable
.
scones
)
// Create the initial prompt instructing the model to edit the image
val
prompt
=
content
{
image
(
bitmap
)
text
(
"Edit this image to make it look like a cartoon"
)
}
// Initialize the chat
val
chat
=
model
.
startChat
()
// To generate an initial response, send a user message with the image and text prompt
var
response
=
chat
.
sendMessage
(
prompt
)
// Inspect the returned image
var
generatedImageAsBitmap
=
response
.
candidates
.
first
().
content
.
parts
.
filterIsInstance<ImagePart>
().
firstOrNull
()
?.
image
// Follow up requests do not need to specify the image again
response
=
chat
.
sendMessage
(
"But make it old-school line drawing style"
)
generatedImageAsBitmap
=
response
.
candidates
.
first
().
content
.
parts
.
filterIsInstance<ImagePart>
().
firstOrNull
()
?.
image
Java
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output
GenerativeModel
ai
=
FirebaseAI
.
getInstance
(
GenerativeBackend
.
googleAI
()).
generativeModel
(
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
new
GenerationConfig
.
Builder
()
.
setResponseModalities
(
Arrays
.
asList
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
))
.
build
()
);
GenerativeModelFutures
model
=
GenerativeModelFutures
.
from
(
ai
);
// Provide an image for the model to edit
Bitmap
bitmap
=
BitmapFactory
.
decodeResource
(
resources
,
R
.
drawable
.
scones
);
// Initialize the chat
ChatFutures
chat
=
model
.
startChat
();
// Create the initial prompt instructing the model to edit the image
Content
prompt
=
new
Content
.
Builder
()
.
setRole
(
"user"
)
.
addImage
(
bitmap
)
.
addText
(
"Edit this image to make it look like a cartoon"
)
.
build
();
// To generate an initial response, send a user message with the image and text prompt
ListenableFuture<GenerateContentResponse>
response
=
chat
.
sendMessage
(
prompt
);
// Extract the image from the initial response
ListenableFuture
< @Nullable
Bitmap
>
initialRequest
=
Futures
.
transform
(
response
,
result
-
>
{
for
(
Part
part
:
result
.
getCandidates
().
get
(
0
).
getContent
().
getParts
())
{
if
(
part
instanceof
ImagePart
)
{
ImagePart
imagePart
=
(
ImagePart
)
part
;
return
imagePart
.
getImage
();
}
}
return
null
;
},
executor
);
// Follow up requests do not need to specify the image again
ListenableFuture<GenerateContentResponse>
modelResponseFuture
=
Futures
.
transformAsync
(
initialRequest
,
generatedImage
-
>
{
Content
followUpPrompt
=
new
Content
.
Builder
()
.
addText
(
"But make it old-school line drawing style"
)
.
build
();
return
chat
.
sendMessage
(
followUpPrompt
);
},
executor
);
// Add a final callback to check the reworked image
Futures
.
addCallback
(
modelResponseFuture
,
new
FutureCallback<GenerateContentResponse>
()
{
@Override
public
void
onSuccess
(
GenerateContentResponse
result
)
{
for
(
Part
part
:
result
.
getCandidates
().
get
(
0
).
getContent
().
getParts
())
{
if
(
part
instanceof
ImagePart
)
{
ImagePart
imagePart
=
(
ImagePart
)
part
;
Bitmap
generatedImageAsBitmap
=
imagePart
.
getImage
();
break
;
}
}
}
@Override
public
void
onFailure
(
Throwable
t
)
{
t
.
printStackTrace
();
}
},
executor
);
Web
import
{
initializeApp
}
from
"firebase/app"
;
import
{
getAI
,
getGenerativeModel
,
GoogleAIBackend
,
ResponseModality
}
from
"firebase/ai"
;
// TODO(developer) Replace the following with your app's Firebase configuration
// See: https://firebase.google.com/docs/web/learn-more#config-object
const
firebaseConfig
=
{
// ...
};
// Initialize FirebaseApp
const
firebaseApp
=
initializeApp
(
firebaseConfig
);
// Initialize the Gemini Developer API backend service.
const
ai
=
getAI
(
firebaseApp
,
{
backend
:
new
GoogleAIBackend
()
});
// Create a `GenerativeModel` instance with a model that supports your use case
const
model
=
getGenerativeModel
(
ai
,
{
model
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required)
generationConfig
:
{
responseModalities
:
[
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
],
},
});
// Prepare an image for the model to edit
async
function
fileToGenerativePart
(
file
)
{
const
base64EncodedDataPromise
=
new
Promise
((
resolve
)
=>
{
const
reader
=
new
FileReader
();
reader
.
onloadend
=
()
=>
resolve
(
reader
.
result
.
split
(
','
)[
1
]);
reader
.
readAsDataURL
(
file
);
});
return
{
inlineData
:
{
data
:
await
base64EncodedDataPromise
,
mimeType
:
file
.
type
},
};
}
const
fileInputEl
=
document
.
querySelector
(
"input[type=file]"
);
const
imagePart
=
await
fileToGenerativePart
(
fileInputEl
.
files
[
0
]);
// Provide an initial text prompt instructing the model to edit the image
const
prompt
=
"Edit this image to make it look like a cartoon"
;
// Initialize the chat
const
chat
=
model
.
startChat
();
// To generate an initial response, send a user message with the image and text prompt
const
result
=
await
chat
.
sendMessage
([
prompt
,
imagePart
]);
// Request and inspect the generated image
try
{
const
inlineDataParts
=
result
.
response
.
inlineDataParts
();
if
(
inlineDataParts
?
.[
0
])
{
// Inspect the generated image
const
image
=
inlineDataParts
[
0
].
inlineData
;
console
.
log
(
image
.
mimeType
,
image
.
data
);
}
}
catch
(
err
)
{
console
.
error
(
'Prompt or candidate was blocked:'
,
err
);
}
// Follow up requests do not need to specify the image again
const
followUpResult
=
await
chat
.
sendMessage
(
"But make it old-school line drawing style"
);
// Request and inspect the returned image
try
{
const
followUpInlineDataParts
=
followUpResult
.
response
.
inlineDataParts
();
if
(
followUpInlineDataParts
?
.[
0
])
{
// Inspect the generated image
const
followUpImage
=
followUpInlineDataParts
[
0
].
inlineData
;
console
.
log
(
followUpImage
.
mimeType
,
followUpImage
.
data
);
}
}
catch
(
err
)
{
console
.
error
(
'Prompt or candidate was blocked:'
,
err
);
}
Dart
import
'package:firebase_ai/firebase_ai.dart'
;
import
'package:firebase_core/firebase_core.dart'
;
import
'firebase_options.dart'
;
await
Firebase
.
initializeApp
(
options:
DefaultFirebaseOptions
.
currentPlatform
,
);
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
final
model
=
FirebaseAI
.
googleAI
().
generativeModel
(
model:
'gemini-3.1-flash-image'
,
// Configure the model to respond with text and images (required).
generationConfig:
GenerationConfig
(
responseModalities:
[
ResponseModalities
.
text
,
ResponseModalities
.
image
]),
);
// Prepare an image for the model to edit
final
image
=
await
File
(
'scones.jpg'
).
readAsBytes
();
final
imagePart
=
InlineDataPart
(
'image/jpeg'
,
image
);
// Provide an initial text prompt instructing the model to edit the image
final
prompt
=
TextPart
(
"Edit this image to make it look like a cartoon"
);
// Initialize the chat
final
chat
=
model
.
startChat
();
// To generate an initial response, send a user message with the image and text prompt
final
response
=
await
chat
.
sendMessage
([
Content
.
multi
([
prompt
,
imagePart
])
]);
// Inspect the returned image
if
(
response
.
inlineDataParts
.
isNotEmpty
)
{
final
imageBytes
=
response
.
inlineDataParts
[
0
].
bytes
;
// Process the image
}
else
{
// Handle the case where no images were generated
print
(
'Error: No images were generated.'
);
}
// Follow up requests do not need to specify the image again
final
followUpResponse
=
await
chat
.
sendMessage
([
Content
.
text
(
"But make it old-school line drawing style"
)
]);
// Inspect the returned image
if
(
followUpResponse
.
inlineDataParts
.
isNotEmpty
)
{
final
followUpImageBytes
=
response
.
inlineDataParts
[
0
].
bytes
;
// Process the image
}
else
{
// Handle the case where no images were generated
print
(
'Error: No images were generated.'
);
}
Unity
using
Firebase
;
using
Firebase.AI
;
// Initialize the Gemini Developer API backend service.
// Create a `GenerativeModel` instance with a Gemini model that supports image output.
var
model
=
FirebaseAI
.
GetInstance
(
FirebaseAI
.
Backend
.
GoogleAI
()).
GetGenerativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
// Configure the model to respond with text and images (required).
generationConfig
:
new
GenerationConfig
(
responseModalities
:
new
[]
{
ResponseModality
.
Text
,
ResponseModality
.
Image
})
);
// Prepare an image for the model to edit
var
imageFile
=
System
.
IO
.
File
.
ReadAllBytes
(
System
.
IO
.
Path
.
Combine
(
UnityEngine
.
Application
.
streamingAssetsPath
,
"scones.jpg"
));
var
image
=
ModelContent
.
InlineData
(
"image/jpeg"
,
imageFile
);
// Provide an initial text prompt instructing the model to edit the image
var
prompt
=
ModelContent
.
Text
(
"Edit this image to make it look like a cartoon."
);
// Initialize the chat
var
chat
=
model
.
StartChat
();
// To generate an initial response, send a user message with the image and text prompt
var
response
=
await
chat
.
SendMessageAsync
(
new
[]
{
prompt
,
image
});
// Inspect the returned image
var
imageParts
=
response
.
Candidates
.
First
().
Content
.
Parts
.
OfType
<
ModelContent
.
InlineDataPart
>
()
.
Where
(
part
=>
part
.
MimeType
==
"image/png"
);
// Load the image into a Unity Texture2D object
UnityEngine
.
Texture2D
texture2D
=
new
(
2
,
2
);
if
(
texture2D
.
LoadImage
(
imageParts
.
First
().
Data
.
ToArray
()))
{
// Do something with the image
}
// Follow up requests do not need to specify the image again
var
followUpResponse
=
await
chat
.
SendMessageAsync
(
"But make it old-school line drawing style"
);
// Inspect the returned image
var
followUpImageParts
=
followUpResponse
.
Candidates
.
First
().
Content
.
Parts
.
OfType
<
ModelContent
.
InlineDataPart
>
()
.
Where
(
part
=>
part
.
MimeType
==
"image/png"
);
// Load the image into a Unity Texture2D object
UnityEngine
.
Texture2D
followUpTexture2D
=
new
(
2
,
2
);
if
(
followUpTexture2D
.
LoadImage
(
followUpImageParts
.
First
().
Data
.
ToArray
()))
{
// Do something with the image
}
Provide reference images
Gemini Image models let you provide reference images in your prompt. These images can include the following:
-
Gemini 3.x Pro Image (
gemini-3-pro-image, aka "Nano Banana Pro")- Up to 6 images of objects with high-fidelity to include in the final image
- Up to 5 images of characters to maintain character consistency
- Up to 3 images to be used as style references
-
Gemini 3.x Flash Image (
gemini-3.1-flash-image, aka "Nano Banana 2"):- Up to 10 images of objects with high-fidelity to include in the final image
- Up to 4 images of characters to maintain character consistency
-
Gemini 2.5 Flash Image (
gemini-2.5-flash-image, aka "Nano Banana"):- Up to 3 images
Configure image generation
By default, Gemini
Image models generate square images
(1:1 aspect ratio) at 1024x1024 resolution. You can customize the output of your
generated images using the imageConfig
property within generationConfig
.
For example, you can configure the output image to be 16:9 aspect ratio and 2K resolution (resulting image of 2752x1536), like so:
Swift
// ...
let
imageConfig
=
ImageConfig
(
aspectRatio
:
.
landscape16x9
,
imageSize
:
.
size2K
)
let
generationConfig
=
GenerationConfig
(
responseModalities
:
[.
text
,
.
image
],
imageConfig
:
imageConfig
)
// Make sure you initialize your chosen Gemini API backend service
let
model
=
FirebaseAI
.
firebaseAI
().
generativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
generationConfig
:
generationConfig
)
// ...
Kotlin
// ...
val
config
=
generationConfig
{
responseModalities
=
listOf
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
)
imageConfig
=
imageConfig
{
aspectRatio
=
AspectRatio
.
LANDSCAPE_16x9
imageSize
=
ImageSize
.
SIZE_2K
}
}
// Make sure you initialize your chosen Gemini API backend service
val
model
=
Firebase
.
ai
.
generativeModel
(
modelName
=
"gemini-3.1-flash-image"
,
generationConfig
=
config
)
// ...
Java
// ...
GenerationConfig
config
=
new
GenerationConfig
.
Builder
()
.
setResponseModalities
(
Arrays
.
asList
(
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
))
.
setImageConfig
(
ImageConfig
.
builder
()
.
setAspectRatio
(
AspectRatio
.
LANDSCAPE_16x9
)
.
setImageSize
(
ImageSize
.
SIZE_2K
)
.
build
()
)
.
build
();
// Make sure you initialize your chosen Gemini API backend service
GenerativeModel
model
=
FirebaseAI
.
getInstance
().
generativeModel
(
"gemini-3.1-flash-image"
,
config
);
// ...
Web
// ...
const
generationConfig
=
{
responseModalities
:
[
ResponseModality
.
TEXT
,
ResponseModality
.
IMAGE
],
imageConfig
:
{
aspectRatio
:
"16:9"
,
imageSize
:
"2K"
}
};
// Make sure you initialize your chosen Gemini API backend service
const
model
=
getGenerativeModel
(
ai
,
{
model
:
"gemini-3.1-flash-image"
,
generationConfig
});
// ...
Dart
// ...
final
generationConfig
=
GenerationConfig
(
responseModalities:
[
ResponseModalities
.
text
,
ResponseModalities
.
image
],
imageConfig:
ImageConfig
(
aspectRatio:
ImageAspectRatio
.
landscape16x9
,
imageSize:
ImageSize
.
size2K
,
),
);
// Make sure you initialize your chosen Gemini API backend service
final
model
=
FirebaseAI
.
instance
.
generativeModel
(
model:
'gemini-3.1-flash-image,
generationConfig:
generationConfig
,
);
// ...
Unity
// ...
var
generationConfig
=
new
GenerationConfig
(
responseModalities
:
new
[]
{
ResponseModality
.
Text
,
ResponseModality
.
Image
},
imageConfig
:
new
ImageConfig
(
aspectRatio
:
ImageConfig
.
AspectRatio
.
Landscape16x9
,
imageSize
:
ImageConfig
.
ImageSize
.
Size2K
)
);
// Make sure you initialize your chosen Gemini API backend service
var
model
=
FirebaseAI
.
GetInstance
().
GetGenerativeModel
(
modelName
:
"gemini-3.1-flash-image"
,
generationConfig
:
generationConfig
);
// ...
Supported aspect ratios
All Gemini image-generation models support the following aspect ratios:
Default: 1:1
(square)
1:1
, 1:4
, 1:8
, 2:3
, 3:2
, 3:4
, 4:1
, 4:3
, 4:5
, 5:4
, 8:1
, 9:16
, 16:9
, 21:9
Supported image sizes (resolutions)
Supported image sizes (resolutions) depend on the model you're using.
| Gemini Image model | Supported sizes (resolutions) |
|---|---|
Gemini 3.x Pro Image
gemini-3-pro-image
("Nano Banana Pro") |
Default: 1K
(1024)1K
(1024), 2K
(2048), 4K
(4096) |
Gemini 3.x Flash Image
gemini-3.1-flash-image
("Nano Banana 2") |
Default: 1K
(1024)512
, 1K
(1024), 2K
(2048), 4K
(4096) |
Gemini 2.5 Flash Image
gemini-2.5-flash-image
("Nano Banana") |
Fixed at 1K
(1024) |
You must use an uppercase K
suffix (that is, 1K
, 2K
, 4K
).
The 512
value does not use a K
suffix.
A lowercase k
suffix (for example, 1k
) will be rejected.
Supported features
The following are supported features, like modalities, tools, input, and languages.
For supported aspect ratios and resolutions for each model, see Configure image generation earlier in this guide.
Supported modalities
The following are supported "modalities" for Gemini Image models. These "modalities" aren't explicitly set in your requests. They're more like recommended patterns for common use cases. Each modality in this list shows an example prompt and has an example code sample earlier in this guide.
-
Text Image(s) (text-only to image)
- Generate an image of the Eiffel tower with fireworks in the background.
-
Text Image(s) (text rendering within image)
- Generate a cinematic photo of a large building with this giant text projection mapped on the front of the building.
-
Text Image(s) & Text (interleaved)
-
Generate an illustrated recipe for a paella. Create images alongside the text as you generate the recipe.
-
Generate a story about a dog in a 3D cartoon animation style. For each scene, generate an image.
-
-
Image(s) & Text Image(s) & Text (interleaved)
- [image of a furnished room] + What other color sofas would work in my space? Can you update the image?
-
Image editing (text-and-image to image)
-
[image of scones] + Edit this image to make it look like a cartoon
-
[image of a cat] + [image of a pillow] + Create a cross stitch of my cat on this pillow.
-
-
Multi-turn image editing (chat)
- [image of a blue car] + Turn this car into a convertible. , then Now change the color to yellow.
Supported tools
Support for Grounding with
-
Gemini 3.x Pro Image (
gemini-3-pro-image, aka "Nano Banana Pro") -
Gemini 3.x Flash Image (
gemini-3.1-flash-image, aka "Nano Banana 2")
Other supported capabilities
-
Supported multimodal input:
-
Image input: All of the Gemini Image models.
-
Video input: Only Gemini 3.x Flash Image (
gemini-3.1-flash-image, aka "Nano Banana 2") -
Audio input: None of the Gemini Image models.
-
-
All of the Gemini Image models support the following:
- Generating PNG images.
- Generating and editing images of people.
- Using safety filters that provide a flexible and less restrictive user experience.
-
Support for generating structured output (like JSON) :
- Gemini 3.x Pro Image
(
gemini-3-pro-image, aka "Nano Banana Pro")
- Gemini 3.x Pro Image
(
Supported languages
While the Gemini Image models support over 35 languages , the languages listed in this section will give you the best performance.
-
Supported languages for the text prompt:
- Gemini 3.x Image
models:
ar-EG,de-DE,EN,es-MX,fr-FR,hi-IN,id-ID,it-IT,ja-JP,ko-KR,pt-BR,ru-RU,ua-UA,vi-VN,zh-CN - Gemini 2.5 Flash Image
model:
EN,es-MX,ja-JP,zh-CN,hi-IN.
- Gemini 3.x Image
models:
-
Supported languages for the text within the generated image:
- Gemini 3.x Image models: same languages as the list above
- Gemini 2.5 Flash Image model: only English
To use a specific language within a generated image (even without the language code), just ask the model within your prompt (for example, "Update this infographic to be in Spanish. Do not change any other elements of the image." ).
Best practices
The following are best practices for Gemini Image models.
-
When generating an image containing text, first generate the text and then generate an image with that text.
-
Image generation may not always trigger. Also, image or text generation might not work as expected in these situations:
-
The model might only generate text and no image (especially if the prompt is ambiguous). If this happens, the
FinishReasonisNO_IMAGE.
Try asking for image outputs explicitly. For example, "generate an image", "provide images as you go along", "update the image". -
The model may stop generating partway through.Try again or try a different prompt.
-
The model may generate text as an image.Try asking for text outputs explicitly. For example, "generate narrative text along with illustrations".
-
If a prompt is potentially unsafe, the model might not process the request and instead return a response indicating that it can't create unsafe images. If this happens, the
FinishReasonisSTOP.
-

