diff --git a/admin.php b/admin.php index 8c61a42..2324757 100644 --- a/admin.php +++ b/admin.php @@ -1144,9 +1144,10 @@ require_once __DIR__ . '/includes/header.php'; AI Provider & Model - >Google Gemini 1.5 Pro (Aanbevolen & Slim) - >Google Gemini 2.0 Flash (Snel & Modern) - >Google Gemini 1.5 Flash (Lichtgewicht) + >Google Gemini 3.6 Flash (Aanbevolen, Snel & Nieuwste) + >Google Gemini 1.5 Pro (Slim & Uitgebreid) + >Google Gemini 2.0 Flash + >Google Gemini 1.5 Flash >OpenAI GPT-4o-mini diff --git a/includes/ai.php b/includes/ai.php index 3b264f5..315dc8c 100644 --- a/includes/ai.php +++ b/includes/ai.php @@ -142,32 +142,35 @@ function fociz_ai_chat_gemini(array $messages, array $options, array $aiSettings // Bepaal fallback volgorde van endpoints/versies voor maximale compatibiliteit met alle Google AI Studio accounts $candidateUrls = []; - if (str_contains($cleanModel, '1.5-flash')) { + if (str_contains($cleanModel, '3.6-flash')) { + $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.6-flash:generateContent"; + $candidateUrls[] = "https://generativelanguage.googleapis.com/v1/models/gemini-3.6-flash:generateContent"; + } elseif (str_contains($cleanModel, '2.0-flash')) { + $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.6-flash:generateContent"; + $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent"; + $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent"; + } elseif (str_contains($cleanModel, '1.5-flash')) { + $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.6-flash:generateContent"; $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent"; $candidateUrls[] = "https://generativelanguage.googleapis.com/v1/models/gemini-1.5-flash:generateContent"; - $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent"; $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-001:generateContent"; $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-002:generateContent"; } elseif (str_contains($cleanModel, '1.5-pro')) { $candidateUrls[] = "https://generativelanguage.googleapis.com/v1/models/gemini-1.5-pro:generateContent"; $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-latest:generateContent"; - $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:generateContent"; - $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro-001:generateContent"; - } elseif (str_contains($cleanModel, '2.0-flash')) { - $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent"; - $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-exp:generateContent"; - $candidateUrls[] = "https://generativelanguage.googleapis.com/v1/models/gemini-2.0-flash:generateContent"; + $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.6-flash:generateContent"; } else { $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/{$cleanModel}:generateContent"; + $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/gemini-3.6-flash:generateContent"; $candidateUrls[] = "https://generativelanguage.googleapis.com/v1/models/{$cleanModel}:generateContent"; - $candidateUrls[] = "https://generativelanguage.googleapis.com/v1beta/models/{$cleanModel}-latest:generateContent"; } $response = null; $lastError = null; $successfulModel = $cleanModel; - foreach ($candidateUrls as $baseUrl) { + for ($i = 0; $i < count($candidateUrls); $i++) { + $baseUrl = $candidateUrls[$i]; $endpoint = $baseUrl . '?key=' . urlencode($apiKey); $res = fociz_http_request($endpoint, [ 'method' => 'POST', @@ -187,14 +190,24 @@ function fociz_ai_chat_gemini(array $messages, array $options, array $aiSettings break; } - // Als het een model-not-found 404 fout is, probeer de volgende kandidaat $msg = $res['json']['error']['message'] ?? ($res['error'] ?? ''); $lastError = $msg; - if ($res['status'] === 404 || str_contains($msg, 'not found') || str_contains($msg, 'not supported')) { + + // Als Google in de foutmelding direct een nieuwer model aanbeveelt (bv. "use models/gemini-3.6-flash") + if (preg_match('#use (?:models/)?(gemini-[a-zA-Z0-9\.\-_]+)#i', $msg, $recMatch)) { + $recModel = $recMatch[1]; + $recUrl = "https://generativelanguage.googleapis.com/v1beta/models/{$recModel}:generateContent"; + if (!in_array($recUrl, $candidateUrls, true)) { + $candidateUrls[] = $recUrl; + } + } + + // Als het model niet gevonden is, niet meer beschikbaar is of deprecated is, probeer de volgende kandidaat + if ($res['status'] === 404 || str_contains($msg, 'not found') || str_contains($msg, 'not supported') || str_contains($msg, 'no longer available') || str_contains($msg, 'deprecated')) { continue; } - // Bij andere fouten (zoals ongeldige sleutel 400/403) direct stoppen + // Bij autorisatiefouten (zoals ongeldige API key 400/403) direct stoppen $response = $res; break; }