Files changed (1) hide show
  1. app.py +62 -43
app.py CHANGED
@@ -1,61 +1,81 @@
1
- from smolagents import CodeAgent,DuckDuckGoSearchTool, HfApiModel,load_tool,tool
2
- import datetime
3
  import requests
4
- import pytz
 
5
  import yaml
6
  from tools.final_answer import FinalAnswerTool
7
 
8
- from Gradio_UI import GradioUI
9
-
10
- # Below is an example of a tool that does nothing. Amaze us with your creativity !
11
  @tool
12
- def my_custom_tool(arg1:str, arg2:int)-> str: #it's import to specify the return type
13
- #Keep this format for the description / args / args description but feel free to modify the tool
14
- """A tool that does nothing yet
15
- Args:
16
- arg1: the first argument
17
- arg2: the second argument
18
  """
19
- return "What magic will you build ?"
20
-
21
- @tool
22
- def get_current_time_in_timezone(timezone: str) -> str:
23
- """A tool that fetches the current local time in a specified timezone.
24
- Args:
25
- timezone: A string representing a valid timezone (e.g., 'America/New_York').
26
  """
27
- try:
28
- # Create timezone object
29
- tz = pytz.timezone(timezone)
30
- # Get current time in that timezone
31
- local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S")
32
- return f"The current local time in {timezone} is: {local_time}"
33
- except Exception as e:
34
- return f"Error fetching time for timezone '{timezone}': {str(e)}"
35
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
 
37
  final_answer = FinalAnswerTool()
38
-
39
- # 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:
40
- # model_id='https://pflgm2locj2t89co.us-east-1.aws.endpoints.huggingface.cloud'
41
-
42
  model = HfApiModel(
43
- max_tokens=2096,
44
- temperature=0.5,
45
- model_id='Qwen/Qwen2.5-Coder-32B-Instruct',# it is possible that this model may be overloaded
46
- custom_role_conversions=None,
47
  )
48
 
49
-
50
- # Import tool from Hub
51
- image_generation_tool = load_tool("agents-course/text-to-image", trust_remote_code=True)
52
-
53
  with open("prompts.yaml", 'r') as stream:
54
  prompt_templates = yaml.safe_load(stream)
55
 
56
  agent = CodeAgent(
57
  model=model,
58
- tools=[final_answer], ## add your tools here (don't remove final answer)
59
  max_steps=6,
60
  verbosity_level=1,
61
  grammar=None,
@@ -65,5 +85,4 @@ agent = CodeAgent(
65
  prompt_templates=prompt_templates
66
  )
67
 
68
-
69
- GradioUI(agent).launch()
 
1
+ from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool
 
2
  import requests
3
+ from bs4 import BeautifulSoup
4
+ import pandas as pd
5
  import yaml
6
  from tools.final_answer import FinalAnswerTool
7
 
 
 
 
8
  @tool
9
+ def amazon_product_scraper(search_url: str) -> tuple[pd.DataFrame, str]:
 
 
 
 
 
10
  """
11
+ Scrapes Amazon search results for product titles, prices, delivery fees, and links.
12
+
13
+ Arguments:
14
+ search_url (str): The URL of the Amazon search results page.
15
+
16
+ Returns:
17
+ tuple[pd.DataFrame, str]: A tuple containing a sorted Pandas DataFrame of products and a recommendation string.
18
  """
19
+ headers = {
20
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
21
+ }
22
+
23
+ response = requests.get(search_url, headers=headers)
24
+ if response.status_code != 200:
25
+ return None, "Failed to retrieve Amazon results. Amazon may be blocking requests."
26
+
27
+ soup = BeautifulSoup(response.text, 'html.parser')
28
+
29
+ product_data = []
30
+
31
+ for item in soup.select("div[data-asin]"):
32
+ title_tag = item.select_one("h2 a")
33
+ price_tag = item.select_one("span.a-price-whole")
34
+ delivery_tag = item.select_one("span.s-align-children-center")
35
+
36
+ if title_tag and price_tag:
37
+ title = title_tag.text.strip()
38
+ price = price_tag.text.strip().replace(',', '') # Normalize prices
39
+ delivery = delivery_tag.text.strip() if delivery_tag else "Free"
40
+ link = "https://www.amazon.com" + title_tag["href"]
41
+
42
+ product_data.append({
43
+ "Title": title,
44
+ "Price": float(price) if price.isnumeric() else None,
45
+ "Delivery": delivery,
46
+ "Link": link
47
+ })
48
+
49
+ # Filter out products with no price and sort by price
50
+ product_data = [p for p in product_data if p["Price"] is not None]
51
+ product_data.sort(key=lambda x: x["Price"])
52
+
53
+ # Convert to DataFrame for better visualization
54
+ df = pd.DataFrame(product_data)
55
+
56
+ # Recommendation logic
57
+ best_deal = df.iloc[0] if not df.empty else None
58
+ recommendation = ""
59
+ if best_deal is not None:
60
+ recommendation = f"Best deal: {best_deal['Title']} at ${best_deal['Price']} with {best_deal['Delivery']} (Link: {best_deal['Link']})"
61
+
62
+ return df, recommendation
63
 
64
+ # Define the Agent
65
  final_answer = FinalAnswerTool()
 
 
 
 
66
  model = HfApiModel(
67
+ max_tokens=2096,
68
+ temperature=0.5,
69
+ model_id='Qwen/Qwen2.5-Coder-32B-Instruct',
70
+ custom_role_conversions=None,
71
  )
72
 
 
 
 
 
73
  with open("prompts.yaml", 'r') as stream:
74
  prompt_templates = yaml.safe_load(stream)
75
 
76
  agent = CodeAgent(
77
  model=model,
78
+ tools=[final_answer, amazon_product_scraper], # Adding the scraper tool
79
  max_steps=6,
80
  verbosity_level=1,
81
  grammar=None,
 
85
  prompt_templates=prompt_templates
86
  )
87
 
88
+ GradioUI(agent).launch()