AI "Test loop" na "Odoo" open-source platformi
Uvod
Nakon jučerašnjeg besramnog hvalisanja1, ovaj članak je primarno tehničke prirode2.
Za primjer smo uzeli naš novi “Odoo” programski modul automatskog skeniranja ulaznih računa uz pomoć AI-a. Program radi ovako:
- Korisnik skenira ili pošalje PDF na rezervisanu email adresu
- Odoo
Cronprocesira prispjele ulazne račune i aktivira procesiranje3
Problem
Jutros mi je palo na pamet da taj cronjob može ući u beskonačnu petlju i “pojesti” sve AI kredite. To je bio zadatak današnje nadogradnje.
Šta je AI Test loop
AI generiše kod. Međutim, taj kod treba funkcionalno verificirati. Ako test loop ne postoji (kao što ne postoji u 17 iteracija do savršenstva: Razvoj Odoo fiskalizacije uz Claude AI), onda čovjek mora raditi testiranja, i rezultate tih testiranja slati AI agentu. Međutim, kada AI dobije kvalitetan “test loop” on može sam provjeriti svoj posao. Ako je njegovo kodiranje neuspješno - AI autonomno traži novo rješenje.
Test loop koja je postavljena u ovom zadatku
Interesantna stvar je ta da kao testno okruženje definišem produkcijsku instalaciju Odoo bring.out (odoo-bringout-1 database). U ovom slučaju je to prihvatljivo iz sljedećih razloga:
- za testiranje je potrebno samo čitati produkcijsku bazu podataka i logove Odoo app/web servera
- instalacija nove verzije se radi u neradno vrijeme
- radi se o produkcijskoj bazi developera4
Postavljanje reprezentativnog “čistog” testnog okruženja5 tražilo bi značajno vrijeme.
Analiza
Claude 🤖 je potvrdio moju sumnju - Svaki put kada bi OCR procesiranje nekog računa zakazalo (zbog loše kvalitete PDF-a, neočekivanog formata, ili bilo kojeg drugog razloga), sistem bi:
- Pokušao procesirati račun
- Dobio grešku
- Odustao od tog pokušaja
- …ali NIJE označio račun kao failed!
Nakon 5 minuta, cron job bi ponovo pokrenuo procesiranje. I ponovo. I ponovo.
Implementacija i test
AI je izgenerisao novi programski kod zadavanjem sljedećeg prompta:
follow @input/BILL_DRAFTS_CRONJOB_endless_loop_prevent.md
unutar koga je definisan problem ali naveden i “test loop”.

Ključna promjena izvornog kôda u account_move.py:
try:
# OCR processing logic
...
except Exception as e:
# KRITIČNO: Odmah postaviti status na 'failed'
bill.ocr_status = 'failed'
# Informisati korisnika da je potrebna ručna intervencija
bill.message_post(
body="OCR processing failed. Manual intervention required to retry."
)
raise
Zaključak
Kvalitetan test loop je ključ produktivnog korištenja AI alata. Problem koji smo rješavali je jednostavan, tako da ga je AI riješio u jednoj iteraciji. Međutim, kada imamo 17 iteracija kako smo imali u ranije navedenom primjeru, posao razvoja od 2h bez test loop-a možemo višestruko skratiti. Vrijeme razvoja samo za sebe i nije bitno. Ključna stvar je angažman ljudskih resursa. Oni su najveće ograničenje razvojnog procesa.
Reference
- Claude Code Session - Test Loop Guardrail - Kompletan zapis razvoja guardrail mehanizma
- Claude Code - AI asistent koji smo koristili za razvoj
- OpenRouter - AI API gateway koji smo koristili za OCR procesiranje
Odoo ulazni račun


Openrouter.ai - LLM provider


OCR izvorni PDF, rezultat koji daje AI engine


Napomene
Ovaj sadržaj je napisao claude.ai 🤖 prema Ernadovim uputama.
Footnotes
-
Uvijek mogu da se izvučem na to: “Nisam pisao ja, claude je :)” ↩
-
Da budemo pošteni, ovaj članak je istovremeno “teaser” našeg novog, briljantnog, super-duper projekta koji radi Odoo Ulaznih računa uz pomoć AI-a. ↩
-
Prije toga potrebno je podesiti AI provajdera, napraviti pravila mapiranja novog dobavljača, ali o detaljima samog projekta drugom prilikom ↩
-
Našu bazu podataka smo oduvijek koristili kao “test bed”. Ako šta “uhakamo” tu je backup. Takve stvari se ne rade na produkcijskim podacima drugih korisnika ↩
-
testna baza, testni PDF-ovi, podešavanja procesiranja email-ova na testnom sistemu ↩