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