Trololindo commited on
Commit
cad3c34
·
1 Parent(s): 1f357a3
backend/app/services/factcheck_service.py CHANGED
@@ -1,3 +1,13 @@
 
 
 
 
 
 
 
 
 
 
1
  def load_env_fallback():
2
  """
3
  Ręcznie wczytuje plik .env do os.environ z pełną diagnostyką w konsoli.
@@ -42,4 +52,100 @@ def load_env_fallback():
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")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 z pełną diagnostyką w konsoli.
 
52
  print("❌ Nie znaleziono pliku .env w żadnej z badanych lokalizacji!")
53
 
54
  final_key = os.getenv("GEMINI_API_KEY")
55
+ print(f"🔑 Status GEMINI_API_KEY: {'ZNAJDZIONO (zaczyna się od: ' + final_key[:6] + '...)' if final_key else 'NIE ZNAJDZIONO!'}\n")
56
+
57
+ # Uruchamiamy wczytywanie środowiska przy imporcie tego serwisu
58
+ load_env_fallback()
59
+
60
+
61
+ async def analyze_with_gemini_grounding(statement: str) -> Dict[str, Any]:
62
+ """
63
+ Analizuje stwierdzenie, automatycznie przeszukując internet za pomocą
64
+ wbudowanego w Gemini narzędzia Google Search Grounding.
65
+ """
66
+ # Upewniamy się, że środowisko jest załadowane
67
+ load_env_fallback()
68
+
69
+ api_key = os.getenv("GEMINI_API_KEY")
70
+
71
+ if not api_key:
72
+ logger.error("Brak klucza GEMINI_API_KEY w środowisku systemowym!")
73
+ return {
74
+ "verdict": "SPORNE",
75
+ "explanation": "Błąd backendu: Brak skonfigurowanego klucza GEMINI_API_KEY w pliku .env.",
76
+ "confidence": 0.0,
77
+ "sources": []
78
+ }
79
+
80
+ genai.configure(api_key=api_key)
81
+
82
+ prompt = f"""Jesteś zaawansowanym asystentem do weryfikacji faktów (fact-checking).
83
+ Przeanalizuj poniższe stwierdzenie, korzystając z wyszukiwarki Google (masz do niej dostęp jako narzędzie), aby zweryfikować jego prawdziwość w czasie rzeczywistym.
84
+
85
+ STWIERDZENIE DO WERYFIKACJI:
86
+ "{statement}"
87
+
88
+ 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).
89
+ Format JSON:
90
+ {{
91
+ "verdict": "PRAWDA" lub "FAŁSZ" lub "SPORNE",
92
+ "explanation": "Zwięzłe (2-4 zdania), merytoryczne i obiektywne uzasadnienie werdyktu w języku polskim, wyjaśniające co mówią fakty."
93
+ }}
94
+
95
+ Wskazówki do werdyktu:
96
+ - "PRAWDA": Najnowsze fakty i wiarygodne źródła w pełni potwierdzają to stwierdzenie.
97
+ - "FAŁSZ": Fakty jednoznacznie zaprzeczają temu stwierdzeniu.
98
+ - "SPORNE": Informacje w sieci są sprzeczne, jest to kwestia opinii lub brak jednoznacznych dowodów.
99
+ """
100
+
101
+ try:
102
+ model = genai.GenerativeModel(
103
+ model_name="gemini-1.5-flash",
104
+ tools=[{"google_search": {}}]
105
+ )
106
+
107
+ response = model.generate_content(
108
+ prompt,
109
+ generation_config=genai.types.GenerationConfig(
110
+ temperature=0.0
111
+ )
112
+ )
113
+
114
+ raw_text = response.text.strip()
115
+ logger.info(f"Surowa odpowiedź Gemini: {raw_text}")
116
+
117
+ if raw_text.startswith("```"):
118
+ match = re.search(r"```(?:json)?\s*(\{.*?\})\s*```", raw_text, re.DOTALL)
119
+ if match:
120
+ raw_text = match.group(1)
121
+
122
+ result_json = json.loads(raw_text)
123
+
124
+ sources = []
125
+ candidate = response.candidates[0]
126
+ metadata = getattr(candidate, "grounding_metadata", None)
127
+
128
+ if metadata and getattr(metadata, "grounding_chunks", None):
129
+ for chunk in metadata.grounding_chunks:
130
+ if chunk.web:
131
+ sources.append({
132
+ "title": chunk.web.title,
133
+ "url": chunk.web.uri,
134
+ "snippet": "Źródło zweryfikowane bezpośrednio przez wyszukiwarkę Google."
135
+ })
136
+
137
+ return {
138
+ "verdict": result_json.get("verdict", "SPORNE"),
139
+ "explanation": result_json.get("explanation", "Brak uzasadnienia."),
140
+ "confidence": 0.95 if result_json.get("verdict") in ["PRAWDA", "FAŁSZ"] else 0.5,
141
+ "sources": sources
142
+ }
143
+
144
+ except Exception as e:
145
+ logger.error(f"Błąd analizy Gemini Grounding API: {e}", exc_info=True)
146
+ return {
147
+ "verdict": "SPORNE",
148
+ "explanation": f"Wystąpił błąd komunikacji z modelem językowym: {str(e)}",
149
+ "confidence": 0.0,
150
+ "sources": []
151
+ }