zavavan's picture
Update app.py
e781b0c verified
raw
history blame
4.39 kB
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
# Below is an example of a tool that does nothing. Amaze us with your creativity !
@tool
def scrape_drug_reviews(drug:str)-> str: #it's import to specify the return type
#Keep this format for the description / args / args description but feel free to modify the tool
"""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)
# Get current time in that timezone
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) # Give page some time to load
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:
# Create timezone object
tz = pytz.timezone(timezone)
# Get current time in that 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()
# If the agent does not answer, the model is overloaded, please use another model or the following Hugging Face Endpoint that also contains qwen2.5 coder:
# model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'
model = HfApiModel(
max_tokens=2096,
temperature=0.5,
model_id='Qwen/Qwen2.5-Coder-32B-Instruct',# it is possible that this model may be overloaded
custom_role_conversions=None,
)
# Import tool from Hub
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], ## add your tools here (don't remove final answer)
max_steps=6,
verbosity_level=1,
grammar=None,
planning_interval=None,
name=None,
description=None,
prompt_templates=prompt_templates
)
GradioUI(agent).launch()