from fastapi import FastAPI from fastapi.responses import HTMLResponse from dotenv import load_dotenv from .core.nlp_handler import NLPHandler import os # Load environment variables dari file .env load_dotenv() from api.predict import predict_endpoint from api.quiz import get_quiz_questions, submit_quiz from api.core.chatbot import MBTIChatbot from pydantic import BaseModel # Init Chatbot (Load dataset sekali di awal) chatbot = MBTIChatbot() class ChatRequest(BaseModel): message: str lang: str = "id" # Default ke Indo kalo gak dikirim from fastapi.middleware.cors import CORSMiddleware app = FastAPI() # Tambahkan CORS biar frontend (port 3000) bisa akses backend (port 8000) app.add_middleware( CORSMiddleware, allow_origins=["*"], # Di produksi, ganti "*" dengan domain frontend lu allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # --- TAMBAHAN DEBUGGING (CEK SAAT SERVER NYALA) --- @app.on_event("startup") async def startup_event(): api_key = os.getenv("YOUTUBE_API_KEY") print("\n" + "="*40) if api_key: print(f"[OK] API KEY DITEMUKAN: {api_key[:5]}...******") print("[MODE] Mode: OFFICIAL API (Anti-Blokir)") else: print("[ERR] API KEY TIDAK DITEMUKAN!") print("[WARN] Mode: FALLBACK SCRAPING (Rawan Error)") print("\n[WAIT] PRE-LOADING MODELS (Transformer + Emotions)...") try: NLPHandler.load_models() print("[OK] Models Loaded Successfully!") except Exception as e: print(f"[ERR] Model Preload Failed: {e}") print("="*40 + "\n") app.add_api_route("/api/predict", predict_endpoint, methods=["POST"]) app.add_api_route("/api/quiz", get_quiz_questions, methods=["GET"]) app.add_api_route("/api/quiz", submit_quiz, methods=["POST"]) @app.post("/api/chat") async def chat_endpoint(request: ChatRequest): return {"response": chatbot.generate_response(request.message, request.lang)} @app.get("/api/hello") def health_check(): # Biar bisa dicek lewat browser: http://localhost:8000/api/hello has_key = bool(os.getenv("YOUTUBE_API_KEY")) return { "status": "online", "mode": "youtube_ready", "api_key_detected": has_key } @app.get("/", response_class=HTMLResponse) def read_root(): return """