Newsify-AI / app.py
Chetan3110's picture
Update app.py
701ac82 verified
import gradio as gr
from newsdataapi import NewsDataApiClient
from huggingface_hub import InferenceClient
import os
# Initialize APIs
NEWS_API_KEY = os.getenv("NEWS_API_KEY")
HF_TOKEN = os.getenv("HF_TOKEN")
news_client = NewsDataApiClient(apikey=NEWS_API_KEY)
hf_client = InferenceClient(api_key=HF_TOKEN)
def fetch_news(query, country, language, category, max_pages):
"""
Fetch news articles using Newsdata.io API with pagination.
"""
try:
page = None
all_articles = []
for _ in range(max_pages):
response = news_client.latest_api(q=query, country=country, language=language, category=category, page=page)
articles = response.get('results', [])
if not articles:
break
all_articles.extend(articles)
page = response.get('nextPage', None)
if not page:
break
return all_articles
except Exception as e:
return f"Error: {e}"
def summarize_articles(articles, summary_length="brief"):
"""
Summarize articles using Hugging Face models.
"""
try:
article_texts = "\n".join([article['title'] for article in articles])
prompt = "Summarize briefly" if summary_length == "brief" else "Provide a detailed summary"
messages = [{"role": "user", "content": f"{prompt} the following news: {article_texts}"}]
completion = hf_client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.3",
messages=messages,
max_tokens=500
)
return completion.choices[0].message['content']
except Exception as e:
return f"Error: {e}"
def gradio_interface(query, country, language, category, max_pages, summary_length):
"""
Unified interface for fetching and summarizing news articles.
"""
if country:
country = country.split(" (")[-1][:-1] # Extract the code part from the dropdown choice
articles = fetch_news(query, country, language, category, max_pages)
if isinstance(articles, str): # Error handling
return articles, []
summaries = summarize_articles(articles, summary_length)
article_titles = [article['title'] for article in articles]
# Update the dropdown with new article titles
return summaries, gr.update(choices = article_titles)
countries = [
None, "Afghanistan (af)", "Albania (al)", "Algeria (dz)", "Andorra (ad)", "Angola (ao)", "Argentina (ar)", "Armenia (am)",
"Australia (au)", "Austria (at)", "Azerbaijan (az)", "Bahamas (bs)", "Bahrain (bh)", "Bangladesh (bd)", "Barbados (bb)",
"Belarus (by)", "Belgium (be)", "Belize (bz)", "Benin (bj)", "Bermuda (bm)", "Bhutan (bt)", "Bolivia (bo)",
"Bosnia And Herzegovina (ba)", "Botswana (bw)", "Brazil (br)", "Brunei (bn)", "Bulgaria (bg)", "Burkina Faso (bf)",
"Burundi (bi)", "Cambodia (kh)", "Cameroon (cm)", "Canada (ca)", "Cape Verde (cv)", "Cayman Islands (ky)",
"Central African Republic (cf)", "Chad (td)", "Chile (cl)", "China (cn)", "Colombia (co)", "Comoros (km)", "Congo (cg)",
"Cook Islands (ck)", "Costa Rica (cr)", "Croatia (hr)", "Cuba (cu)", "Curaçao (cw)", "Cyprus (cy)", "Czech Republic (cz)",
"Denmark (dk)", "Djibouti (dj)", "Dominica (dm)", "Dominican Republic (do)", "DR Congo (cd)", "Ecuador (ec)",
"Egypt (eg)", "El Salvador (sv)", "Equatorial Guinea (gq)", "Eritrea (er)", "Estonia (ee)", "Eswatini (sz)",
"Ethiopia (et)", "Fiji (fj)", "Finland (fi)", "France (fr)", "French Polynesia (pf)", "Gabon (ga)", "Gambia (gm)",
"Georgia (ge)", "Germany (de)", "Ghana (gh)", "Gibraltar (gi)", "Greece (gr)", "Grenada (gd)", "Guatemala (gt)",
"Guinea (gn)", "Guyana (gy)", "Haiti (ht)", "Honduras (hn)", "Hong Kong (hk)", "Hungary (hu)", "Iceland (is)",
"India (in)", "Indonesia (id)", "Iran (ir)", "Iraq (iq)", "Ireland (ie)", "Israel (il)", "Italy (it)", "Ivory Coast (ci)",
"Jamaica (jm)", "Japan (jp)", "Jersey (je)", "Jordan (jo)", "Kazakhstan (kz)", "Kenya (ke)", "Kiribati (ki)",
"Kosovo (xk)", "Kuwait (kw)", "Kyrgyzstan (kg)", "Laos (la)", "Latvia (lv)", "Lebanon (lb)", "Lesotho (ls)", "Liberia (lr)",
"Libya (ly)", "Liechtenstein (li)", "Lithuania (lt)", "Luxembourg (lu)", "Macau (mo)", "Macedonia (mk)", "Madagascar (mg)",
"Malawi (mw)", "Malaysia (my)", "Maldives (mv)", "Mali (ml)", "Malta (mt)", "Marshall Islands (mh)", "Mauritania (mr)",
"Mauritius (mu)", "Mexico (mx)", "Micronesia (fm)", "Moldova (md)", "Monaco (mc)", "Mongolia (mn)", "Montenegro (me)",
"Morocco (ma)", "Mozambique (mz)", "Myanmar (mm)", "Namibia (na)", "Nauru (nr)", "Nepal (np)", "Netherlands (nl)",
"New Caledonia (nc)", "New Zealand (nz)", "Nicaragua (ni)", "Niger (ne)", "Nigeria (ng)", "North Korea (kp)", "Norway (no)",
"Oman (om)", "Pakistan (pk)", "Palau (pw)", "Palestine (ps)", "Panama (pa)", "Papua New Guinea (pg)", "Paraguay (py)",
"Peru (pe)", "Philippines (ph)", "Poland (pl)", "Portugal (pt)", "Puerto Rico (pr)", "Qatar (qa)", "Romania (ro)",
"Russia (ru)", "Rwanda (rw)", "Saint Lucia (lc)", "Saint Martin (sx)", "Samoa (ws)", "San Marino (sm)", "São Tomé and Príncipe (st)",
"Saudi Arabia (sa)", "Senegal (sn)", "Serbia (rs)", "Seychelles (sc)", "Sierra Leone (sl)", "Singapore (sg)", "Slovakia (sk)",
"Slovenia (si)", "Solomon Islands (sb)", "Somalia (so)", "South Africa (za)", "South Korea (kr)", "Spain (es)", "Sri Lanka (lk)",
"Sudan (sd)", "Suriname (sr)", "Sweden (se)", "Switzerland (ch)", "Syria (sy)", "Taiwan (tw)", "Tajikistan (tj)", "Tanzania (tz)",
"Thailand (th)", "Timor-Leste (tl)", "Togo (tg)", "Tonga (to)", "Trinidad and Tobago (tt)", "Tunisia (tn)", "Turkey (tr)",
"Turkmenistan (tm)", "Tuvalu (tv)", "Uganda (ug)", "Ukraine (ua)", "United Arab Emirates (ae)", "United Kingdom (gb)",
"United States of America (us)", "Uruguay (uy)", "Uzbekistan (uz)", "Vanuatu (vu)", "Vatican (va)", "Venezuela (ve)",
"Vietnam (vi)", "Virgin Islands (British) (vg)", "World (wo)", "Yemen (ye)", "Zambia (zm)", "Zimbabwe (zw)"
]
categories = [
None, "business", "crime", "domestic", "education", "entertainment",
"environment", "food", "health", "lifestyle", "other",
"politics", "science", "sports", "technology", "top",
"tourism", "world"
]
# Gradio UI
with gr.Blocks() as demo:
# Add Horizontal Bar for App Name and Description using gr.HTML
gr.HTML(
"""
<div style="background-color: #2C3E50; padding: 15px; text-align: center;">
<h1 style="color: white;">Newsify-AI</h1>
<p style="color: #BDC3C7;">Summarize news articles using AI-powered insights</p>
</div>
"""
)
with gr.Row():
query = gr.Textbox(label="Query/Keyword", placeholder="E.g., Ronaldo", value="")
with gr.Row():
country = gr.Dropdown(label="Country",choices=countries)
language = gr.Textbox(label="Language", placeholder="E.g., en", value="en", interactive= False)
category = gr.Dropdown(label="Category", choices=categories)
max_pages = gr.Number(label="Max Pages to Fetch", value=1, precision=0, interactive=False)
summary_length = gr.Radio(["brief", "detailed"], label="Summary Length", value="brief")
fetch_button = gr.Button("Fetch & Summarize")
summary_output = gr.Textbox(label="Summarized News", lines=10)
links_dropdown = gr.Dropdown(label="Article Links", choices=[], interactive=True, allow_custom_value = True)
fetch_button.click(gradio_interface,
inputs=[query, country, language, category, max_pages, summary_length],
outputs=[summary_output, links_dropdown])
if __name__ == "__main__":
demo.launch(debug=True)