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 # 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") # 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: # Retrieve relevant info from FAISS knowledge graph kg_content = search_kg(query=news_text, index_path=KG_INDEX_PATH, dataset_path=KG_DATASET_PATH) # Search online for additional context online_search_results = search_online( query=news_text, api_key=SEARCH_API_KEY, base_url=SEARCH_BASE_URL, model=SEARCH_MODEL ) # 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()