LogicGoInfotechSpaces commited on
Commit
212462e
·
1 Parent(s): a67e1f8

Change response to show category name and category_id instead of budget_name

Browse files
Files changed (2) hide show
  1. app/models.py +2 -1
  2. app/smart_recommendation.py +29 -17
app/models.py CHANGED
@@ -24,7 +24,8 @@ class Budget(BaseModel):
24
  end_date: Optional[datetime] = None
25
 
26
  class BudgetRecommendation(BaseModel):
27
- budget_name: str = Field(..., description="Budget name (e.g., Groceries, Transport)")
 
28
  average_expense: float
29
  recommended_budget: float
30
  reason: str
 
24
  end_date: Optional[datetime] = None
25
 
26
  class BudgetRecommendation(BaseModel):
27
+ category: str = Field(..., description="Category name (e.g., Groceries, Transport)")
28
+ category_id: Optional[str] = Field(None, description="Category ID from database")
29
  average_expense: float
30
  recommended_budget: float
31
  reason: str
app/smart_recommendation.py CHANGED
@@ -48,29 +48,33 @@ class SmartBudgetRecommender:
48
 
49
  recommendations: List[BudgetRecommendation] = []
50
 
51
- for category, data in category_data.items():
 
 
 
52
  avg_expense = data["average_monthly"]
53
  confidence = self._calculate_confidence(data)
54
 
55
  # Always try OpenAI first (primary source of recommendation)
56
- ai_result = self._get_ai_recommendation(category, data, avg_expense)
57
  if ai_result and ai_result.get("recommended_budget"):
58
  recommended_budget = ai_result.get("recommended_budget")
59
- reason = ai_result.get("reason", f"AI recommendation for {category}")
60
  action = ai_result.get("action")
61
- print(f"✅ OpenAI recommendation for {category}: {recommended_budget} (action: {action})")
62
  else:
63
  # Fallback to rule-based recommendation if OpenAI fails
64
  recommended_budget = self._calculate_recommended_budget(avg_expense, data)
65
- reason = self._generate_reason(category, avg_expense, recommended_budget)
66
  action = None
67
  if not ai_result:
68
- print(f"❌ OpenAI unavailable (no API key or error), using rule-based for {category}: {recommended_budget}")
69
  else:
70
- print(f"⚠️ OpenAI returned invalid data, using rule-based for {category}: {recommended_budget}")
71
 
72
  recommendations.append(BudgetRecommendation(
73
- budget_name=category,
 
74
  average_expense=round(avg_expense, 2),
75
  recommended_budget=round(recommended_budget or 0, 2),
76
  reason=reason,
@@ -521,9 +525,15 @@ class SmartBudgetRecommender:
521
  base_amount = 0
522
 
523
  # Only add budget if it has an amount - use category name as key
 
524
  if base_amount > 0:
525
- if category_name not in result:
526
- result[category_name] = {
 
 
 
 
 
527
  "average_monthly": base_amount,
528
  "total": base_amount,
529
  "count": 1,
@@ -532,15 +542,17 @@ class SmartBudgetRecommender:
532
  "monthly_values": [base_amount],
533
  }
534
  else:
535
- result[category_name]["total"] += base_amount
536
- result[category_name]["count"] += 1
537
- result[category_name]["months_analyzed"] = result[category_name]["count"]
538
- result[category_name]["average_monthly"] = (
539
- result[category_name]["total"] / result[category_name]["count"]
540
  )
541
- result[category_name]["monthly_values"].append(base_amount)
542
 
543
- print(f"✅ Processed {len(result)} budget categories for recommendations: {list(result.keys())}")
 
 
544
  return result
545
 
546
  def _get_ai_recommendation(self, category: str, data: Dict, avg_expense: float):
 
48
 
49
  recommendations: List[BudgetRecommendation] = []
50
 
51
+ for category_key, data in category_data.items():
52
+ # Extract category_name and category_id from data
53
+ category_name = data.get("category_name", category_key.split("|")[0] if "|" in category_key else category_key)
54
+ category_id = data.get("category_id")
55
  avg_expense = data["average_monthly"]
56
  confidence = self._calculate_confidence(data)
57
 
58
  # Always try OpenAI first (primary source of recommendation)
59
+ ai_result = self._get_ai_recommendation(category_name, data, avg_expense)
60
  if ai_result and ai_result.get("recommended_budget"):
61
  recommended_budget = ai_result.get("recommended_budget")
62
+ reason = ai_result.get("reason", f"AI recommendation for {category_name}")
63
  action = ai_result.get("action")
64
+ print(f"✅ OpenAI recommendation for {category_name}: {recommended_budget} (action: {action})")
65
  else:
66
  # Fallback to rule-based recommendation if OpenAI fails
67
  recommended_budget = self._calculate_recommended_budget(avg_expense, data)
68
+ reason = self._generate_reason(category_name, avg_expense, recommended_budget)
69
  action = None
70
  if not ai_result:
71
+ print(f"❌ OpenAI unavailable (no API key or error), using rule-based for {category_name}: {recommended_budget}")
72
  else:
73
+ print(f"⚠️ OpenAI returned invalid data, using rule-based for {category_name}: {recommended_budget}")
74
 
75
  recommendations.append(BudgetRecommendation(
76
+ category=category_name,
77
+ category_id=category_id,
78
  average_expense=round(avg_expense, 2),
79
  recommended_budget=round(recommended_budget or 0, 2),
80
  reason=reason,
 
525
  base_amount = 0
526
 
527
  # Only add budget if it has an amount - use category name as key
528
+ # Store both category_name and category_id in the result
529
  if base_amount > 0:
530
+ # Use a unique key that includes category_id to handle multiple budgets with same category name
531
+ result_key = f"{category_name}|{category_id}" if category_id else category_name
532
+
533
+ if result_key not in result:
534
+ result[result_key] = {
535
+ "category_name": category_name,
536
+ "category_id": str(category_id) if category_id else None,
537
  "average_monthly": base_amount,
538
  "total": base_amount,
539
  "count": 1,
 
542
  "monthly_values": [base_amount],
543
  }
544
  else:
545
+ result[result_key]["total"] += base_amount
546
+ result[result_key]["count"] += 1
547
+ result[result_key]["months_analyzed"] = result[result_key]["count"]
548
+ result[result_key]["average_monthly"] = (
549
+ result[result_key]["total"] / result[result_key]["count"]
550
  )
551
+ result[result_key]["monthly_values"].append(base_amount)
552
 
553
+ # Extract category names for logging
554
+ category_names = [data.get("category_name", key.split("|")[0] if "|" in key else key) for key, data in result.items()]
555
+ print(f"✅ Processed {len(result)} budget categories for recommendations: {category_names}")
556
  return result
557
 
558
  def _get_ai_recommendation(self, category: str, data: Dict, avg_expense: float):