尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Tarayıcıda çalışan, gizlilik odaklı AI veri asistanı: verini bırak, Türkçe sor. DuckDB-WASM + FastAPI + sqlglot + Gemini
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Verini tarayıcına bırak, doğal dille sor. Dosya cihazdan çıkmaz: sorgu motoru (DuckDB-WASM) tarayıcıda çalışır, yapay zekâya yalnızca tablonun şeması gider. API, Render'ın ücretsiz planında çalışıyor ve 15 dakika boşta kalınca uyuyor. İlk açılışta 20–50 sn uyanma gecikmesi olabilir. Bu sırada arayüz "Yanıt motoru uyanıyor…" gösterir ve sunucu hazır olunca soru kutusu kendiliğinden açılır. Veri yükleme ve profil çıkarma backend'e bağlı olmadığı için hemen çalışır. Plan ve mimari: docs/InsightFlow_Proje_Plani_v2.pdf · Performans: docs/benchmark檢視完整 README ↗
Verini tarayıcına bırak, doğal dille sor. Dosya cihazdan çıkmaz: sorgu motoru (DuckDB-WASM) tarayıcıda çalışır, yapay zekâya yalnızca tablonun şeması gider.
Canlı: https://insightflow-rust.vercel.app · API: https://insightflow-api-d2gf.onrender.com/docs
API, Render'ın ücretsiz planında çalışıyor ve 15 dakika boşta kalınca uyuyor. İlk açılışta 20–50 sn uyanma gecikmesi olabilir. Bu sırada arayüz "Yanıt motoru uyanıyor…" gösterir ve sunucu hazır olunca soru kutusu kendiliğinden açılır. Veri yükleme ve profil çıkarma backend'e bağlı olmadığı için hemen çalışır.
Plan ve mimari: docs/InsightFlow_Proje_Plani_v2.pdf · Performans: docs/benchmark
| Faz | İçerik | Durum |
|---|---|---|
| 1 | Tarayıcıda veri çekirdeği: CSV/Parquet/Excel yükleme, motor kilidi, profil, örnek sorular, demo veri setleri | ✅ |
| 2 | Güvenli text-to-SQL: şema-only prompt, sqlglot doğrulama + saldırı test seti, self-healing, istek sınırı, soru-cevap akışı | ✅ |
| 3 | Grafik seçici (ECharts: çizgi/çubuk/dağılım/KPI) + onaylı yönetici özeti | ✅ |
| 4 | "Modele ne gitti?" paneli, grafik panosu (IndexedDB), durdurma, backend durumu, boş/hata durumları | ✅ |
| 5 | Playwright E2E, benchmark, CSP, Docker, CI, canlıya alma (Render + Vercel) | ✅ |
Tarayıcı Backend (durumsuz) Gemini
──────── ────────────────── ──────
dosya → DuckDB-WASM (kilitli)
şema {ad, tip} + soru ───────────────▶ POST /sql ──────────────────────▶ yapılandırılmış JSON
sqlglot doğrulama ◀───────────── {sql, açıklama, grafik}
(red → nedenini modele geri besle, en fazla 3 tur)
onaylı SQL ◀───────────────────────────
sorgu tarayıcıda koşar
hata → değerleri maskele → POST /repair (en fazla 3 kez)
sonuç tablosu (satırlar asla sunucuya gitmez)
Ayrıntılar ve yöntem: docs/benchmark/README.md. i7-1165G7, 16 GB RAM.
| 100 bin satır | 1 milyon satır | 5 milyon satır | |
|---|---|---|---|
| Tarayıcıda 5 analitik sorgu (medyan aralığı) | 9–37 ms | 59–137 ms | 252–510 ms |
| Tarayıcıda yükleme + profil | 0,8 sn | 3,0 sn | 11,9 sn |
| Yerel Python: DuckDB / pandas sorgu hızı | 1,4× | 4,1× | 4,5× |
| Yerel Python: tepe bellek, DuckDB'de pandas'a göre | −%48 | −%37 | −%29 |
Tarayıcıda
data tablosuna alındıktan sonra enable_external_access=false ve lock_configuration=true uygulanır. Motor, kilidi doğrulamadan veri setini açmaz. E2E testi: doğrulayıcı atlatılsa bile read_text(...) motor tarafından reddedilir.next.config.ts): tarayıcı API'ye doğrudan değil, uygulamanın kendi /api/* yolundan gider; Next bu isteği sunucu tarafında Render'a iletir. Böylece CSP connect-src 'self' olabiliyor: bir hata ya da kötü niyetli bir bağımlılık olsa bile tarayıcı uygulamanın kendi sunucusu dışında hiçbir yere istek atamaz. İlk sürümde tarayıcı *.onrender.com'a doğrudan gidiyordu ve reklam engelleyiciler bunu üçüncü taraf istek sayıp engelledi (net::ERR_BLOCKED_BY_CLIENT); vekil bu sorunu da çözdü.extensions.duckdb.org'a istek atılıyordu. Bu, CSP eklenince fark edildi ve E2E testiyle kilitlendi: sayfa dış hiçbir adrese istek atmaz.src/lib/sanitize.ts).src/lib/data/sample-values.ts, varsayılan kapalı): kullanıcı isterse az kategorili metin sütunlarının değerleri (en fazla 12 değer, kimlik sütunları hariç, ör. islem_turu: Gelir, Gider) modele gönderilir.
Backend (src/insightflow/validator.py)
data ve sorgunun kendi CTE'leri. Şema niteliği, dosya yolu ve tablo fonksiyonu yasak.read_csv, glob, getenv, current_setting, duckdb_* gibi fonksiyonlar SELECT içinde olsa bile reddedilir.tests/test_validator.py: 47 saldırı sorgusu (hepsi reddedilmeli) ve 18 gerçekçi analitik sorgu (hepsi kabul edilip gerçek DuckDB'de demo verisi üzerinde çalışmalı).src/lib/chart-spec.ts: modelin grafik önerisi yalnızca bir ipucu. Sonucun şekli (tarih/sayı/kategori sütunları) uymuyorsa şekle uygun tür seçilir.
validate_palette.js ile doğrulandı. Yeşil ve çivit arayüzde "cihazda kalan / modele giden" anlamına ayrıldığı için grafiklerde kullanılmaz. Her grafikte tablo görünümü var.summary.py). data'yı okuyan her SELECT GROUP BY veya toplama fonksiyonu içermeli; pencere fonksiyonu ve alt sorgudaki COUNT sayılmaz.data tablosu olur; birlikte seçilen ya da sonradan Dosya ekle ile eklenen dosyalar adlarından türetilen tablolar olur (Müşteri Listesi.xlsx → musteri_listesi, src/lib/data/tables.ts). En fazla 4 ek tablo var.data.musteri_id ↔ musteriler.musteri_id · %87 eşleşme). Modele yalnızca tablo.sütun çiftleri gider; oran ve değer gitmez.tables ve relationships alır. Tablo adları ^[a-z][a-z0-9_]{0,39}$, data olamaz, benzersizdir; ilişkiler yalnızca bilinen tablo ve sütunlara işaret edebilir.
scripts/eval_join.py): gerçek modelle 5 sorunun 5'i doğru tablo kullanımıyla ilk denemede çalıştı. Buna LEFT JOIN … IS NULL ile "müşteri kaydı olmayan siparişler" de dahil. Tek tabloyla yanıtlanabilen soruda gereksiz JOIN yapılmadı.src/lib/explore.ts), soru sormadan hazır içgörüler üretir; model çağrısı yapmaz, sorgular tarayıcıda koşar, cümleler sonuçlardan kural tabanlı ve basit istatistikle kurulur.corr, grafik için tekrarlanabilir örneklem).src/lib/answer-text.ts). Model çağrısı yoktur, cümle yalnızca sonuç tablosundaki sayılardan kurulur; neden ya da tavsiye içermez.src/lib/why.ts), seçilen iki dönem arasındaki farkı kategorilere böler (katkı analizi). Model çağrısı yapmaz, her şey tarayıcıdaki kilitli motorda koşar.json_serialize_sql) ağaca çevrilir. Aynı sorgu, aynı FROM/JOIN ve WHERE ile, bu kez her kategorik sütuna göre de gruplanarak yeniden kurulur (json_deserialize_sql). Regex ile SQL kurcalanmaz.SUM, COUNT, ROUND(SUM(...))). Ortalama, oran ya da benzersiz sayımın değişimi kategorilere paylaştırılamayacağı için analiz yapılmaz ve nedeni yazılır. CTE, alt sorgu, UNION, HAVING ve DISTINCT de aynı şekilde gerekçeyle reddedilir.src/lib/followup.ts); sonuç satırı gitmez.scripts/eval_followup.py: gerçek modelle 3 takip zincirinin 3'ü beklenen değişikliği uyguladı. İlk koşuda "kanal bazında kır" ayları düşürüyordu; prompt bu ayrımla düzeltildi.src/lib/outbound-log.ts): sunucuya giden her istek tek bir postJson üzerinden geçer ve gövdesi gönderildiği hâliyle kayda alınır. Üst şeritteki sayılar bu kayıttan türetilir; şeride tıklayınca gövdelerin kendisi açılır.src/lib/pins.ts): sabitlenen yanıt, sonuç satırlarıyla (ve varsa yönetici özetiyle) birlikte yalnızca tarayıcının IndexedDB'sinde saklanır.src/lib/report.ts): panodaki tüm analizler ya da tek bir yanıt, tarayıcıda PDF'e dönüştürülüp indirilir; sunucuya istek atılmaz.
chart-option.ts) sabit baskı temasıyla üretilir (ECharts SSR → SVG → svg2pdf).public/fonts/report/OFL.txt); metin PDF'te aranabilir.| Katman | Komut | Kapsam |
|---|---|---|
| Backend | uv run pytest | 130 test: doğrulayıcı saldırı korpusu, ek tablolarla JOIN ve izin listesi, API ve tablo/ilişki doğrulaması, özet toplulaştırma kuralı (JOIN/UNION dahil), örnek değer ve takip geçmişi sınırları, hata temizleme, istek sınırı |
| Frontend birim | npm test | 107 test: grafik seçici, profil, öneri soruları, tablo adı ve ilişki adayları, keşif cümleleri ve plan seçimi, örnek değer adayları, takip bağlamı zinciri, onarım döngüsü, giden istek kaydı, pano deposu (özet güncelleme dahil), backend uyanma izleyicisi, cevap cümlesi, "neden değişti?" (gerçek DuckDB sorgu ağaçlarıyla uygunluk kararları, katkı hesabı, toplam doğrulaması) |
| Uçtan uca | npm run test:e2e | 20 senaryo, gerçek Chromium + gerçek DuckDB-WASM (backend taklit edilir): dış istek yok, API aynı alan adından, veri sızıntısı yok, iki tablolu JOIN ve dosya ekleme/çıkarma, model çağrısız keşif, takip soruları, onaylı örnek değerler, motor kilidi, onarım, özet onayı, pano kalıcılığı, PDF rapor indirme, "neden değişti?" katkı analizi, durdurma, uyuyan sunucu, mobil |
| Model | uv run python scripts/eval_llm.py | Gerçek Gemini ile 3 veri setinde 16 soru; SQL gerçek DuckDB'de çalıştırılır (--with-values: onaylı örnek değerlerle). Ayrıca eval_followup.py (takip) ve eval_join.py (çok tablo) |
Son model değerlendirmesi (15.09.2026, gemini-3.5-flash-lite, 16 soru): 14 doğru sonuç, 1 doğru red ("yarın dolar kaç olacak"), 1 yanlış red ("aylık net kâr"), 0 çalışmayan SQL.
Yanlış red, yalnızca şema gönderme kararının bilinen bedeli: model islem_turu sütununda "Gelir/Gider" değerleri olduğunu göremiyor. Önceki koşularda aynı soruyu doğru yanıtlamıştı, yani sonuç koşudan koşuya değişebiliyor.
Onaylı örnek değerlerle (--with-values, aynı gün, aynı 16 soru): 15 doğru sonuç, 1 doğru red, 0 yanlış red. "Aylık net kâr" doğru çizgi grafiğe dönüştü; "mobil ve web" karşılaştırması tam değer adlarıyla filtrelendi. Tek koşuluk bir ölçüm; model sonuçları koşudan koşuya değişebilir.
Bir model, JSON içinde çift tırnaklı sütun adını kaçıramayıp kesik SQL döndürdü. Çözüm olarak sade adlar tırnaksız yazdırılıyor ve reddedilen turlardan sonra model zinciri kaydırılıyor. Bu hatayı yakalayan iki soru sete eklendi.
# Docker ile tek komut
GEMINI_API_KEY=... docker compose up --build # http://localhost:3000
# veya ayrı ayrı
cd backend && uv sync && uv run uvicorn insightflow.main:app --reload # http://localhost:8000/docs
cd frontend && npm install && npm run dev # http://localhost:3000
| Katman | Platform | Adres | Ayarlar |
|---|---|---|---|
| Arayüz | Vercel | https://insightflow-rust.vercel.app | Kök dizin frontend, NEXT_PUBLIC_API_URL=https://insightflow-api-d2gf.onrender.com (Config) |
| API | Render (Blueprint, Docker) | https://insightflow-api-d2gf.onrender.com | render.yaml; GEMINI_API_KEY (gizli), CORS_ORIGINS=https://insightflow-rust.vercel.app |
Dikkat edilecekler:
NEXT_PUBLIC_API_URL (ya da tercih edilen adıyla API_UPSTREAM_URL), /api/* vekilinin hedefidir ve derleme sırasında okunur; tarayıcıya gönderilmez. Değeri değiştirince Vercel'de yeniden derleme (Redeploy) şart. Tanımsız bırakılırsa vekil http://localhost:8000'e iletir; geçersiz bir değer (ör. yer tutucu metin) derlemeyi durdurur.CORS_ORIGINS doğrudan erişim için yedek olarak duruyor.src/lib/health-watch.ts).Canlı doğrulama (15.09.2026): üretim sitesinde headless Chromium ile demo veri seti açıldı ve "Kategori bazında iade oranı nedir?" soruldu.
/health, /sql, /summary); soru isteklerinde veri değeri yoktu..github/workflows/ci.yml): pytest, lint, tip kontrolü, vitest, production derlemesine karşı Playwright ve iki Docker imajının derlenmesi.frontend/ Next.js 16 + TypeScript + Tailwind + shadcn/ui, DuckDB-WASM, ECharts
src/lib/data/engine.ts tarayıcı içi motor (yükle → data tablosu → kilitle)
src/lib/ask.ts soru → /sql → tarayıcıda çalıştır → gerekirse /repair
src/lib/chart-spec.ts sonuç şekli → grafik tanımı
src/lib/outbound-log.ts giden istek kaydı ("Modele ne gitti?")
e2e/ Playwright senaryoları
scripts/benchmark.mjs tarayıcı performans ölçümü
backend/ FastAPI (Python 3.12, uv)
src/insightflow/validator.py AST güvenlik doğrulaması
src/insightflow/summary.py yönetici özeti için toplulaştırma kuralı
src/insightflow/llm.py Gemini (model zinciri: kota/yoğunlukta sıradakine geçer)
scripts/ demo/benchmark verisi, model değerlendirmesi, pandas–DuckDB karşılaştırması
docs/ plan PDF, benchmark sonuçları