File size: 4,215 Bytes
11cc0d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
569e03b
11cc0d3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from fact_checker import FactChecker
from openai import OpenAI
import os
from dotenv import load_dotenv
import csv
from datetime import datetime

load_dotenv()

def store_feedback_csv(claim, result, feedback, csv_file="feedback_log.csv"):
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    row = [
        now,
        claim,
        result.get("verdict", ""),
        result.get("confidence", ""),
        "|".join(result.get("evidence", [])),
        result.get("reasoning", ""),
        feedback
    ]
    header = ["datetime", "claim", "verdict", "confidence", "evidence", "reasoning", "feedback"]
    
    # Create file if it doesn't exist
    if not os.path.exists(csv_file):
        with open(csv_file, "w", newline='', encoding="utf-8") as f:
            writer = csv.writer(f)
            writer.writerow(header)
    
    # Append to existing file
    with open(csv_file, "a", newline='', encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow(row)

def initialize_services():
    return FactChecker(
        chroma_path="app/chroma_db",
        collection_name="pib_titles",
        groq_client=OpenAI(
            api_key=os.getenv("GROQ_API_KEY"),
            base_url="https://api.groq.com/openai/v1"
        )
    )

def main():
    st.title("πŸ” Fact Checker")
    checker = initialize_services()

    # Initialize session state variables
    if "feedback_submitted" not in st.session_state:
        st.session_state.feedback_submitted = False
    if "last_claim" not in st.session_state:
        st.session_state.last_claim = ""
    if "result" not in st.session_state:
        st.session_state.result = None

    claim = st.text_area("Enter a claim to verify:", height=150)
    confidence_threshold = st.slider("Confidence Threshold", 0.0, 1.0, 0.5, 0.05)

    if st.button("Verify Claim"):
        if not claim.strip():
            st.error("Please enter a claim to verify")
            return

        with st.spinner("Analyzing..."):
            # Store result in session state
            st.session_state.result = checker.verify_claim(claim, confidence_threshold)
            st.session_state.last_claim = claim
            st.session_state.feedback_submitted = False  # Reset feedback state for new claim

    # Display results from session state
    if st.session_state.result:
        result = st.session_state.result
        if "error" in result:
            st.error(f"Error: {result['error']}")
            if "raw_response" in result:
                with st.expander("Show raw LLM response"):
                    st.code(result["raw_response"])
        else:
            # Display verdict
            verdict_color = {
                "True": "green",
                "False": "red",
                "Unverifiable": "orange"
            }.get(result["verdict"], "gray")
            st.markdown(f"**Verdict:** :{verdict_color}[{result['verdict']}]")
            
            # Display confidence score
            st.metric("Confidence Score", f"{result.get('confidence', 0):.2f}")
            
            # Display evidence
            with st.expander("View Supporting Evidence"):
                for idx, evidence in enumerate(result.get("evidence", []), 1):
                    st.markdown(f"{idx}. {evidence}")
            
            # Display reasoning
            st.markdown("**Analysis:**")
            st.write(result.get("reasoning", "No reasoning provided"))

        # Feedback system
        feedback_key = f"feedback_radio_{st.session_state.last_claim}"
        if not st.session_state.feedback_submitted:
            feedback = st.radio(
                "Was this analysis helpful?",
                ["", "πŸ‘ Yes", "πŸ‘Ž No"],
                horizontal=True,
                key=feedback_key
            )
            
            if feedback:
                store_feedback_csv(st.session_state.last_claim, result, feedback)
                st.session_state.feedback_submitted = True
                st.rerun()  # Use st.rerun() instead of experimental_rerun()
        else:
            st.success("Thank you for your feedback! Your input helps improve the system.")


if __name__ == "__main__":
    main()