Spaces:
Running
Running
| 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) | |