|
from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool |
|
import datetime |
|
import requests |
|
import pytz |
|
import yaml |
|
from tools.final_answer import FinalAnswerTool |
|
from playwright.sync_api import sync_playwright |
|
import time |
|
from bs4 import BeautifulSoup |
|
import pandas as pd |
|
import time |
|
|
|
from Gradio_UI import GradioUI |
|
|
|
|
|
@tool |
|
def scrape_drug_reviews(drug:str)-> str: |
|
|
|
"""A tool that calls a scraping function on the drugs.com website to scrape for reviews on target dtug specified in input |
|
Args: |
|
drug: the name of the target drug we want to retrieve reviews for, in lower case (e.g. 'flecainide') |
|
|
|
""" |
|
try: |
|
data = scrape_drugs_com_reviews(drug) |
|
|
|
return data.to_string() |
|
except Exception as e: |
|
return f"Error fetching reviews for the target drug you provided: '{drug}'" |
|
|
|
|
|
def scrape_drugs_com_reviews(drug_name, max_pages=3, delay=2): |
|
""" |
|
Scrapes user reviews from Drugs.com for a given drug. |
|
""" |
|
base_url = f"https://www.drugs.com/comments/{drug_name}/" |
|
all_reviews = [] |
|
|
|
with sync_playwright() as p: |
|
browser = p.chromium.launch(headless=True) |
|
page = browser.new_page() |
|
|
|
for page_num in range(1, max_pages + 1): |
|
url = base_url if page_num == 1 else f"{base_url}?page={page_num}" |
|
print(f"Scraping: {url}") |
|
page.goto(url, timeout=60000) |
|
time.sleep(delay) |
|
|
|
html = page.content() |
|
soup = BeautifulSoup(html, 'html.parser') |
|
review_blocks = soup.select('.user-comment') |
|
|
|
if not review_blocks: |
|
print("No reviews found on this page.") |
|
break |
|
|
|
for block in review_blocks: |
|
review_text = block.select_one('.user-comment-text') |
|
condition = block.select_one('.drug-condition') |
|
rating = block.select_one('.rating-score') |
|
date = block.select_one('.comment-date') |
|
|
|
all_reviews.append({ |
|
"condition": condition.get_text(strip=True) if condition else None, |
|
"rating": rating.get_text(strip=True) if rating else None, |
|
"review": review_text.get_text(strip=True) if review_text else None, |
|
"date": date.get_text(strip=True) if date else None, |
|
"source": url |
|
}) |
|
|
|
time.sleep(delay) |
|
|
|
browser.close() |
|
return pd.DataFrame(all_reviews) |
|
|
|
|
|
|
|
@tool |
|
def get_current_time_in_timezone(timezone: str) -> str: |
|
"""A tool that fetches the current local time in a specified timezone. |
|
Args: |
|
timezone: A string representing a valid timezone (e.g., 'America/New_York'). |
|
""" |
|
try: |
|
|
|
tz = pytz.timezone(timezone) |
|
|
|
local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S") |
|
return f"The current local time in {timezone} is: {local_time}" |
|
except Exception as e: |
|
return f"Error fetching time for timezone '{timezone}': {str(e)}" |
|
|
|
|
|
final_answer = FinalAnswerTool() |
|
|
|
|
|
|
|
|
|
model = HfApiModel( |
|
max_tokens=2096, |
|
temperature=0.5, |
|
model_id='Qwen/Qwen2.5-Coder-32B-Instruct', |
|
custom_role_conversions=None, |
|
) |
|
|
|
|
|
|
|
image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True) |
|
|
|
with open("prompts.yaml", 'r') as stream: |
|
prompt_templates = yaml.safe_load(stream) |
|
|
|
agent = CodeAgent( |
|
model=model, |
|
tools=[scrape_drug_reviews,final_answer], |
|
max_steps=6, |
|
verbosity_level=1, |
|
grammar=None, |
|
planning_interval=None, |
|
name=None, |
|
description=None, |
|
prompt_templates=prompt_templates |
|
) |
|
|
|
|
|
GradioUI(agent).launch() |