import gradio as gr from newspaper import Article from modules.online_search import search_online from modules.validation import calculate_truthfulness_score from modules.knowledge_graph import search_kg from dotenv import load_dotenv import os from concurrent.futures import ThreadPoolExecutor # Load environment variables from .env file load_dotenv() # Constants KG_INDEX_PATH = "KG/news_category_index.faiss" KG_DATASET_PATH = "KG/News_Category_Dataset_v3.json" SEARCH_API_KEY = os.getenv("SEARCH_API_KEY") SEARCH_BASE_URL = os.getenv("SEARCH_BASE_URL") SEARCH_MODEL = os.getenv("SEARCH_MODEL") # Initialize ThreadPoolExecutor executor = ThreadPoolExecutor(max_workers=2) # Function to process input and evaluate truthfulness def evaluate_news(news_input): # Display loading message yield "**Processing... Please wait while we analyze the information.** ⏳" # Handle URL input if news_input.startswith("http"): try: article = Article(news_input) article.download() article.parse() news_text = article.title + ". " + article.text except Exception as e: yield f"**Error processing the URL:** {str(e)}" return else: # Direct text input news_text = news_input try: # Run both search functions concurrently using ThreadPoolExecutor future_kg = executor.submit(search_kg, news_text, KG_INDEX_PATH, KG_DATASET_PATH) future_online = executor.submit(search_online, news_text, SEARCH_API_KEY, SEARCH_BASE_URL, SEARCH_MODEL) # Wait for the results of both tasks kg_content = future_kg.result() online_search_results = future_online.result() # Combine context from KG and online search context = online_search_results['message_content'] + '\n' + kg_content # Calculate truth score truth_score = calculate_truthfulness_score(info=news_text, context=context) # Generate explanation based on score if truth_score > 0.7: status = "likely true" recommendation = "You can reasonably trust this information, but further verification is always recommended for critical decisions." elif truth_score > 0.4: status = "uncertain" recommendation = "This information might be partially true, but additional investigation is required before accepting it as fact." else: status = "unlikely to be true" recommendation = "It is recommended to verify this information through multiple reliable sources before trusting it." # Final Output result = f"**News**: \"{news_text[:300]}...\"\n\n" result += f"**Truthfulness Score**: {truth_score:.2f} (**{status.capitalize()}**)\n\n" result += f"**Analysis**: {recommendation}\n\n" yield result except Exception as e: yield f"**Error occurred while processing the input:** {str(e)}" # Gradio Interface with gr.Blocks() as demo: gr.Markdown("# 📰 EchoTruth: Amplifying Authenticity in Live Broadcasts") gr.Markdown("### Enter a piece of news or a URL below to validate its authenticity.") # Input options with gr.Row(): input_box = gr.Textbox(placeholder="Enter news text or URL here...", label="Input News or URL") # Output display output_box = gr.Markdown() # Submit button submit_btn = gr.Button("Check Truthfulness") # Trigger function with spinner submit_btn.click( fn=evaluate_news, inputs=[input_box], outputs=[output_box] ) # Launch Gradio App demo.launch()