fastapi_hf / app.py
looh2's picture
Add computer vision models for image classification and object detection; update Dockerfile and requirements
9c3865a
Raw
History Blame Contribute Delete
6.75 kB
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)