feat: Gemini Flash ücretli yedek — analiz zincirinin sonunda her zaman denenir

Panelde seçilen modeller tıkanınca (limit/429) şartname analizi ve teklif asistanı
boş kalıyordu; analyzeSpec zincire yoksa 'gemini'yi sona ekler. Panel ve kılavuz notu.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 13:45:04 +03:00
co-authored by Claude Fable 5.1
parent 08c0a0af7e
commit 782b361d24
3 changed files with 8 additions and 3 deletions
+6 -1
View File
@@ -314,8 +314,13 @@ function kesikJsonOnar(s) {
/** Zinciri sırayla dener; ilk başarılı sonucu döndürür. */ /** Zinciri sırayla dener; ilk başarılı sonucu döndürür. */
export async function analyzeSpec({ text, fileName, tender, chain, systemOverride, mode }) { export async function analyzeSpec({ text, fileName, tender, chain, systemOverride, mode }) {
const derin = mode === 'derin'; const derin = mode === 'derin';
const order = (Array.isArray(chain) && chain.length ? chain : ['glmflash', 'gemini', 'deepseek', 'grok', 'gpt', 'claude']) // Ücretli yedek: Gemini Flash her zaman zincirin sonunda. Panelde seçilen
// modeller (ör. ücretsiz/limitli olanlar) tıkanınca analiz boş kalmasın;
// yalnız üsttekilerin hepsi başarısız olursa devreye girer.
const YEDEK = 'gemini';
const secim = (Array.isArray(chain) && chain.length ? chain : ['glmflash', 'gemini', 'deepseek', 'grok', 'gpt', 'claude'])
.filter((id) => PROVIDERS[id]); .filter((id) => PROVIDERS[id]);
const order = secim.includes(YEDEK) ? secim : [...secim, YEDEK];
// Derin analiz hem daha çok metin okur hem daha uzun JSON üretir; çıktı // Derin analiz hem daha çok metin okur hem daha uzun JSON üretir; çıktı
// kesilirse JSON parse edilemez ve zincir boşuna tüketilir. // kesilirse JSON parse edilemez ve zincir boşuna tüketilir.
const userPrompt = buildUserPrompt({ text, fileName, tender, limit: derin ? 90000 : 60000 }); const userPrompt = buildUserPrompt({ text, fileName, tender, limit: derin ? 90000 : 60000 });
+1 -1
View File
@@ -58,7 +58,7 @@ const KILAVUZ = {
api_webhooks: { baslik: 'API & Webhooks', ne: 'Kendi sistemlerinize ihale akışı.', adimlar: [ api_webhooks: { baslik: 'API & Webhooks', ne: 'Kendi sistemlerinize ihale akışı.', adimlar: [
'MCP: bir API anahtarı üretin, karttaki Claude Code komutunu veya mcp.json\'u kopyalayıp anahtarı yerine yazın; asistanınız search_tenders, get_tender, search_results, search_items, upcoming_deadlines araçlarını kullanır.', 'MCP: bir API anahtarı üretin, karttaki Claude Code komutunu veya mcp.json\'u kopyalayıp anahtarı yerine yazın; asistanınız search_tenders, get_tender, search_results, search_items, upcoming_deadlines araçlarını kullanır.',
'RSS: /api/feeds/tenders.rss?key=… adresini (il, sektor, q filtreleri) Feedly / Outlook / Slack RSS\'e ekleyin; sonuç ilanları için /api/feeds/sonuc.rss anahtarsızdır.','API anahtarı üretin; webhook adresinize yeni ihaleler gönderilir.'], ipuclari: [] }, 'RSS: /api/feeds/tenders.rss?key=… adresini (il, sektor, q filtreleri) Feedly / Outlook / Slack RSS\'e ekleyin; sonuç ilanları için /api/feeds/sonuc.rss anahtarsızdır.','API anahtarı üretin; webhook adresinize yeni ihaleler gönderilir.'], ipuclari: [] },
ai_ayarlari: { baslik: 'AI Model Ayarları', ne: 'Analizlerde kullanılacak model zinciri (yedekli).', adimlar: ['Sırayı sürükleyerek değiştirin; ilk başarılı model sonucu döner.'], ipuclari: [] }, ai_ayarlari: { baslik: 'AI Model Ayarları', ne: 'Analizlerde kullanılacak model zinciri (yedekli).', adimlar: ['Sırayı sürükleyerek değiştirin; ilk başarılı model sonucu döner.', 'Gemini Flash ücretli yedek olarak zincirin sonunda her zaman denenir; seçtiğiniz modeller (ör. limitli/ücretsiz olanlar) tıkanınca analiz boş kalmaz.'], ipuclari: [] },
pwa_settings: { pwa_settings: {
baslik: 'Mobil PWA & Bildirimler', baslik: 'Mobil PWA & Bildirimler',
ne: 'Uygulamayı telefona kurma, e-posta ve Telegram bildirimleri.', ne: 'Uygulamayı telefona kurma, e-posta ve Telegram bildirimleri.',
+1 -1
View File
@@ -113,7 +113,7 @@ export const AiModelSettings = () => {
<h3 className="font-extrabold text-sm text-slate-900 flex items-center gap-2"> <h3 className="font-extrabold text-sm text-slate-900 flex items-center gap-2">
<Sparkles className="w-4 h-4 text-indigo-600" /> Aktif Model Sırası (Fallback Zinciri) <Sparkles className="w-4 h-4 text-indigo-600" /> Aktif Model Sırası (Fallback Zinciri)
</h3> </h3>
<p className="text-xs text-slate-500">Birincil model yanıt vermezse sıradaki yedeğe otomatik geçilir.</p> <p className="text-xs text-slate-500">Birincil model yanıt vermezse sıradaki yedeğe otomatik geçilir. Zincirde olmasa bile <strong>Gemini Flash</strong> ücretli yedek olarak her zaman en sonda denenir; yalnız üsttekilerin hepsi başarısız olursa devreye girer.</p>
</div> </div>
</div> </div>