Il problema
Non serviva un prodotto commerciale, serviva uno strumento per uso familiare: niente account, niente abbonamenti, tutto in locale. L'obiettivo era semplice da enunciare e meno semplice da costruire — digitare il nome di un prodotto una sola volta e vedere il miglior prezzo su quattro piattaforme diverse, ciascuna con la sua struttura, i suoi filtri, i suoi link di affiliazione.
La soluzione tecnica più diretta sarebbe stata uno scraper per ogni sito. Quella più robusta — e quella che ho scelto — è stata delegare la ricerca a un modello con accesso al web in tempo reale.
Architettura a due velocità
Il backend è FastAPI su Python, il frontend una single-page HTML che parla con localhost:8000. Il pezzo interessante è come è divisa la ricerca:
| Task | Come funziona |
|---|---|
| Amazon | Task Gemini 2.0 Flash dedicato e separato (_search_amazon_via_ai), pronto a passare a PA-API v5 ufficiale appena disponibile |
| AliExpress / eBay / Trovaprezzi | Una singola chiamata Gemini 2.0 Flash con Google Search grounding (_search_others_via_gemini) |
| Parallelismo | asyncio.gather lancia i due gruppi in executor separati |
| Persistenza | SQLite locale (bivio.db), auto-creato al primo avvio |
Il dettaglio che mi ha fatto perdere più tempo: Amazon deve restare fuori dal gruppo "altri" anche quando la PA-API ufficiale è disattivata. Ci ho provato, inizialmente, per semplificare il codice — risultato: Gemini restituiva un array vuoto per Amazon ogni volta che veniva impacchettato insieme agli altri tre. Due task separati, due prompt separati, problema risolto.
Il trucco dei link affiliati
Un problema che non mi aspettavo: i link prodotto che Gemini restituisce nella risposta sono spesso inventati — URL plausibili ma che portano a pagine 404 o a prodotti diversi. Google Search grounding aiuta a trovare i risultati giusti, ma non garantisce che il link finale sia reale.
La soluzione è stata smettere di fidarmi dei link generati dal modello e ricostruirli io, lato backend, con una funzione unica (_affiliate_url) che genera URL di ricerca reali con il tracking già incluso:
- Amazon:
amazon.it/s?k={query}&tag=... - AliExpress:
aliexpress.com/wholesale?SearchText={query}&tblci=...(nontracking_id, che sembra corretto ma non lo è) - eBay: query string con
campidemkevtdell'eBay Partner Network - Trovaprezzi: link di ricerca diretto, senza affiliazione attiva
Gemini serve a decidere cosa cercare e a stimare i prezzi indicativi. I link che l'utente clicca davvero sono sempre generati dal mio codice, mai copiati dalla risposta del modello.
Wishlist, alert prezzi e un scheduler silenzioso
Sopra la ricerca gira un secondo livello, pensato per l'uso quotidiano più che per la demo: una wishlist per salvare i prodotti interessanti e un sistema di alert che notifica quando un prezzo scende sotto una soglia impostata. APScheduler controlla tutti gli alert ogni 24 ore in background, più un endpoint manuale (/api/alerts/check) per forzare la verifica quando non si vuole aspettare.
Da casa a ovunque
BIVIO gira interamente in locale — nessun server da pagare, nessun dato che lascia casa. Per usarlo anche fuori casa ho aggiunto un Cloudflare Tunnel: nessuna porta aperta sul router, nessun IP statico da configurare, solo cloudflared tunnel run bivio puntato al dominio.
I problemi reali
Tre ostacoli concreti, di quelli che non si trovano nella documentazione ufficiale.
1. L'antivirus intercettava le chiamate HTTPS. Le richieste a Gemini fallivano con errori SSL intermittenti. Causa: l'antivirus locale faceva TLS inspection sulle connessioni in uscita. Fix (temporaneo, non ideale): patch globale con ssl._create_unverified_context applicata a httpx.
2. La quota Gemini si esaurisce, e in un momento imbarazzante. Per registrare un reel dimostrativo la quota giornaliera era già finita. Soluzione strutturale: due chiavi API in cascata (GEMINI_API_KEY_2 primaria, GEMINI_API_KEY come fallback), e per le demo dal vivo, dati iniettati direttamente dopo la risposta del backend invece di aspettare il reset quota.
3. Amazon PA-API richiede 3 vendite qualificate prima di attivarsi. Le credenziali Associates da sole bastano solo per generare il tag di tracking, non per interrogare l'API ufficiale — serve lo storico vendite. Nel frattempo Amazon passa dallo stesso canale Gemini + grounding degli altri tre marketplace, pronto a passare a PA-API v5 il giorno in cui lo storico lo sblocca.
Il modello AI non sostituisce l'integrazione con le API ufficiali — la anticipa. Il giorno in cui PA-API si sblocca, cambio una funzione e il resto dell'architettura resta identico.
Costo reale
- Hosting: 0 €/mese (gira su un PC di casa)
- Gemini 2.0 Flash: gratuito nel tier free, con doppia chiave di fallback
- Cloudflare Tunnel: gratuito
- SQLite: incluso, zero configurazione
Cosa aggiungerei
PA-API ufficiale Amazon appena maturano le 3 vendite richieste, uno storico prezzi per capire se conviene comprare ora o aspettare, e una versione mobile-first del frontend — al momento pensato soprattutto per desktop di casa.