factify-models / models /challenge_analyzer.py
arwnsyh's picture
Revert to models/gemini-flash-latest to fix quota issues
c318fcb
"""
Challenge Analyzer - Analisis jawaban user di fitur Challenge
"""
import os
import json
from typing import Dict, Any, Optional
import google.generativeai as genai
from .base_model import BaseAnalyzer, AnalysisResult
class ChallengeAnalyzer(BaseAnalyzer):
"""
Analyzer untuk mengevaluasi jawaban user pada challenge/studi kasus
"""
def __init__(self):
super().__init__("ChallengeAnalyzer")
self.genai_model = None
def initialize(self) -> bool:
try:
api_key = os.getenv('GEMINI_API_KEY')
if not api_key:
print("[ChallengeAnalyzer] No API Key found")
return False
genai.configure(api_key=api_key)
self.genai_model = genai.GenerativeModel('models/gemini-flash-latest')
self.is_initialized = True
print("[ChallengeAnalyzer] Gemini Flash Latest initialized")
return True
except Exception as e:
print(f"[ChallengeAnalyzer] Init failed: {e}")
return False
def evaluate(self, case_context: Dict[str, str], user_answer: str, user_sources: str) -> Dict[str, Any]:
"""
Evaluasi jawaban user
"""
if not self.is_initialized:
return {"error": "Analyzer not initialized"}
prompt = f"""
Peran: Kamu adalah Sistem Evaluasi Verifikasi Fakta Tingkat Mahir (Advanced Fact-Checking Evaluation System).
Tugas: Menilai akurasi dan kualitas investigasi pengguna terhadap kasus hoaks dengan standar profesional (Akurasi Tinggi).
KONTEKS KASUS:
[Topik]: {case_context.get('topic', 'General')}
[Judul]: {case_context.get('title', '')}
[Masalah]: {case_context.get('problem', '')}
[Kebenaran]: {case_context.get('solution', '')}
JAWABAN PENGGUNA:
[Analisis]: "{user_answer}"
[Sumber]: "{user_sources}"
PEDOMAN PENILAIAN (PRESISI & STRICT):
1. KETEPATAN FAKTA (40%): Apakah pengguna berhasil membongkar hoaks tersebut dengan bukti yang benar-benar akurat sesuai 'Kebenaran'?
2. KEDAULATAN LOGIKA (30%): Apakah argumentasi logis? Apakah mereka menjelaskan MENGAPA itu hoaks (misal: analisis foto, cek tanggal)?
3. KUALITAS REFERENSI (20%): Apakah sumber yang disebut kredibel (Berita Mainstream/Jurnal)? Jika user menjawab "Google" atau kosong, nilai bagian ini 0.
4. OBYEKTIVITAS (10%): Gaya bahasa netral dan analitis.
OUTPUT JSON:
{{
"thought_process": "<Analisis singkat AI tentang jawaban user>",
"score": <0-100>,
"verdict": "<Sangat Bagus / Bagus / Cukup / Kurang / Gagal>",
"strengths": ["<Poin positif 1>", "<Poin positif 2>"],
"weaknesses": ["<Kekurangan 1>", "<Kekurangan 2>"],
"feedback": "<Saran konstruktif dan cerdas untuk pengguna agar lebih baik.>",
"detailed_scores": {{
"accuracy": <0-40>,
"logic": <0-30>,
"evidence": <0-20>,
"attitude": <0-10>
}}
}}
"""
try:
response = self.genai_model.generate_content(prompt)
text = response.text.strip()
# Clean JSON
if "```json" in text:
text = text.split("```json")[1].split("```")[0]
elif "```" in text:
text = text.split("```")[1].split("```")[0]
return json.loads(text)
except Exception as e:
print(f"[ChallengeAnalyzer] Error: {e}")
return {
"score": 0,
"error": str(e),
"feedback": "Maaf, terjadi kesalahan teknis saat menilai."
}
def analyze(self, content: Any) -> AnalysisResult:
# Not used directly, but required by BaseAnalyzer
return AnalysisResult(0, 0, [], [])