CareerAI Mentor adalah asisten pengembangan karier berbasis kecerdasan buatan (AI Career Development Assistant) yang didukung oleh Google Gemini API. Aplikasi ini dirancang untuk memproses bahasa alami (NLP/LLM), memahami intensi pengguna secara kontekstual, dan memberikan panduan karier yang personal, terstruktur, serta aplikatif.
-
AI Career Consultant:
- Eksplorasi jalur karier, transisi karier (career switch), dan strategi melamar kerja.
- Rekomendasi sertifikasi dan pengembangan profesional yang realistis.
- Format respons terstruktur: 1. Jawaban Langsung, 2. Analisis, 3. Rekomendasi Aksi, 4. Langkah Berikutnya.
-
CV Assistant:
- Tinjauan konten CV terhadap target posisi atau deskripsi lowongan kerja (Job Description).
- Perbaikan bullet points pengalaman kerja menggunakan Action Verbs + Metrik Terukur.
- Evaluasi kesesuaian sistem ATS tanpa merekayasa atau mengarang pencapaian palsu.
-
Skill Gap Analyzer:
- Memetakan keahlian saat ini terhadap persyaratan industri target.
- Mengkategorikan Essential Skills (wajib) vs Optional Skills (nilai tambah).
- Matriks prioritas belajar, estimasi tingkat kesulitan, dan latihan praktis untuk menutup kesenjangan keahlian.
-
Learning Roadmap Generator:
- Menghasilkan kurikulum dan rencana belajar mingguan adaptif sesuai jam belajar pengguna.
- Pembagian tahapan (Fundamentals -> Applied Skills -> Real-World Portfolio Projects).
- Kriteria penyelesaian (completion checklist) yang terukur.
-
Interactive Mock Interview:
- Simulasi wawancara kerja teknis dan situasional gilir-demi-gilir (turn-by-turn).
- AI menanyakan satu pertanyaan pada setiap giliran.
- Memberikan evaluasi format STAR (Situation, Task, Action, Result), kekuatan, kekurangan, dan contoh perbaikan sebelum memberikan pertanyaan berikutnya.
-
Conversation & Context Management:
- Penyimpanan riwayat obrolan dan sesi wawancara ke database SQLite lokal (zero-configuration).
- Bounded Context Window (membatasi riwayat pesan yang dikirim ke LLM) untuk menghemat token dan menjaga relevansi.
- Pencarian riwayat percakapan dan penghapusan percakapan.
-
Configurable AI Presets & Parameters:
- Accurate (Temp 0.2): Evaluasi CV, analisis gap, dan data terstruktur dengan variabilitas minimal.
- Balanced (Temp 0.7): Konsultasi karier umum dengan gaya bahasa natural.
- Creative (Temp 1.0): Brainstorming ide proyek, eksplorasi opsi karier baru, dan solusi alternatif.
- Dukungan model Gemini (
gemini-flash-lite-latestsebagai default tercepat,gemini-flash-latest,gemini-3.8-flash,gemini-2.5-pro).
-
User Authentication & Multi-Tenant Data Isolation:
- Registrasi pengguna baru dan login aman dengan password hashing
bcryptjs(salt rounds 10). - Otorisasi berbasis JSON Web Token (JWT) dengan expiry 7 hari.
- Isolasi percakapan antar-pengguna (multi-tenancy): pengguna terautentikasi hanya dapat mengakses, melihat, dan menghapus percakapan miliknya sendiri. Akses lintas user diblokir dengan proteksi HTTP 403 / 404.
- Mode tamu (guest access) tetap didukung tanpa memutus alur pengguna baru.
- Registrasi pengguna baru dan login aman dengan password hashing
-
Halaman Login & Dashboard (User + Admin):
- Halaman login/registrasi terpisah (
/login.html) dengan redirect ke dashboard setelah masuk. - Dashboard pengguna: statistik percakapan & pesan, distribusi topik, riwayat terbaru, dan aksi cepat modul karier.
- Dashboard admin: ringkasan seluruh pengguna/percakapan serta manajemen (daftar pengguna, daftar percakapan, hapus data).
- Sistem role (
user/admin); akun admin di-bootstrap otomatis dariADMIN_EMAIL/ADMIN_PASSWORD.
- Halaman login/registrasi terpisah (
CareerAI/
├── data/ # Direktori database SQLite lokal (otomatis dibuat)
│ └── careerai.sqlite
├── public/ # Frontend UI (Bootstrap 5, Indigo/Navy SaaS theme)
│ ├── css/
│ │ └── style.css # Desain modern SaaS dashboard
│ ├── js/
│ │ ├── app.js # Logic chat client-side, Markdown & DOMPurify, API handler
│ │ ├── login.js # Controller halaman login/registrasi
│ │ └── dashboard.js # Controller dashboard user & admin
│ ├── index.html # Aplikasi chat utama & modal aksi cepat
│ ├── login.html # Halaman login/registrasi (full page)
│ └── dashboard.html # Dashboard user & panel admin
├── src/
│ ├── config/
│ │ ├── auth.js # Konfigurasi & helper JWT
│ │ ├── database.js # Inisialisasi SQLite database (Node 24 DatabaseSync)
│ │ └── gemini.js # Konfigurasi model, limits, presets & System Prompt
│ ├── controllers/
│ │ ├── authController.js # Register, login, & profil pengguna
│ │ ├── chatController.js # Controller alur chat, validasi pesan, & riwayat
│ │ ├── dashboardController.js # Statistik dashboard pengguna
│ │ ├── adminController.js # Statistik & manajemen (admin)
│ │ └── specializedController.js # Controller modul CV, Skill Gap, Roadmap, & Mock Interview
│ ├── middleware/
│ │ ├── authMiddleware.js # requireAuth, optionalAuth, requireAdmin
│ │ ├── errorHandler.js # Sanitasi pesan error (menjamin API key tidak bocor)
│ │ └── rateLimiter.js # Rate limiting pencegah abuse
│ ├── models/
│ │ ├── conversationModel.js # Akses database percakapan & interview
│ │ └── userModel.js # Akses database pengguna & hashing password
│ ├── routes/
│ │ └── api.js # Definisi endpoint RESTful API
│ ├── services/
│ │ ├── geminiService.js # HTTP Client resmi Gemini REST, timeout & retry logic
│ │ └── intentClassifier.js# Engine deteksi intensi percakapan (7 kategori)
│ ├── app.js # Express Application bootstrapping
│ └── server.js # Server entry point
├── tests/ # Pengujian otomatis (Jest & Supertest)
│ ├── auth.test.js # Test autentikasi & isolasi data antar-user
│ ├── chatApi.test.js # Test endpoint API & validasi batas karakter
│ ├── conversationModel.test.js # Test persistensi data SQLite
│ ├── dashboardAdmin.test.js # Test dashboard user & endpoint admin
│ ├── geminiService.test.js # Test mock respon HTTP Gemini, 429 rate limit, 400 key
│ └── intentClassifier.test.js # Test akurasi klasifikasi intensi & prompt augmentations
├── .env.example # Contoh konfigurasi environment variable
├── .gitignore # Filter file rahasia & dependencies
├── package.json # Konfigurasi dependensi project
└── README.md # Dokumentasi lengkap
- Node.js: Versi 18+ (Rekomendasi Node.js 22 atau 24 yang sudah terinstal di sistem Anda).
- Koneksi Internet: Untuk mengakses Google Gemini API.
- Google Gemini API Key: Dapatkan secara gratis di Google AI Studio.
Buka terminal / PowerShell di direktori proyek:
cd d:\Project\CareerAI
npm installSalin file .env.example menjadi .env:
cp .env.example .envBuka file .env dan masukkan API Key Anda:
PORT=3000
NODE_ENV=development
# Masukkan Gemini API Key Anda dari Google AI Studio:
GEMINI_API_KEY=AIzaSyYourActualGeminiApiKeyHere
# Pilihan model (default: gemini-flash-lite-latest)
GEMINI_MODEL=gemini-flash-lite-latest
# Default AI Parameters
DEFAULT_TEMPERATURE=0.7
DEFAULT_TOP_P=0.9
DEFAULT_TOP_K=40
DEFAULT_MAX_OUTPUT_TOKENS=2048
# Bounded context window
MAX_HISTORY_MESSAGES=10
REQUEST_TIMEOUT_MS=90000Jalankan server aplikasi:
npm startAtau untuk mode pengembangan dengan auto-reload:
npm run devBuka browser dan akses:
👉 http://localhost:3000 (aplikasi chat) · 👉 http://localhost:3000/login.html (login) · 👉 http://localhost:3000/dashboard.html (dashboard)
- Saat server pertama kali dijalankan, akun admin di-bootstrap otomatis dari
ADMIN_EMAIL/ADMIN_PASSWORDdi.env(default:admin@careerai.local/admin12345— wajib diganti untuk produksi). - Setiap email yang terdaftar pada
ADMIN_EMAILS(dipisah koma) otomatis mendapat roleadminsaat registrasi. - Masuk melalui
/login.html; roleadminakan melihat Panel Administrator (statistik seluruh pengguna, daftar pengguna, daftar semua percakapan, serta aksi hapus).
Pengujian mencakup unit test dan integration test dengan HTTP mock (tidak memotong kuota API Gemini asli Anda):
npm testgeminiService.test.js: Validasi parameter, penanganan HTTP 200, HTTP 400 (kunci salah), HTTP 429 (rate limit habis), AbortController Timeout, dan filter keselamatan konten (Safety Filters).intentClassifier.test.js: Klasifikasi pola teks untuk 7 intensi (career_advice,cv_review,skill_gap,learning_roadmap,mock_interview,general_question,out_of_scope).conversationModel.test.js: Persistensi pesan, isolasi SQLite, dan pembatasan context window (bounded history).chatApi.test.js: Validasi HTTP input (pesan kosong, pesan > 4000 karakter), pencegahan kebocoran secret pada konfigurasi publik, dan endpoint CRUD.
Parameter AI dapat disesuaikan langsung melalui antarmuka pengguna (Modal Konfigurasi AI) atau via .env:
| Preset | Temperature | Top-P | Rekomendasi Use Case |
|---|---|---|---|
| Accurate | 0.2 |
0.80 |
Analisis CV, ekstraksi gap kompetensi, evaluasi format STAR. Menghasilkan jawaban deterministik dan konsisten. |
| Balanced | 0.7 |
0.90 |
Tanya jawab konsultasi umum karier, panduan wawancara interaktif. |
| Creative | 1.0 |
0.95 |
Brainstorming ide proyek portofolio, alternatif transisi karier lintas bidang. |
Catatan Teknis Mengenai Temperature: Parameter temperature mengatur keberagaman distribusi probabilitas pemilihan token (variabilitas respons). Nilai temperature yang lebih tinggi bukan tolok ukur kecerdasan model atau tingkat kebenaran faktual, melainkan tingkat variasi respons.
- Server-Side API Key Only:
GEMINI_API_KEYhanya dibaca oleh backend Node.js dan tidak pernah dikirim ke frontend browser atau disimpan pada log. - Safe Markdown Rendering: Respons AI dirender menggunakan
Marked.jsyang disanitasi ketat olehDOMPurifyuntuk mencegah serangan Cross-Site Scripting (XSS). - Rate Limiting: Endpoint API dilindungi oleh middleware
express-rate-limit(100 request per 15 menit per IP). - Input Bounding: Input pesan dibatasi maksimal 4.000 karakter untuk mencegah eksploitasi token injection dan payload berlebih.
- Sanitized Error Logs: Middleware error secara otomatis menyaring dan menyamarkan (redact) string yang menyerupai API key dari keluaran konsol maupun respon HTTP.
| Masalah | Kemungkinan Penyebab | Solusi |
|---|---|---|
| "GEMINI_API_KEY is not configured" | File .env belum memiliki API key atau masih berisi placeholder. |
Buka .env, pastikan GEMINI_API_KEY=AIzaSy... terisi kunci yang valid dari Google AI Studio, lalu restart server. |
| "Gemini API rate limit exceeded (429)" | Kuota per menit untuk tier gratis Gemini tercapai. | Tunggu 30–60 detik sebelum mengirim prompt berikutnya, atau gunakan model gemini-1.5-flash yang memiliki batas RPM lebih tinggi. |
| "The requested Gemini model was not found (404)" | Nama model di .env sudah usang atau salah ketik. |
Gunakan salah satu model yang didukung: gemini-flash-lite-latest, gemini-flash-latest, gemini-3.8-flash, atau gemini-2.5-pro. |
| "Request timed out" | Koneksi internet lambat atau endpoint Google mengalami latensi tinggi. | Periksa koneksi internet Anda atau tingkatkan nilai REQUEST_TIMEOUT_MS di file .env. |
| Port 3000 sudah digunakan | Aplikasi lain sedang berjalan pada port 3000. | Ubah PORT=3001 atau port lain pada file .env. |
Proyek ini dilisensikan di bawah MIT License — lihat file LICENSE untuk detailnya.