| | import re |
| | import os |
| | import requests |
| | from smolagents import Tool |
| | from smolagents.utils import truncate_content |
| |
|
| | |
| | DEFAULT_API_URL = "https://agents-course-unit4-scoring.hf.space" |
| |
|
| | class DownloadTaskAttachmentTool(Tool): |
| | """Tool for downloading files attached to tasks.""" |
| |
|
| | name = "download_file" |
| | description = "Downloads the file attached to the task ID" |
| | inputs = {'task_id': {'type': 'string', 'description': 'The task id to download attachment from.'}} |
| | output_type = "string" |
| |
|
| | def __init__(self, *args, **kwargs): |
| | self.is_initialized = True |
| |
|
| | def forward(self, task_id: str) -> str: |
| | """Download a file associated with the given task ID.""" |
| | file_url = f"{DEFAULT_API_URL}/files/{task_id}" |
| | local_file_path = f"downloads/{task_id}.file" |
| |
|
| | try: |
| | |
| | os.makedirs("downloads", exist_ok=True) |
| |
|
| | |
| | with requests.get(file_url, stream=True, timeout=15) as response: |
| | response.raise_for_status() |
| | with open(local_file_path, "wb") as file: |
| | for chunk in response.iter_content(chunk_size=8192): |
| | file.write(chunk) |
| |
|
| | return local_file_path |
| |
|
| | except Exception as e: |
| | print(f"Error downloading file for task {task_id}: {e}") |
| | raise |
| |
|
| |
|
| | class VisitWebpageTool(Tool): |
| | """Tool for visiting webpages and converting content to markdown.""" |
| |
|
| | name = "visit_webpage" |
| | description = "Visits a webpage and returns its content as markdown" |
| | inputs = {'url': {'type': 'string', 'description': 'The URL to visit'}} |
| | output_type = "string" |
| |
|
| | def __init__(self, *args, **kwargs): |
| | self.is_initialized = True |
| |
|
| | def forward(self, url: str) -> str: |
| | """Visit a webpage and return its content as markdown.""" |
| | try: |
| | |
| | from markdownify import markdownify |
| |
|
| | |
| | response = requests.get(url, timeout=20) |
| | response.raise_for_status() |
| |
|
| | |
| | content = markdownify(response.text).strip() |
| | content = re.sub(r"\n{3,}", "\n\n", content) |
| |
|
| | |
| | return truncate_content(content, 10000) |
| |
|
| | except requests.exceptions.Timeout: |
| | return "Request timed out. Please check the URL or try again later." |
| | except Exception as e: |
| | return f"Error: {str(e)}" |
| |
|