v1.0.0-009 : Konsolidasi Aturan Tetap (Core Rules) Kodebase
Mendokumentasikan seluruh aturan dan perilaku yang harus terus dipertahankan dalam arsitektur OCR dan NLP agar tidak terhapus pada update selanjutnya.
Dokumen ini berisi kompilasi aturan-aturan esensial yang sudah ada di kodebase dan harus terus dipatuhi oleh seluruh agent dalam pengembangan lanjutan:
- Dua Tahapan Pemrosesan: Sistem terdiri dari dua tahap independen yang tidak boleh digabung.
- Tahap 1: Ekstraksi gambar menjadi teks kasar (raw OCR).
- Tahap 2: Transformasi (NLP Parsing) teks kasar menjadi JSON menggunakan
parseTransaction.
- Fallback Mechanism OCR (Tiered):
- Level 1: (Kini dinonaktifkan) Local OCR
Xenova/trocr-small-printeddi browser. - Level 2: AI Vision Server (Backend Sajen -> MCP
ocrTool.ts). - Eksekusi AI pada
ocrTool.tsmendahulukan Gemini Vision API dan akan fallback otomatis ke Ollama (LLaVA) lokal via ngrok jika Gemini gagal.
- Level 1: (Kini dinonaktifkan) Local OCR
- Pemisahan Peran Agent NLP:
- Fungsi NLP (Natural Language Processing) untuk merubah string ke JSON hanya boleh ditangani oleh prompt panjang dalam
parseTransaction. OCR Vision dilarang keras mencoba membuat JSON berstruktur rumit, tugasnya hanya memindahkan tulisan dari gambar ke teks (transkripsi).
- Fungsi NLP (Natural Language Processing) untuk merubah string ke JSON hanya boleh ditangani oleh prompt panjang dalam
- Dilarang Mengarang Barang (Dummy): Jika input pengguna berupa ringkasan (“omset hari ini 5 juta”), field
"items"harus berupa array kosong[]. - Kalkulator Otomatis: Jika pengguna tidak menyertakan grand total, sistem WAJIB menghitung sendiri (jumlahkan
qty * unit_price). Tidak boleh ada grand total = 0. - Pembacaan “=” dan “@”:
@mengartikan harga satuan (unit price).=mengartikan harga total (subtotal per item).
- Jatuh Tempo (Tempo / Hutang): Deteksi otomatis metode pembayaran. Jika tertulis jatuh tempo, maka
payment_method: "tempo"dandue_datewajib diekstrak dalam format ISO 8601 (YYYY-MM-DD).
- Hindari Anchor Spesifik: Dalam menyusun system instruction dan negative prompt, jangan menyisipkan contoh kasus yang terlalu spesifik (misal nama vendor seperti “INDOMARCO”) sebagai sesuatu yang dilarang. Hal ini menyebabkan fenomena Prompt Bleed di mana model LLM malah menganggap kata tersebut sebagai kata kunci penting dan berhalusinasi mengeluarkannya.
Aturan-aturan ini terikat ke dalam file useOcrUpload.ts (Blonjo), ocr_worker.py (Sajen), ocrTool.ts (MCP-Server), dan transactionParser.ts (MCP-Server). Jangan ubah struktur alur di atas kecuali disetujui.