Spaces:
Running
Running
from smolagents import CodeAgent, HfApiModel, tool | |
from tools.final_answer import FinalAnswerTool | |
from Gradio_UI import GradioUI | |
import requests | |
import yaml | |
import os | |
from typing import Dict, List, Optional | |
def fetch_news(topic: str, num_results: int = 5) -> List[Dict]: | |
"""Fetches recent news articles about any topic using Serper.dev. | |
Args: | |
topic: The topic to search for news about | |
num_results: Number of news articles to retrieve (default: 5) | |
Returns: | |
List of dictionaries containing article information | |
""" | |
try: | |
api_key = os.environ.get("SERPER_API_KEY") | |
if not api_key: | |
return "Error: SERPER_API_KEY not found in environment variables" | |
url = f"https://google.serper.dev/news" | |
headers = { | |
"X-API-KEY": api_key | |
} | |
params = { | |
"q": topic, | |
"gl": "us", | |
"hl": "en" | |
} | |
response = requests.get(url, headers=headers, params=params) | |
response.raise_for_status() | |
results = response.json() | |
if "news" not in results: | |
return [] | |
articles = [] | |
for article in results["news"][:num_results]: | |
articles.append({ | |
'title': article.get('title', 'No title'), | |
'source': article.get('source', 'Unknown source'), | |
'date': article.get('date', 'No date'), | |
'link': article.get('link', 'No link'), | |
'snippet': article.get('snippet', 'No preview available') | |
}) | |
return articles | |
except Exception as e: | |
return f"Error: {str(e)}" | |
def summarize_news(articles: List[Dict]) -> str: | |
"""Creates a summary of the news articles followed by a list of sources. | |
Args: | |
articles: List of article dictionaries containing title, source, date, link, and snippet | |
Returns: | |
A string containing a summary followed by article references | |
""" | |
if not articles or not isinstance(articles, list): | |
return "No articles to summarize" | |
# Collect all snippets for the overall summary | |
all_snippets = [article['snippet'] for article in articles if article.get('snippet')] | |
# Create a high-level summary from snippets | |
summary = "📰 Summary:\n" | |
summary += "Latest news covers " + ", ".join(set(article['source'] for article in articles)) + ". " | |
summary += "Key points: " + ". ".join(all_snippets[:2]) + "\n\n" | |
# List individual articles | |
summary += "🔍 Articles:\n" | |
for idx, article in enumerate(articles, 1): | |
title = article['title'] | |
link = article['link'] | |
date = article['date'] | |
snippet = article['snippet'][:100] + "..." if len(article['snippet']) > 100 else article['snippet'] | |
summary += f"{idx}. {title}\n" | |
summary += f" {snippet}\n" | |
summary += f" [Read more]({link}) ({date})\n\n" | |
return summary | |
# Load prompt templates | |
with open("prompts.yaml", 'r') as stream: | |
prompt_templates = yaml.safe_load(stream) | |
# Initialize the model | |
model = HfApiModel( | |
max_tokens=2096, | |
temperature=0.5, | |
model_id='Qwen/Qwen2.5-Coder-32B-Instruct', | |
custom_role_conversions=None, | |
) | |
final_answer = FinalAnswerTool() | |
# Create the agent with all tools | |
agent = CodeAgent( | |
model=model, | |
tools=[fetch_news, summarize_news, final_answer], | |
max_steps=6, | |
verbosity_level=1, | |
grammar=None, | |
planning_interval=None, | |
name="News Agent", | |
description="An agent that fetches and summarizes news about any topic", | |
prompt_templates=prompt_templates | |
) | |
# Launch the Gradio interface | |
if __name__ == "__main__": | |
GradioUI(agent).launch() |