from flask import Flask, request, jsonify, send_from_directory from flask_cors import CORS import joblib import requests import os from dotenv import load_dotenv # Load environment variables load_dotenv() app = Flask(__name__, static_folder='.', static_url_path='') CORS(app) # Enable CORS for all routes # Load model and vectorizer try: model = joblib.load("spam_model.pkl") vectorizer = joblib.load("vectorizer.pkl") print("Model and vectorizer loaded successfully.") except Exception as e: print(f"Error loading model: {e}") model = None vectorizer = None N8N_URL = os.getenv("N8N_WEBHOOK_URL") @app.route('/') def serve_frontend(): return send_from_directory('.', 'index.html') @app.route('/') def serve_static(path): return send_from_directory('.', path) @app.route('/predict', methods=['POST']) def predict(): if not model or not vectorizer: return jsonify({"error": "Model not loaded"}), 500 data = request.get_json(force=True) message = data.get('message', '') if not message: return jsonify({"error": "No message provided"}), 400 # Vectorize input vectorized_message = vectorizer.transform([message]) # Predict prediction = model.predict(vectorized_message)[0] # Get probabilities probabilities = model.predict_proba(vectorized_message) confidence = max(probabilities[0]) result = { "prediction": prediction, "confidence": float(confidence), "message": message } # Send to N8N (Fire and forget, or wait for response?) if N8N_URL: try: print(f"Sending to N8N: {N8N_URL}") requests.post(N8N_URL, json=result, timeout=5) # Add timeout except Exception as e: print(f"Failed to send to N8N: {e}") return jsonify(result) if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=7860) # Port 7860 is standard for HF Spaces