Skip to content

Commit 4ce205c

Browse files
authored
Merge pull request #1307 from narengogi/chore/nano-banana-support
support nano banana in strict open ai compliance false mode
2 parents 6150f06 + 1d67e2d commit 4ce205c

File tree

4 files changed

+74
-0
lines changed

4 files changed

+74
-0
lines changed

src/providers/google-vertex-ai/chatComplete.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,10 @@ export const VertexGoogleChatCompleteConfig: ProviderConfig = {
354354
param: 'generationConfig',
355355
transform: (params: Params) => transformGenerationConfig(params),
356356
},
357+
modalities: {
358+
param: 'generationConfig',
359+
transform: (params: Params) => transformGenerationConfig(params),
360+
},
357361
};
358362

359363
interface AnthorpicTextContentItem {
@@ -479,6 +483,13 @@ export const GoogleChatCompleteResponseTransform: (
479483
content = part.text;
480484
contentBlocks.push({ type: 'text', text: part.text });
481485
}
486+
} else if (part.inlineData) {
487+
contentBlocks.push({
488+
type: 'image_url',
489+
image_url: {
490+
url: `data:${part.inlineData.mimeType};base64,${part.inlineData.data}`,
491+
},
492+
});
482493
}
483494
}
484495

@@ -674,6 +685,23 @@ export const GoogleChatCompleteStreamChunkTransform: (
674685
}
675686
}),
676687
};
688+
} else if (generation.content?.parts[0]?.inlineData) {
689+
const part = generation.content.parts[0];
690+
const contentBlocks = [
691+
{
692+
index: streamState.containsChainOfThoughtMessage ? 1 : 0,
693+
delta: {
694+
type: 'image_url',
695+
image_url: {
696+
url: `data:${part.inlineData?.mimeType};base64,${part.inlineData?.data}`,
697+
},
698+
},
699+
},
700+
];
701+
message = {
702+
role: 'assistant',
703+
content_blocks: contentBlocks,
704+
};
677705
}
678706
return {
679707
delta: message,

src/providers/google-vertex-ai/transformGenerationConfig.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ export function transformGenerationConfig(params: Params) {
5757
thinkingConfig['thinking_budget'] = budget_tokens;
5858
generationConfig['thinking_config'] = thinkingConfig;
5959
}
60+
if (params.modalities) {
61+
generationConfig['responseModalities'] = params.modalities.map((modality) =>
62+
modality.toUpperCase()
63+
);
64+
}
6065

6166
return generationConfig;
6267
}

src/providers/google-vertex-ai/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ export interface GoogleResponseCandidate {
2020
text?: string;
2121
thought?: string; // for models like gemini-2.0-flash-thinking-exp refer: https://ai.google.dev/gemini-api/docs/thinking-mode#streaming_model_thinking
2222
functionCall?: GoogleGenerateFunctionCall;
23+
inlineData?: {
24+
mimeType: string;
25+
data: string;
26+
};
2327
}[];
2428
};
2529
logprobsResult?: {

src/providers/google/chatComplete.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,11 @@ const transformGenerationConfig = (params: Params) => {
7878
thinkingConfig['thinking_budget'] = params.thinking.budget_tokens;
7979
generationConfig['thinking_config'] = thinkingConfig;
8080
}
81+
if (params.modalities) {
82+
generationConfig['responseModalities'] = params.modalities.map((modality) =>
83+
modality.toUpperCase()
84+
);
85+
}
8186
return generationConfig;
8287
};
8388

@@ -425,6 +430,10 @@ export const GoogleChatCompleteConfig: ProviderConfig = {
425430
param: 'generationConfig',
426431
transform: (params: Params) => transformGenerationConfig(params),
427432
},
433+
modalities: {
434+
param: 'generationConfig',
435+
transform: (params: Params) => transformGenerationConfig(params),
436+
},
428437
};
429438

430439
export interface GoogleErrorResponse {
@@ -447,6 +456,10 @@ interface GoogleResponseCandidate {
447456
text?: string;
448457
thought?: string; // for models like gemini-2.0-flash-thinking-exp refer: https://ai.google.dev/gemini-api/docs/thinking-mode#streaming_model_thinking
449458
functionCall?: GoogleGenerateFunctionCall;
459+
inlineData?: {
460+
mimeType: string;
461+
data: string;
462+
};
450463
}[];
451464
};
452465
logprobsResult?: {
@@ -560,6 +573,13 @@ export const GoogleChatCompleteResponseTransform: (
560573
content = part.text;
561574
contentBlocks.push({ type: 'text', text: part.text });
562575
}
576+
} else if (part.inlineData) {
577+
contentBlocks.push({
578+
type: 'image_url',
579+
image_url: {
580+
url: `data:${part.inlineData.mimeType};base64,${part.inlineData.data}`,
581+
},
582+
});
563583
}
564584
}
565585

@@ -706,6 +726,23 @@ export const GoogleChatCompleteStreamChunkTransform: (
706726
}
707727
}),
708728
};
729+
} else if (generation.content?.parts[0]?.inlineData) {
730+
const part = generation.content.parts[0];
731+
const contentBlocks = [
732+
{
733+
index: streamState.containsChainOfThoughtMessage ? 1 : 0,
734+
delta: {
735+
type: 'image_url',
736+
image_url: {
737+
url: `data:${part.inlineData?.mimeType};base64,${part.inlineData?.data}`,
738+
},
739+
},
740+
},
741+
];
742+
message = {
743+
role: 'assistant',
744+
content_blocks: contentBlocks,
745+
};
709746
}
710747
return {
711748
delta: message,

0 commit comments

Comments
 (0)