diff --git a/docs/quality/qa-offer-provider-error-after.json b/docs/quality/qa-offer-provider-error-after.json new file mode 100644 index 0000000..1494ddc --- /dev/null +++ b/docs/quality/qa-offer-provider-error-after.json @@ -0,0 +1,5 @@ +{ + "environment": "Isolated local QA, real provider-not-configured response, current frontend", + "draftRetained": true, + "snapshot": " - dialog \"QA — Giresun laboratuvar\":\n - button \"Listeye Geri Dön\":\n - generic: Listeye Geri Dön\n - button \"İncelendi olarak işaretle\"\n - button \"Takip Et\":\n - generic: Takip Et\n - button \"🗂 Hazırlık Görevi Aç\"\n - button \"İhale detayını kapat\":\n - generic: Mal Alımı\n - generic: \"İKN: 2026/1582991\"\n - generic: \"Ekleme:\"\n - heading \"QA — Giresun laboratuvar\" [level=1]\n - generic: Kurum Adı\n - generic \"Giresun TEST KURUMU\"\n - generic: İhale Tarihi & Saat\n - generic: 10.09.2026 - 10:00\n - generic: Şehir / Bölge\n - generic: Giresun ()\n - generic: Yaklaşık Maliyet\n - generic: Gizli / Belirtilmemiş\n - button \"İhale Detayları\":\n - generic: İhale Detayları\n - button \"Birim Fiyat Cetveli (PDF & Kaşe) İnteraktif\":\n - generic: Birim Fiyat Cetveli (PDF & Kaşe)\n - generic: İnteraktif\n - button \"Yapay Zeka Asistanı\":\n - generic: Yapay Zeka Asistanı\n - button \"Hazırlık Checklist\":\n - generic: Hazırlık Checklist\n - button \"Teklif Asistanı AI\":\n - generic: Teklif Asistanı\n - generic: AI\n - button \"Belgeye Sor\":\n - text: Belgeye Sor\n - button \"Taslağı Denetle\":\n - text: Taslağı Denetle\n - button \"Taslak Üret\":\n - text: Taslak Üret\n - text: Doküman yükle (.pdf/.txt) — isteğe bağlı\n - paragraph: Metin sağlanmazsa sunucu EKAP dokümanını / ilan metnini kullanır. Yanıtların kaynak parçalarını kontrol edin; AI yanıtları hata veya eksik bilgi içerebilir.\n - alert: AI hizmeti şu anda kullanılamıyor. Çalışmanız korundu; daha sonra yeniden deneyin. Sorun sürerse uygulama yöneticinize bildirin.\n - textbox \"Teklif mektubu / teknik teklif metninizi yapıştırın (en az 200 karakter)…\": SENTETİK QA TASLAĞI. Bu metin yalnız hata durumunda kullanıcının çalışmasının korunduğunu sınamak içindir. Gerçek teklif, taahhüt veya başvuru içermez. SENTETİK QA TASLAĞI. Bu metin yalnız hata durumunda kullanıcının çalışmasının korunduğunu sınamak içindir. Gerçek teklif, taahhüt veya başvuru içermez. SENTETİK QA TASLAĞI. Bu metin yalnız hata durumunda kullanıcının çalışmasının korunduğunu sınamak içindir. Gerçek teklif, taahhüt veya başvuru içermez.\n - button \"Denetle\":\n - text: Denetle\n- button \"Kullanım kılavuzu (? tuşu)\":" +} \ No newline at end of file diff --git a/docs/quality/qa-offer-provider-error.json b/docs/quality/qa-offer-provider-error.json new file mode 100644 index 0000000..6c27d17 --- /dev/null +++ b/docs/quality/qa-offer-provider-error.json @@ -0,0 +1,7 @@ +{ + "url": "http://127.0.0.1:5175/", + "scenario": "No AI provider configured in isolated local test server", + "source": "Browser DOM observation", + "draftRetained": true, + "snapshot": " - dialog \"QA — Giresun laboratuvar\":\n - button \"Listeye Geri Dön\":\n - generic: Listeye Geri Dön\n - button \"İncelendi olarak işaretle\"\n - button \"Takip Et\":\n - generic: Takip Et\n - button \"🗂 Hazırlık Görevi Aç\"\n - button \"İhale detayını kapat\":\n - generic: Mal Alımı\n - generic: \"İKN: 2026/1582991\"\n - generic: \"Ekleme:\"\n - heading \"QA — Giresun laboratuvar\" [level=1]\n - generic: Kurum Adı\n - generic \"Giresun TEST KURUMU\"\n - generic: İhale Tarihi & Saat\n - generic: 10.09.2026 - 10:00\n - generic: Şehir / Bölge\n - generic: Giresun ()\n - generic: Yaklaşık Maliyet\n - generic: Gizli / Belirtilmemiş\n - button \"İhale Detayları\":\n - generic: İhale Detayları\n - button \"Birim Fiyat Cetveli (PDF & Kaşe) İnteraktif\":\n - generic: Birim Fiyat Cetveli (PDF & Kaşe)\n - generic: İnteraktif\n - button \"Yapay Zeka Asistanı\":\n - generic: Yapay Zeka Asistanı\n - button \"Hazırlık Checklist\":\n - generic: Hazırlık Checklist\n - button \"Teklif Asistanı AI\":\n - generic: Teklif Asistanı\n - generic: AI\n - button \"Belgeye Sor\":\n - text: Belgeye Sor\n - button \"Taslağı Denetle\":\n - text: Taslağı Denetle\n - button \"Taslak Üret\":\n - text: Taslak Üret\n - text: Doküman yükle (.pdf/.txt) — isteğe bağlı\n - paragraph: Metin sağlanmazsa sunucu EKAP dokümanını / ilan metnini kullanır. Yanıtların kaynak parçalarını kontrol edin; AI yanıtları hata veya eksik bilgi içerebilir.\n - paragraph: AI yapılandırılmamış — sunucuya bir sağlayıcı anahtarı ekleyin.\n - textbox \"Teklif mektubu / teknik teklif metninizi yapıştırın (en az 200 karakter)…\": SENTETİK QA TASLAĞI. Bu metin yalnız hata durumunda kullanıcının çalışmasının korunduğunu sınamak içindir. Gerçek teklif, taahhüt veya başvuru içermez. SENTETİK QA TASLAĞI. Bu metin yalnız hata durumunda kullanıcının çalışmasının korunduğunu sınamak içindir. Gerçek teklif, taahhüt veya başvuru içermez. SENTETİK QA TASLAĞI. Bu metin yalnız hata durumunda kullanıcının çalışmasının korunduğunu sınamak içindir. Gerçek teklif, taahhüt veya başvuru içermez.\n - button \"Denetle\":\n - text: Denetle\n- button \"Kullanım kılavuzu (? tuşu)\":" +} \ No newline at end of file diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index d2eb876..02c8270 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -471,3 +471,13 @@ AI HTTP isteği ve yanıt okumasına 120 saniyelik istemci zaman aşımı eklend Doğrulama: HTML/null/boş yanıt, geçersiz iç durum, askıda istek ve üç gerçek sunucu doğrulayıcısının ürettiği yanıtın istemci sözleşmesiyle uyumu test edildi. Tarayıcıdaki gerçek sağlayıcı arızası kabulü ayrıca açık. Sonuç: Tüm 103 test ve üretim derlemesi geçti. Büyük paket uyarıları devam ediyor. Canlı yayın yapılmadı; tüm plan tamamlanmış değildir. + +### D09 — Sağlayıcı yokken gerçek tarayıcı hata kabulü + +Mevcut localhost:5175 QA sunucusunun canlı olduğu doğrulandı; yeniden başlatılmadı. Güncel ön yüz üzerinden QA Giresun → Teklif Asistanı → Taslağı Denetle akışında 200 karakterden uzun sentetik taslak girildi. Anahtarsız izole sunucunun gerçek başarısız yanıtı sonrasında taslağın korunduğu ve Denetle düğmesinin yeniden etkin olduğu DOM'dan doğrulandı. + +İlk mesaj normal kullanıcıya sunucu anahtarı eklemesini söylüyordu. Kullanıcıya yönelik hizmet kullanılamıyor/yeniden dene açıklaması eklendi; hata `role=alert` olarak duyurulur. Sunucu genel analiz ve teklif araçlarının yapılandırılmamış sağlayıcı mesajları da sadeleştirildi. Güncel istemci eski sunucu 503 mesajlarını da uygun açıklamaya dönüştürür. + +Değişiklikten sonra aynı tarayıcı akışı tekrarlandı: yeni alert, aynı taslak ve kullanılabilir Denetle düğmesi doğrulandı. Kanıtlar: `qa-offer-provider-error.json`, `qa-offer-provider-error-after.json`. Bu kayıtlar sağlayıcı yokluğu hata yolunu kanıtlar; gerçek AI üretimi, iki hesaplı tarayıcı geçişi, uzun analiz veya başarılı çıktı kabulü değildir. Yeni backend metni çalışan eski sunucuda ayrıca sınanmadı; tarayıcı yeni istemci dönüşümünü doğruladı. + +Tüm 104 test ve üretim derlemesi geçti. Büyük paket uyarıları sürüyor. Planın kalan kapsamı açık; canlı yayın yapılmadı. diff --git a/server/index.js b/server/index.js index 8c75bad..728ebad 100644 --- a/server/index.js +++ b/server/index.js @@ -1306,7 +1306,7 @@ const server = http.createServer(async (req, res) => { if (!aiConfigured()) { return json(res, 503, { success: false, - error: 'AI yapılandırılmamış — sunucuya en az bir sağlayıcı anahtarı ekleyin (ZAI_API_KEY / DEEPSEEK_API_KEY / GEMINI_API_KEY …)', + error: 'AI hizmeti şu anda kullanılamıyor. Daha sonra yeniden deneyin; sorun sürerse uygulama yöneticinize bildirin.', }); } try { @@ -1456,7 +1456,7 @@ const server = http.createServer(async (req, res) => { if ((url.pathname === '/api/ai/belge-sor' || url.pathname === '/api/ai/teklif-denetim' || url.pathname === '/api/ai/teklif-taslak') && req.method === 'POST') { const user = userFromAuthHeader(req.headers['authorization']); if (!user) return json(res, 401, { success: false, error: 'oturum yok' }); - if (!aiConfigured()) return json(res, 503, { success: false, error: 'AI yapılandırılmamış — sunucuya bir sağlayıcı anahtarı ekleyin.' }); + if (!aiConfigured()) return json(res, 503, { success: false, error: 'AI hizmeti şu anda kullanılamıyor. Daha sonra yeniden deneyin; sorun sürerse uygulama yöneticinize bildirin.' }); try { const body = await readBody(req, 2 * 1024 * 1024); const ortak = { ikn: body.ikn, tender: body.tender, chain: body.chain, text: body.text }; diff --git a/src/components/TeklifAsistani.jsx b/src/components/TeklifAsistani.jsx index 9f9e08c..734358f 100644 --- a/src/components/TeklifAsistani.jsx +++ b/src/components/TeklifAsistani.jsx @@ -91,7 +91,7 @@ const OfferAssistantSession = ({ tender }) => {
Metin sağlanmazsa sunucu EKAP dokümanını / ilan metnini kullanır. Yanıtların kaynak parçalarını kontrol edin; AI yanıtları hata veya eksik bilgi içerebilir.
- {hata &&{hata}
} + {hata &&{hata}
} {arac === 'sor' && (