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:
+6
-1
@@ -314,8 +314,13 @@ function kesikJsonOnar(s) {
|
||||
/** Zinciri sırayla dener; ilk başarılı sonucu döndürür. */
|
||||
export async function analyzeSpec({ text, fileName, tender, chain, systemOverride, mode }) {
|
||||
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]);
|
||||
const order = secim.includes(YEDEK) ? secim : [...secim, YEDEK];
|
||||
// Derin analiz hem daha çok metin okur hem daha uzun JSON üretir; çıktı
|
||||
// kesilirse JSON parse edilemez ve zincir boşuna tüketilir.
|
||||
const userPrompt = buildUserPrompt({ text, fileName, tender, limit: derin ? 90000 : 60000 });
|
||||
|
||||
@@ -58,7 +58,7 @@ const KILAVUZ = {
|
||||
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.',
|
||||
'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: {
|
||||
baslik: 'Mobil PWA & Bildirimler',
|
||||
ne: 'Uygulamayı telefona kurma, e-posta ve Telegram bildirimleri.',
|
||||
|
||||
@@ -113,7 +113,7 @@ export const AiModelSettings = () => {
|
||||
<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)
|
||||
</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>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user