diff --git a/backend/src/utils/gemini-fallback.js b/backend/src/utils/gemini-fallback.js index 17625fb..c900443 100644 --- a/backend/src/utils/gemini-fallback.js +++ b/backend/src/utils/gemini-fallback.js @@ -1,15 +1,15 @@ /** * Gemini API with Multi-Tier Fallback - * Tries: Gemini β†’ OpenCode β†’ OpenRouter + * Tries: Gemini β†’ OpenRouter β†’ OpenCode */ const fetch = require('node-fetch'); const GEMINI_API_KEY = process.env.GOOGLE_API_KEY; -const OPENCODE_API_KEY = process.env.OPENCODE_API_KEY; -const OPENCODE_BASE_URL = process.env.OPENCODE_BASE_URL || 'https://api.opencode.com/v1'; const OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY; const OPENROUTER_BASE_URL = process.env.OPENROUTER_BASE_URL || 'https://openrouter.ai/api/v1'; +const OPENCODE_API_KEY = process.env.OPENCODE_API_KEY; +const OPENCODE_BASE_URL = process.env.OPENCODE_BASE_URL || 'https://api.opencode.com/v1'; async function generateWithFallback(prompt, options = {}) { console.log('πŸ€– Generating content...'); @@ -46,40 +46,10 @@ async function generateWithFallback(prompt, options = {}) { } } - // Tier 2: Fallback to OpenCode - if (OPENCODE_API_KEY) { - try { - console.log('πŸ“ Tier 2: Attempting OpenCode API...'); - const response = await fetch(`${OPENCODE_BASE_URL}/chat/completions`, { - method: 'POST', - headers: { - 'Authorization': `Bearer ${OPENCODE_API_KEY}`, - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - model: options.model || 'gpt-4', - messages: [{ role: 'user', content: prompt }], - temperature: options.temperature || 0.7, - max_tokens: options.maxTokens || 2048 - }) - }); - - if (response.ok) { - const data = await response.json(); - console.log('βœ… OpenCode API success'); - return { success: true, provider: 'opencode', data }; - } - - console.warn(`OpenCode error: ${response.status}, trying next fallback...`); - } catch (err) { - console.warn(`OpenCode failed: ${err.message}`); - } - } - - // Tier 3: Fallback to OpenRouter + // Tier 2: Fallback to OpenRouter (billigare, mer flexibel) if (OPENROUTER_API_KEY) { try { - console.log('πŸ“ Tier 3: Attempting OpenRouter API...'); + console.log('πŸ“ Tier 2: Attempting OpenRouter API...'); const response = await fetch(`${OPENROUTER_BASE_URL}/chat/completions`, { method: 'POST', headers: { @@ -101,20 +71,50 @@ async function generateWithFallback(prompt, options = {}) { return { success: true, provider: 'openrouter', data }; } - throw new Error(`OpenRouter error: ${response.status}`); + console.warn(`OpenRouter error: ${response.status}, trying next fallback...`); } catch (err) { - console.error(`OpenRouter failed: ${err.message}`); + console.warn(`OpenRouter failed: ${err.message}`); } } - throw new Error('All generation APIs failed (Gemini β†’ OpenCode β†’ OpenRouter)'); + // Tier 3: Fallback to OpenCode (sista fΓΆrsΓΆket) + if (OPENCODE_API_KEY) { + try { + console.log('πŸ“ Tier 3: Attempting OpenCode API...'); + const response = await fetch(`${OPENCODE_BASE_URL}/chat/completions`, { + method: 'POST', + headers: { + 'Authorization': `Bearer ${OPENCODE_API_KEY}`, + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + model: options.model || 'gpt-4', + messages: [{ role: 'user', content: prompt }], + temperature: options.temperature || 0.7, + max_tokens: options.maxTokens || 2048 + }) + }); + + if (response.ok) { + const data = await response.json(); + console.log('βœ… OpenCode API success'); + return { success: true, provider: 'opencode', data }; + } + + throw new Error(`OpenCode error: ${response.status}`); + } catch (err) { + console.error(`OpenCode failed: ${err.message}`); + } + } + + throw new Error('All generation APIs failed (Gemini β†’ OpenRouter β†’ OpenCode)'); } module.exports = { generateWithFallback, getAvailableProviders: () => ({ gemini: !!GEMINI_API_KEY, - opencode: !!OPENCODE_API_KEY, - openrouter: !!OPENROUTER_API_KEY + openrouter: !!OPENROUTER_API_KEY, + opencode: !!OPENCODE_API_KEY }) };