Spaces:
Running
Running
| from flask import Flask, jsonify, request, send_from_directory | |
| from flask_cors import CORS | |
| from polygon_api import PolygonAPI | |
| from chat_routes import register_chat_routes | |
| from sentiment_routes import sentiment_bp | |
| from forecast_routes import forecast_bp | |
| import os | |
| import atexit | |
| app = Flask(__name__, static_folder='../fe', static_url_path='') | |
| CORS(app) | |
| polygon = PolygonAPI() | |
| def index(): | |
| return send_from_directory(app.static_folder, 'index.html') | |
| def get_tickers(): | |
| return send_from_directory('../', 'company_tickers.json') | |
| def get_ticker_details(ticker): | |
| try: | |
| data = polygon.get_ticker_details(ticker.upper()) | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| def get_previous_close(ticker): | |
| try: | |
| data = polygon.get_previous_close(ticker.upper()) | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| def get_aggregates(ticker): | |
| try: | |
| from_date = request.args.get('from') | |
| to_date = request.args.get('to') | |
| timespan = request.args.get('timespan', 'day') | |
| data = polygon.get_aggregates(ticker.upper(), timespan, from_date, to_date) | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| def get_news(ticker): | |
| try: | |
| limit = request.args.get('limit', 10, type=int) | |
| data = polygon.get_ticker_news(ticker.upper(), limit) | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| def get_financials(ticker): | |
| try: | |
| data = polygon.get_financials(ticker.upper()) | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| def get_snapshot(ticker): | |
| try: | |
| data = polygon.get_snapshot(ticker.upper()) | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| def get_dividends(ticker): | |
| try: | |
| limit = request.args.get('limit', 10, type=int) | |
| data = polygon.get_dividends(ticker.upper(), limit) | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| def get_splits(ticker): | |
| try: | |
| limit = request.args.get('limit', 10, type=int) | |
| data = polygon.get_splits(ticker.upper(), limit) | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| def get_market_status(): | |
| try: | |
| data = polygon.get_market_status() | |
| return jsonify(data) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| # Register chat routes | |
| register_chat_routes(app) | |
| # Register sentiment routes | |
| app.register_blueprint(sentiment_bp) | |
| # Register forecast routes | |
| app.register_blueprint(forecast_bp) | |
| # Graceful shutdown handler for FAISS | |
| from chat_routes import agent_service | |
| def shutdown_handler(): | |
| """Save FAISS index on graceful shutdown""" | |
| print("Shutting down gracefully, saving FAISS index...") | |
| try: | |
| agent_service.vector_store.save() | |
| print("FAISS index saved successfully") | |
| except Exception as e: | |
| print(f"Error saving FAISS index on shutdown: {e}") | |
| atexit.register(shutdown_handler) | |
| if __name__ == '__main__': | |
| from config import PORT | |
| app.run(debug=False, port=PORT) | |