| # 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. | |