rewardpilot-web-ui / utils /gemini_explainer.py
sammy786's picture
Create gemini_explainer.py
7160e12 verified
raw
history blame
3.01 kB
import google.generativeai as genai
from typing import Dict, List, Optional
import config
class GeminiExplainer:
"""Alternative LLM explainer using Google Gemini"""
def __init__(self):
if config.GEMINI_API_KEY:
genai.configure(api_key=config.GEMINI_API_KEY)
self.model = genai.GenerativeModel(config.GEMINI_MODEL)
self.enabled = True
else:
self.enabled = False
def explain_recommendation(
self,
card: str,
rewards: float,
rewards_rate: str,
merchant: str,
category: str,
amount: float,
warnings: Optional[List[str]] = None,
annual_potential: float = 0,
alternatives: Optional[List[Dict]] = None
) -> str:
"""Generate explanation using Gemini"""
if not self.enabled:
return "Gemini explainer not configured"
prompt = f"""You are a friendly financial advisor explaining credit card rewards to everyday consumers.
Transaction Details:
- Merchant: {merchant}
- Category: {category}
- Amount: ${amount:.2f}
Recommended Card: {card}
Rewards Earned: ${rewards:.2f} ({rewards_rate})
Annual Potential: ${annual_potential:.2f}/year
Task: Explain in 2-3 simple sentences why this card is the best choice. Use friendly, conversational language.
Focus on the tangible benefit (e.g., "That's like getting a free coffee every week!").
{"Warnings to mention: " + ", ".join(warnings) if warnings else ""}
"""
try:
response = self.model.generate_content(prompt)
return response.text
except Exception as e:
return f"Gemini explanation unavailable: {str(e)}"
def generate_spending_insights(
self,
user_id: str,
total_spending: float,
total_rewards: float,
optimization_score: int,
top_categories: List[Dict],
recommendations_count: int
) -> str:
"""Generate personalized insights using Gemini"""
if not self.enabled:
return "Gemini insights not configured"
prompt = f"""You are a financial coach reviewing a user's credit card rewards performance.
User Stats:
- Total Spending: ${total_spending:.2f}
- Total Rewards: ${total_rewards:.2f}
- Optimization Score: {optimization_score}/100
- Optimized Transactions: {recommendations_count}
- Top Categories: {', '.join([c.get('category', 'Unknown') for c in top_categories[:3]])}
Task: Provide 3 actionable insights in a friendly, motivating tone. Each insight should be 1 sentence.
Focus on what they're doing well and one improvement opportunity.
"""
try:
response = self.model.generate_content(prompt)
return response.text
except Exception as e:
return f"Gemini insights unavailable: {str(e)}"
def get_gemini_explainer():
"""Factory function to get Gemini explainer"""
return GeminiExplainer()