anggars commited on
Commit
71b7a02
Β·
verified Β·
1 Parent(s): 788e35b

Sync from GitHub Actions: b8f51c1e658e26be2f6768ab95b2b6c004c56131

Browse files
Files changed (1) hide show
  1. api/API DOCUMENTATION.md +158 -0
api/API DOCUMENTATION.md ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dokumentasi Backend Sentimind (API)
2
+
3
+ Dokumen ini menjelaskan struktur folder `api`, fungsi dari setiap file, dan logika perhitungan yang digunakan dalam sistem Sentimind.
4
+
5
+ ## πŸ“‚ Struktur Folder
6
+
7
+ ```
8
+ api/
9
+ β”œβ”€β”€ index.py # Entry point utama aplikasi (FastAPI)
10
+ β”œβ”€β”€ predict.py # Endpoint untuk prediksi teks manual
11
+ β”œβ”€β”€ quiz.py # Endpoint untuk sistem kuis MBTI
12
+ β”œβ”€β”€ core/
13
+ β”‚ β”œβ”€β”€ chatbot.py # Logic Chatbot menggunakan Google Gemini
14
+ β”‚ β”œβ”€β”€ nlp_handler.py # Logic utama NLP (Machine Learning + Youtube)
15
+ β”‚ └── quiz_logic.py # Perhitungan skor dan logika MBTI
16
+ └── data/
17
+ β”œβ”€β”€ questions.json # Database soal kuis
18
+ β”œβ”€β”€ model_mbti.pkl # Model Machine Learning untuk MBTI
19
+ └── model_emotion.pkl # Model Machine Learning untuk Emosi
20
+ ```
21
+
22
+ ---
23
+
24
+ ## 🧠 Logika Perhitungan Kuis (MBTI Scoring)
25
+
26
+ Perhitungan MBTI dilakukan di file `api/core/quiz_logic.py`. Sistem tidak menggunakan sistem "benar/salah", melainkan sistem **Dimensi Bipolar**.
27
+
28
+ ### 1. Variabel Dimensi
29
+
30
+ Kita memiliki 4 variabel skor awal yang dimulai dari angka 0:
31
+
32
+ - `EI`: Introvert vs Extravert
33
+ - `SN`: Sensing vs Intuition
34
+ - `TF`: Thinking vs Feeling
35
+ - `JP`: Judging vs Perceiving
36
+
37
+ ### 2. Rumus Per Soal
38
+
39
+ Setiap soal memiliki atribut `dimension` (misal "EI") dan `direction` (1 atau -1).
40
+ User memberikan jawaban dalam skala -3 sampai 3 (Sangat Tidak Setuju s.d. Sangat Setuju).
41
+
42
+ **Rumus:**
43
+
44
+ ```python
45
+ Skor Dimensi += (Jawaban User * Arah Soal)
46
+ ```
47
+
48
+ **Contoh Kasus:**
49
+
50
+ - **Soal**: "Saya suka pesta."
51
+ - Dimensi: `EI`
52
+ - Arah (`direction`): `1` (Positif mengarah ke Extravert)
53
+ - **Jawaban User**: `3` (Sangat Setuju)
54
+ - **Hitungan**: `3 * 1 = 3`. Skor EI bertambah +3 (Makin E).
55
+
56
+ - **Soal**: "Saya butuh waktu sendiri."
57
+ - Dimensi: `EI`
58
+ - Arah (`direction`): `-1` (Positif mengarah ke Introvert)
59
+ - **Jawaban User**: `3` (Sangat Setuju)
60
+ - **Hitungan**: `3 * -1 = -3`. Skor EI berkurang -3 (Makin I).
61
+
62
+ ### 3. Penentuan Hasil Akhir
63
+
64
+ Setelah menghitung total skor dari 40 soal, hasil ditentukan berdasarkan tanda positif/negatif:
65
+
66
+ | Dimensi | Skor Positif (>= 0) | Skor Negatif (< 0) |
67
+ | :------ | :------------------ | :----------------- |
68
+ | **EI** | **E** (Extravert) | **I** (Introvert) |
69
+ | **SN** | **S** (Sensing) | **N** (Intuition) |
70
+ | **TF** | **T** (Thinking) | **F** (Feeling) |
71
+ | **JP** | **J** (Judging) | **P** (Perceiving) |
72
+
73
+ ---
74
+
75
+ ## πŸ“œ Penjelasan File & Fungsi (Detail)
76
+
77
+ ### 1. `api/index.py`
78
+
79
+ File utama untuk menjalankan server backend.
80
+
81
+ - **`app = FastAPI()`**: Inisialisasi aplikasi.
82
+ - **`startup_event()`**: Mengecek keberadaan `YOUTUBE_API_KEY` saat server nyala. Menentukan mode Official atau Scraping.
83
+ - **`app.add_middleware(CORSMiddleware)`**: Mengizinkan frontend (berbeda port) untuk mengakses API ini.
84
+ - **Routes**: Mendaftarkan URL endpoint dari file lain (`/api/predict`, `/api/quiz`, dll).
85
+ - **`analyze_youtube_video(video_id)`**: Endpoint khusus untuk analisis YouTube. Memanggil `NLPHandler` untuk mengambil transkrip/komentar dan melakukan prediksi.
86
+
87
+ ### 2. `api/predict.py`
88
+
89
+ Handler untuk fitur "Analyzer" (Input Teks Manual).
90
+
91
+ - **`predict_endpoint(input_data)`**: Menerima JSON `{ "text": "..." }`, memvalidasi input, lalu memanggil `NLPHandler.predict_all` untuk mendapatkan hasil MBTI dan Emosi.
92
+
93
+ ### 3. `api/quiz.py`
94
+
95
+ Handler untuk fitur "Quiz".
96
+
97
+ - **`get_quiz_questions()`**: Mengambil daftar soal dari `QuizHandler`.
98
+ - **`submit_quiz(submission)`**: Menerima jawaban user dan mengembalikan hasil MBTI.
99
+
100
+ ### 4. `api/core/chatbot.py`
101
+
102
+ Otak dari fitur Chatbot.
103
+
104
+ - **`__init__`**: Menghubungkan ke Google Gemini API. Menggunakan model `gemini-2.0-flash` atau fallback ke `lite`.
105
+ - **`generate_response(user_query, lang)`**:
106
+ - Membuat `system_prompt` yang mendefinisikan persona AI "Sentimind".
107
+ - Menyesuaikan gaya bahasa (Slang Jakarta untuk ID, Formal untuk EN).
108
+ - Mengirim prompt ke Gemini dan mengembalikan teks balasan.
109
+
110
+ ### 5. `api/core/nlp_handler.py` (Core Logic)
111
+
112
+ File paling kompleks yang menangani Machine Learning dan pemrosesan data.
113
+
114
+ **Fungsi Utama:**
115
+
116
+ - **`load_models()`**: Memuat file `.pkl` (model ML yang sudah dilatih) ke memory agar prediksi cepat.
117
+ - **`_validate_with_gemini(text, ml_prediction)`**:
118
+ - Teknik **Hybrid AI**: Menggunakan LLM (Gemini) untuk "mengoreksi" hasil Machine Learning klasik.
119
+ - Jika teks cukup panjang (>50 kata), Gemini akan menganalisis ulang teks dan memberikan "second opinion".
120
+ - Mengembalikan confidence score dan alasan logis.
121
+ - **`predict_all(raw_text)`**:
122
+ 1. Translate teks ke Inggris (karena model dilatih pakai B.Inggris).
123
+ 2. Prediksi MBTI pakai Model ML.
124
+ 3. Validasi MBTI pakai Gemini (jika memungkinkan).
125
+ 4. Prediksi Emosi pakai Model ML + Normalisasi probabilitas.
126
+ 5. Ekstrak Keyword utama.
127
+ 6. Generate penjelasan/reasoning untuk ditampilkan di UI.
128
+ - **`fetch_youtube_transcript(video_id)`**:
129
+ - Mencoba pakai **Official YouTube API** dulu (ambil judul, deskripsi, komentar).
130
+ - Jika gagal/tak ada key, fallback ke **Scraping** (ambil subtitle otomatis).
131
+
132
+ ### 6. `api/core/quiz_logic.py`
133
+
134
+ Logic pemrosesan kuis.
135
+
136
+ - **`get_questions()`**: Membaca file `api/data/questions.json`.
137
+ - **`calculate_mbti(answers)`**: Mengimplementasikan rumus scoring MBTI (lihat bagian Logika Perhitungan Kuis di atas).
138
+
139
+ ---
140
+
141
+ ## πŸ›  Flow Data (E2E)
142
+
143
+ 1. **Frontend** kirim data (Teks/Jawaban Kuis/Video ID) ke **Backend**.
144
+ 2. **Backend** (`index.py` / `quiz.py` / `predict.py`) terima request.
145
+ 3. **Core Logic** (`NLPHandler` / `QuizHandler`) memproses data:
146
+ - Load Model ML.
147
+ - Hitung Matematika / Prediksi Statistik.
148
+ - Panggil External API (Gemini/YouTube) jika perlu.
149
+ 4. **Backend** membalas dengan JSON standar:
150
+ ```json
151
+ {
152
+ "success": true,
153
+ "mbti": "INTJ",
154
+ "emotion": { "id": "Senang", "en": "Joy" },
155
+ "reasoning": { ... }
156
+ }
157
+ ```
158
+ 5. **Frontend** menampilkan animasi dan hasil ke user.