# Dokumentasi Backend Sentimind (API) Dokumen ini menjelaskan struktur folder `api`, fungsi dari setiap file, dan logika perhitungan yang digunakan dalam sistem Sentimind. ## 📂 Struktur Folder ``` api/ ├── index.py # Entry point utama aplikasi (FastAPI) ├── predict.py # Endpoint untuk prediksi teks manual ├── quiz.py # Endpoint untuk sistem kuis MBTI ├── core/ │ ├── chatbot.py # Logic Chatbot menggunakan Google Gemini │ ├── nlp_handler.py # Logic utama NLP (Machine Learning + Youtube) │ └── quiz_logic.py # Perhitungan skor dan logika MBTI └── data/ ├── questions.json # Database soal kuis ├── model_mbti.pkl # Model Machine Learning untuk MBTI └── model_emotion.pkl # Model Machine Learning untuk Emosi ``` --- ## 🧠 Logika Perhitungan Kuis (MBTI Scoring) Perhitungan MBTI dilakukan di file `api/core/quiz_logic.py`. Sistem tidak menggunakan sistem "benar/salah", melainkan sistem **Dimensi Bipolar**. ### 1. Variabel Dimensi Kita memiliki 4 variabel skor awal yang dimulai dari angka 0: - `EI`: Introvert vs Extravert - `SN`: Sensing vs Intuition - `TF`: Thinking vs Feeling - `JP`: Judging vs Perceiving ### 2. Rumus Per Soal Setiap soal memiliki atribut `dimension` (misal "EI") dan `direction` (1 atau -1). User memberikan jawaban dalam skala -3 sampai 3 (Sangat Tidak Setuju s.d. Sangat Setuju). **Rumus:** ```python Skor Dimensi += (Jawaban User * Arah Soal) ``` **Contoh Kasus:** - **Soal**: "Saya suka pesta." - Dimensi: `EI` - Arah (`direction`): `1` (Positif mengarah ke Extravert) - **Jawaban User**: `3` (Sangat Setuju) - **Hitungan**: `3 * 1 = 3`. Skor EI bertambah +3 (Makin E). - **Soal**: "Saya butuh waktu sendiri." - Dimensi: `EI` - Arah (`direction`): `-1` (Positif mengarah ke Introvert) - **Jawaban User**: `3` (Sangat Setuju) - **Hitungan**: `3 * -1 = -3`. Skor EI berkurang -3 (Makin I). ### 3. Penentuan Hasil Akhir Setelah menghitung total skor dari 40 soal, hasil ditentukan berdasarkan tanda positif/negatif: | Dimensi | Skor Positif (>= 0) | Skor Negatif (< 0) | | :------ | :------------------ | :----------------- | | **EI** | **E** (Extravert) | **I** (Introvert) | | **SN** | **S** (Sensing) | **N** (Intuition) | | **TF** | **T** (Thinking) | **F** (Feeling) | | **JP** | **J** (Judging) | **P** (Perceiving) | --- ## 📜 Penjelasan File & Fungsi (Detail) ### 1. `api/index.py` File utama untuk menjalankan server backend. - **`app = FastAPI()`**: Inisialisasi aplikasi. - **`startup_event()`**: Mengecek keberadaan `YOUTUBE_API_KEY` saat server nyala. Menentukan mode Official atau Scraping. - **`app.add_middleware(CORSMiddleware)`**: Mengizinkan frontend (berbeda port) untuk mengakses API ini. - **Routes**: Mendaftarkan URL endpoint dari file lain (`/api/predict`, `/api/quiz`, dll). - **`analyze_youtube_video(video_id)`**: Endpoint khusus untuk analisis YouTube. Memanggil `NLPHandler` untuk mengambil transkrip/komentar dan melakukan prediksi. ### 2. `api/predict.py` Handler untuk fitur "Analyzer" (Input Teks Manual). - **`predict_endpoint(input_data)`**: Menerima JSON `{ "text": "..." }`, memvalidasi input, lalu memanggil `NLPHandler.predict_all` untuk mendapatkan hasil MBTI dan Emosi. ### 3. `api/quiz.py` Handler untuk fitur "Quiz". - **`get_quiz_questions()`**: Mengambil daftar soal dari `QuizHandler`. - **`submit_quiz(submission)`**: Menerima jawaban user dan mengembalikan hasil MBTI. ### 4. `api/core/chatbot.py` Otak dari fitur Chatbot. - **`__init__`**: Menghubungkan ke Google Gemini API. Menggunakan model `gemini-2.0-flash` atau fallback ke `lite`. - **`generate_response(user_query, lang)`**: - Membuat `system_prompt` yang mendefinisikan persona AI "Sentimind". - Menyesuaikan gaya bahasa (Slang Jakarta untuk ID, Formal untuk EN). - Mengirim prompt ke Gemini dan mengembalikan teks balasan. ### 5. `api/core/nlp_handler.py` (Core Logic) File paling kompleks yang menangani Machine Learning dan pemrosesan data. **Fungsi Utama:** - **`load_models()`**: Memuat file `.pkl` (model ML yang sudah dilatih) ke memory agar prediksi cepat. - **`_validate_with_gemini(text, ml_prediction)`**: - Teknik **Hybrid AI**: Menggunakan LLM (Gemini) untuk "mengoreksi" hasil Machine Learning klasik. - Jika teks cukup panjang (>50 kata), Gemini akan menganalisis ulang teks dan memberikan "second opinion". - Mengembalikan confidence score dan alasan logis. - **`predict_all(raw_text)`**: 1. Translate teks ke Inggris (karena model dilatih pakai B.Inggris). 2. Prediksi MBTI pakai Model ML. 3. Validasi MBTI pakai Gemini (jika memungkinkan). 4. Prediksi Emosi pakai Model ML + Normalisasi probabilitas. 5. Ekstrak Keyword utama. 6. Generate penjelasan/reasoning untuk ditampilkan di UI. - **`fetch_youtube_transcript(video_id)`**: - Mencoba pakai **Official YouTube API** dulu (ambil judul, deskripsi, komentar). - Jika gagal/tak ada key, fallback ke **Scraping** (ambil subtitle otomatis). ### 6. `api/core/quiz_logic.py` Logic pemrosesan kuis. - **`get_questions()`**: Membaca file `api/data/questions.json`. - **`calculate_mbti(answers)`**: Mengimplementasikan rumus scoring MBTI (lihat bagian Logika Perhitungan Kuis di atas). --- ## 🛠 Flow Data (E2E) 1. **Frontend** kirim data (Teks/Jawaban Kuis/Video ID) ke **Backend**. 2. **Backend** (`index.py` / `quiz.py` / `predict.py`) terima request. 3. **Core Logic** (`NLPHandler` / `QuizHandler`) memproses data: - Load Model ML. - Hitung Matematika / Prediksi Statistik. - Panggil External API (Gemini/YouTube) jika perlu. 4. **Backend** membalas dengan JSON standar: ```json { "success": true, "mbti": "INTJ", "emotion": { "id": "Senang", "en": "Joy" }, "reasoning": { ... } } ``` 5. **Frontend** menampilkan animasi dan hasil ke user.