Update services/geminiService.ts
Browse files
services/geminiService.ts
CHANGED
|
@@ -29,11 +29,11 @@ const ai = new GoogleGenAI({ apiKey: API_KEY });
|
|
| 29 |
|
| 30 |
// --- TIERED MODEL STRATEGY ---
|
| 31 |
// 1. Primary: Gemini 2.5 Flash (Highest Quality/Speed Balance)
|
| 32 |
-
// 2. Secondary: Gemini Flash Lite (Quota Rescue)
|
| 33 |
// 3. Tertiary: Local/HuggingFace Backends (Privacy/Offline/No-Quota Fallback)
|
| 34 |
const MODEL_PRIMARY = 'gemini-2.5-flash';
|
| 35 |
-
const MODEL_SECONDARY = 'gemini-flash-lite
|
| 36 |
-
const MODEL_TTS = 'gemini-2.5-flash-
|
| 37 |
|
| 38 |
// --- UTILITIES ---
|
| 39 |
const cleanText = (text: string) => {
|
|
@@ -139,14 +139,14 @@ async function executePipeline<T>(
|
|
| 139 |
|
| 140 |
try {
|
| 141 |
// 1. Primary Model
|
| 142 |
-
if (onStatus) onStatus("⚡ Using Gemini Flash...");
|
| 143 |
return await geminiTask(MODEL_PRIMARY);
|
| 144 |
} catch (error: any) {
|
| 145 |
// Check for Quota/Rate Limits or Model Overload
|
| 146 |
if (error.toString().includes('429') || error.toString().includes('Quota') || error.toString().includes('503')) {
|
| 147 |
try {
|
| 148 |
// 2. Secondary Model
|
| 149 |
-
if (onStatus) onStatus("⚠️ Quota limit. Switching to Flash
|
| 150 |
return await geminiTask(MODEL_SECONDARY);
|
| 151 |
} catch (secondaryError) {
|
| 152 |
console.warn("Secondary model failed:", secondaryError);
|
|
@@ -295,7 +295,7 @@ export const analyzeRisk = async (
|
|
| 295 |
});
|
| 296 |
|
| 297 |
const parsed = parseRiskResponse(response.text || "{}", calculatedScore);
|
| 298 |
-
return { ...parsed, source: model === MODEL_PRIMARY ? 'Gemini 2.5 Flash' : 'Gemini Flash Lite' };
|
| 299 |
};
|
| 300 |
|
| 301 |
const fallbackTask = async () => {
|
|
@@ -329,7 +329,7 @@ export const generateChatResponse = async (
|
|
| 329 |
contents.push({ role: 'user', parts: [{ text: context + "\nUser: " + currentMessage }, ...(image ? [{ inlineData: { mimeType: 'image/jpeg', data: image.split('base64,')[1] } }] : [])] });
|
| 330 |
|
| 331 |
const geminiTask = async (model: string) => {
|
| 332 |
-
onSource(model === MODEL_PRIMARY ? 'Gemini 2.5 Flash' : 'Gemini Flash Lite');
|
| 333 |
const response = await ai.models.generateContent({
|
| 334 |
model: model,
|
| 335 |
contents: contents,
|
|
|
|
| 29 |
|
| 30 |
// --- TIERED MODEL STRATEGY ---
|
| 31 |
// 1. Primary: Gemini 2.5 Flash (Highest Quality/Speed Balance)
|
| 32 |
+
// 2. Secondary: Gemini 2.5 Flash Lite (Quota Rescue / Higher Throughput)
|
| 33 |
// 3. Tertiary: Local/HuggingFace Backends (Privacy/Offline/No-Quota Fallback)
|
| 34 |
const MODEL_PRIMARY = 'gemini-2.5-flash';
|
| 35 |
+
const MODEL_SECONDARY = 'gemini-2.5-flash-lite';
|
| 36 |
+
const MODEL_TTS = 'gemini-2.5-flash-tts';
|
| 37 |
|
| 38 |
// --- UTILITIES ---
|
| 39 |
const cleanText = (text: string) => {
|
|
|
|
| 139 |
|
| 140 |
try {
|
| 141 |
// 1. Primary Model
|
| 142 |
+
if (onStatus) onStatus("⚡ Using Gemini 2.5 Flash...");
|
| 143 |
return await geminiTask(MODEL_PRIMARY);
|
| 144 |
} catch (error: any) {
|
| 145 |
// Check for Quota/Rate Limits or Model Overload
|
| 146 |
if (error.toString().includes('429') || error.toString().includes('Quota') || error.toString().includes('503')) {
|
| 147 |
try {
|
| 148 |
// 2. Secondary Model
|
| 149 |
+
if (onStatus) onStatus("⚠️ Quota limit. Switching to 2.5 Flash Lite...");
|
| 150 |
return await geminiTask(MODEL_SECONDARY);
|
| 151 |
} catch (secondaryError) {
|
| 152 |
console.warn("Secondary model failed:", secondaryError);
|
|
|
|
| 295 |
});
|
| 296 |
|
| 297 |
const parsed = parseRiskResponse(response.text || "{}", calculatedScore);
|
| 298 |
+
return { ...parsed, source: model === MODEL_PRIMARY ? 'Gemini 2.5 Flash' : 'Gemini 2.5 Flash Lite' };
|
| 299 |
};
|
| 300 |
|
| 301 |
const fallbackTask = async () => {
|
|
|
|
| 329 |
contents.push({ role: 'user', parts: [{ text: context + "\nUser: " + currentMessage }, ...(image ? [{ inlineData: { mimeType: 'image/jpeg', data: image.split('base64,')[1] } }] : [])] });
|
| 330 |
|
| 331 |
const geminiTask = async (model: string) => {
|
| 332 |
+
onSource(model === MODEL_PRIMARY ? 'Gemini 2.5 Flash' : 'Gemini 2.5 Flash Lite');
|
| 333 |
const response = await ai.models.generateContent({
|
| 334 |
model: model,
|
| 335 |
contents: contents,
|