feat: set OpenRouter as primary AI provider with Google Gemini fallback
This commit is contained in:
1 parent
fc5d96e72c
commit
5a7b284ff0
1 file changed
+42
-42
+42
-42
@@ -50,10 +50,44 @@ export async function orchestrateGeneration(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. Try Primary Provider (Google Gemini)
|
// 1. Try Primary Provider (OpenRouter)
|
||||||
|
if (isProviderAvailable("openrouter") && hasOpenRouterKey) {
|
||||||
|
try {
|
||||||
|
console.log(`[AI Orchestrator] Attempting Primary (OpenRouter: ${config.ai.backup.model})...`);
|
||||||
|
const result = await generateWithOpenRouter({
|
||||||
|
model: config.ai.backup.model,
|
||||||
|
prompt: style.prompt,
|
||||||
|
negativePrompt: style.negativePrompt,
|
||||||
|
imageBase64,
|
||||||
|
mimeType,
|
||||||
|
timeoutMs: config.ai.backup.timeoutMs,
|
||||||
|
});
|
||||||
|
|
||||||
|
resetProvider("openrouter");
|
||||||
|
return {
|
||||||
|
imageUrl: result.imageUrl,
|
||||||
|
providerUsed: "openrouter",
|
||||||
|
modelUsed: result.model,
|
||||||
|
durationMs: Date.now() - startTime,
|
||||||
|
fallbackTriggered: false,
|
||||||
|
};
|
||||||
|
} catch (primaryError: any) {
|
||||||
|
if (isContentSafetyError(primaryError)) {
|
||||||
|
console.warn(`[AI Orchestrator] Primary provider (OpenRouter) rejected image for safety:`, primaryError.message);
|
||||||
|
throw new ContentSafetyError(primaryError.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.warn(`[AI Orchestrator] Primary provider (OpenRouter) failed:`, primaryError.message);
|
||||||
|
warnings.push(`Primary (OpenRouter) failed: ${primaryError.message}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
warnings.push("Primary provider key (OpenRouter) missing or in cooldown. Skipping to fallback.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Try Fallback Provider (Google Gemini)
|
||||||
if (isProviderAvailable("gemini") && hasGeminiKey) {
|
if (isProviderAvailable("gemini") && hasGeminiKey) {
|
||||||
try {
|
try {
|
||||||
console.log(`[AI Orchestrator] Attempting Primary (Gemini: ${config.ai.primary.model})...`);
|
console.log(`[AI Orchestrator] Attempting Fallback (Gemini: ${config.ai.primary.model})...`);
|
||||||
const result = await generateWithGemini({
|
const result = await generateWithGemini({
|
||||||
model: config.ai.primary.model,
|
model: config.ai.primary.model,
|
||||||
prompt: style.prompt,
|
prompt: style.prompt,
|
||||||
@@ -70,51 +104,17 @@ export async function orchestrateGeneration(
|
|||||||
providerUsed: "gemini",
|
providerUsed: "gemini",
|
||||||
modelUsed: result.model,
|
modelUsed: result.model,
|
||||||
durationMs: Date.now() - startTime,
|
durationMs: Date.now() - startTime,
|
||||||
fallbackTriggered: false,
|
|
||||||
};
|
|
||||||
} catch (primaryError: any) {
|
|
||||||
// Content safety rejections are caused by user input, NOT provider downtime
|
|
||||||
if (isContentSafetyError(primaryError)) {
|
|
||||||
console.warn(`[AI Orchestrator] Primary provider (Gemini) rejected image for safety:`, primaryError.message);
|
|
||||||
throw new ContentSafetyError(primaryError.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.warn(`[AI Orchestrator] Primary provider (Gemini) failed:`, primaryError.message);
|
|
||||||
warnings.push(`Primary failed: ${primaryError.message}`);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
warnings.push("Primary provider key missing. Skipping to backup.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Try Backup Provider (OpenRouter)
|
|
||||||
if (isProviderAvailable("openrouter") && hasOpenRouterKey) {
|
|
||||||
try {
|
|
||||||
console.log(`[AI Orchestrator] Attempting Backup (OpenRouter: ${config.ai.backup.model})...`);
|
|
||||||
const result = await generateWithOpenRouter({
|
|
||||||
model: config.ai.backup.model,
|
|
||||||
prompt: style.prompt,
|
|
||||||
negativePrompt: style.negativePrompt,
|
|
||||||
imageBase64,
|
|
||||||
mimeType,
|
|
||||||
timeoutMs: config.ai.backup.timeoutMs,
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
imageUrl: result.imageUrl,
|
|
||||||
providerUsed: "openrouter",
|
|
||||||
modelUsed: result.model,
|
|
||||||
durationMs: Date.now() - startTime,
|
|
||||||
fallbackTriggered: true,
|
fallbackTriggered: true,
|
||||||
warnings,
|
warnings,
|
||||||
};
|
};
|
||||||
} catch (backupError: any) {
|
} catch (fallbackError: any) {
|
||||||
if (isContentSafetyError(backupError)) {
|
if (isContentSafetyError(fallbackError)) {
|
||||||
console.warn(`[AI Orchestrator] Backup provider (OpenRouter) rejected image for safety:`, backupError.message);
|
console.warn(`[AI Orchestrator] Fallback provider (Gemini) rejected image for safety:`, fallbackError.message);
|
||||||
throw new ContentSafetyError(backupError.message);
|
throw new ContentSafetyError(fallbackError.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.error(`[AI Orchestrator] Backup provider (OpenRouter) failed:`, backupError.message);
|
console.error(`[AI Orchestrator] Fallback provider (Gemini) failed:`, fallbackError.message);
|
||||||
warnings.push(`Backup failed: ${backupError.message}`);
|
warnings.push(`Fallback (Gemini) failed: ${fallbackError.message}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user