import gradio as gr import requests from PIL import Image from src.application.content_detection import NewsVerification from src.application.content_generation import ( generate_fake_image, generate_fake_text, replace_text, ) from src.application.url_reader import URLReader AZURE_TEXT_MODEL = ["gpt-4o-mini", "gpt-4o"] AZURE_IMAGE_MODEL = ["dall-e-3", "Stable Diffusion (not supported)"] def load_url(url): """ Load content from the given URL. """ content = URLReader(url) image = None header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36", # noqa: E501 } try: response = requests.get( url, headers=header, stream=True, ) response.raise_for_status() # Raise an exception for bad status codes image_response = requests.get(content.top_image, stream=True) try: image = Image.open(image_response.raw) except OSError as e: print(f"Error loading image from {content.top_image}: {e}") except (requests.exceptions.RequestException, FileNotFoundError) as e: print(f"Error fetching image: {e}") return content.title, content.text, image def generate_analysis_report( news_title: str, news_content: str, news_image: Image, ): news_analysis = NewsVerification() news_analysis.load_news(news_title, news_content, news_image) news_analysis.generate_analysis_report() return news_analysis.analyze_details() # Define the GUI with gr.Blocks() as demo: gr.Markdown("# NEWS VERIFICATION") with gr.Row(): # SETTINGS with gr.Column(scale=1): with gr.Accordion("1. Enter a URL"): url_input = gr.Textbox( label="", show_label=False, value="", ) load_button = gr.Button("Load URL") with gr.Accordion( "2. Select content-generation models", open=True, visible=False, ): with gr.Row(): text_generation_model = gr.Dropdown( choices=AZURE_TEXT_MODEL, label="Text-generation model", ) image_generation_model = gr.Dropdown( choices=AZURE_IMAGE_MODEL, label="Image-generation model", ) generate_text_button = gr.Button("Generate text") generate_image_button = gr.Button("Generate image") with gr.Accordion( "3. Replace any terms", open=True, visible=False, ): replace_df = gr.Dataframe( headers=["Find what:", "Replace with:"], datatype=["str", "str"], row_count=(1, "dynamic"), col_count=(2, "fixed"), interactive=True, ) replace_button = gr.Button("Replace all") # GENERATED CONTENT with gr.Accordion("Input News"): news_title = gr.Textbox(label="Title", value="") news_image = gr.Image(label="Image", type="filepath") news_content = gr.Textbox(label="Content", value="", lines=13) # NEWS ANALYSIS REPORT ordinary_user_explanation = """ FOR ORDINARY USER
- Green texts are the matched words in the input and source news.
- Each highlighted pair (marked with a number) shows the key differences between the input text and the source. """ fact_checker_explanation = """ FOR FACT CHECKER
- Green texts are the matched words in the input and source news.
- Each highlighted pair (marked with a number) shows the key differences between the input text and the source. """ governor_explanation = """ FOR GOVERNOR
- Green texts are the matched words in the input and source news.
- Each highlighted pair (marked with a number) shows the key differences between the input text and the source. """ table = """
Comparison between input news and source news:
Input news Source (corresponding URL provided in Originality) Forensic Originality
TBD TBD TBD TBD