{"id":72,"date":"2026-06-09T21:40:00","date_gmt":"2026-06-09T21:40:00","guid":{"rendered":"https:\/\/rpi.temporiti.net\/wordpress\/?p=72"},"modified":"2026-06-10T06:27:12","modified_gmt":"2026-06-10T04:27:12","slug":"openrouter-qwen-coder","status":"publish","type":"post","link":"https:\/\/rpi.temporiti.net\/wordpress\/?p=72","title":{"rendered":"OpenRouter come gateway: qwen3-coder:free per code-gen di backup"},"content":{"rendered":"<p>OpenRouter \u00e8 il gateway universale OpenAI-compatibile. La forza non \u00e8 tanto un singolo modello, \u00e8 la possibilit\u00e0 di puntare a decine di modelli diversi con la stessa chiave e lo stesso endpoint. Sul free tier mi interessa soprattutto <code>qwen3-coder:free<\/code>, variante gratuita del modello di Alibaba specializzato per code generation.<\/p>\n<p>Lo uso come fallback per generare codice di backup, scaffold di file di configurazione e funzioni helper quando non ho voglia di consumare i miei limiti su Groq o Cerebras. Qwen 3 Coder \u00e8 open weights, Apache 2.0, sviluppato da Alibaba. Su OpenRouter viene servito da provider downstream che variano: Chutes, DeepInfra, NovitaAI, Targon. Questo \u00e8 un dettaglio rilevante per la privacy, ne parlo sotto.<\/p>\n<h2>Configurazione di opencode<\/h2>\n<p>La chiave la creo su <code>openrouter.ai\/keys<\/code>, gratis con email. La salvo in <code>~\/.config\/claude-credentials\/credentials.env<\/code> come <code>OPENROUTER_API_KEY<\/code>. Nel file <code>~\/.config\/opencode\/opencode.json<\/code> registro il provider:<\/p>\n<pre><code class=\"language-json\">\n{\n  \"provider\": {\n    \"openrouter\": {\n      \"npm\": \"@ai-sdk\/openai-compatible\",\n      \"options\": {\n        \"apiKey\": \"{env:OPENROUTER_API_KEY}\",\n        \"baseURL\": \"https:\/\/openrouter.ai\/api\/v1\"\n      },\n      \"models\": {\n        \"qwen\/qwen3-coder:free\": { \"name\": \"Qwen3 Coder (free)\" }\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<p>Per aprire la TUI puntando al modello:<\/p>\n<pre><code class=\"language-bash\">\nopencode . --model openrouter\/qwen\/qwen3-coder:free\n<\/code><\/pre>\n<p>Sul dashboard di OpenRouter, prima di usarlo seriamente, attivo a livello account il toggle &#8220;Do not route to providers that may train on inputs&#8221; e dove possibile aggiungo i provider downstream che offrono Zero Data Retention alla lista preferita. \u00c8 un passaggio importante che racconto nella sezione privacy.<\/p>\n<h2>Un esempio di sessione reale<\/h2>\n<p>Domenica pomeriggio alle 16:00 stavo rifacendo lo script di backup di un mio database SQLite. Avevo lo script vecchio che faceva un <code>.backup<\/code> e un <code>gzip<\/code>, ma volevo qualcosa di pi\u00f9 robusto: rotation, verifica del checksum, retention configurabile da file YAML, log strutturato. Ho aperto opencode dentro <code>progetti\/sqlite-backup\/<\/code>, dove avevo il vecchio script. Prompt:<\/p>\n<blockquote>\n<p>riscrivi backup.sh in qualcosa di pi\u00f9 robusto. Aggiungi rotation con retention da config.yaml, verifica SHA-256 del file generato, log JSON su stdout. Mantieni Bash 5, niente dipendenze esterne oltre a sqlite3, gzip, sha256sum, yq.<\/p>\n<\/blockquote>\n<p>Risposta in circa quattro secondi. Lo script generato era 110 righe, ben commentato, con una funzione <code>log_json<\/code> corretta che produceva una riga JSON per evento. La verifica SHA-256 era integrata con un confronto contro un file di checkpoint salvato accanto al backup. Il parsing YAML con <code>yq<\/code> aveva la sintassi giusta della versione recente (mkrieger). Ho dovuto modificare solo la directory di destinazione hard-coded.<\/p>\n<h2>Cosa fa bene<\/h2>\n<p>Code generation pulita su file singoli. Riscritture con vincoli espliciti su dipendenze. Buona aderenza alle specifiche di formato (JSON in output, conformit\u00e0 a una struttura richiesta). La forza vera per\u00f2 \u00e8 la flessibilit\u00e0 del gateway: posso passare in un secondo da <code>qwen\/qwen3-coder:free<\/code> a un altro modello cambiando solo il <code>--model<\/code>.<\/p>\n<h2>Cosa fa meno bene<\/h2>\n<p>Variabilit\u00e0 della latenza, perch\u00e9 il provider downstream cambia di chiamata in chiamata. Su prompt molto lunghi la qualit\u00e0 dipende da quale backend OpenRouter sceglie. Sul free tier le quote per provider downstream possono essere strette, e in giornate di traffico alto si finisce in coda. Il modello in s\u00e9 \u00e8 solido, ma la catena di fornitura \u00e8 meno trasparente di un provider diretto.<\/p>\n<h2>Privacy e termini del provider<\/h2>\n<p>Qui serve attenzione perch\u00e9 OpenRouter \u00e8 un gateway, non l&#8217;erogatore finale. OpenRouter dichiara &#8220;zero logging&#8221; sui suoi server di default. La policy effettiva di training e logging, per\u00f2, dipende dal provider downstream che OpenRouter sceglie in quel momento. Per <code>qwen3-coder:free<\/code> la lista di provider possibili include Chutes, DeepInfra, NovitaAI, Targon. Alcuni di questi possono usare gli input per migliorare i modelli, salvo opt-out esplicito.<\/p>\n<p>La leva di controllo \u00e8 la coppia di toggle in account: &#8220;Do not route to providers that may train on inputs&#8221; e l&#8217;opzione Zero Data Retention. Attivati entrambi, OpenRouter restringe la lista di backend a quelli che garantiscono no-training e no-retention. La controindicazione \u00e8 che la disponibilit\u00e0 del modello cala, e a volte una richiesta fallisce perch\u00e9 nessun provider eleggibile \u00e8 disponibile. \u00c8 un trade-off che accetto per il fallback ma che valuto caso per caso.<\/p>\n<p>La residency varia con il provider downstream, non c&#8217;\u00e8 un commitment unico. Per task tecnici routine senza dato personale \u00e8 accettabile. Per qualunque cosa con minimo livello di sensibilit\u00e0 preferisco un provider diretto con policy chiara.<\/p>\n<p>Il modello Qwen 3 Coder \u00e8 open weights, Apache 2.0, ridistribuibile e ispezionabile.<\/p>\n<h2>Cosa non gli mando<\/h2>\n<p>Sul free di OpenRouter senza toggle privacy attivati, non mando codice di clienti, log con dati personali, configurazioni con secret. Anche con i toggle attivati resto cauto su contenuti che non vorrei vedere replicati. Per code-gen sensibile fallback diretto a <code>qwen2.5-coder:14b<\/code> su Ollama in locale: stessa famiglia, esecuzione sulla mia macchina, zero rete.<\/p>\n<h2>In pratica<\/h2>\n<p>Nel mio toolkit OpenRouter \u00e8 la &#8220;rete di sicurezza&#8221;: utile quando Groq mi mette in coda sul rate limit, quando Cerebras \u00e8 in manutenzione, quando voglio testare un modello esotico senza creare un account dedicato. Per code-gen quotidiana il primo a cui mi rivolgo \u00e8 Qwen3 32B su Groq, pi\u00f9 veloce e con policy pi\u00f9 chiara. Per ragionamento lungo Qwen3 235B su Cerebras. OpenRouter resta utile come gateway proprio perch\u00e9 copre la coda lunga dei modelli che non valgono un account dedicato.<\/p>\n<hr>\n<blockquote>\n<p>Immagine generata con Cloudflare Workers AI \/ FLUX.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>OpenRouter \u00e8 il gateway universale OpenAI-compatibile. La forza non \u00e8 tanto un singolo modello, \u00e8 la possibilit\u00e0 di puntare a decine di modelli diversi con la stessa chiave e lo stesso endpoint. Sul free tier mi interessa soprattutto qwen3-coder:free, variante gratuita del modello di Alibaba specializzato per code generation. Lo uso come fallback per generare [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":73,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-72","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\/72","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=72"}],"version-history":[{"count":7,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/72\/revisions"}],"predecessor-version":[{"id":388,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/72\/revisions\/388"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/73"}],"wp:attachment":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=72"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=72"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=72"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}