Skip to content

Commit 5430d75

Browse files
committed
Gemini code review fixes
1 parent 51f1f78 commit 5430d75

3 files changed

Lines changed: 40 additions & 30 deletions

File tree

ai/ai-react-app/src/components/Layout/RightSidebar.tsx

Lines changed: 27 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,22 @@ import {
99
} from "../../services/firebaseAIService";
1010
import {
1111
ModelParams,
12+
GenerationConfig,
1213
HarmCategory,
1314
HarmBlockThreshold,
1415
FunctionCallingMode,
1516
UsageMetadata,
1617
ResponseModality,
1718
} from "firebase/ai";
1819

20+
export interface ExtendedGenerationConfig extends GenerationConfig {
21+
responseModalities?: ResponseModality[];
22+
}
23+
24+
export interface ExtendedModelParams extends ModelParams {
25+
generationConfig?: ExtendedGenerationConfig;
26+
}
27+
1928
interface RightSidebarProps {
2029
usageMetadata: UsageMetadata | null;
2130
activeMode: AppMode;
@@ -49,6 +58,20 @@ const RightSidebar: React.FC<RightSidebarProps> = ({
4958
setNanoBananaParams((prevState) => updateFn(prevState));
5059
};
5160

61+
const handleModalityChange = (modality: ResponseModality, checked: boolean) => {
62+
handleNanoBananaModelParamsUpdate((prev) => {
63+
const currentModalities = (prev.generationConfig as ExtendedGenerationConfig)?.responseModalities || [ResponseModality.TEXT];
64+
let newModalities = [...currentModalities];
65+
if (checked) {
66+
if (!newModalities.includes(modality)) newModalities.push(modality);
67+
} else {
68+
newModalities = newModalities.filter((m) => m !== modality);
69+
}
70+
if (newModalities.length === 0) return prev;
71+
return { ...prev, generationConfig: { ...prev.generationConfig, responseModalities: newModalities } };
72+
});
73+
};
74+
5275
const getThresholdForCategory = (
5376
category: HarmCategory,
5477
): HarmBlockThreshold => {
@@ -419,40 +442,16 @@ const RightSidebar: React.FC<RightSidebarProps> = ({
419442
<label style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
420443
<input
421444
type="checkbox"
422-
checked={((nanoBananaParams.generationConfig as any)?.responseModalities || [ResponseModality.TEXT]).includes(ResponseModality.TEXT)}
423-
onChange={(e) => {
424-
handleNanoBananaModelParamsUpdate((prev) => {
425-
const currentModalities = (prev.generationConfig as any)?.responseModalities || [ResponseModality.TEXT];
426-
let newModalities = [...currentModalities];
427-
if (e.target.checked) {
428-
if (!newModalities.includes(ResponseModality.TEXT)) newModalities.push(ResponseModality.TEXT);
429-
} else {
430-
newModalities = newModalities.filter((m) => m !== ResponseModality.TEXT);
431-
}
432-
if (newModalities.length === 0) return prev;
433-
return { ...prev, generationConfig: { ...prev.generationConfig, responseModalities: newModalities } };
434-
});
435-
}}
445+
checked={((nanoBananaParams.generationConfig as ExtendedGenerationConfig)?.responseModalities || [ResponseModality.TEXT]).includes(ResponseModality.TEXT)}
446+
onChange={(e) => handleModalityChange(ResponseModality.TEXT, e.target.checked)}
436447
/>
437448
Text
438449
</label>
439450
<label style={{ display: 'flex', alignItems: 'center', gap: '5px' }}>
440451
<input
441452
type="checkbox"
442-
checked={((nanoBananaParams.generationConfig as any)?.responseModalities || []).includes(ResponseModality.IMAGE)}
443-
onChange={(e) => {
444-
handleNanoBananaModelParamsUpdate((prev) => {
445-
const currentModalities = (prev.generationConfig as any)?.responseModalities || [ResponseModality.TEXT];
446-
let newModalities = [...currentModalities];
447-
if (e.target.checked) {
448-
if (!newModalities.includes(ResponseModality.IMAGE)) newModalities.push(ResponseModality.IMAGE);
449-
} else {
450-
newModalities = newModalities.filter((m) => m !== ResponseModality.IMAGE);
451-
}
452-
if (newModalities.length === 0) return prev;
453-
return { ...prev, generationConfig: { ...prev.generationConfig, responseModalities: newModalities } };
454-
});
455-
}}
453+
checked={((nanoBananaParams.generationConfig as ExtendedGenerationConfig)?.responseModalities || []).includes(ResponseModality.IMAGE)}
454+
onChange={(e) => handleModalityChange(ResponseModality.IMAGE, e.target.checked)}
456455
/>
457456
Image
458457
</label>

ai/ai-react-app/src/views/NanoBananaView.module.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
.imagenViewContainer {
1+
.nanoBananaViewContainer {
22
display: flex;
33
flex-direction: column;
44
height: 100%;

ai/ai-react-app/src/views/NanoBananaView.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ const NanoBananaView: React.FC<NanoBananaViewProps> = ({
107107
const response = result.response;
108108
const parts: GeneratedContentPart[] = [];
109109

110+
// Intentionally only support handling the primary candidate.
110111
if (response.candidates?.[0].content?.parts) {
111112
for (const part of response.candidates?.[0].content?.parts) {
112113
if (part.text) {
@@ -122,6 +123,16 @@ const NanoBananaView: React.FC<NanoBananaViewProps> = ({
122123
}
123124
}
124125
}
126+
127+
const candidate = response.candidates?.[0];
128+
if (candidate && candidate.finishReason && candidate.finishReason !== "STOP") {
129+
setFilteredReason(`Generation stopped due to: ${candidate.finishReason}`);
130+
}
131+
132+
if (response.promptFeedback?.blockReason) {
133+
setFilteredReason(`Prompt blocked due to: ${response.promptFeedback.blockReason}`);
134+
}
135+
125136
setGeneratedContent(parts);
126137
} catch (err: unknown) {
127138
console.error("[NanoBananaView] Error during generation:", err);
@@ -153,7 +164,7 @@ const NanoBananaView: React.FC<NanoBananaViewProps> = ({
153164
};
154165

155166
return (
156-
<div className={styles.imagenViewContainer}>
167+
<div className={styles.nanoBananaViewContainer}>
157168
{error && <div className={styles.errorMessage}>{error}</div>}
158169
<div className={styles.displayArea}>
159170
<ContentDisplay

0 commit comments

Comments
 (0)