Skip to content

Commit 126c489

Browse files
authored
feat(js/plugins/google-genai): Added mediaResolution support for Gemini (#3865)
1 parent 7ffa911 commit 126c489

File tree

5 files changed

+71
-0
lines changed

5 files changed

+71
-0
lines changed

‎js/plugins/google-genai/src/common/converters.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ function toGeminiMedia(part: Part): GeminiPart {
134134
media.videoMetadata = { ...videoMetadata };
135135
}
136136

137+
// Media resolution
138+
if (part.metadata?.mediaResolution) {
139+
media.mediaResolution = { ...part.metadata.mediaResolution };
140+
}
141+
137142
return maybeAddGeminiThoughtSignature(part, media);
138143
}
139144

‎js/plugins/google-genai/src/common/types.ts‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,16 @@ export declare interface VideoMetadata {
717717
fps?: number;
718718
}
719719

720+
export enum MediaResolutionLevel {
721+
MEDIA_RESOUTION_LOW = 'MEDIA_RESOUTION_LOW',
722+
MEDIA_RESOLUTION_MEDIUM = 'MEDIA_RESOLUTION_MEDIUM',
723+
MEDIA_RESOLUTION_HIGH = 'MEDIA_RESOLUTION_HIGH',
724+
}
725+
726+
export declare interface MediaResolution {
727+
level?: MediaResolutionLevel;
728+
}
729+
720730
/**
721731
* This is a Gemini Part. (Users never see this
722732
* structure, it is just built by the converters.)
@@ -732,6 +742,7 @@ export declare interface Part {
732742
executableCode?: ExecutableCode;
733743
codeExecutionResult?: CodeExecutionResult;
734744
videoMetadata?: VideoMetadata;
745+
mediaResolution?: MediaResolution;
735746
}
736747

737748
/**

‎js/plugins/google-genai/tests/common/converters_test.ts‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ describe('toGeminiMessage', () => {
125125
contentType: 'image/jpeg',
126126
url: 'data:image/jpeg;base64,SHORTENED_BASE64_DATA',
127127
},
128+
metadata: {
129+
mediaResolution: {
130+
level: 'MEDIA_RESOLUTION_HIGH',
131+
},
132+
},
128133
},
129134
],
130135
},
@@ -137,6 +142,9 @@ describe('toGeminiMessage', () => {
137142
mimeType: 'image/jpeg',
138143
data: 'SHORTENED_BASE64_DATA',
139144
},
145+
mediaResolution: {
146+
level: 'MEDIA_RESOLUTION_HIGH',
147+
},
140148
},
141149
],
142150
},

‎js/testapps/basic-gemini/src/index-vertexai.ts‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,28 @@ ai.defineFlow('reasoning', async (_, { sendChunk }) => {
378378
return message;
379379
});
380380

381+
// Media resolution
382+
ai.defineFlow('gemini-media-resolution', async (_) => {
383+
const plant = fs.readFileSync('palm_tree.png', { encoding: 'base64' });
384+
const { text } = await ai.generate({
385+
model: vertexAI.model('gemini-3-pro-preview'),
386+
prompt: [
387+
{ text: 'What is in this picture?' },
388+
{
389+
media: { url: `data:image/png;base64,${plant}` },
390+
metadata: {
391+
mediaResolution: {
392+
// Or MEDIA_RESOLUTION_LOW Or MEDIA_RESOLUTION_MEDIUM
393+
level: 'MEDIA_RESOLUTION_HIGH',
394+
},
395+
},
396+
},
397+
],
398+
});
399+
400+
return text;
401+
});
402+
381403
// Image editing with Gemini.
382404
ai.defineFlow('gemini-image-editing', async (_) => {
383405
const plant = fs.readFileSync('palm_tree.png', { encoding: 'base64' });

‎js/testapps/basic-gemini/src/index.ts‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,31 @@ ai.defineFlow('reasoning', async (_, { sendChunk }) => {
366366
return message;
367367
});
368368

369+
// Media resolution
370+
ai.defineFlow('gemini-media-resolution', async (_) => {
371+
const plant = fs.readFileSync('palm_tree.png', { encoding: 'base64' });
372+
const { text } = await ai.generate({
373+
model: googleAI.model('gemini-3-pro-preview'),
374+
prompt: [
375+
{ text: 'What is in this picture?' },
376+
{
377+
media: { url: `data:image/png;base64,${plant}` },
378+
metadata: {
379+
mediaResolution: {
380+
// Or MEDIA_RESOLUTION_LOW Or MEDIA_RESOLUTION_MEDIUM
381+
level: 'MEDIA_RESOLUTION_HIGH',
382+
},
383+
},
384+
},
385+
],
386+
config: {
387+
// MediaResolution is currently only supported in v1alpha for googleAI
388+
apiVersion: 'v1alpha',
389+
},
390+
});
391+
return text;
392+
});
393+
369394
// Image editing with Gemini.
370395
ai.defineFlow('gemini-image-editing', async (_) => {
371396
const plant = fs.readFileSync('palm_tree.png', { encoding: 'base64' });

0 commit comments

Comments
 (0)