Panduan & Arsitektur AI Assistant Control
🎛️ PANDUAN TEKNIS & ARSITEKTUR MASTER KILL-SWITCH AI ASSISTANT CONTROL
Proteksi Kuota Serverless Vercel, Sinkronisasi Multi-Device & Tata Kelola AI Terpadu#
[!IMPORTANT] KLASIFIKASI DOKUMEN: TEKNIKAL INTERNAL / PRIVAT SUPER ADMIN & DIREKSI Dokumen ini menjelaskan mekanisme arsitektur saklar terpusat (Global Kill-Switch) pada modul AI Assistant Control ERP BUMDes. Sistem ini dirancang untuk mencegah kebocoran kuota komputasi serverless Vercel dan konsumsi token Google Gemini secara instan dan menyeluruh.
1. Latar Belakang & Filosofi Tata Kelola AI#
Sebelum audit Oktober 2026, tombol AI Assistant Control pada menu Preferensi Sistem hanya berfungsi sebagai pengubah nilai lokal di peramban (localStorage). Kondisi tersebut menimbulkan masalah besar:
- Kebocoran Kuota Serverless: Server Component (SSR) pada laporan keuangan Neraca, Laba Rugi, dan Arus Kas tetap memanggil Google Gemini di setiap kunjungan halaman meskipun tombol berstatus
NON-AKTIF. - Desinkronisasi Antar Perangkat: Penonaktifan AI oleh Super Admin di komputer kantor tidak berpengaruh ke komputer unit usaha, tablet kasir POS, atau sesi peramban lain.
- Ketiadaan Audit Trail: Mutasi status AI tidak terekam pada basis data audit sistem.
Melalui restrukturisasi Grand Standard v2026.2, AI Assistant Control ditingkatkan statusnya menjadi Master Kill-Switch Ekosistem. Ketika dinonaktifkan, seluruh jalur eksternal ke Google Generative AI diputus seketika pada level kode inti dengan latensi nol milidetik.
2. Diagram Arsitektur Terpadu (Data & Control Flow)#
Memuat diagram alur...
3. Single Source of Truth & Persistensi Supabase#
Pusat kendali status AI disimpan secara persisten di tabel public_content Supabase dengan slug = 'site.preferences':
json{ "language": "id", "timezone": "GMT+8", "isAIEnabled": false, "default_map_lat": 0.6185038605613407, "default_map_lng": 123.06575026105962 }
Server Action Terpusat: lib/actions/ai-control.ts
Fungsi-fungsi inti yang mengontrol status AI:
isSystemAIEnabled(): Promise<boolean>Membaca status AI menggunakan mekanismeunstable_cacheNext.js dengan masa berlaku (TTL) 30 detik atau direvalidasi seketika menggunakan tagai_system_control. Fungsi ini sangat ringan dan aman dipanggil ratusan kali oleh Server Actions, Server Components, maupun API Routes.updateAISystemStatus(enabled: boolean)Memvalidasi hak akses pengguna (super_admin,admin_keuangan, ataudirektur), memperbarui kolomisAIEnabledpada konten preferensi situs, mencatat entri riwayat padaaudit_logs, dan merevalidasi seluruh jalur halaman terkait (revalidatePath('/')).
4. Mekanisme Hard Kill-Switch di Core Engine#
Sebelum ada panggilan fungsi yang menghubungi jaringan eksternal Google Generative AI, gerbang utama pada lib/ai/gemini-client.ts melakukan intersepsi:
typescriptexport async function generateAIContent(prompt: string | any[], options: AIOptions = {}) { // 0. Hard Kill-Switch Check try { const { isSystemAIEnabled } = await import('@/lib/actions/ai-control') const isAIActive = await isSystemAIEnabled() if (!isAIActive) { console.info('[AI Kill-Switch Active] Panggilan Gemini dibatalkan karena AI Assistant non-aktif.') if (options.useJson) { return { disabled: true, ai_disabled: true, holdingHealthScore: 85, holdingSolvencyStatus: 'STABLE', riskAlerts: ['Fitur AI Assistant sedang dinonaktifkan oleh administrator sistem.'], crossUnitSynergyRecommendations: [], workingCapitalAdvice: 'Sistem beroperasi normal dalam mode standar tanpa rekomendasi AI.', title: "Fitur AI Dinonaktifkan", narrative: "Asisten analitik AI sedang dinonaktifkan oleh Administrator Sistem.", sentiment: "neutral" } } return "Fitur AI Assistant saat ini sedang dinonaktifkan oleh Administrator BUMDes melalui Pengaturan Sistem." } } catch (checkErr) { console.warn('Gagal memeriksa status AI Kill-Switch, melanjutkan secara hati-hati:', checkErr) } // Eksekusi pemanggilan Gemini API jika AI aktif... }
5. Optimasi SSR & Eliminasi Pembengkakan Kuota Vercel#
A. Bypass Laporan Keuangan (lib/actions/ai_finance_narrative.ts)
Setiap kali laporan keuangan Neraca, Laba Rugi, atau Arus Kas dibuka, fungsi narasi AI memeriksa status saklar terlebih dahulu. Jika isSystemAIEnabled() bernilai false, sistem langsung mengembalikan narasi berbasis aturan (rule-based fallback) standar SAK EP:
- Keuntungan Waktu Render: Menghilangkan penundaan 3–5 detik pemanggilan AI pada proses Server-Side Rendering (SSR).
- Keuntungan Kuota Vercel: Mencegah eksekusi serverless function duration yang sebelumnya menghabiskan puluhan gigabyte-jam kuota bulanan.
B. Bypass Halaman AI Analytics (app/dashboard/ai-analytics/page.tsx)
Jika AI berstatus NON-AKTIF, SSR pada rute /dashboard/ai-analytics secara otomatis melewati 8 query analitik berat ke tabel inventori, peternakan, performa unit, dan tren finansial, sehingga halaman termuat dalam waktu kurang dari 15 milidetik.
6. Protokol Sinkronisasi Multi-Device & Server Hydration#
- Hydration Bersih di
app/dashboard/layout.tsx: Layout membacaisSystemAIEnabled()langsung di server dan meneruskannya ke<AIConfigProvider initialEnabled={isAIEnabled}>. - Kesesuaian di Sisi Klien (
AIConfigProvider.tsx): Provider mendengarkan perubahan prop dari server dan menyelaraskanlocalStorageperamban. Jika terjadi perubahan di satu perangkat, perangkat lain akan menerima nilai terkini saat memuat ulang halaman. - Penyelamatan Kegagalan Jaringan (Rollback Guard): Jika pengguna mengklik toggle tetapi terjadi kendala koneksi atau ditolak oleh izin RBAC, antarmuka akan membatalkan perubahan secara otomatis (optimistic rollback) dan menampilkan peringatan galat.
7. Tata Kelola Akses (RBAC) & Audit Trail#
A. Hak Akses Saklar
| Peran (Role) | Hak Mengubah Saklar AI | Tindakan yang Diizinkan |
|---|---|---|
| Super Admin | ✅ Penuh | Mengaktifkan / Menonaktifkan kapan saja |
| Direktur Utama | ✅ Penuh | Mengaktifkan / Menonaktifkan kapan saja |
| Admin Keuangan | ✅ Penuh | Mengaktifkan / Menonaktifkan demi efisiensi biaya |
| Manajer Unit / Staf / Kasir | ❌ Ditolak | Hanya mengikuti status yang ditetapkan pusat |
B. Format Rekaman audit_logs
Setiap mutasi status saklar dicatat secara permanen:
actor_id: ID Pengguna yang melakukan perubahan.action:'UPDATE_AI_CONTROL'.module:'SYSTEM_SETTINGS'.details:
json{ "isAIEnabled": false, "action_description": "Menonaktifkan seluruh modul AI (Kill-Switch)", "actor_name": "Ansor (Super Admin)", "actor_role": "super_admin", "timestamp": "2026-10-21T00:55:00.000Z" }
8. Matriks Cakupan 12 Modul AI Terkoneksi#
| No | Modul AI | Lokasi Komponen | Perilaku Saat NON-AKTIF |
|---|---|---|---|
| 1 | Global AI Copilot | GlobalAICopilot.tsx | Ikon melayang disembunyikan sepenuhnya dari layar |
| 2 | Executive Strategic Advisor | ExecutiveStrategicAdvisor.tsx | Kartu analitik holding disembunyikan dari Dashboard Utama |
| 3 | AI Unit Advisor (POS & Sapi) | AIUnitAdvisor.tsx | Widget prediksi stok dan tren penjualan disembunyikan |
| 4 | AI Analytics Hub | AIAnalyticsClient.tsx | Menampilkan layar status non-aktif; SSR melewati query |
| 5 | Narasi Neraca Keuangan | neraca/page.tsx | Otomatis menggunakan narasi standar SAK EP tanpa AI |
| 6 | Narasi Laba Rugi | laba-rugi/page.tsx | Otomatis menggunakan kalkulasi margin standar SAK EP |
| 7 | Narasi Arus Kas | arus-kas/page.tsx | Otomatis menggunakan narasi likuiditas standar SAK EP |
| 8 | Doc AI Chatbot (Panduan) | DocAiChatbot.tsx | Komponen tidak dirender pada halaman dokumen panduan |
| 9 | SOP Copilot Modal | SopCopilotModal.tsx | Mengunci input chat dan memberi pesan penonaktifan ramah |
| 10 | CaLK Copilot Drawer | CalkCopilotDrawer.tsx | Menampilkan banner peringatan dan menonaktifkan tombol |
| 11 | Peternakan AI Advisor | LivestockAIIntelligence.tsx | Melewati pemanggilan AI analitik kandang |
| 12 | Ketapang Agro Yield AI | KetapangAIAssistant.tsx | Mengunci prediksi panen dan menampilkan status non-aktif |
9. Panduan Pengembang (Developer Checklist Modul AI Baru)#
Setiap pengembang yang menambahkan fitur AI baru di ekosistem ERP BUMDes wajib mematuhi checklist kepatuhan berikut:
- Client Component:
Gunakan hook
useAIConfig()dari@/components/providers/AIConfigProvider:
tsxconst { isAIEnabled } = useAIConfig() if (!isAIEnabled) return null // atau tampilkan banner fallback
- Server Action: Sebelum memanggil model atau fungsi eksternal, validasi status saklar:
typescriptimport { isSystemAIEnabled } from '@/lib/actions/ai-control' if (!(await isSystemAIEnabled())) { return { success: false, message: 'AI sedang dinonaktifkan.' } }
- Panggilan Inti:
Selalu gunakan pembungkus resmi
generateAIContentdari@/lib/ai/gemini-clientyang telah dilengkapi proteksi hard kill-switch otomatis. Jangan pernah menginisialisasi pustaka@google/generative-aisecara mandiri di luar modul inti.
Disahkan oleh Tim Arsitektur Sistem ERP BUMDes Mandiri Bolulango.