Spaces:
Sleeping
Sleeping
| import os | |
| from smolagents import Tool | |
| from googleapiclient.discovery import build | |
| class YouTubeSearchTool(Tool): | |
| """ | |
| A tool to search for YouTube videos using the Google Custom Search Engine (CSE) API, | |
| by specifically restricting results to the youtube.com domain. | |
| """ | |
| name = "youtube_search" | |
| description = "Searches for and returns links and snippets for YouTube videos related to a specific query." | |
| inputs = { | |
| # Corrected the typo/broken line to read correctly | |
| "query": {"type": "string", "description": "The search term to find relevant YouTube videos for."} | |
| } | |
| output_type = "string" | |
| def __init__(self, **kwargs): | |
| super().__init__(**kwargs) | |
| # Retrieve credentials from environment variables | |
| self.api_key = os.getenv("GOOGLE_API_KEY") | |
| self.cse_id = os.getenv("GOOGLE_CSE_ID") | |
| if not self.api_key or not self.cse_id: | |
| # Note: This check relies on environment variables being set up | |
| raise ValueError("GOOGLE_API_KEY or GOOGLE_CSE_ID secret not found.") | |
| # Initialize the Google Custom Search service | |
| self.service = build( | |
| "customsearch", "v1", developerKey=self.api_key | |
| ) | |
| def forward(self, query: str) -> str: | |
| """ | |
| Executes a Google search query, restricting results to youtube.com. | |
| Args: | |
| query: The search term provided by the agent. | |
| Returns: | |
| A formatted string of search results (max 3), or an error message. | |
| """ | |
| print(f"Executing YouTube search for: '{query}'") | |
| # Modify the query to ensure results are restricted to YouTube | |
| youtube_query = f"{query} site:youtube.com" | |
| try: | |
| # Execute the search request for up to 3 results | |
| res = self.service.cse().list( | |
| q=youtube_query, | |
| cx=self.cse_id, | |
| num=3 | |
| ).execute() | |
| items = res.get('items', []) | |
| if not items: | |
| return "XX record info: No YouTube results found." | |
| search_results = [] | |
| for i, item in enumerate(items): | |
| search_results.append( | |
| f"RESULT {i+1}: '{item.get('title')}'\n" | |
| f"CONTENT: {item.get('snippet')}\n" | |
| f"SOURCE: {item.get('link')}" | |
| ) | |
| return "\n\n---SEPARATOR---\n\n".join(search_results) | |
| except Exception as e: | |
| return f"Error during YouTube Search API call: {e}" |