import os os.environ.setdefault("TF_ENABLE_ONEDNN_OPTS", "0") from dotenv import load_dotenv load_dotenv() # must run before any route module is imported so env vars are visible at module level from fastapi import Depends, FastAPI from fastapi.middleware.cors import CORSMiddleware from slowapi import _rate_limit_exceeded_handler from slowapi.errors import RateLimitExceeded from slowapi.middleware import SlowAPIMiddleware from routes.auth import verify_approved_user from routes.limiter import limiter from routes.Admin_Users import router as admin_users_router from routes.NLP_ContentFilter_MovieRecommender import router as nlp_content_filter_router from routes.NLP_Sentiment import router as sentiment_router from routes.ML_LinearRegression_ChurnPredictor import router as linear_regression_router from routes.ML_LogisticRegression_ChurnPredictor import router as logistic_regression_router from routes.ML_DecisionTree_IrisClassifier import router as iris_router from routes.ML_RandomForest_TaxiPredictor import router as random_forest_router from routes.ML_RidgeRegression_HousePricePredictor import router as ridge_regression_router from routes.ML_PolynomialRegression_CarPricePredictor import router as polynomial_regression_router from routes.ML_LassoRegression_SalesPredictor import router as lasso_regression_router from routes.ML_DecisionTreeRegressor_BikeRentalPredictor import router as decision_tree_regressor_router from routes.ML_GradientBoosting_HousePricePredictor import router as gradient_boosting_router from routes.ML_RandomForestClassifier_CreditApproval import router as random_forest_classifier_router from routes.ML_KNN_CustomerSegment import router as knn_router from routes.ML_NaiveBayes_RainPredictor import router as naive_bayes_router from routes.ML_SVM_WineQuality import router as svm_router from routes.ML_KMeans_CustomerSegmentation import router as kmeans_router from routes.ML_DBSCAN_ServerAnomaly import router as dbscan_router from routes.ML_MeanShift_UserBehavior import router as mean_shift_router from routes.ML_PCA_ProductFeatures import router as pca_router from routes.ML_ICA_SensorSignals import router as ica_router from routes.ML_Apriori_GroceryRecommender import router as apriori_router from routes.ML_FPGrowth_GroceryRecommender import router as fpgrowth_router from routes.ML_ECLAT_GroceryRecommender import router as eclat_router from routes.DL_RNN_StockPricePredictor import router as rnn_stock_router from routes.DL_CNN_NumberRecognition import router as cnn_router from routes.DL_MobileNet_ImageClassifier import router as image_classifier_router from routes.DL_FasterRCNN_ObjectDetection import router as object_detection_router from routes.DL_YOLO_DentalXray import router as dental_xray_router from routes.NLP_CollaborativeFilter_BookRecommender import router as nlp_collaborative_filter_router from routes.Memory_Upload import router as upload_memory_router from routes.Memory_Crud import router as documents_router from routes.Chat_multi_agent_router import router as multi_agent_router from routes.agents.agent_fill_form import router as fill_form_router app = FastAPI() app.state.limiter = limiter app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) # type: ignore[arg-type] app.add_middleware(SlowAPIMiddleware) app.add_middleware( CORSMiddleware, allow_origins=[ "https://compass-j.vercel.app", "https://frontend-ashy-six-61.vercel.app", "http://localhost:3000", "http://localhost:4200", ], allow_credentials=True, allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"], allow_headers=[ "Authorization", "Content-Type", "x-vercel-protection-bypass", "x-user-id", "x-supabase-user-id", "x-username", "x-login-method", "x-comvision-key", # ComVision frontend still sends this; harmless here (routes use Bearer auth) ], ) # Every router requires a valid token AND an admin-approved account # (public.profiles.status = 'approved'). New signups are 'pending' until an # admin approves them via the /admin endpoints below. _auth = [Depends(verify_approved_user)] @app.get("/") def greet_json(): return {"Hello": "World!"} app.include_router(sentiment_router, dependencies=_auth) app.include_router(linear_regression_router, dependencies=_auth) app.include_router(logistic_regression_router, dependencies=_auth) app.include_router(random_forest_router, dependencies=_auth) app.include_router(ridge_regression_router, dependencies=_auth) app.include_router(polynomial_regression_router, dependencies=_auth) app.include_router(lasso_regression_router, dependencies=_auth) app.include_router(decision_tree_regressor_router, dependencies=_auth) app.include_router(gradient_boosting_router, dependencies=_auth) app.include_router(random_forest_classifier_router, dependencies=_auth) app.include_router(knn_router, dependencies=_auth) app.include_router(naive_bayes_router, dependencies=_auth) app.include_router(svm_router, dependencies=_auth) app.include_router(kmeans_router, dependencies=_auth) app.include_router(dbscan_router, dependencies=_auth) app.include_router(mean_shift_router, dependencies=_auth) app.include_router(pca_router, dependencies=_auth) app.include_router(ica_router, dependencies=_auth) app.include_router(apriori_router, dependencies=_auth) app.include_router(fpgrowth_router, dependencies=_auth) app.include_router(eclat_router, dependencies=_auth) app.include_router(cnn_router, dependencies=_auth) app.include_router(iris_router, dependencies=_auth) app.include_router(nlp_collaborative_filter_router, dependencies=_auth) app.include_router(nlp_content_filter_router, dependencies=_auth) app.include_router(rnn_stock_router, dependencies=_auth) # ComVision computer-vision demos, merged back in from the standalone comvision-api # Space. In the monolith they sit behind the same approved-user auth as every other # model endpoint (the frontend already sends a Bearer token when it targets the # monolith), so the CV Space's x-comvision-key shared secret is not needed here. app.include_router(image_classifier_router, dependencies=_auth) app.include_router(object_detection_router, dependencies=_auth) app.include_router(dental_xray_router, dependencies=_auth) app.include_router(upload_memory_router, dependencies=_auth) app.include_router(documents_router, dependencies=_auth) app.include_router(multi_agent_router, dependencies=_auth) app.include_router(fill_form_router, dependencies=_auth) # Admin user-approval endpoints guard themselves (require_admin), so they are # not behind _auth — an admin must stay able to manage users regardless. app.include_router(admin_users_router)