in src/video_toys/lib/textGeneration.ts [56:141]
export async function generateText(
options: GenerateTextOptions,
): Promise<string> {
const {
modelName,
prompt,
videoUrl,
temperature = 0.75,
safetySettings = DEFAULT_SAFETY_SETTINGS,
} = options;
if (!GEMINI_API_KEY) {
throw new Error('Gemini API key is missing or empty');
}
const ai = new GoogleGenAI({apiKey: GEMINI_API_KEY});
const parts: Part[] = [{text: prompt}];
if (videoUrl) {
try {
parts.push({
fileData: {
mimeType: 'video/mp4',
fileUri: videoUrl,
},
});
} catch (error) {
console.error('Error processing video input:', error);
throw new Error(`Failed to process video input from URL: ${videoUrl}`);
}
}
const generationConfig: GenerateContentConfig = {
temperature,
safetySettings,
};
const request: GenerateContentParameters = {
model: modelName,
contents: [{role: 'user', parts}],
config: generationConfig,
};
try {
const response = await ai.models.generateContent(request);
// Check for prompt blockage
if (response.promptFeedback?.blockReason) {
throw new Error(
`Content generation failed: Prompt blocked (reason: ${response.promptFeedback.blockReason})`,
);
}
// Check for response blockage
if (!response.candidates || response.candidates.length === 0) {
throw new Error('Content generation failed: No candidates returned.');
}
const firstCandidate = response.candidates[0];
// Check for finish reasons other than STOP
if (
firstCandidate.finishReason &&
firstCandidate.finishReason !== FinishReason.STOP
) {
if (firstCandidate.finishReason === FinishReason.SAFETY) {
throw new Error(
'Content generation failed: Response blocked due to safety settings.',
);
} else {
throw new Error(
`Content generation failed: Stopped due to ${firstCandidate.finishReason}.`,
);
}
}
return response.text;
} catch (error) {
console.error(
'An error occurred during Gemini API call or response processing:',
error,
);
throw error;
}
}