|
import streamlit as st |
|
import google.generativeai as genai |
|
import ast |
|
import time |
|
import re |
|
import os |
|
from typing import List, Tuple, Optional |
|
|
|
def extract_python_code(text: str) -> Optional[str]: |
|
pattern = r"```python\n(.*?)```" |
|
match = re.search(pattern, text, re.DOTALL) |
|
return match.group(1).strip() if match else None |
|
|
|
def configure_genai(): |
|
secret_key = os.getenv("SECRET_KEY") |
|
if not secret_key: |
|
st.error("API key not found. Please set the SECRET_KEY environment variable.") |
|
st.stop() |
|
genai.configure(api_key=secret_key) |
|
|
|
def parse_gemini_response(response_text: str) -> Tuple[str, str]: |
|
try: |
|
|
|
parsed = ast.literal_eval(response_text) |
|
if isinstance(parsed, list) and len(parsed) == 2: |
|
return parsed[0], parsed[1] |
|
|
|
|
|
matches = re.findall(r'\[.*?\]', response_text) |
|
if len(matches) >= 2: |
|
first_list = ast.literal_eval(matches[0]) |
|
second_list = ast.literal_eval(matches[1]) |
|
return first_list[0], second_list[0] |
|
|
|
|
|
raise ValueError("Unexpected response format") |
|
except Exception as e: |
|
return "Error", f"Failed to parse response: {str(e)}" |
|
|
|
def get_gemini_response(input_text: str) -> Tuple[str, str]: |
|
prompt = """You are a fact checker. Given a text, respond with: |
|
1. 'true', 'false', or 'unsure' (if you are unsure or knowledge cutoff) |
|
2. Evidence in support or 'knowledge cutoff' |
|
|
|
Respond in this exact format: ['true/false/unsure', 'evidence or knowledge cutoff'] |
|
Example input: 'Google was founded in 1998' |
|
Example output: ['true', 'Google was indeed founded in September 1998 by Larry Page and Sergey Brin'] |
|
|
|
Now give a response in the exact described format for the following text: |
|
""" |
|
model = genai.GenerativeModel('gemini-1.5-pro') |
|
try: |
|
response = model.generate_content(prompt + input_text) |
|
result, evidence = parse_gemini_response(response.text) |
|
return result, evidence |
|
except Exception as e: |
|
return "Error", f"Failed to get or parse the model's response: {str(e)}" |
|
|
|
def break_down_text(text: str) -> List[str]: |
|
prompt = """Break down the following text into a list of individual factual statements that can be independently verified. Return only a Python list of strings. |
|
|
|
Example input: "The Eiffel Tower, built in 1889, is 324 meters tall and located in Paris, France." |
|
Example output: ["The Eiffel Tower was built in 1889", "The Eiffel Tower is 324 meters tall", "The Eiffel Tower is located in Paris, France"] |
|
|
|
Now break down the following text: |
|
""" |
|
model = genai.GenerativeModel('gemini-1.5-pro') |
|
response = model.generate_content(prompt + text) |
|
|
|
code = extract_python_code(response.text) |
|
try: |
|
return ast.literal_eval(code) if code else [] |
|
except (ValueError, SyntaxError): |
|
st.error(f"Failed to parse the breakdown response: {response.text}") |
|
return [] |
|
|
|
def main(): |
|
st.title("Fact Checker") |
|
configure_genai() |
|
|
|
text = st.text_area('Paste the text to fact check (preferably about facts before 2021)', height=150) |
|
|
|
if st.button("Check Facts"): |
|
if not text: |
|
st.warning("Please enter some text to fact-check.") |
|
return |
|
|
|
statements = break_down_text(text) |
|
|
|
if not statements: |
|
st.error("Failed to break down the text into checkable statements. Please try rephrasing your input.") |
|
return |
|
|
|
st.subheader("Fact Checking Results:") |
|
for statement in statements: |
|
with st.expander(statement): |
|
with st.spinner('Checking...'): |
|
result, evidence = get_gemini_response(statement) |
|
|
|
if result.lower() == "true": |
|
st.success(f"Likely True: {evidence}") |
|
elif result.lower() == "false": |
|
st.error(f"Likely False: {evidence}") |
|
elif result.lower() == "unsure": |
|
st.warning(f"Uncertain: {evidence}") |
|
else: |
|
st.error(f"Error in fact-checking: {evidence}") |
|
|
|
time.sleep(3) |
|
|
|
if __name__ == "__main__": |
|
main() |
|
|