---
title: "Snipeflip: tragač za povoljnim ponudama u kojem AI na kraju radi manje nego prvog dana"
date: 2026-08-06
author: "Damjan Savić"
canonical: https://damjan-savic.com/sr/znanje/ai-deal-finder
language: sr
keywords: "AI agenti, Claude Code, Automatizacija, Web scraping, Telegram"
video: https://www.youtube.com/watch?v=dqrlof_o0H0
---
# Snipeflip: tragač za povoljnim ponudama u kojem AI na kraju radi manje nego prvog dana

**Ukratko** — Agent za pretragu koji na svakih petnaest minuta dovlači oglase, provlači ih kroz četiri stepena filtera i javlja na Telegram sa ocenom od 0 do 100. AI sedi u sredini i radi manje nego prvog dana — ispred njega stoje deterministička pravila kojima nikakav model nije potreban.

---

Kažem mu tačno šta tražim. On pretražuje Kleinanzeigen, pročita svaki oglas koji se vrati i svakom da ocenu od 0 do 100. Ja gledam one preko 70.

Evo jednog: 45 evra za uređaj koji se inače prodaje za 80 do 100. Grafički kalkulator TI-Nspire CX II-T CAS. Nov je oko 170 evra, polovan oko 105.

To je dosadan predmet. I jedan je od najboljih mogućih predmeta za lov, iz razloga koji nema veze sa kalkulatorima: **niko ko takav kupuje nije ga sam izabrao.** Škole i fakulteti propisuju tačan model. Ako tvoj kurs traži tu mašinu, jeftiniji uređaj koji radi istu matematiku nije opcija.

Dakle svake godine postoje ljudi kojima tačno određena stvar treba u tačno određenom trenutku — i ljudi koji su upravo završili i tu istu stvar imaju u fioci.

## Šta pokazujem

Problem sa oglasnicima za polovne stvari nije to što nema dobrih ponuda. Problem je što dobre ponude traju oko dvadeset minuta. Imaš tri mogućnosti: osvežavati ručno, što ti pojede dan; prihvatiti da ćeš propustiti većinu; ili napisati nešto što gleda umesto tebe.

Napisao sam ovo treće, i uz to ide jasan govor: ovo je **jedna** platforma, sa niskom učestalošću, za **jednog** korisnika, mene.

Ono što pokazujem jeste arhitektura — kako radi raspoređivanje, kako radi filtriranje, kako radi ocenjivanje i kako rezultat stiže na moj telefon. Ono što ne pokazujem jeste kako se bilo šta zaobilazi. Taj deo ostaje van videa i van pisanog vodiča.

Ako praviš ovako nešto: **prvo pročitaj uslove korišćenja onoga na šta ga usmeravaš.** Svuda su različiti, a neki su znatno stroži od ovih.

## Faza 1 · Server

PostgreSQL, Node, upravljač procesima, nginx. Claude Code postavlja, ja gledam — u ovom slučaju u auto režimu, da ne stiže potvrda na svakom koraku.

Ocenjivanje poziva `api.deepseek.com` umesto Claude ključa. To je odluka o troškovima, ne ocena kvaliteta, i ima posledice kasnije — vidi grešku tri.

Jedna prepreka je stigla odmah: izabrani domen se [još razrešavao na Vercel](/sr/znanje/vercel-to-root-server), a certbot ne može da izda sertifikat dok A zapisi ne pokazuju na server. Dakle prvo prebaciti DNS, `www` kao CNAME na osnovni domen, sačekati propagaciju, pa sertifikat.

### Raspored procesa

To je deo na koji hoću da ukažem. **Tri odvojena procesa:**

| Proces | Port | Ograničenje memorije |
| --- | --- | --- |
| WebSocket server | 3002 | 200 MB |
| Web aplikacija | 3003 | 500 MB |
| Scraper radnik | — | 1 GB |

Nisu jedan proces, i **redosled pokretanja je bitan**: WebSocket mora da bude gore pre nego što scraper pokuša da se poveže. U mojoj sopstvenoj konfiguraciji stoji tačno ta rečenica velikim slovima, jer sam pogrešio dovoljno puta da je zapišem.

Scraper dobija najviše memorije jer drži isparsirani HTML dok obrađuje seriju.

## Faza 2 · Lov

To je deo koji ljudi pogrešno rade, i nema veze sa veštačkom inteligencijom. Ciljni proizvod nije pojam za pretragu, nego četiri stvari:

1. **Ime.** `TI-Nspire CX II-T CAS`. Ne „kalkulator", ne „grafički kalkulator". Tačan model, jer je tačan model ono što je propisano.
2. **Obavezne reči.** Reči koje moraju da se pojave, inače to nije ta stvar.
3. **Isključene reči.** Ono što je važno.
4. **Radijus.** Koliko sam spreman da vozim.

O isključenjima: ko na oglasniku traži kalkulator, dobija uglavnom futrole, torbice, rezervne delove i uređaje prodate kao neispravne. To nisu bliski promašaji, to je druga kategorija proizvoda koja slučajno deli ime. Zato su na listi isključenja stajale reči `Tasche` (torbica), `Hülle` (futrola), `defekt`.

### Greška sa Tasche

I time sam upao u grešku koja me je najviše koštala vremena.

Nemačka reč za taj uređaj je **Taschenrechner** — doslovno „džepni računar". Na listi isključenja stajalo je **Tasche**. Poređenje po podnizu sa sopstvenom listom isključenja time je tiho odbacilo **svaki pojedinačni oglas za tačno onaj proizvod koji sam lovio.** Filter napravljen da ukloni dodatke uklanjao je samu stvar.

Ispravka je poređenje po granicama reči umesto po podnizu. Iznad te funkcije u mom repozitorijumu stoji komentar sa tačno te dve reči, jer to nikada više ne želim da debagujem.

Uopšteni oblik: **nemački gradi složenice onako kako drugi jezici grade rečenice.** Ko nemački tekst filtrira po podnizu, pre ili kasnije obriše sopstveni proizvod.

## Faza 3 · Prikupljanje

Na svakih petnaest minuta, najviše pet linkova pretrage paralelno.

Prva stvar u poslu je **mutex** — jedan boolean i vremenska oznaka. Ako prethodni prolaz još radi, ovaj zapiše koliko stari već traje i izađe. Ne staje u red, ne radi uporedo, preskače.

To zvuči očigledno. Zapisano, nije bilo očigledno u tri ujutru kada su dva preklopljena posla upisivala iste oglase, a logovi više nisu imali nikakvog smisla.

Zatim **uklanjanje duplikata**, i to je namerno grupna operacija. Svaki oglas ima spoljni identifikator. Pre nego što se bilo šta drugo desi, posao u **jednom** upitu povuče sve identifikatore koje već zna, kod postojećih obnovi vreme poslednjeg viđenja i zadrži samo ono što je stvarno novo.

Razlog je dosadan i važan: 50 rezultata po linku pretrage, puta pet linkova, puta 96 prolaza dnevno. Ko ih proverava jedan po jedan, napravio je uskraćivanje usluge protiv sopstvene baze.

Samo novo ide dalje na scraper detalja: **tri istovremeno, 500 milisekundi između serija, ograničenje od 30 sekundi.** Ta tri broja su cela etika ove stvari. To je budžet, ne trka.

## Faza 4 · Lanac filtera

Tu sam očekivao da model radi posao. Ne radi ga.

**Prvi stepen je deterministički.** Bez modela, bez API poziva, bez troška. Isključene reči po granicama reči, obrasci za dodatke (jer „futrola za X" nije X), obavezne reči strogo, i provera jezika. Većina onoga što uđe, umire ovde.

U tom fajlu stoji komentar koji sam napisao sebi: ova funkcija je glavni filter i mora da bude stroga, jer **posle nje više ne dolazi nikakva AI provera**.

To „više" je cela priča. Počeo sam sa jezičkim modelom koji je ocenjivao svaki pojedinačni oglas. Zatim sam prešao na jeftiniji model, jer je količina učinila račun neprijatnim. Zatim sam dodao analizu slika, da bi stanje moglo da se proceni sa fotografija. I to sam dvaput isključio.

**Drugi stepen je mesto gde model i dalje zaslužuje svoje mesto.** Sve što preživi prvi stepen dobija strukturisanu procenu: stanje, kompletnost — kod kalkulatora to znači kabl, futrola, uputstvo — da li cena odgovara onome što je opisano, i signali o prodavcu sa stranice sa detaljima. Izlazi ocena od 0 do 100 **sa priloženim obrazloženjem**.

**Treći stepen je referentna cena.** Dvaput dnevno, u 08:00 i u 18:00, poseban posao ponovo izračuna prosečnu cenu po proizvodu iz onoga što je stvarno video. „Povoljno" time znači povoljno u odnosu na ovo tržište ovog meseca, a ne u odnosu na broj koji sam jednom ukucao.

**Četvrti stepen je prag.** Od 50 naviše ide obaveštenje, sve ispod pada u feed i čeka. Od 80 naviše zaista ustajem sa stolice.

![Dijagram · Četiri stepena lanca filtera i šta svaki od njih košta](/media/website/article/figures/ai-deal-finder-filters.avif)

## Faza 5 · Obaveštenje

Dva kanala: Telegram, jer ga zaista čitam, i Web Push za pregledač.

Obaveštenje nosi ocenu, cenu, udaljenost **i obrazloženje koje je model dao** — ne samo link. Ako moram da otvorim aplikaciju da bih odlučio da li da otvorim aplikaciju, cela stvar je propala.

Kontrolna tabla se osvežava preko WebSocket-a: novi oglas stigne, ocena se zakači, oznaka se promeni. Bez anketiranja.

I svaki oglas čuva istoriju cene. Ako se ista stvar tri dana kasnije ponovo objavi jeftinije, to se vidi — a to je obično trenutak da se prodavcu piše.

## Za šta služi

Napravio sam ga da preprodajem kalkulatore. Onda je prijatelj hteo Mac. Savetovao sam mu MacBook Pro sa M1 umesto nečeg novijeg, uneli smo ga — ista četiri polja, bez izmena u kodu — i završio je sa primerkom koji je imao originalno pakovanje i sve pripadajuće.

To je tačka na kojoj sam prestao da to zovem alatom za preprodaju. Drugi proizvod, a ne drugi problem. I ta druga upotreba je ona koju branim u javnosti.

## Pet grešaka

**Prva: ocenjivao sam oglase pre nego što sam imao oglase.** Neko vreme je procena radila pre nego što se dovuče stranica sa detaljima. Model je dakle ocenjivao naslov i sličicu, a zatim mi samouvereno pričao o stanju predmeta čiji opis nikada nije video. Ispravka je **jedan** commit: prvo povuci detalje, pa oceni. Ocene su time osetno postale bolje, a u tom poboljšanju nije učestvovao nijedan model.

**Druga: stranica se promenila pod mnom.** U ovom repozitorijumu postoji funkcija čiji je jedini posao da izvuče slike iz oglasa. Ima četiri različita načina za to: prvo strukturirani podaci u elementima galerije, pa CSS pozadinske slike, pa opšta šema proizvoda na stranici, a ako sve troje vrate prazno, onda direktno slikovni tagovi i njihovi atributi za odloženo učitavanje. To nisam projektovao. To se nataložilo. Svaki sloj je jedno jutro kada je nešto što je juče radilo vratilo prazan niz.

**Treća: analiza slika isključena dvaput.** Napravio sam je da bi ocenjivanje moglo da pogleda fotografije i proceni stanje — kod polovnog kalkulatora to su uglavnom ekran i tastatura, pa je delovalo vredno. Onda sam iz razloga troškova promenio provajdera, a novi ne prima slikovni ulaz. Postoje dva commit-a sa nedeljama razmaka, oba isključuju istu stvar. Drugi postoji jer sam zaboravio prvi.

**Četvrta: sudari portova.** Pet commit-a sa istom greškom u sebi. Robusniji PM2 restart. Čišćenje portova u skripti za postavljanje. Logika ponavljanja u WebSocket serveru. Uredno gašenje. Sekvencijalno pokretanje servisa. To nije jedna greška — to je jedna greška koju sam četiri puta loše ispravio pre nego što sam je ispravio kako treba. Prava ispravka bila je prihvatiti da tri procesa traže **definisan redosled pokretanja i vreme do prinudnog gašenja**. Ne pametnu logiku ponavljanja.

**Peta: alat za build — i `.env` u repozitorijumu.** Turbopack, četiri produkcijska build-a sa standalone izlazom, pa isključeno. I `.env` fajl uvučen u repozitorijum. Tu se nema mnogo reći osim da se desilo.

## Tri pravila

**Prvo: prvo deterministički, pa model.** Svaki filter koji možeš da napišeš kao pravilo, napiši kao pravilo. Modelu ostaje ono što pretekne. To je jeftinije, brže i proverljivo — a kada pođe naopako, možeš da pročitaš red koji je to uradio. Regularni izraz nikada nije halucinirao obrazloženje. Rado će ti pojesti celu kategoriju proizvoda, ali će to uraditi na način koji možeš da nađeš.

**Drugo: pretpostavi da će se stranica promeniti.** Ako ti ulaz dolazi sa tuđeg sajta, to nije API i neće te upozoriti. Piši izvlačenje od početka kao lanac rezervnih puteva — i neka prazan rezultat bude glasan. Tiho vraćeni prazni nizovi su najgori mogući način otkaza, jer sve nastavlja da radi, a kvalitet tiho pada. Četiri rezervna nivoa za jednu sliku nisu preterivanje; tako izgleda godina rada.

**Treće: svako automatsko dovlačenje traži budžet.** Ograničenja istovremenosti, pauze između serija, razmak između prolaza i brava da se prolazi ne preklapaju. Ne zato što te neko tera, nego zato što sistem koji ostaje tih nastavlja da radi — a onaj koji juri biva blokiran. I onda nemaš ništa.

Ta tri pravila su razlog zašto veštačka inteligencija u ovom AI projektu na kraju radi manje nego prvog dana. To nije neuspeh modela. To je ono što je posao zaista tražio.

## Zaključak

Krenuo sam da napravim AI alat, a napravio sam sistem za filtriranje u čijoj sredini jezički model radi tačno jedan posao u kojem je stvarno dobar — iza pravila kojima on nije potreban.

I druga polovina: kalkulator koji je nekome trebao dve godine, a od tada ga nije dodirnuo, savršeno je upotrebljiv kalkulator. Neko u septembru počinje taj kurs. Mac star pet godina je i dalje brz računar. Ništa od toga ne mora ponovo da se proizvede; treba da se koristi.

To je problem pretrage. A problemi pretrage su tačno ona vrsta stvari koju možeš da staviš na server i posle zaboraviš.

## Poglavlja snimka

- [0:48 — Zašto je dosadan predmet dobra meta](https://youtu.be/dqrlof_o0H0?t=48)
- [1:36 — Šta pokazujem, a šta ne](https://youtu.be/dqrlof_o0H0?t=96)
- [2:28 — Faza 1: server i raspored procesa](https://youtu.be/dqrlof_o0H0?t=148)
- [5:55 — Faza 2: četiri polja i greška sa rečju Tasche](https://youtu.be/dqrlof_o0H0?t=355)
- [7:29 — Faza 3: mutex, duplikati, budžet](https://youtu.be/dqrlof_o0H0?t=449)
- [8:19 — Faza 4: lanac filtera](https://youtu.be/dqrlof_o0H0?t=499)
- [10:44 — Faza 5: Telegram, Web Push, istorija cena](https://youtu.be/dqrlof_o0H0?t=644)
- [12:23 — Pet grešaka](https://youtu.be/dqrlof_o0H0?t=743)
- [14:47 — Tri pravila](https://youtu.be/dqrlof_o0H0?t=887)

## Česta pitanja

### Šta je bila greška sa rečju Tasche?

Na listi isključenja je stajala reč Tasche, nemački za torbu ili futrolu, da bi maske i futrole otpale. Traženi proizvod se zove Taschenrechner, kalkulator. Poređenje po podnizu je zato tiho bacalo svaki pojedinačni oglas za tačno onaj uređaj koji sam tražio. Ispravka je poređenje na granicama reči. Uopšteno: nemački gradi složenice kao što drugi jezici grade rečenice, pa filtriranje nemačkog teksta po podnizu pre ili kasnije obriše tvoj sopstveni proizvod.

### Zašto model dolazi tek u drugom stepenu?

Zato što je prvi stepen determinističan i tu umre najveći deo ulaza: reči za isključenje na granicama reči, obrasci za pribor, obavezne reči i provera jezika — bez poziva modela i bez troška. Tek ono što to preživi dobija strukturisanu ocenu sa obrazloženjem. Regularni izraz nikada nije halucinirao obrazloženje; rado će ti pojesti celu kategoriju proizvoda, ali na način koji možeš da nađeš.

### Šta znači „budžet" kod automatskog dovlačenja?

Tri istovremena dovlačenja detalja, 500 milisekundi između serija, ograničenje od 30 sekundi, petnaest minuta razmaka između prolaza i brava da se prolazi ne preklapaju. Ne zato što te neko tera, nego zato što sistem koji ostaje tih nastavlja da radi — a onaj koji juri biva blokiran.

---

Snipeflip: tragač za povoljnim ponudama u kojem AI na kraju radi manje nego prvog dana — https://damjan-savic.com/sr/znanje/ai-deal-finder
Sadržaj generisan veštačkom inteligencijom: https://damjan-savic.com/sr/transparentnost-vi
© 2026 Damjan Savić. https://damjan-savic.com
