AI Local Error Assistant (llama.cpp)
by okkype@gmail.com https://linkedin.com/in/okky-permana-sihipo$ 30.00
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Lines of code | 1081 |
| Technical Name |
ai_error_llama |
| License | OPL-1 |
| Website | https://linkedin.com/in/okky-permana-sihipo |
| Versions | 18.0 19.0 |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Lines of code | 1081 |
| Technical Name |
ai_error_llama |
| License | OPL-1 |
| Website | https://linkedin.com/in/okky-permana-sihipo |
| Versions | 18.0 19.0 |
Buku Panduan Teknis: AI Error Assistant
Kupas tuntas arsitektur, kode, dan logika di balik asisten error lokal offline berbasis GGUF Llama untuk mendiagnosis, mengklasifikasi, dan memperbaiki bug Odoo secara otomatis.
Materi Terstruktur
Disusun layaknya bab-bab buku pembelajaran untuk memudahkan pemahaman alur kerja parser backend, scanner file, compiler AST, dan penggantian proses OS.
Analisis Exception
Mempelajari cara asisten memilah traceback mentah Odoo dan melakukan routing tindakan perbaikan yang sesuai untuk setiap jenis error.
Hot Reloading
Membedah logika restarter mandiri yang memicu penggantian proses server (OS process replacement) agar perubahan kode yang ditulis AI langsung dimuat.
ð¬ Hubungi Kami & Layanan Training
Hubungi kami untuk informasi atau menjadwalkan training
Bab 01 Sistem Diagnosis Backend (Traceback API)
AI Error Assistant mengintegrasikan frontend Odoo dengan API backend menggunakan route HTTP JSON controller. Ketika error dialog di-extend, backend menerima data traceback lengkap, memformat prompt terstruktur, dan mengirimkannya ke LLM untuk dipilah.
def _classify_error_with_ai(self, traceback_str, error_message, error_name): # Menginstruksikan LLM menghasilkan klasifikasi error berformat JSON murni prompt = f"""Analyze this Odoo error and provide a structured classification. Error Name: {error_name} Error Message: {error_message} Traceback: {traceback_str} Return ONLY a JSON object with this exact structure (no markdown): {{ "error_type": "ValueError|ValidationError|IntegrityError|MissingError|...", "category": "xml_file|python_file|database|...", "file_path": "/absolute/path/to/file.ext or null", "line_number": 123 or null }} """ ai_response = self._call_ai_api(prompt) # Parsing JSON secara aman dengan mencari kurung kurawal pembuka/penutup
Bab 02 Klasifikasi & Strategi Resolusi Error
Setiap exception ditangani dengan skema khusus untuk memastikan database tetap aman dan instruksi LLM terfokus:
| Jenis Exception | Metode Resolusi AI Fix | Penjelasan Teknis |
|---|---|---|
| ValueError | Memilah field yang salah dan memperbaikinya via XML parser/Python fallback. | Mencegah kegagalan parsing views. |
| ValidationError | Menulis script ORM / query perbaikan untuk membersihkan data ilegal. | Mengatasi pelanggaran @api.constrains. |
| IntegrityError | Melakukan eksekusi pembersihan database terisolasi untuk data yatim piatu. | Mengembalikan integritas foreign key. |
| AccessError | Menyarankan penulisan rule akses di ir.model.access.csv secara tertulis. |
Memerlukan review manual agar hak akses aman. |
| ImportError | Menyediakan CLI command pip install untuk pustaka yang kurang. |
Mencegah kegagalan boot modul. |
Bab 03 Algoritma Pencarian Berkas ORM secara Dinamis
Jika error terjadi pada level model ORM database, asisten tidak memodifikasi database langsung, melainkan mencari file sumber model python di dalam folder addon yang di-whitelist. Pencarian didasarkan pada scanning teks regex untuk mendeteksi `_name` atau `_inherit` dari model tersebut:
def _find_model_file(self, model_name, custom_addon_paths): # Mencari file model Python yang mendefinisikan model terkait matches = [] for addon_path in custom_addon_paths: for root, dirs, files in os.walk(addon_path): for file in files: if file.endswith(".py"): file_path = os.path.join(root, file) with open(file_path, encoding="utf-8") as f: content = f.read() # Mencari kecocokan _name atau _inherit match_name = re.search(rf"_name\s*=\s*['\"]{re.escape(model_name)}['\"]", content) match_inherit = re.search(rf"_inherit\s*=\s*['\"]{re.escape(model_name)}['\"]", content) if match_name or match_inherit: matches.append({"file_path": file_path, "score": 100 if match_inherit else 50}) return matches[0]["file_path"] if matches else None
Bab 04 Pengaplikasian Patch Diff & Compiler Check
Sebelum menyimpan modifikasi kode ke dalam file disk, modul memastikan keamanan sintaksis kode tersebut. Sintaks Python di-compile secara virtual menggunakan AST parser Python. Jika sintaks valid, salinan file asli di-backup, patch diff dihitung menggunakan difflib.unified_diff, dan file baru ditulis ke disk.
# Cek validitas kompilasi Python sebelum menulis berkas fisik if file_ext == ".py": try: ast.parse(fixed_code) except SyntaxError as e: return {"error": f"AI generated invalid Python code: {e}"} # Membuat unified diff patch diff = difflib.unified_diff( code_content.splitlines(keepends=True), fixed_code.splitlines(keepends=True), fromfile=f"{file_path} (before)", tofile=f"{file_path} (after)" )
Bab 05 Rekayasa Restart Server (OS Process Replacement)
Restart server secara mulus dari UI browser membutuhkan penutupan proses Odoo yang sedang berjalan secara aman, kemudian melakukan start ulang. Asisten melakukan ini dengan memicu subprocess independen yang menunggu parent process PID mati sebelum meluncurkan kembali server menggunakan `os.execv`:
restarter_code = """
import time
import os
import sys
pid = int(sys.argv[1])
cmd = sys.argv[2:]
# Loop sampai parent PID benar-benar tidak terdeteksi aktif
try:
while True:
os.kill(pid, 0)
time.sleep(0.1)
except OSError:
pass
# Meluncurkan proses python baru menggantikan proses restarter ini
os.execv(sys.executable, [sys.executable] + cmd)
"""
Bab 06 Automated Testing & Sandbox Mocking
Pengujian unit test dilakukan secara terisolasi tanpa memakan resource GPU/CPU berat menggunakan mocking (penyamaran API):
conda run -n odoo-18 python odoo-bin -c odoo-apps.conf -d odoo_18ce_apps --test-enable --test-tags=ai_error_llama --stop-after-init
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module