Usare l'intelligenza artificiale per scrivere codice è diventato parte del mio lavoro quotidiano. Non la uso soltanto per farmi spiegare una funzione o generare qualche riga di PHP: la uso per sviluppare, modificare progetti esistenti, fare refactoring, scrivere script e affrontare attività che coinvolgono più file. In pratica, le delego una parte del lavoro operativo che prima avrei svolto interamente a mano.
Il problema arriva quando si comincia a guardare il conto. Gli assistenti AI più interessanti sono spesso legati ad abbonamenti mensili, crediti o limiti di utilizzo. Presi singolarmente, gli importi possono sembrare ragionevoli. Quando però si comincia a utilizzare più strumenti, magari per linguaggi e progetti differenti, la spesa aumenta rapidamente. Pagare tre o quattro abbonamenti soltanto per capire quale assistente funzioni meglio non è esattamente il mio ideale di ottimizzazione.
Per questo ho cominciato a sperimentare soluzioni alternative. Non mi interessava trovare un chatbot gratuito capace di scrivere una funzione banale, ma strumenti che potessero inserirsi in un flusso di sviluppo reale. Volevo lavorare sul codice esistente, modificare più file, lanciare comandi, correggere errori e continuare a sviluppare senza essere fermato continuamente da un contatore di richieste.
La buona notizia è che oggi possiamo combinare strumenti open source, modelli locali e servizi remoti con quote gratuite. La soluzione che trovo particolarmente interessante è utilizzare OpenCode insieme a FreeLLMAPI. Il primo permette di lavorare direttamente sul progetto, mentre il secondo aggrega diversi provider di modelli linguistici dietro un'unica API compatibile con OpenAI.
Non significa ottenere intelligenza artificiale illimitata senza pagare nulla. Le quote dei provider esistono ancora, le prestazioni variano e qualche configurazione va fatta. Significa però poter costruire un ambiente di sviluppo assistito dall'AI senza essere obbligati a sottoscrivere immediatamente un abbonamento.
OpenCode: il coding agent da cui partire
OpenCode è un coding agent utilizzabile dal terminale, progettato per lavorare direttamente sui file di un progetto. La differenza rispetto a una normale chat è sostanziale: invece di copiare continuamente codice nel browser, possiamo chiedere all'agente di analizzare una repository, individuare i punti da modificare, proporre interventi e aiutarci a verificare il risultato.
Per chi sviluppa applicazioni reali, questo approccio è molto più interessante della semplice generazione di snippet. Possiamo chiedere, per esempio, di individuare un problema in un servizio PHP, modificare una classe Java, aggiornare un componente Angular o scrivere test per una funzione esistente.
OpenCode non è però il modello AI. È lo strumento che gestisce l'interazione con il progetto e con il modello scelto. La qualità del risultato dipende anche dal provider, dal modello, dal contesto disponibile e dalla capacità di utilizzare correttamente gli strumenti.
La documentazione ufficiale è disponibile su opencode.ai.
FreeLLMAPI: tanti provider, un solo endpoint
Il problema successivo è scegliere il modello da utilizzare. Google, Groq, Cerebras, Mistral, NVIDIA e altri servizi offrono modelli con condizioni di accesso differenti. Alcuni prevedono quote gratuite, altri offrono accessi promozionali e altri ancora mettono a disposizione modelli locali o compatibili con API standard.
Gestire tutto manualmente significa configurare più servizi, custodire diverse chiavi API, ricordare i limiti e cambiare configurazione quando un provider non è più disponibile. È proprio qui che entra in gioco FreeLLMAPI.
FreeLLMAPI è un progetto open source che aggrega provider di modelli linguistici dietro un'unica interfaccia API compatibile con OpenAI. Il servizio dispone di un sistema di instradamento delle richieste e può passare a un'alternativa quando un provider incontra determinati errori o limiti, secondo la strategia configurata.
In pratica, invece di collegare OpenCode separatamente a ogni servizio, possiamo collegarlo a FreeLLMAPI. Sarà quest'ultimo a gestire i provider che abbiamo configurato e i modelli disponibili.
Il vantaggio è soprattutto organizzativo. Abbiamo un unico endpoint, una chiave da utilizzare nel client e una configurazione centralizzata. Possiamo inoltre consultare il catalogo aggiornato dei modelli e scegliere quelli più adatti alle nostre attività.
C'è una precisazione fondamentale: FreeLLMAPI non crea capacità di calcolo gratuita dal nulla. Aggrega le quote e le condizioni dei servizi collegati. Se un provider esaurisce il proprio limite, il router può tentare un'alternativa compatibile, ma non può garantire che esista sempre un altro modello disponibile. Anche le quote dei servizi gratuiti possono cambiare.
Il progetto è pensato principalmente per sperimentazione e uso personale. Per applicazioni di produzione che richiedono disponibilità garantita, bisogna valutare un servizio con condizioni e livelli di supporto adeguati.
Installare FreeLLMAPI
Il metodo più semplice su Linux è utilizzare lo script d'installazione ufficiale, che richiede Docker. Prima di eseguirlo, consiglio di aprire e controllare lo script, come farei con qualsiasi programma che deve installare container e modificare la configurazione della macchina.
Il comando documentato dal progetto è:
curl -fsSL https://freellmapi.co/install.sh -o install-freellmapi.sh
less install-freellmapi.sh
bash install-freellmapi.shUna volta terminata l'installazione, il servizio espone normalmente la dashboard locale sulla porta 3001. Possiamo aprirla dal browser all'indirizzo:
Se il servizio è stato installato su una macchina diversa o utilizza una porta personalizzata, naturalmente bisogna adeguare l'indirizzo.
La dashboard è il punto da cui gestire le credenziali dei provider, consultare i modelli disponibili e configurare il comportamento del router. Non basta installare il progetto e aspettarsi che tutti i modelli siano immediatamente utilizzabili: dobbiamo prima configurare almeno un provider accessibile.
Configurare i provider e recuperare la chiave API
Dalla dashboard bisogna aprire la sezione dedicata alle chiavi dei provider e aggiungere quelle dei servizi che vogliamo utilizzare. Per ciascun provider occorre rispettare le condizioni di registrazione, autenticazione e utilizzo previste dal servizio originale.

Una volta inserite le credenziali, possiamo controllare quali modelli risultano disponibili e configurare la catena di fallback. Questa catena stabilisce quali alternative utilizzare quando il modello principale non è disponibile o incontra un limite gestibile dal router.
Non sceglierei i modelli soltanto in base alla dimensione o alla popolarità. Per un coding agent contano anche la capacità di seguire istruzioni, il supporto alle chiamate agli strumenti, la finestra di contesto e l'affidabilità nelle modifiche al codice.
Il catalogo aggiornato si trova su freellmapi.co/models.
Dopo aver configurato i provider, dalla sezione dedicata alle chiavi di FreeLLMAPI possiamo recuperare la chiave API unificata. È quella che utilizzeremo per collegare OpenCode al router, invece di inserire direttamente nel client tutte le chiavi dei singoli servizi.
Questa chiave va trattata come una credenziale personale: non va pubblicata nei repository, inserita negli articoli o condivisa negli screenshot della configurazione.
Collegare FreeLLMAPI a OpenCode
Questa è la parte interessante, perché ci permette di trasformare due strumenti separati in un ambiente di sviluppo concreto.
OpenCode supporta provider personalizzati, mentre FreeLLMAPI espone un endpoint compatibile con OpenAI. Il progetto mette a disposizione anche un comando per generare la configurazione di OpenCode senza dover scrivere manualmente ogni parametro.
Con FreeLLMAPI avviato localmente e la chiave API unificata già disponibile, possiamo utilizzare il comando seguente:
npx freellmapi setup-opencode --url http://localhost:3001 --api-key LA_TUA_CHIAVE_APISostituiamo LA_TUA_CHIAVE_API con la chiave effettiva ottenuta dalla dashboard. Il comando dedicato legge il catalogo dei modelli disponibili e prepara la configurazione per OpenCode, cercando di preservare quella esistente.
Prima di modificare la configurazione, possiamo anche chiedere al comando di mostrare le modifiche previste senza applicarle:
npx freellmapi setup-opencode --url http://localhost:3001 --api-key LA_TUA_CHIAVE_API --dry-runÈ una precauzione utile se abbiamo già configurato OpenCode con altri provider. Per indicazioni aggiornate sui parametri disponibili, conviene consultare la documentazione ufficiale dei client supportati da FreeLLMAPI.
Una volta completata la configurazione, possiamo avviare OpenCode dalla directory del progetto e selezionare il modello configurato. Se il comando ha creato un profilo specifico, utilizziamo quello indicato dalla procedura. I nomi esatti dei modelli dipendono dal catalogo disponibile nella nostra installazione.
Configurazione manuale di OpenCode
Se preferiamo capire cosa succede sotto il cofano, possiamo configurare un provider personalizzato direttamente nel file di configurazione di OpenCode.
La struttura da utilizzare è quella prevista dalla versione corrente di OpenCode per i provider compatibili con OpenAI. L'indirizzo base di FreeLLMAPI, in un'installazione locale standard, è http://localhost:3001/v1. La chiave deve essere quella unificata generata dal router.
La configurazione del provider deve contenere almeno l'indirizzo base, la chiave di autenticazione e gli identificativi dei modelli realmente disponibili. Per esempio, la struttura concettuale è questa:
{
"provider": {
"freellmapi": {
"npm": "@ai-sdk/openai-compatible",
"name": "FreeLLMAPI",
"options": {
"baseURL": "http://localhost:3001/v1",
"apiKey": "{env:FREELLMAPI_API_KEY}"
},
"models": {
"MODELLO_DISPONIBILE": {
"name": "Modello disponibile"
}
}
}
}
}Questo è uno schema di riferimento, non un file completo da copiare alla cieca: va integrato nella configurazione esistente, usando gli identificativi effettivi restituiti dal catalogo e verificando la sintassi richiesta dalla versione installata di OpenCode.
In questo esempio la chiave viene letta da una variabile d'ambiente, così da non doverla scrivere direttamente nel file. Prima di avviare OpenCode, possiamo impostarla nel terminale:
export FREELLMAPI_API_KEY='LA_TUA_CHIAVE_API'
opencodeSe utilizziamo questa modalità, la variabile deve essere disponibile nella sessione da cui avviamo OpenCode. Per una configurazione permanente possiamo gestirla nel nostro ambiente locale, evitando di inserirla nei file versionati con il progetto.
Per chi non ha esigenze particolari, preferisco comunque il comando setup-opencode: riduce la possibilità di sbagliare la struttura della configurazione e permette di sfruttare il catalogo disponibile al momento dell'installazione.
Come scegliere il modello giusto
A questo punto abbiamo un ambiente funzionante, ma resta una decisione importante: quale modello utilizzare per programmare?
Non esiste una risposta universale. Un modello veloce può essere sufficiente per generare una funzione, spiegare un errore o modificare un piccolo componente. Per un refactoring ampio, invece, sono più importanti la capacità di ragionamento, la finestra di contesto e la qualità delle chiamate agli strumenti.
Il mio consiglio è provare almeno tre attività rappresentative del lavoro quotidiano: una modifica semplice su un singolo file, un intervento che coinvolga più file e la correzione di un bug che richieda di comprendere il codice esistente. In questo modo possiamo valutare non soltanto la risposta del modello, ma anche la sua capacità di portare a termine il lavoro.
FreeLLMAPI aiuta a gestire l'accesso ai provider, ma non rende tutti i modelli equivalenti. Un modello poco adatto al coding continuerà a produrre risultati mediocri anche se è raggiungibile attraverso un router ben configurato.
E se volessi utilizzare anche modelli locali?
Un ulteriore vantaggio di questa architettura è la possibilità di affiancare provider remoti e modelli locali. Se utilizziamo Ollama, per esempio, possiamo valutare l'integrazione attraverso gli endpoint compatibili previsti da FreeLLMAPI.
In questo modo possiamo riservare il modello locale alle attività più semplici o ai casi in cui preferiamo non inviare il codice a un servizio remoto. Per le operazioni più complesse possiamo utilizzare un modello remoto, se disponibile.
Bisogna però distinguere tra il fatto che FreeLLMAPI possa instradare verso un modello e il fatto che quel modello sia adatto a OpenCode. Contesto, strumenti e formato delle richieste devono essere compatibili con il client e con l'attività da svolgere.
I limiti da conoscere prima di affidargli il progetto
L'utilizzo di un coding agent non elimina la necessità di verificare il codice. OpenCode può modificare molti file, introdurre dipendenze, alterare comportamenti esistenti o proporre una soluzione che sembra corretta ma non lo è.
Per questo continuerei a utilizzare Git, test automatici e revisione delle modifiche. Prima di accettare un intervento ampio, controllerei cosa è cambiato e verificherei il risultato. Se l'agente non riesce a individuare la causa di un bug e continua a proporre correzioni casuali, è meglio fermarlo piuttosto che lasciargli riscrivere mezzo progetto.
C'è anche la questione della riservatezza. FreeLLMAPI gira localmente, ma quando utilizziamo un provider remoto le richieste vengono comunque inviate al servizio che esegue il modello. Il fatto che il router sia installato sul nostro computer non significa che tutto il codice rimanga necessariamente locale.
Infine, le quote gratuite non rappresentano un servizio con disponibilità garantita. Possono cambiare, esaurirsi o essere accompagnate da limitazioni specifiche. Per un progetto personale sono compromessi accettabili; per un ambiente di produzione che richiede continuità, bisogna ragionare diversamente.
Conclusioni: programmare gratis è possibile, lavorare bene è il vero obiettivo
La combinazione che trovo interessante è OpenCode come coding agent e FreeLLMAPI come livello di accesso ai modelli. Il primo lavora sul progetto, il secondo centralizza l'accesso ai provider e gestisce le alternative disponibili.
La configurazione iniziale richiede qualche passaggio, ma una volta completata possiamo utilizzare un ambiente flessibile senza essere obbligati a sottoscrivere immediatamente più abbonamenti. Possiamo anche affiancare modelli locali, confrontare le prestazioni e scegliere di volta in volta quello più adatto.
Non considero questa soluzione un modo per ottenere capacità illimitate senza costi. La considero un modo per evitare di pagare per strumenti che non mi servono e per sfruttare meglio le risorse gratuite già disponibili.
Il punto, alla fine, non è generare più righe di codice in meno tempo. È ridurre il lavoro ripetitivo, velocizzare le iterazioni e lasciare allo sviluppatore più spazio per progettazione, verifica e risoluzione dei problemi.
Se riusciamo a farlo mantenendo il controllo sul codice e senza dipendere completamente da un solo servizio, abbiamo costruito un ambiente di sviluppo AI che ha davvero senso. E senza trasformare ogni modifica a una classe PHP in un nuovo addebito mensile.
