first_agent_template / my_tools.py
WaelDahech's picture
Auto commit 2025-06-29 10:20:07
1c426cf
import wikipedia
from youtube_transcript_api import YouTubeTranscriptApi
import cv2
from pytube import YouTube
import re
import chess
import chess.engine
import pandas as pd
import requests
from bs4 import BeautifulSoup
import whisper
from imdb import IMDb
import subprocess
import sys
# === wikipedia_search ===
def wikipedia_search_call(query: str) -> dict:
page = wikipedia.page(query)
sections = {sec: page.section(sec) for sec in page.sections}
return {"title": page.title, "content": page.content, "sections": sections}
# === youtube_transcript ===
def youtube_transcript_call(video_id: str) -> list:
return YouTubeTranscriptApi.get_transcript(video_id)
# === video_frame_analyzer ===
def download_and_sample(video_id: str, fps: int = 1) -> list:
url = f"https://www.youtube.com/watch?v={video_id}"
yt = YouTube(url)
stream = yt.streams.filter(progressive=True, file_extension='mp4').first()
path = stream.download(filename=f"{video_id}.mp4")
cap = cv2.VideoCapture(path)
frame_rate = cap.get(cv2.CAP_PROP_FPS) or 1
step = max(1, int(frame_rate / fps))
frames = []
idx = 0
while True:
ret, frame = cap.read()
if not ret:
break
if idx % step == 0:
frames.append(frame)
idx += 1
cap.release()
return frames
def detect_species(frame) -> list:
# TODO: integrate actual CV model for bird-species detection
return []
def video_frame_analyzer_call(video_id: str) -> int:
frames = download_and_sample(video_id)
counts = [len(set(detect_species(f))) for f in frames]
return max(counts) if counts else 0
# === string_manipulator ===
def string_manipulator_call(text: str, operation: str = "reverse", pattern: str = None, replacement: str = None):
if operation == "reverse":
return text[::-1]
if operation == "split":
return text.split()
if operation == "regex_replace" and pattern and replacement is not None:
return re.sub(pattern, replacement, text)
raise ValueError(f"Unsupported operation: {operation}")
# === vision_chess_engine ===
def vision_chess_engine_call(fen: str, depth: int = 20) -> str:
engine = chess.engine.SimpleEngine.popen_uci("stockfish")
board = chess.Board(fen)
result = engine.play(board, chess.engine.Limit(depth=depth))
engine.quit()
return board.san(result.move)
# === table_parser ===
def table_parser_call(file_path: str, sheet_name: str = None) -> pd.DataFrame:
if file_path.lower().endswith('.csv'):
return pd.read_csv(file_path)
return pd.read_excel(file_path, sheet_name=sheet_name)
# === libretext_fetcher ===
def libretext_fetcher_call(url: str, section_id: str) -> list:
resp = requests.get(url)
soup = BeautifulSoup(resp.text, "html.parser")
sec = soup.find(id=section_id)
if not sec:
return []
items = sec.find_next('ul').find_all('li')
return [li.get_text(strip=True) for li in items]
# === audio_transcriber ===
def audio_transcriber_call(audio_path: str) -> str:
model = whisper.load_model("base")
result = model.transcribe(audio_path)
return result.get("text", "")
# === botanical_classifier ===
BOTANICAL_VEGETABLES = {"tomato", "eggplant", "pepper", "squash"}
def botanical_classifier_call(items: list) -> list:
return [item for item in items if item.lower() in BOTANICAL_VEGETABLES]
# === imdb_lookup ===
def imdb_lookup_call(person_name: str) -> dict:
ia = IMDb()
results = ia.search_person(person_name)
if not results:
return {}
person = results[0]
ia.update(person, 'filmography')
return {"name": person['name'], "filmography": person.get('filmography', {})}
# === python_executor ===
def python_executor_call(script_path: str) -> str:
proc = subprocess.run([sys.executable, script_path], capture_output=True, text=True, check=True)
return proc.stdout.strip()
# === sports_stats_api ===
def sports_stats_api_call(season: int, team: str, stat: str = "BB") -> dict:
raise NotImplementedError("sports_stats_api integration not configured")
# === web_scraper ===
def web_scraper_call(url: str, css_selector: str) -> list:
resp = requests.get(url)
soup = BeautifulSoup(resp.text, "html.parser")
return [el.get_text(strip=True) for el in soup.select(css_selector)]
# === excel_reader ===
def excel_reader_call(file_path: str, sheet_name: str = None) -> pd.DataFrame:
return pd.read_excel(file_path, sheet_name=sheet_name)
# === competition_db ===
def competition_db_call(year_start: int, year_end: int) -> list:
raise NotImplementedError("competition_db integration not configured")
# === japanese_baseball_api ===
def japanese_baseball_api_call(team: str, date: str) -> list:
raise NotImplementedError("japanese_baseball_api integration not configured")