| import requests |
| from langchain_core.tools import Tool, tool |
| from typing import Optional |
| from PIL import Image |
| from io import BytesIO |
| import base64 |
| import mimetypes |
| import urllib.error |
| import urllib.request |
| from urllib.parse import urlparse |
| import tempfile |
| import os |
| import pytesseract |
| import uuid |
| import pandas as pd |
|
|
| local_filename = "downloaded_data.xlsx" |
|
|
|
|
| |
| def get_file(task_id: str) -> str: |
| """fetches the file from GAIA API for given task_id""" |
| response = requests.get( |
| f"https://agents-course-unit4-scoring.hf.space/files/{task_id}", timeout=120 |
| ) |
| return response.content |
|
|
|
|
| file_retriever_tool = Tool( |
| name="get_file", |
| description="fetches the file from Agent API for given task_id", |
| func=get_file, |
| ) |
|
|
|
|
| @tool |
| def download_file_from_url(url: str, filename: Optional[str] = None) -> str: |
| """ |
| Download a file from a URL and save it to a temporary location. |
| Args: |
| url (str): the URL of the file to download. |
| filename (str, optional): the name of the file. If not provided, a random name file will be created. |
| """ |
| try: |
| |
| if not filename: |
| path = urlparse(url).path |
| filename = os.path.basename(path) |
| if not filename: |
| filename = f"downloaded_{uuid.uuid4().hex[:8]}" |
|
|
| |
| temp_dir = tempfile.gettempdir() |
| filepath = os.path.join(temp_dir, filename) |
|
|
| |
| response = requests.get(url, stream=True, timeout=120) |
| response.raise_for_status() |
|
|
| |
| with open(filepath, "wb") as f: |
| for chunk in response.iter_content(chunk_size=8192): |
| f.write(chunk) |
|
|
| return f"File downloaded to {filepath}. You can read this file to process its contents." |
| except Exception as e: |
| return f"Error downloading file: {str(e)}" |
|
|
|
|
| |
| @tool |
| def fetch_text_from_url(url: str) -> str: |
| """Fetch the document from a URL""" |
| req = urllib.request.Request( |
| url, |
| headers={"User-Agent": "Mozilla/5.0 (compatible; quickstart-research/1.0)"}, |
| ) |
| try: |
| with urllib.request.urlopen(req, timeout=120) as resp: |
| raw = resp.read() |
| except urllib.error.URLError as e: |
| return f"Fetch failed: {e}" |
| text = raw.decode("utf-8", errors="replace") |
| return text |
|
|
|
|
| |
|
|
|
|
| |
| @tool |
| def image_decoder(img_url: str) -> str: |
| """downaload image from url and generate base64 decoded image url to read in local |
| Args: |
| img_url: url of image to download |
| """ |
| try: |
| buffered = BytesIO() |
| headers = { |
| "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" |
| } |
| response = requests.get(img_url, headers, timeout=120) |
| mime, _ = mimetypes.guess_type(img_url) |
| image = Image.open(BytesIO(response.content)) |
| img_mime = ( |
| mime if mime else f"image/{image.format}" if image.format else "image/png" |
| ) |
| img_format = image.format if image.format else "PNG" |
| image.save(buffered, format=img_format) |
| img_base64 = base64.b64encode(buffered.getvalue()).decode("utf-8") |
| buffered.close() |
| return f"data:{img_mime};base64,{img_base64}" |
| except Exception as e: |
| raise Exception(f"Error fetching image details from {img_url}: {str(e)}") |
|
|
|
|
| |
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
|
|
|
|
| @tool |
| def extract_image_info(image_url: str) -> str: |
| """ |
| Extract text from an image file using a OCR library pytesseract (if available). |
| |
| Args: |
| image_url: The URL of the image to analyze |
| |
| Returns: |
| A text containing the description of image |
| """ |
| |
| response = requests.get(image_url, timeout=120) |
|
|
| |
| img = Image.open(BytesIO(response.content)) |
|
|
| |
| text = pytesseract.image_to_string(img) |
| return text |
|
|
|
|
| |
| @tool |
| def excel_data_retriever(file_path: str): |
| """Download and read the excel file using given excel file url. |
| |
| Args: |
| file_path: path of excel file to process |
| """ |
| try: |
| df = pd.read_excel(file_path) |
| df_json = df.to_json() |
| result = ( |
| f"Excel file loaded with {len(df)} rows and {len(df.columns)} columns.\n" |
| ) |
| result += f"Detailed Info of records as given in JSON format: \n Here the JSON is created by columns, so each key in JOSN represent column names with its values\n {df_json}" |
| print(df.to_json()) |
| return result |
| except Exception as e: |
| return f"Error reading excel file {file_path}: {str(e)}" |
|
|
|
|
| |
| @tool |
| def csv_data_retriever(file_path: str): |
| """Download and read the csv file using given csv file url. |
| |
| Args: |
| file_path: path of csv file to process |
| """ |
| try: |
| df = pd.read_csv(file_path) |
| df_json = df.to_json() |
| result = f"CSV file loaded with {len(df)} rows and {len(df.columns)} columns.\n" |
| result += f"Detailed Info of records as given in JSON format: \n Here the JSON is created by columns, so each key in JOSN represent column names with its values\n {df_json}" |
| print(df.to_json()) |
| return result |
| except Exception as e: |
| return f"Error reading CSV file {file_path}: {str(e)}" |
|
|