Spaces:
Sleeping
Sleeping
File size: 6,638 Bytes
217d7cd 9759eb6 217d7cd 945ee74 217d7cd 945ee74 9759eb6 217d7cd 9759eb6 217d7cd 9759eb6 945ee74 9759eb6 217d7cd 9759eb6 217d7cd 9759eb6 217d7cd 945ee74 9759eb6 217d7cd 9759eb6 217d7cd 9759eb6 945ee74 9759eb6 217d7cd 9759eb6 217d7cd 9759eb6 217d7cd 9759eb6 217d7cd 9759eb6 217d7cd 9759eb6 945ee74 217d7cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# app.py - Main file for Hugging Face Spaces deployment
import numpy as np
import pandas as pd
import torch
import gradio as gr
from transformers import pipeline, AutoTokenizer
# Use a more lightweight approach with the pipeline API
# This is more memory-efficient for Spaces deployment
try:
# First try to load a lightweight text generation model
generator = pipeline('text-generation',
model="distilgpt2",
max_length=100)
tokenizer = AutoTokenizer.from_pretrained("distilgpt2")
print("Using distilGPT2 model")
except Exception as e:
# Fallback to an even smaller model if resources are limited
print(f"Error loading distilGPT2: {e}")
print("Falling back to smaller model")
generator = pipeline('text-generation',
model="sshleifer/tiny-gpt2",
max_length=100)
tokenizer = AutoTokenizer.from_pretrained("sshleifer/tiny-gpt2")
# Financial knowledge base - simple templates and responses
financial_templates = {
"budget": "Here's a simple budget template based on the 50/30/20 rule:\n- 50% for needs (rent, groceries, utilities)\n- 30% for wants (dining out, entertainment)\n- 20% for savings and debt repayment",
"emergency fund": "An emergency fund should ideally cover 3-6 months of expenses. Start with a goal of $1,000, then build from there.",
"debt": "Focus on high-interest debt first (like credit cards). Consider the debt avalanche (highest interest first) or debt snowball (smallest balance first) methods.",
"investing": "For beginners, consider index funds or ETFs for diversification. Time in the market beats timing the market.",
"retirement": "Take advantage of employer matches in retirement accounts - it's free money. Start early to benefit from compound interest.",
"save money": "To save money, try the 30-day rule (wait 30 days before making non-essential purchases), meal prep to reduce food costs, and use cashback apps for everyday purchases.",
"credit score": "To improve your credit score: pay bills on time, reduce credit card balances, don't close old accounts, and check your credit report regularly for errors."
}
# Define guided chat flow
def guided_response(user_message, chat_history):
# Check if we should use a template response
for key, template in financial_templates.items():
if key.lower() in user_message.lower():
return "", chat_history + [[user_message, template]]
# For more general queries, use the AI model with a financial prefix
try:
prompt = f"The following is financial advice: {user_message}\nFinancial advisor:"
outputs = generator(prompt, max_length=150, temperature=0.7, num_return_sequences=1)
# Extract relevant part of the response
response = outputs[0]['generated_text'].replace(prompt, "").strip()
# Cleanup and limit response
response = response.split('.')[0] + '.' if '.' in response else response
# Add disclaimer for AI-generated content
response += "\n\n(Note: This is general advice. Please consult a professional financial advisor for specific situations.)"
except Exception as e:
response = f"I'm sorry, I couldn't generate advice at the moment. Please try asking about budgeting, emergency funds, debt, investing, or retirement."
return "", chat_history + [[user_message, response]]
# Create budget calculator function
def calculate_budget(monthly_income, housing, utilities, groceries, transportation):
if not monthly_income or monthly_income <= 0:
return "Please enter a valid monthly income greater than zero."
# Convert inputs to float and handle potential None values
housing = float(housing or 0)
utilities = float(utilities or 0)
groceries = float(groceries or 0)
transportation = float(transportation or 0)
monthly_income = float(monthly_income)
total_needs = housing + utilities + groceries + transportation
needs_percent = (total_needs / monthly_income) * 100 if monthly_income > 0 else 0
available_for_wants = monthly_income * 0.3
available_for_savings = monthly_income * 0.2
return f"""Based on the 50/30/20 rule:
Current spending on needs: ${total_needs:.2f} ({needs_percent:.1f}% of income)
Recommended max for needs: ${monthly_income * 0.5:.2f} (50%)
Available for wants: ${available_for_wants:.2f} (30%)
Recommended for savings/debt: ${available_for_savings:.2f} (20%)
{'Your needs expenses are within recommended limits!' if needs_percent <= 50 else 'Your needs expenses exceed 50% of income. Consider areas to reduce spending.'}
"""
# Setup Gradio interface with tabs
with gr.Blocks() as app:
gr.Markdown("# Financial Advisor Bot")
gr.Markdown("Ask questions about personal finance or use the budget calculator.")
with gr.Tab("Chat Advisor"):
chatbot = gr.Chatbot(height=400)
msg = gr.Textbox(label="Ask about budgeting, emergency funds, debt, investing, retirement, etc.")
clear = gr.Button("Clear")
# Set up the chat interface
msg.submit(guided_response, [msg, chatbot], [msg, chatbot])
clear.click(lambda: None, None, chatbot, queue=False)
# Add some example prompts to help users
gr.Examples(
examples=[
"How should I create a budget?",
"How much should I save for an emergency fund?",
"What's the best way to pay off debt?",
"How should I start investing?",
"How can I save for retirement?"
],
inputs=msg
)
with gr.Tab("Budget Calculator"):
gr.Markdown("## 50/30/20 Budget Calculator")
with gr.Row():
income = gr.Number(label="Monthly Income (after tax)")
with gr.Row():
gr.Markdown("### Monthly Expenses (Needs)")
with gr.Row():
housing = gr.Number(label="Housing", value=0)
utilities = gr.Number(label="Utilities", value=0)
groceries = gr.Number(label="Groceries", value=0)
transport = gr.Number(label="Transportation", value=0)
calculate_btn = gr.Button("Calculate Budget")
output = gr.Textbox(label="Budget Analysis", lines=8)
calculate_btn.click(
calculate_budget,
inputs=[income, housing, utilities, groceries, transport],
outputs=output
)
# Launch the app
app.launch() |