Trololindo commited on
Commit
1f357a3
·
1 Parent(s): 6695efd
backend/app/services/factcheck_service.py CHANGED
@@ -1,135 +1,45 @@
1
- import logging
2
- import json
3
- import re
4
- import os
5
- from pathlib import Path
6
- from typing import Dict, Any, List
7
- import google.generativeai as genai
8
-
9
- logger = logging.getLogger(__name__)
10
-
11
  def load_env_fallback():
12
  """
13
- Ręcznie wczytuje plik .env do os.environ.
14
- Szuka pliku w kilku prawdopodobnych miejscach, zależnie od tego, skąd uruchomiono serwer.
15
  """
16
  if os.getenv("GEMINI_API_KEY"):
17
- return # Klucz już jest wczytany, nie musimy nic robić
18
 
19
- # Sprawdzamy potencjalne ścieżki do pliku .env
20
  possible_paths = [
21
  Path(".env"), # Bieżący folder roboczy
22
- Path("backend/.env"), # Folder backend (jeśli uruchomiono z głównego)
23
- Path(__file__).resolve().parent.parent.parent / ".env" # Ścieżka relatywna do tego pliku serwisu
24
  ]
25
 
26
- for path in possible_paths:
27
- if path.exists():
28
- logger.info(f"Wczytywanie pliku .env z lokalizacji: {path.resolve()}")
 
 
 
 
 
 
 
 
29
  try:
30
- with open(path, "r", encoding="utf-8") as f:
 
31
  for line in f:
32
  line = line.strip()
33
  if line and not line.startswith("#") and "=" in line:
34
  key, val = line.split("=", 1)
35
- # Oczyszczamy klucz i wartość z cudzysłowów oraz spacji
36
- os.environ[key.strip()] = val.strip().strip("'\"")
37
- return
 
 
 
38
  except Exception as e:
39
- logger.warning(f"Nie udało się odczytać pliku {path}: {e}")
40
-
41
- # Uruchamiamy wczytywanie środowiska przy imporcie tego serwisu
42
- load_env_fallback()
43
-
44
-
45
- async def analyze_with_gemini_grounding(statement: str) -> Dict[str, Any]:
46
- """
47
- Analizuje stwierdzenie, automatycznie przeszukując internet za pomocą
48
- wbudowanego w Gemini narzędzia Google Search Grounding.
49
- """
50
- # Upewniamy się, że środowisko jest załadowane
51
- load_env_fallback()
52
-
53
- api_key = os.getenv("GEMINI_API_KEY")
54
-
55
- if not api_key:
56
- logger.error("Brak klucza GEMINI_API_KEY w środowisku systemowym!")
57
- return {
58
- "verdict": "SPORNE",
59
- "explanation": "Błąd backendu: Brak skonfigurowanego klucza GEMINI_API_KEY w pliku .env.",
60
- "confidence": 0.0,
61
- "sources": []
62
- }
63
-
64
- genai.configure(api_key=api_key)
65
-
66
- prompt = f"""Jesteś zaawansowanym asystentem do weryfikacji faktów (fact-checking).
67
- Przeanalizuj poniższe stwierdzenie, korzystając z wyszukiwarki Google (masz do niej dostęp jako narzędzie), aby zweryfikować jego prawdziwość w czasie rzeczywistym.
68
-
69
- STWIERDZENIE DO WERYFIKACJI:
70
- "{statement}"
71
-
72
- Twoja odpowiedź musi być wyłącznie poprawnym obiektem JSON (bez bloków kodu typu ```json, bez dodatkowego tekstu na początku ani na końcu).
73
- Format JSON:
74
- {{
75
- "verdict": "PRAWDA" lub "FAŁSZ" lub "SPORNE",
76
- "explanation": "Zwięzłe (2-4 zdania), merytoryczne i obiektywne uzasadnienie werdyktu w języku polskim, wyjaśniające co mówią fakty."
77
- }}
78
-
79
- Wskazówki do werdyktu:
80
- - "PRAWDA": Najnowsze fakty i wiarygodne źródła w pełni potwierdzają to stwierdzenie.
81
- - "FAŁSZ": Fakty jednoznacznie zaprzeczają temu stwierdzeniu.
82
- - "SPORNE": Informacje w sieci są sprzeczne, jest to kwestia opinii lub brak jednoznacznych dowodów.
83
- """
84
-
85
- try:
86
- model = genai.GenerativeModel(
87
- model_name="gemini-1.5-flash",
88
- tools=[{"google_search": {}}]
89
- )
90
-
91
- response = model.generate_content(
92
- prompt,
93
- generation_config=genai.types.GenerationConfig(
94
- temperature=0.0
95
- )
96
- )
97
-
98
- raw_text = response.text.strip()
99
- logger.info(f"Surowa odpowiedź Gemini: {raw_text}")
100
-
101
- if raw_text.startswith("```"):
102
- match = re.search(r"```(?:json)?\s*(\{.*?\})\s*```", raw_text, re.DOTALL)
103
- if match:
104
- raw_text = match.group(1)
105
 
106
- result_json = json.loads(raw_text)
107
-
108
- sources = []
109
- candidate = response.candidates[0]
110
- metadata = getattr(candidate, "grounding_metadata", None)
111
-
112
- if metadata and getattr(metadata, "grounding_chunks", None):
113
- for chunk in metadata.grounding_chunks:
114
- if chunk.web:
115
- sources.append({
116
- "title": chunk.web.title,
117
- "url": chunk.web.uri,
118
- "snippet": "Źródło zweryfikowane bezpośrednio przez wyszukiwarkę Google."
119
- })
120
-
121
- return {
122
- "verdict": result_json.get("verdict", "SPORNE"),
123
- "explanation": result_json.get("explanation", "Brak uzasadnienia."),
124
- "confidence": 0.95 if result_json.get("verdict") in ["PRAWDA", "FAŁSZ"] else 0.5,
125
- "sources": sources
126
- }
127
 
128
- except Exception as e:
129
- logger.error(f"Błąd analizy Gemini Grounding API: {e}", exc_info=True)
130
- return {
131
- "verdict": "SPORNE",
132
- "explanation": f"Wystąpił błąd komunikacji z modelem językowym: {str(e)}",
133
- "confidence": 0.0,
134
- "sources": []
135
- }
 
 
 
 
 
 
 
 
 
 
 
1
  def load_env_fallback():
2
  """
3
+ Ręcznie wczytuje plik .env do os.environ z pełną diagnostyką w konsoli.
 
4
  """
5
  if os.getenv("GEMINI_API_KEY"):
6
+ return
7
 
 
8
  possible_paths = [
9
  Path(".env"), # Bieżący folder roboczy
10
+ Path("backend/.env"), # Folder backend
11
+ Path(__file__).resolve().parent.parent.parent / ".env" # Ścieżka relatywna do serwisu
12
  ]
13
 
14
+ print(f"\n🔍 [DIAGNOSTYKA .ENV] Bieżący katalog roboczy (CWD): {os.getcwd()}")
15
+
16
+ found_any = False
17
+ for path_obj in possible_paths:
18
+ resolved_path = path_obj.resolve()
19
+ exists = resolved_path.exists()
20
+ print(f"👉 Sprawdzam ścieżkę: {resolved_path} -> [Znaleziono: {'TAK' if exists else 'NIE'}]")
21
+
22
+ if exists:
23
+ found_any = True
24
+ print(f"📖 Próba wczytania pliku: {resolved_path}")
25
  try:
26
+ loaded_keys = []
27
+ with open(resolved_path, "r", encoding="utf-8") as f:
28
  for line in f:
29
  line = line.strip()
30
  if line and not line.startswith("#") and "=" in line:
31
  key, val = line.split("=", 1)
32
+ k_clean = key.strip()
33
+ v_clean = val.strip().strip("'\"")
34
+ os.environ[k_clean] = v_clean
35
+ loaded_keys.append(k_clean)
36
+ print(f"✅ Pomyślnie wczytano klucze z pliku: {loaded_keys}")
37
+ break
38
  except Exception as e:
39
+ print(f" Błąd odczytu pliku .env: {e}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
+ if not found_any:
42
+ print("❌ Nie znaleziono pliku .env w żadnej z badanych lokalizacji!")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
+ final_key = os.getenv("GEMINI_API_KEY")
45
+ print(f"🔑 Status GEMINI_API_KEY: {'ZNAJDZIONO (zaczyna się od: ' + final_key[:6] + '...)' if final_key else 'NIE ZNAJDZIONO!'}\n")