File size: 3,699 Bytes
bf90cd3
 
 
f387a3a
bf90cd3
 
 
 
 
 
c1e6789
bf90cd3
 
 
c1e6789
bf90cd3
 
 
 
 
 
 
c1e6789
bf90cd3
 
 
 
 
 
 
 
 
c1e6789
bf90cd3
 
c1e6789
bf90cd3
c1e6789
bf90cd3
 
c1e6789
bf90cd3
 
 
 
 
 
 
 
 
c1e6789
bf90cd3
c1e6789
bf90cd3
 
 
 
d123b17
c1e6789
d123b17
a32ad6f
c1e6789
d123b17
 
 
bf90cd3
 
c1e6789
a32ad6f
 
c1e6789
a32ad6f
bf90cd3
 
2bd42a9
c1e6789
a32ad6f
bf90cd3
 
 
 
 
a32ad6f
c1e6789
 
bf90cd3
 
ae7a494
c1e6789
a32ad6f
 
 
 
 
 
 
 
 
 
bf90cd3
 
 
a32ad6f
 
bf90cd3
 
 
 
 
 
 
 
c1e6789
e935a75
2c6774f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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
@tool
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)}"
@tool
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()