|
|
import os |
|
|
import requests |
|
|
import wikipedia |
|
|
import pandas as pd |
|
|
from smolagents import PythonInterpreterTool, tool |
|
|
from youtube_transcript_api import YouTubeTranscriptApi |
|
|
|
|
|
@tool |
|
|
def ReverseTextTool(text: str) -> str: |
|
|
""" |
|
|
Reverses a text string character by character. |
|
|
Args: |
|
|
text (str): The text to reverse |
|
|
Returns: |
|
|
str: The reversed text |
|
|
""" |
|
|
return text[::-1] |
|
|
|
|
|
@tool |
|
|
def RunPythonFileTool(file_path: str) -> str: |
|
|
""" |
|
|
Executes a Python script loaded from the specified path using the PythonInterpreterTool. |
|
|
Args: |
|
|
file_path (str): The full path to the python (.py) file containing the Python code. |
|
|
Returns: |
|
|
str: The output produced by the code execution, or an error message if it fails. |
|
|
""" |
|
|
try: |
|
|
with open(file_path, "r") as f: |
|
|
code = f.read() |
|
|
interpreter = PythonInterpreterTool() |
|
|
result = interpreter.run({"code": code}) |
|
|
return result.get("output", "No output returned.") |
|
|
except Exception as e: |
|
|
return f"Execution failed: {e}" |
|
|
|
|
|
@tool |
|
|
def download_server(url: str, save_path: str) -> str: |
|
|
""" |
|
|
Downloads a file from a URL and saves it to the given path. |
|
|
Args: |
|
|
url (str): The URL from which to download the file. |
|
|
save_path (str): The local file path where the downloaded file will be saved. |
|
|
Returns: |
|
|
str: A message indicating the result of the download operation. |
|
|
""" |
|
|
try: |
|
|
response = requests.get(url, timeout=30) |
|
|
response.raise_for_status() |
|
|
with open(save_path, "wb") as f: |
|
|
f.write(response.content) |
|
|
return f"File downloaded to {save_path}" |
|
|
except Exception as e: |
|
|
return f"Failed to download: {e}" |
|
|
|
|
|
@tool |
|
|
def WikipediaSearchTool(query: str) -> str: |
|
|
""" |
|
|
Performs a search on Wikipedia and returns a summary of the result. |
|
|
Args: |
|
|
query: The search term. |
|
|
Returns: |
|
|
A string containing the summary of the search result or an error message. |
|
|
""" |
|
|
try: |
|
|
summary = wikipedia.summary(query, sentences=3) |
|
|
return summary |
|
|
except wikipedia.exceptions.PageError: |
|
|
return f"Error: No Wikipedia page found for '{query}'." |
|
|
except wikipedia.exceptions.DisambiguationError as e: |
|
|
return f"Error: Multiple results found for '{query}'. Try a more specific query. Options: {e.options}" |
|
|
except Exception as e: |
|
|
return f"An unexpected error occurred: {e}" |
|
|
|
|
|
@tool |
|
|
def YouTubeVideoAnalysisTool(video_id: str, keyword: str) -> str: |
|
|
""" |
|
|
Fetches the transcript of a YouTube video by its ID and performs a keyword search. |
|
|
Args: |
|
|
video_id: The ID of the YouTube video. |
|
|
keyword: The keyword to search for in the transcript. |
|
|
Returns: |
|
|
A string indicating if the keyword was found and providing a snippet, or an error message. |
|
|
""" |
|
|
try: |
|
|
transcript_list = YouTubeTranscriptApi.get_transcript(video_id) |
|
|
full_transcript = " ".join([d['text'] for d in transcript_list]) |
|
|
|
|
|
if keyword.lower() in full_transcript.lower(): |
|
|
index = full_transcript.lower().find(keyword.lower()) |
|
|
start = max(0, index - 50) |
|
|
end = min(len(full_transcript), index + len(keyword) + 50) |
|
|
snippet = full_transcript[start:end] |
|
|
return f"Keyword '{keyword}' found in the video. Snippet: '...{snippet}...'." |
|
|
else: |
|
|
return f"Keyword '{keyword}' not found in the video transcript." |
|
|
except Exception as e: |
|
|
return f"An error occurred while fetching the YouTube transcript: {e}" |
|
|
|
|
|
@tool |
|
|
def ExcelFileParserTool(file_path: str, query: str = "get_headers") -> str: |
|
|
""" |
|
|
Reads and queries data from an Excel file at a given path. |
|
|
|
|
|
Args: |
|
|
file_path (str): The path to the Excel file (.xlsx, .xls). |
|
|
query (str): The type of query to perform. Defaults to 'get_headers'. |
|
|
Other options include 'find_value:column_name:value_to_find'. |
|
|
|
|
|
Returns: |
|
|
str: A string with the result of the query or an error message. |
|
|
""" |
|
|
try: |
|
|
df = pd.read_excel(file_path) |
|
|
|
|
|
if query == "get_headers": |
|
|
return f"Headers found: {', '.join(df.columns.tolist())}" |
|
|
|
|
|
elif query.startswith("find_value:"): |
|
|
parts = query.split(":") |
|
|
if len(parts) != 3: |
|
|
return "Error: Invalid query format. Use 'find_value:column_name:value_to_find'." |
|
|
|
|
|
column_name = parts[1] |
|
|
value_to_find = parts[2] |
|
|
|
|
|
if column_name not in df.columns: |
|
|
return f"Error: Column '{column_name}' not found." |
|
|
|
|
|
found_rows = df[df[column_name].astype(str).str.contains(value_to_find, case=False, na=False)] |
|
|
|
|
|
if not found_rows.empty: |
|
|
return f"Value '{value_to_find}' found in column '{column_name}'. Found in the following rows:\n{found_rows.to_string()}" |
|
|
else: |
|
|
return f"Value '{value_to_find}' not found in column '{column_name}'." |
|
|
|
|
|
else: |
|
|
return "Error: Unknown query type. Supported queries: 'get_headers', 'find_value:column_name:value_to_find'." |
|
|
|
|
|
except FileNotFoundError: |
|
|
return f"Error: File not found at '{file_path}'." |
|
|
except Exception as e: |
|
|
return f"An unexpected error occurred: {e}" |