{"id":90,"date":"2026-06-11T21:30:00","date_gmt":"2026-06-11T21:30:00","guid":{"rendered":"https:\/\/rpi.temporiti.net\/wordpress\/?p=90"},"modified":"2026-05-30T14:06:32","modified_gmt":"2026-05-30T12:06:32","slug":"cf-flux-schnell","status":"publish","type":"post","link":"https:\/\/rpi.temporiti.net\/wordpress\/?p=90","title":{"rendered":"Cloudflare Workers AI: FLUX.1 schnell per generazione immagini ultra-rapida"},"content":{"rendered":"<p>FLUX.1 schnell \u00e8 il modello di immagini che apro di default per le cover degli articoli del blog e per le illustrazioni di servizio nella documentazione del homelab. Gira su Cloudflare Workers AI, \u00e8 gratis per i miei volumi (il free tier mette a disposizione 10000 neuroni al giorno, e una FLUX schnell da 1024 pixel ne consuma una manciata), e in tre o quattro secondi mi sputa fuori un PNG pulito gi\u00e0 pubblicabile senza rifiniture. Sotto il cofano \u00e8 la variante &#8220;schnell&#8221; della famiglia FLUX di Black Forest Labs, rilasciata sotto licenza Apache 2.0, distillata per girare in 4 step contro i 20-30 di un modello full.<\/p>\n<p>Lo uso cos\u00ec tanto perch\u00e9 ha esattamente il profilo che mi serve per il blog tecnico: latenza bassa, qualit\u00e0 foto-realistica dignitosa, costo zero per il mio volume, niente da installare in locale, e una policy di provider difendibile.<\/p>\n<h2>Setup con curl + Workers AI<\/h2>\n<p>Per chiamare un modello di Workers AI mi servono due cose: l&#8217;<code>ACCOUNT_ID<\/code> (lo trovo nella dashboard Cloudflare, in alto a destra di qualsiasi pagina) e un API token con scope <code>Workers AI:Read<\/code> (creato da dash.cloudflare.com -> My Profile -> API Tokens -> Create Token, template &#8220;Workers AI&#8221;). Il token vive in <code>~\/.config\/claude-credentials\/credentials.env<\/code> come <code>CF_AI_TOKEN<\/code>, caricato in automatico dalla shell.<\/p>\n<p>La chiamata diretta \u00e8 un singolo <code>curl<\/code> REST:<\/p>\n<pre><code class=\"language-bash\">\nACCOUNT_ID=\"...\"\nTOKEN=\"$CF_AI_TOKEN\"\nMODEL=\"@cf\/black-forest-labs\/flux-1-schnell\"\n\ncurl -s https:\/\/api.cloudflare.com\/client\/v4\/accounts\/$ACCOUNT_ID\/ai\/run\/$MODEL \\\n  -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\/json\" \\\n  -d '{\n        \"prompt\": \"abstract data flow visualization, cyan gradients, editorial tech magazine style, clean composition\",\n        \"steps\": 4\n      }' &gt; out.json\n<\/code><\/pre>\n<p>La risposta non \u00e8 un PNG diretto: \u00e8 JSON con <code>result.image<\/code> come stringa base64. La estraggo con <code>jq<\/code> e la decodifico:<\/p>\n<pre><code class=\"language-bash\">\njq -r '.result.image' out.json | base64 -d &gt; cover.png\n<\/code><\/pre>\n<p>Tutto qui, niente wrangler in mezzo per la sola inference. Wrangler lo tiro fuori solo se devo deployare un Worker che chiami FLUX via binding <code>AI<\/code> da TypeScript; per generare un&#8217;immagine al volo dal portatile, la chiamata REST diretta \u00e8 la cosa pi\u00f9 pulita.<\/p>\n<h2>Un esempio reale: la cover di questo articolo<\/h2>\n<p>La cover che vedete in cima \u00e8 uscita proprio da FLUX.1 schnell, alla seconda iterazione di prompt. Volevo qualcosa di astratto, non l&#8217;ennesima foto di un rack con luci viola: ho chiesto un flusso di dati astratto, gradienti cyan, stile editoriale. 4 step, latenza sotto i quattro secondi, PNG 1024&#215;1024 pulito senza artefatti, niente &#8220;look AI&#8221; appiccicoso. Pi\u00f9 rapido del tempo che mi sarebbe servito a cercare uno stock free su Unsplash.<\/p>\n<p>Lo stesso pattern lo riuso per le illustrazioni dentro la documentazione interna del homelab: piccole copertine per le note Markdown che tengo come runbook, per dare un colpo d&#8217;occhio a sezioni lunghe.<\/p>\n<h2>Cosa fa bene<\/h2>\n<p>Velocit\u00e0 in primo luogo: 4 step \u00e8 gi\u00e0 il punto di funzionamento del modello, non sto barando sulla qualit\u00e0 per andare pi\u00f9 rapido. Su composizioni astratte, illustrazioni editoriali, oggetti singoli con sfondo neutro, la resa \u00e8 spesso pubblicabile al primo tentativo. Segue il prompt in modo onesto, senza interpretazioni creative eccessive. Su 1024&#215;1024 (il default ragionevole) il consumo di neuroni \u00e8 basso, e quindi posso permettermi anche di buttare via tre o quattro risultati per scegliere il migliore senza preoccuparmi del budget free tier.<\/p>\n<h2>Cosa fa meno bene<\/h2>\n<p>Il testo dentro le immagini \u00e8 il punto debole solito: scritte e cartelli vengono fuori storpiati, come per tutti i modelli di questa generazione. Le mani umane in pose complicate sono ancora una sfida, ma per le cover editoriali \u00e8 raro che mi servano. Le composizioni con molti soggetti distinti tendono a fondersi se il prompt non \u00e8 descrittivo in modo geometrico (dove sta cosa). Quattro step sono un trade-off: per scene molto ricche di dettaglio si vede che \u00e8 una versione distillata, e in quei casi mi sposto su SDXL base.<\/p>\n<h2>Privacy<\/h2>\n<p>Cloudflare non addestra i propri LLM e dichiara esplicitamente di non usare prompt e output per training, su free e paid identicamente. Non c&#8217;\u00e8 retention dei prompt o delle immagini generate finch\u00e9 non sono io a deciderlo esplicitamente scrivendoli in R2, KV, Durable Objects o Vectorize. L&#8217;inference gira sull&#8217;edge globale Cloudflare, con possibilit\u00e0 di restringere la regione via Regional Services se serve mantenere il traffico in Europa. Il modello in s\u00e9 \u00e8 open source: FLUX.1 schnell \u00e8 rilasciato da Black Forest Labs sotto licenza Apache 2.0, quindi i pesi sono pubblici e teoricamente self-hostabili su una GPU adeguata. La differenza con altre piattaforme \u00e8 proprio qui: non sto barattando i miei prompt come moneta di scambio per il free tier.<\/p>\n<h2>In pratica<\/h2>\n<p>Per le cover degli articoli del blog tecnico, per le illustrazioni di servizio nei runbook del homelab, e per qualsiasi banner di un piccolo progetto open source che metto online, FLUX schnell \u00e8 il mio default e ci resta. Quando voglio un look pi\u00f9 &#8220;stilizzato\/illustrazione&#8221; passo a dreamshaper 8 LCM, quando voglio una resa fotografica pi\u00f9 seria a SDXL Lightning, e quando l&#8217;asset \u00e8 importante (copertina di una serie, slide per un talk) tiro fuori SDXL base 1.0 e mi prendo i 20 secondi di latenza in pi\u00f9. Per la routine, schnell \u00e8 quello che bisogna battere.<\/p>\n<hr>\n<blockquote>\n<p>Immagine generata con Cloudflare Workers AI \/ FLUX.1 schnell.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>FLUX.1 schnell \u00e8 il modello di immagini che apro di default per le cover degli articoli del blog e per le illustrazioni di servizio nella documentazione del homelab. Gira su Cloudflare Workers AI, \u00e8 gratis per i miei volumi (il free tier mette a disposizione 10000 neuroni al giorno, e una FLUX schnell da 1024 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":91,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-90","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-locale"],"_links":{"self":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/90","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=90"}],"version-history":[{"count":6,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/90\/revisions"}],"predecessor-version":[{"id":381,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/90\/revisions\/381"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/91"}],"wp:attachment":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}