Spaces:
Running
Running
import os | |
import gradio as gr | |
import openai | |
import requests | |
from PIL import Image | |
import re | |
from src.application.url_reader import URLReader | |
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') | |
openai.api_key = os.getenv('OPENAI_API_KEY') | |
GOOGLE_API_KEY = os.getenv('GOOGLE_API_KEY') | |
SEARCH_ENGINE_ID = os.getenv('SEARCH_ENGINE_ID') | |
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'} | |
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: | |
print(f"Error loading image from {content.top_image}") | |
except (requests.exceptions.RequestException, FileNotFoundError) as e: | |
print(f"Error fetching image: {e}") | |
return content.title, content.text, image | |
def replace_terms(text, input_term, destination_term): | |
# Replace input_term with destination_term in the text | |
modified_text = re.sub(input_term, destination_term, text) | |
return modified_text | |
def generate_content(model1, model2, title, content): | |
# Generate text using the selected models | |
full_content = "" | |
input_type = "" | |
if title and content: | |
full_content = title + "\n" + content | |
input_type = "title and content" | |
elif title: | |
full_content = title | |
input_type = "title" | |
elif content: | |
full_content = title | |
input_type = "content" | |
def generate_text(model, full_context, input_type): | |
# Generate text using the selected model | |
if input_type == "": | |
prompt = "Generate a random fake news article" | |
else: | |
prompt = f"Generate a fake news article (title and content) based on the following {input_type}: {full_context}" | |
try: | |
response = openai.ChatCompletion.create( | |
model=model, | |
messages=[ | |
{"role": "user", "content": prompt} | |
] | |
) | |
return response.choices[0].message.content | |
except openai.error.OpenAIError as e: | |
print(f"Error interacting with OpenAI API: {e}") | |
return "An error occurred while processing your request." | |
# Define the GUI | |
with gr.Blocks() as demo: | |
gr.Markdown("# Fake News Detection") | |
with gr.Row(): | |
with gr.Column(scale=1): | |
gr.Markdown("## Settings") | |
gr.Markdown("This tool generates fake news by modifying the content of a given URL.") | |
with gr.Accordion("1. Enter a URL"): | |
#gr.Markdown(" 1. Enter a URL.") | |
url_input = gr.Textbox( | |
label="URL", | |
value="https://bbc.com/future/article/20250110-how-often-you-should-wash-your-towels-according-to-science", | |
) | |
load_button = gr.Button("Load an URL...") | |
with gr.Accordion("2. Select a content-generation model", open=True): | |
with gr.Row(): | |
model1_dropdown = gr.Dropdown(choices=["GPT 4o", "GPT 4o-mini"], label="Text-generation model") | |
model2_dropdown = gr.Dropdown(choices=["Dall-e", "Stable Diffusion"], label="Image-generation model") | |
generate_button = gr.Button("Random generation...") | |
with gr.Accordion("3. Replace any terms", open=True): | |
with gr.Row(): | |
input_term_box = gr.Textbox(label="Input Term") | |
destination_term_box = gr.Textbox(label="Destination Term") | |
replace_button = gr.Button("Replace term...") | |
process_button = gr.Button("Process") | |
with gr.Column(scale=2): | |
gr.Markdown("## News contents") | |
title_input = gr.Textbox(label="Title", value="") | |
with gr.Row(): | |
image_view = gr.Image(label="Image") | |
content_input = gr.Textbox(label="Content", value="", lines=15) | |
# Connect events | |
load_button.click( | |
load_url, | |
inputs=url_input, | |
outputs=[title_input, content_input, image_view] | |
) | |
replace_button.click(replace_terms, | |
inputs=[content_input, input_term_box, destination_term_box], | |
outputs=content_input) | |
process_button.click(generate_text, | |
inputs=[url_input, model1_dropdown, model2_dropdown, input_term_box, destination_term_box, title_input, content_input], | |
outputs=[title_input, content_input]) | |
#url_input.change(load_image, inputs=url_input, outputs=image_view) | |
demo.launch() |