
Chi sono, a chi e' rivolto, prerequisiti minimi e cosa otterrai a fine percorso. Mappa ad alto livello: widget JavaScript embeddabile, backend FastAPI con API REST, integrazione LLM, Turnstile anti-bot e deploy minimale con HTTPS. Come seguire: teoria con slide e pratica con screen share su Cursor e file del progetto.
Teoria essenziale: come modellare un'API REST per un chatbot. Cosa sono risorse ed endpoint, quali payload JSON usare, come scegliere status code e messaggi di errore coerenti. Colleghiamo i concetti agli endpoint del progetto: /api/config/{site_id}, /api/session/init, /api/chat.
Screen share su Cursor: lettura guidata di chatbot_sorretti_it/app/main.py. Individuiamo modelli Pydantic per request/response, validazione (Field e max length), gestione errori (HTTPException) e configurazione CORS. Obiettivo: sapere dove mettere mani per aggiungere o modificare un endpoint senza rompere i contratti.
Mappa delle cartelle e componenti chiave: public/widget.js (widget), app/main.py (API), app/tenants.json (tenant e prompt), app/groq_client.py (LLM), app/turnstile.py (verifica anti-bot), ops/apache (deploy). Flusso: widget -> /api/config -> /api/session/init -> /api/chat -> risposta.
Screen share su Cursor: apriamo chatbot_sorretti_it/public/widget.js. Vediamo come si embedda con data-site, come si costruisce la UI, come si chiama /api/config e come parte il flusso verso /api/session/init e /api/chat. Criteri di correttezza: gestione errori, stato UI e history in-session.
Come controllare comportamento e costi del chatbot con un system prompt per-tenant. Struttura di tenants.json: name, allowed_origins/hostnames, system_prompt e limits (history, message length, max tokens). Obiettivo: capire cosa cambia tra siti diversi e come evitare risposte inventate.
Screen share su Cursor: percorriamo la logica di /api/chat in app/main.py e la chiamata al provider in app/groq_client.py. Vediamo come si compone messages (system + history + user), come si tronca la history e come si gestiscono errori upstream. Obiettivo: sapere dove intervenire per cambiare modello, limiti o policy di risposta.
Spiegazione end-to-end: rendering del widget Turnstile nel frontend, ottenimento token, invio al backend su /api/session/init e verifica server-side tramite siteverify. Controlli di sicurezza: hostname allowlist per tenant e gestione errori (403) quando la verifica fallisce. Obiettivo: sapere esattamente cosa protegge e dove si posiziona.
Configurazione pratica: creazione account Cloudflare, creazione di un widget Turnstile, ottenimento sitekey e secret key. Integrazione nel progetto: aggiornamento .env (TURNSTILE_SITEKEY e TURNSTILE_SECRET_KEY) e verifica del flusso /api/session/init. Controlli finali: hostname corretto e comportamento del widget in caso di errore.
Concetti essenziali per andare online: perche' mettere Apache davanti a Uvicorn, come esporre /api e servire il widget, e cosa significa HTTPS in pratica. Checklist: dominio, DNS, proxy, certificato, variabili d'ambiente e avvio processo.
Micro-lezione per completare il deploy reale: perche' serve un process manager, come tenere online Uvicorn e come leggere i problemi dai log. Checklist .env del progetto: GROQ_API_KEY, GROQ_MODEL, TURNSTILE_SITEKEY, TURNSTILE_SECRET_KEY, SESSION_SECRET e ALLOWED_ORIGINS. Focus su un punto critico: avvio pm2 con working directory corretta per trovare il modulo app.
Screen share su Cursor: leggiamo ops/apache/*.conf. Individuiamo ProxyPass /api, redirect HTTP->HTTPS e certificati. Mini-verifica: cosa controllare quando vedi 404/503 su /api e quali file modificare per ripristinare la configurazione dopo Certbot. Obiettivo: avere un metodo ripetibile e minimale.
Screen share su Cursor: aggiungiamo un nuovo site_id in app/tenants.json (allowed_origins, allowed_hostnames, system_prompt, limits), aggiorniamo
ALLOWED_ORIGINS in .env e ricaviamo lo snippet di embed con data-site. Chiudiamo con una panoramica pratica del deploy automatico: cosa succede al push su master (pull, pip install, pm2 restart) e quali secrets servono per l'SSH.
Screen share finale di verifica end-to-end: apriamo il sito, avviamo il widget,
superiamo Turnstile e proviamo alcune richieste reali per vedere il chatbot in azione. Controlliamo il flusso minimo lato utente e ripassiamo cosa verificare quando il sistema risponde correttamente dopo configurazione e deploy.
In questo corso costruirai e comprenderai un chatbot web completo, basato su un progetto reale: un widget JavaScript embeddabile e un backend FastAPI che espone API REST per configurazione, inizializzazione sessione e chat.
Vedrai come si struttura un servizio multi-tenant tramite site_id, con prompt e limiti per sito, e come si integra un provider LLM (via API) mantenendo controllo su contesto, history e output. Lavoreremo su contratti request/response chiari, validazione con Pydantic, gestione errori coerente e CORS per permettere l'integrazione del widget su domini diversi senza compromettere la sicurezza.
Affronteremo anche aspetti pratici che in un progetto reale fanno la differenza: limiti sulla history e sulla lunghezza dei messaggi, protezione contro abusi, variabili d'ambiente e checklist di configurazione per passare da locale a produzione senza sorprese.
Una parte centrale è dedicata alla protezione anti-bot con Cloudflare Turnstile: prima chiariremo il meccanismo (token, verifica server-side, controlli hostname), poi farai la configurazione pratica su Cloudflare e collegherai chiavi e variabili d'ambiente al progetto.
Chiudiamo con il deploy in produzione: configureremo un reverse proxy Apache per esporre in sicurezza le API, implementeremo connessioni HTTPS con certificati Let's Encrypt e gestiremo l'applicazione con un process manager. Vedremo infine il flusso end-to-end: dall'aggiunta di un nuovo tenant fino alla generazione dello snippet JavaScript da copiare e incollare nel sito di destinazione.
Per chi è questo corso?
Questo percorso ha un doppio valore. Da un lato, è un'ottima palestra didattica per chi vuole imparare a progettare API REST solide, gestire la sicurezza e strutturare un'architettura moderna. Dall'altro, ti consegna un progetto reale, completo e "production-ready": un widget incorporabile con estrema facilità in qualsiasi sito web.
Che tu sia uno sviluppatore con le basi di programmazione che vuole fare il salto di qualità, un developer senior in cerca di un'architettura di riferimento per integrare l'IA generativa, o uno startupper che desidera lanciare il proprio servizio SaaS di chatbot, qui troverai un prodotto finito, spendibile e pronto per il mercato.