Commit Graph

409 Commits

Author SHA1 Message Date
121fb593db fix(zopk): Poprawka nazwy kolumny confidence_score w auto_verify_top_facts
- Funkcja używała nieistniejącej kolumny importance_score
- Zmieniono na confidence_score (rzeczywista nazwa w tabeli)
- Poprawka analogiczna do wcześniejszej w find_duplicate_facts
2026-01-17 11:31:35 +01:00
56bfbeed37 fix(zopk): Poprawka statystyk weryfikacji na dashboardzie
- Funkcja renderVerificationStats używała nieistniejącego klucza data.verification
- API zwraca dane w strukturze: data.entities, data.facts, data.chunks
- Naprawiono mapowanie danych do właściwej struktury
- Obliczanie 'oczekuje' jako total - verified
2026-01-17 11:27:01 +01:00
5d24aa30b0 fix(zopk): Poprawka wyświetlania confidence_score w deduplikacji faktów 2026-01-17 11:21:53 +01:00
0adb9bed0e fix(zopk): Poprawka nazwy kolumny confidence_score w deduplikacji faktów 2026-01-17 11:16:53 +01:00
b3249f5b22 fix(zopk): Użycie operatora % z indeksem GiST dla deduplikacji faktów
Zapytanie similarity() bez indeksu powodowało timeout przy 3414 faktach.
Teraz używamy SET pg_trgm.similarity_threshold + operator % który
wykorzystuje indeks GiST (idx_facts_fulltext_trgm).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 11:09:01 +01:00
96fa0058c2 feat(zopk): Rozbudowa bazy wiedzy ZOPK
- Dodano skrypt cron do automatycznej ekstrakcji wiedzy (scripts/cron_extract_knowledge.py)
- Dodano panel deduplikacji faktów (/admin/zopk/knowledge/fact-duplicates)
- Dodano API i funkcje auto-weryfikacji encji i faktów
- Dodano panel Timeline ZOPK (/admin/zopk/timeline) z CRUD
- Rozszerzono dashboard bazy wiedzy o statystyki weryfikacji i przyciski auto-weryfikacji
- Dodano migrację 016_zopk_milestones.sql dla tabeli kamieni milowych
- Naprawiono duplikat modelu ZOPKMilestone w database.py

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 10:57:11 +01:00
3b27dcaf0d fix(zopk): Naprawa NaN w podglądzie faktów przy łączeniu encji
Problem: JS oczekiwał facts_subject + facts_object, API zwraca facts
Rozwiązanie: Zmiana JS na ${p.transfers.facts || 0}

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 10:32:41 +01:00
51378176c9 fix(zopk): Prawidłowe nazwy kolumn w ZOPKKnowledgeRelation
Model używa entity_a_id/entity_b_id, nie source_entity_id/target_entity_id.

Naprawione miejsca:
- get_entity_merge_preview(): zliczanie relacji
- merge_entities(): przenoszenie relacji

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 10:29:57 +01:00
4dcfc1b8e8 fix(zopk): Naprawa błędu JSONB cast w SQLAlchemy
Problem: `:entity_json::jsonb` było interpretowane przez SQLAlchemy
jako parametr `:entity_json` z dodatkowym `:jsonb` (błąd składni SQL)

Rozwiązanie: Użycie CAST(:entity_json AS jsonb) zamiast ::jsonb

Naprawione miejsca:
- get_entity_merge_preview() - linia 1919
- merge_entities() - linia 1831

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 10:22:58 +01:00
8bdbd04c8c fix(zopk): Sortowanie duplikatów encji od największego podobieństwa
Zmiana kolejności ORDER BY w find_duplicate_entities():
- Teraz: sim DESC, entity_type, mentions DESC
- Wcześniej: entity_type, mentions DESC, sim DESC

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 10:19:16 +01:00
9ae72bb2fa fix(zopk): Naprawa łączenia encji - brak kolumn subject_entity_id/object_entity_id
Problem: ZOPKKnowledgeFact nie ma kolumn subject_entity_id i object_entity_id.
Zamiast tego używa entities_involved (JSONB array).

Zmiany:
- get_entity_merge_preview(): użycie JSONB @> query do liczenia faktów
- merge_entities(): użycie JSONB update do zamiany entity ID w facts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 09:57:30 +01:00
b69882bbb2 perf(zopk): Cache dla grafu relacji (TTL 5 min)
- Dodano in-memory cache dla API /api/zopk/knowledge/graph/data
- Cache key oparty o parametry: entity_type, min_cooccurrence, limit
- TTL = 300 sekund (5 minut)
- Flaga 'cached' w odpowiedzi informuje czy dane z cache

Korzyść: Drugie i kolejne ładowania grafu są natychmiastowe.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 09:34:52 +01:00
36d24d1735 fix(zopk): Naprawa inicjalizacji grafu relacji
Problem: D3.js ładowane przez base.html PO bloku extra_js,
więc initGraph() była wywoływana gdy D3 jeszcze nie istniało.

Rozwiązanie: użycie window.addEventListener('load', ...)
zamiast natychmiastowego sprawdzenia typeof d3.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 09:24:33 +01:00
85c3f75e9b feat(zopk): Graf relacji encji (Priorytet 5)
- Dodano endpoint /admin/zopk/knowledge/graph z wizualizacją D3.js
- Dodano API endpoint /api/zopk/knowledge/graph/data
- Graf współwystępowania encji z kolorami według typu
- Rozmiar węzłów proporcjonalny do liczby wzmianek
- Filtry: typ encji, minimalna liczba współwystąpień
- Tooltips z informacjami o encjach
- Zoom i drag-and-drop interakcje

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 09:14:30 +01:00
143f5c674a feat(zopk): Implementacja łączenia duplikatów encji (Priorytet 4)
Nowe funkcje w zopk_knowledge_service.py:
- find_duplicate_entities() - wyszukiwanie podobnych encji (pg_trgm)
- merge_entities() - łączenie encji z transferem relacji
- get_entity_merge_preview() - podgląd przed połączeniem

Nowe endpointy w app.py:
- GET /admin/zopk/knowledge/duplicates - panel zarządzania duplikatami
- POST /api/zopk/knowledge/duplicates/preview - podgląd merge
- POST /api/zopk/knowledge/duplicates/merge - wykonanie merge

Nowy szablon:
- templates/admin/zopk_knowledge_duplicates.html - UI z kartami encji

Dodatkowo:
- Aktualizacja CLAUDE.md z procedurą wdrażania
- Skrypt scripts/run_migration.py do uruchamiania migracji SQL

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 09:09:22 +01:00
6d1f75bce5 fix(admin): Naprawiono błędne nazwy endpointów w breadcrumbs
Zmieniono admin_dashboard i admin_zopk_dashboard na admin_zopk

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 09:03:01 +01:00
d0dda10bd7 feat(zopk): Panel admina bazy wiedzy, poprawa odpowiedzi AI, timeline
Priorytet 1 - Panel admina bazy wiedzy ZOPK:
- /admin/zopk/knowledge - dashboard ze statystykami
- /admin/zopk/knowledge/chunks - lista chunks z filtrowaniem
- /admin/zopk/knowledge/facts - lista faktów z typami
- /admin/zopk/knowledge/entities - lista encji z mentions
- CRUD operacje: weryfikacja, usuwanie

Priorytet 2 - Poprawa jakości odpowiedzi NordaGPT:
- Linki markdown do źródeł w kontekście ZOPK
- Ulepszone formatowanie (bold, listy, nagłówki)
- Sekcja "Źródła" na końcu odpowiedzi
- Instrukcje w system prompt dla lepszej prezentacji

Priorytet 3 - Timeline ZOPK:
- Model ZOPKMilestone w database.py
- Migracja 016_zopk_milestones.sql z sample data
- Sekcja "Roadmapa ZOPK" na stronie /zopk
- Pionowa oś czasu z markerami lat
- Statusy: completed, in_progress, planned, delayed

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 08:56:55 +01:00
7cc5f033fe fix: Poprawiono nazwy kluczy w pipeline skrypcie
Zmieniono 'processed' -> 'success' i 'generated' -> 'success' aby
pasowały do wartości zwracanych przez batch_extract() i
generate_chunk_embeddings().

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 00:27:08 +01:00
cbd9c5cc4d feat(zopk): Skrypt pipeline do automatycznej ekstrakcji wiedzy
Uruchamia po kolei: scraping treści, ekstrakcję AI, generowanie embeddingów.
Do użycia w cron job co godzinę.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:39:49 +01:00
081c0d7ec5 fix: Naprawiono dekodowanie URL-i Google News
Zmieniono kolejność metod dekodowania - googlenewsdecoder jest teraz
używany jako pierwsza metoda zamiast ostatniej. Poprzednia kolejność
powodowała wpadanie w pętlę z consent.google.com i wyczerpanie max_depth
przed wywołaniem działającej biblioteki.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:34:40 +01:00
900a3b4ed9 fix(admin): Naprawiono błąd importu w SSE scraping endpoint
Problem: Podwójny import ZOPKContentScraper powodował błąd 'cannot access local variable'
Rozwiązanie: Przeniesiono import na początek funkcji generate()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:28:16 +01:00
37af8abc73 feat(admin): Paski postępu dla operacji AI w panelu ZOPK
Dodano Server-Sent Events (SSE) dla śledzenia postępu w czasie rzeczywistym:
- Scraping treści artykułów
- Ekstrakcja wiedzy przez Gemini AI
- Generowanie embeddingów

Funkcje:
- Modal z paskiem postępu i statystykami
- Live log operacji z kolorowaniem statusów
- Podsumowanie na zakończenie (sukces/błędy/czas)
- Możliwość zamknięcia modalu po zakończeniu

Zmiany techniczne:
- 3 nowe SSE endpointy (/stream)
- ProgressUpdate dataclass w scraperze
- Callback pattern w batch_scrape, batch_extract, generate_chunk_embeddings

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:23:05 +01:00
31d5a112b8 feat(admin): Sekcja Baza Wiedzy AI w panelu ZOPK
- Dodano sekcję "🧠 Baza Wiedzy AI" do /admin/zopk
- Statystyki scrapingu: zatwierdzonych, zescrapowanych, oczekujących
- Statystyki wiedzy: chunks, fakty, encje
- Statystyki embeddingów: z/bez embeddingów
- Przyciski: Scrapuj treść, Ekstrakcja AI, Generuj embeddingi
- Top encje z kolorowymi pillami (firmy, osoby, miejsca, projekty)
- Rozszerzono get_extraction_statistics() o pending_scrape i embeddings

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 22:17:44 +01:00
3e90cdbfc7 feat(scraper): Dekodowanie URL-i Google News do oryginalnych źródeł
- Dodano funkcję decode_google_news_url() z 3 metodami dekodowania:
  1. Base64 decoding (preferowana, bez HTTP request)
  2. HTTP redirect following
  3. googlenewsdecoder library jako fallback
- Scraper automatycznie dekoduje URL-e Google News przed scrapowaniem
- Zaktualizowano news.url i news.source_domain po dekodowaniu
- Dodano news.google.com do SKIP_DOMAINS (wymaga dekodowania)
- Dodano googlenewsdecoder do requirements.txt

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 22:12:27 +01:00
41141eb540 fix: Remove is_verified filter from get_relevant_facts
All 328 auto-extracted facts had is_verified=False, causing
empty results. Changed to confidence_score >= 0.3 filter instead.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 22:03:15 +01:00
9421f2847f fix: Improve extraction prompt with JSON structure and fix fact parsing
- Updated prompt to specify expected JSON structure for facts and entities
- Added 'text' field support in fact parsing (alongside 'full_text')
- Listed explicit type values for facts and entities

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 21:14:56 +01:00
624114d443 fix: Remove max_tokens parameter that triggered Gemini safety filters
Testing revealed that max_tokens=2000 parameter causes Gemini to block
requests with safety filters, even for safe content.

Removed max_tokens from generate_text() call - Gemini will use default.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 21:10:45 +01:00
ac0aceb30e fix: Reduce chunk size and truncate prompts for Gemini safety filters
Testing revealed that Gemini 2.5 safety filters block texts longer than
~2000 chars. Applied two fixes:

1. Truncate chunk text to 2000 chars in _extract_with_ai() as safety net
2. Reduce MAX_CHUNK_SIZE from 1000 to 500 tokens (~2000 chars)

This ensures all AI extraction requests stay within Gemini's safe limits.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 21:05:48 +01:00
4045106b3c fix: Ultra-simplified extraction prompt to avoid Gemini safety filters
The complex JSON schema with pipe characters was triggering Gemini 2.5's
safety filters. Simplified to minimal prompt that still produces valid output.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:59:00 +01:00
e1f29229a3 fix(zopk): Uproszczone prompty ekstrakcji - rozwiązanie safety filters
Problem: Połączenie skomplikowanego system_prompt + user_prompt
         wyzwalało safety filters Gemini mimo płatnego API

Rozwiązanie:
- Usunięto system_prompt (pusty string)
- Uproszczono user_prompt do minimum
- Zachowano niezbędny format JSON

Testowane: prosty prompt działa, pełny przebieg do weryfikacji

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:54:22 +01:00
1e42c4fbd8 fix(scraper): Dodano domeny paywall do SKIP_DOMAINS
- wyborcza.pl - paywall Gazety Wyborczej
- rp.pl - paywall Rzeczpospolitej
- wykop.pl - agregator bez oryginalnej treści
- reddit.com - agregator

Te domeny zwracają cookie dialog zamiast treści artykułów

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:48:26 +01:00
21586f6b91 fix(chat): Rozszerzone słowa kluczowe ZOPK - polskie odmiany przypadków
Dodano:
- Odmiany 'jądrowa/jądrowej/jądrowe/jądrowy'
- 'atomowa' i odmiany
- Konkretne nazwy: westinghouse, bechtel, arabelle, turbiny
- Więcej form offshore wind
- Rozszerzono infrastructure i energy keywords

Dzięki temu pytania jak 'turbiny dla elektrowni jądrowej'
będą poprawnie rozpoznawane jako ZOPK

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:48:02 +01:00
1136e9d40b fix(gemini): Przekazywanie safety_settings z BLOCK_NONE
Problem: Gemini blokował treści o energetyce jako 'dangerous content'
Rozwiązanie: Przekazywanie safety_settings do API z BLOCK_NONE

Uwaga: FREE tier może nadal mieć ograniczenia

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:43:33 +01:00
27b03eb051 fix(zopk): Neutralne prompty ekstrakcji - unikanie safety filters
Problem: Gemini blokował ekstrakcję z artykułów o energetyce
Rozwiązanie: Bardziej neutralne sformułowania promptów
- Podkreślono że to analiza PUBLICZNYCH artykułów prasowych
- Usunięto wrażliwe słowa kluczowe (nuclear, defense)
- Zmieniono 'extract' na 'identify'

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:42:05 +01:00
cd2db86a95 fix(zopk): Naprawiono błąd system_prompt w AI extraction
Problem: GeminiService.generate_text() nie obsługuje parametru system_prompt
Rozwiązanie: Połączono system_prompt z user_prompt w jeden full_prompt

Dotyczy: ekstrakcji faktów, encji i relacji z artykułów ZOPK

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:37:09 +01:00
a20d94883e feat(admin): Konfigurowalne limity dla operacji ZOPK
- Scraping: domyślnie 1, max 100
- Ekstrakcja: domyślnie 1, max 100
- Embeddingi: domyślnie 1, max 500
- Usunięto stałe liczby z etykiet przycisków

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:30:54 +01:00
0797afe162 fix(admin): Poprawiono czytelność wyświetlania statystyk ZOPK
- Dodano white-space: pre-line do modala
- Wyrównano kolumny wartości
- Dodano separatory sekcji
- Usunięto zbędne emoji w nagłówkach

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:29:26 +01:00
498f273aba fix(admin): Naprawiono strukturę danych w przyciskach ZOPK
- Naprawiono showKnowledgeStats - używa prawidłowej zagnieżdżonej struktury
- Naprawiono endpoint embeddings - renamed 'success' count to 'generated'
- Naprawiono endpoint extract - renamed 'success' count to 'processed'
- Unikamy nadpisywania flagi 'success: True' przez spread operator

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:27:02 +01:00
8b065d84d0 feat(admin): Przyciski do scrapingu i ekstrakcji wiedzy ZOPK
- Dodano przyciski: Scrapuj treść, Ekstraktuj wiedzę, Generuj embeddingi
- Dodano przycisk Statystyki z podglądem bazy wiedzy
- Przyciski widoczne w panelu /admin/zopk/news

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:21:55 +01:00
1b4cd31c41 feat(zopk): Knowledge Base + NordaGPT integration (FAZY 0-3)
FAZA 0 - Web Scraping:
- Migracja 015: pola full_content, scrape_status w zopk_news
- zopk_content_scraper.py: scraper z rate limiting i selektorami

FAZA 1 - Knowledge Extraction:
- zopk_knowledge_service.py: chunking, facts, entities extraction
- Endpointy /admin/zopk/knowledge/extract

FAZA 2 - Embeddings:
- gemini_service.py: generate_embedding(), generate_embeddings_batch()
- Model text-embedding-004 (768 dimensions)

FAZA 3 - NordaGPT Integration:
- nordabiz_chat.py: _is_zopk_query(), _get_zopk_knowledge_context()
- System prompt z bazą wiedzy ZOPK
- Semantic search w kontekście chatu

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 20:15:30 +01:00
0f1cf6176a fix(health): Usunięcie nieistniejącego endpointu /admin/news
Endpoint /admin/news był planowany (dokumentacja CLAUDE.md) ale nigdy
nie zaimplementowany. Tylko /admin/zopk/news istnieje.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 21:31:10 +01:00
0a5f40879b fix(admin): Naprawa błędu 500 na /admin/fees + rozszerzenie health check
1. Context processor bug: datetime.now → datetime.now()
   - Szablon fees.html używa now.strftime(), potrzebuje wartości nie metody
   - Powodowało jinja2.UndefinedError na /admin/fees

2. Health check: dodano brakujące endpointy admina
   - /admin/fees (Składki/FIS)
   - /admin/news (News moderacja)
   - /admin/zopk/news (ZOPK News)
   - /admin/recommendations (Rekomendacje)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 21:27:18 +01:00
c13ad09e3a feat(zopk): Skrypt do naprawy źródeł newsów z Google News
Problem: Newsy z Google News RSS miały source_domain='news.google.com'
i favicon Google zamiast prawdziwego źródła.

Rozwiązanie: Nowy skrypt fix_google_news_sources.py który:
- Wyciąga nazwę źródła z tytułu (po " - ")
- Mapuje 59 źródeł na ich prawdziwe domeny
- Aktualizuje source_domain i image_url (favicon)

Wynik: 143/143 newsów zaktualizowanych z poprawnymi źródłami.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 08:06:40 +01:00
8055589a08 fix: Usunięto Session z decode_google_news_url, dodano max_depth
- Zamieniono requests.Session() na bezpośredni requests.get()
- Dodano max_depth=3 jako zabezpieczenie przed nieskończoną rekurencją
- Jawne zamykanie response.close() po każdym request

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 07:45:02 +01:00
af4c0d157a fix: Naprawiono wyciek połączeń HTTP w fix_google_news_images.py
- Dodano context manager (with) dla sesji requests
- Jawne zamykanie odpowiedzi HTTP (response.close())
- Dodano flush=True do print dla natychmiastowego outputu
- Rozwiązuje problem 725+ otwartych połączeń

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 07:40:00 +01:00
07171b46b7 docs: Raport incydentu CPU + ostrzeżenia o uruchamianiu skryptów
- Dodano INCIDENT_REPORT_20260115.md dokumentujący incydent
  wysokiego CPU spowodowany wielokrotnym uruchomieniem skryptu
- Dodano ostrzeżenia do CLAUDE.md o uruchamianiu skryptów:
  - SSH timeout NIE oznacza nieudanego wykonania
  - Sprawdzaj procesy przed ponownym uruchomieniem
  - Używaj QEMU guest agent jako alternatywy

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 07:35:05 +01:00
637ec2fc75 feat: Skrypt do naprawy obrazków newsów z Google News 2026-01-15 06:19:53 +01:00
c2205b0815 fix: Poprawione dekodowanie URL Google News + użycie source_domain 2026-01-15 06:10:59 +01:00
8ead7798df fix: Ładowanie DATABASE_URL z .env w skrypcie obrazków 2026-01-15 06:08:59 +01:00
cf56fe7d8a feat(zopk): Skrypt do pobierania obrazków dla newsów
Strategia pobierania obrazków:
1. Rozwiń URL Google News do oryginalnego źródła
2. Pobierz og:image z meta tagów strony
3. Fallback: logo domeny (Clearbit API)
4. Fallback: favicon (Google Favicon API)

Użycie: python scripts/fetch_news_images.py [--dry-run] [--limit N]

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-15 06:08:10 +01:00