Chris4K commited on
Commit
b047828
·
verified ·
1 Parent(s): 1e31715

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -26
app.py CHANGED
@@ -199,34 +199,58 @@ import pandas as pd
199
  from typing import Dict, List, Tuple, Union
200
  from smolagents import CodeAgent, HfApiModel, tool
201
 
202
- def process_agent_response(response: Union[Dict, str]) -> Tuple[pd.DataFrame, str]:
203
  """
204
  Process the agent's response and convert it to a DataFrame
205
  Returns DataFrame and error message (if any)
206
  """
207
- if isinstance(response, dict):
208
- if 'error' in response:
209
- return pd.DataFrame(), f"Error: {response['error']}"
210
- elif 'products' in response:
 
 
 
 
 
 
 
 
 
 
 
211
  try:
212
- df = pd.DataFrame(response['products'])
213
- return df, ""
214
- except Exception as e:
215
- return pd.DataFrame(), f"Error processing data: {str(e)}"
216
- elif isinstance(response, str):
217
- try:
218
- # Try to evaluate string response as dict if needed
219
- import ast
220
- data = ast.literal_eval(response)
221
- if isinstance(data, dict):
222
- if 'products' in data:
223
- df = pd.DataFrame(data['products'])
224
- else:
225
- df = pd.DataFrame([data])
226
- return df, ""
227
- except:
228
- pass
229
- return pd.DataFrame(), "Unexpected response format"
 
 
 
 
 
 
 
 
 
 
 
 
 
230
 
231
  def search_products(keyword: str, max_products: int) -> Tuple[pd.DataFrame, str, str]:
232
  """
@@ -238,13 +262,24 @@ def search_products(keyword: str, max_products: int) -> Tuple[pd.DataFrame, str,
238
  df, error_msg = process_agent_response(result)
239
 
240
  if not df.empty:
241
- # Select and reorder relevant columns
242
  display_columns = [
243
  'title', 'price', 'rating', 'reviews', 'description',
244
  'bullet_points', 'average_rating', 'total_reviews'
245
  ]
246
- display_columns = [col for col in display_columns if col in df.columns]
247
- df = df[display_columns]
 
 
 
 
 
 
 
 
 
 
 
248
 
249
  status_msg = f"Found {len(df)} products"
250
  return df, status_msg, ""
 
199
  from typing import Dict, List, Tuple, Union
200
  from smolagents import CodeAgent, HfApiModel, tool
201
 
202
+ def process_agent_response(response: Union[Dict, List, str]) -> Tuple[pd.DataFrame, str]:
203
  """
204
  Process the agent's response and convert it to a DataFrame
205
  Returns DataFrame and error message (if any)
206
  """
207
+ def extract_products_from_response(resp):
208
+ """Helper function to extract product data from various response formats"""
209
+ if isinstance(resp, list):
210
+ # Response is already a list of products
211
+ return resp
212
+ elif isinstance(resp, dict):
213
+ # Check if it's wrapped in a 'products' key
214
+ if 'products' in resp:
215
+ return resp['products']
216
+ # Check if it's a single product
217
+ elif 'title' in resp:
218
+ return [resp]
219
+ elif 'error' in resp:
220
+ return None
221
+ elif isinstance(resp, str):
222
  try:
223
+ # Try to parse the string response
224
+ import ast
225
+ # Remove common prefixes
226
+ if "Final answer:" in resp:
227
+ resp = resp.split("Final answer:", 1)[1].strip()
228
+ elif "Out - Final answer:" in resp:
229
+ resp = resp.split("Out - Final answer:", 1)[1].strip()
230
+
231
+ parsed = ast.literal_eval(resp)
232
+ # Recursively process the parsed result
233
+ return extract_products_from_response(parsed)
234
+ except:
235
+ pass
236
+ return None
237
+
238
+ try:
239
+ products = extract_products_from_response(response)
240
+
241
+ if products is None:
242
+ return pd.DataFrame(), "No valid product data found"
243
+
244
+ # Convert to DataFrame
245
+ df = pd.DataFrame(products)
246
+
247
+ # Clean up column names
248
+ df.columns = [col.lower().strip() for col in df.columns]
249
+
250
+ return df, ""
251
+
252
+ except Exception as e:
253
+ return pd.DataFrame(), f"Error processing data: {str(e)}"
254
 
255
  def search_products(keyword: str, max_products: int) -> Tuple[pd.DataFrame, str, str]:
256
  """
 
262
  df, error_msg = process_agent_response(result)
263
 
264
  if not df.empty:
265
+ # Select and reorder relevant columns, using lowercase names
266
  display_columns = [
267
  'title', 'price', 'rating', 'reviews', 'description',
268
  'bullet_points', 'average_rating', 'total_reviews'
269
  ]
270
+ # Filter for columns that actually exist in the DataFrame
271
+ available_columns = [col for col in display_columns if col in df.columns]
272
+ df = df[available_columns]
273
+
274
+ # Clean up the display
275
+ if 'price' in df.columns:
276
+ df['price'] = df['price'].apply(lambda x: f"${str(x).strip('.')}")
277
+
278
+ # Truncate long text fields for better display
279
+ if 'description' in df.columns:
280
+ df['description'] = df['description'].apply(lambda x: x[:200] + '...' if len(x) > 200 else x)
281
+ if 'bullet_points' in df.columns:
282
+ df['bullet_points'] = df['bullet_points'].apply(lambda x: x[:200] + '...' if len(x) > 200 else x)
283
 
284
  status_msg = f"Found {len(df)} products"
285
  return df, status_msg, ""