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": []
        }