|
|
from flask import Flask, request, jsonify |
|
|
from flask_cors import CORS |
|
|
import os |
|
|
import sys |
|
|
|
|
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
|
|
from api.predict import predict_review, load_resources |
|
|
|
|
|
app = Flask(__name__) |
|
|
CORS(app) |
|
|
|
|
|
print("loading models on startup...") |
|
|
try: |
|
|
load_resources() |
|
|
print("models loaded") |
|
|
except Exception as e: |
|
|
print(f"couldnt preload models: {e}") |
|
|
|
|
|
@app.route('/health', methods=['GET']) |
|
|
def health(): |
|
|
return jsonify({"status": "ok"}), 200 |
|
|
|
|
|
@app.route('/predict', methods=['POST']) |
|
|
def predict(): |
|
|
try: |
|
|
data = request.get_json() |
|
|
|
|
|
if not data or 'text' not in data: |
|
|
return jsonify({"error": "missing 'text' field"}), 400 |
|
|
|
|
|
reviewText = data['text'] |
|
|
|
|
|
if not isinstance(reviewText, str): |
|
|
return jsonify({"error": "'text' must be a string"}), 400 |
|
|
|
|
|
if len(reviewText.strip()) == 0: |
|
|
return jsonify({"error": "text cannot be empty"}), 400 |
|
|
|
|
|
result = predict_review(reviewText) |
|
|
|
|
|
if 'error' in result: |
|
|
return jsonify({"error": result['error']}), 400 |
|
|
|
|
|
return jsonify({ |
|
|
"prediction": result['prediction'], |
|
|
"confidence": result['confidence'], |
|
|
"is_fake": result['is_fake'], |
|
|
"length_category": result.get('length_category'), |
|
|
"token_count": result.get('token_count') |
|
|
}), 200 |
|
|
|
|
|
except Exception as e: |
|
|
return jsonify({"error": str(e)}), 500 |
|
|
|
|
|
if __name__ == '__main__': |
|
|
print("starting api server") |
|
|
app.run(host='0.0.0.0', port=7860, debug=False) |