File size: 3,556 Bytes
1a790ff
 
 
 
2ad72ce
1a790ff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a781809
1a790ff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a781809
 
 
 
 
 
1a790ff
a781809
1a790ff
a781809
1a790ff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a781809
1a790ff
 
a781809
 
1a790ff
 
 
a781809
 
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
from smolagents import DuckDuckGoSearchTool
from smolagents import Tool
import random
from huggingface_hub import list_models
import requests


# --------- Weather Info Tool ---------
class WeatherInfoTool(Tool):
    name = "weather_info"
    description = "Fetches dummy weather information for a given location."
    inputs = {
        "location": {
            "type": "string",
            "description": "The location to get weather information for."
        }
    }
    output_type = "string"

    def forward(self, location: str):
        # Dummy weather data
        weather_conditions = [
            {"condition": "Rainy", "temp_c": 15},
            {"condition": "Clear", "temp_c": 25},
            {"condition": "Windy", "temp_c": 20}
        ]
        data = random.choice(weather_conditions)
        return f"🌦️ Weather in **{location}**: {data['condition']}, {data['temp_c']}°C"


# --------- Hugging Face Hub Stats Tool ---------
class HubStatsTool(Tool):
    name = "hub_stats"
    description = "Fetches the most downloaded model from a specific author on the Hugging Face Hub."
    inputs = {
        "author": {
            "type": "string",
            "description": "The username of the model author/organization to find models from."
        }
    }
    output_type = "string"

    def forward(self, author: str):
        try:
            models = list(list_models(author=author, sort="downloads", direction=-1, limit=1))
            if models:
                model = models[0]
                return (
                    f"📊 Most downloaded model by **{author}**:\n"
                    f"**Model ID**: {model.id}\n"
                    f"**Downloads**: {model.downloads:,}\n"
                    f"[View on Hugging Face](https://huggingface.co/{model.id})"
                )
            else:
                return f"No models found for author **{author}**."
        except Exception as e:
            return f"⚠️ Error fetching models for **{author}**: {str(e)}"


# --------- News Search Tool using ContextualWeb API ---------
class NewsSearchTool(Tool):
    name = "news_search"
    description = "Fetches the latest news headlines about a specific topic using the ContextualWeb API."
    inputs = {
        "topic": {
            "type": "string",
            "description": "The topic to search for in recent news."
        }
    }
    output_type = "string"

    def __init__(self, api_key: str):
        self.api_key = api_key

    def forward(self, topic: str):
        url = "https://contextualwebsearch-websearch-v1.p.rapidapi.com/api/Search/NewsSearchAPI"
        params = {
            "q": topic,
            "pageNumber": "1",
            "pageSize": "3",
            "autoCorrect": "true"
        }
        headers = {
            "X-RapidAPI-Key": self.api_key,
            "X-RapidAPI-Host": "contextualwebsearch-websearch-v1.p.rapidapi.com"
        }

        try:
            response = requests.get(url, headers=headers, params=params)
            response.raise_for_status()
            articles = response.json().get("value", [])

            if not articles:
                return f"No news articles found for topic **{topic}**."

            return "\n\n".join(
                f"📰 **{a['title']}**\n{a['description'] or '_No description provided_'}\n"
                f"Source: {a['provider']['name']}\n[Read more]({a['url']})"
                for a in articles
            )
        except Exception as e:
            return f"⚠️ Error retrieving news for **{topic}**: {str(e)}"