DanLevy.net

È ora delle Connection String per LLM

Semplifica la configurazione di modelli e provider con gli URL llm://

Aggiornamento: Questo articolo ha portato a una Internet-Draft per lo schema URI llm://.

Ti ricordi i brutti vecchi tempi in cui connettersi a un database significava destreggiarsi tra un mucchio disordinato di variabili d’ambiente?

Era una torre di configurazione fragile. DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME… o forse era DB_USERNAME? È DB_PASS o DB_PWD? Devo usare i prefissi PG_* questa volta? E dove diavolo va impostato il timeout?

Era un fragile castello di carte, pronto a far crollare la tua build di produzione perché avevi dimenticato di scrivere HOST in maiuscolo.

Poi, qualcuno ha avuto la brillante idea di usare semplicemente un URL¹:

Terminal window
postgres://user:pass@host:5432/dbname

Una sola stringa. Tutto il necessario. Universalmente parsabile. Portabile. Oserei dire… bellissima?

E allora perché stiamo trattando gli LLM come se fossimo nel 1999?

L’esplosione delle variabili d’ambiente

In questo momento, il mio file .env sembra un cimitero di chiavi API abbandonate. OPENAI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, GROQ_API_KEY. E non fatemi nemmeno parlare di Azure: servono un endpoint, un nome di deployment, una versione API e una chiave solo per dire “ciao”.

Non è solo brutto; è attrito. Ogni volta che voglio cambiare modello o testare un nuovo provider, devo riscrivere il codice di inizializzazione, cercare nella documentazione i nomi dei parametri specifici e aggiungere altre tre righe alla configurazione dell’ambiente.

E se semplicemente… rubassimo prendessimo in prestito l’idea degli URL dei database?

Introduzione alle Connection String per LLM

Immagina di configurare l’intera interfaccia del tuo modello con una sola riga:

Terminal window
llm://api.openai.com/gpt-5.2?reasoning_effort=none&temp=0.7&max_tokens=1500
llm://api.z.ai/glm-4.7?top_p=0.9&cache=true


Anatomia di una Connection String per LLM

le parti di una connection string per LLM

Lo schema è llm://. L’host è l’URL base dell’API del provider. Il path è il nome del modello. E i parametri di query gestiscono tutte le opzioni di runtime che di solito ingombrano il tuo codice.

Serve l’autenticazione? Perfetto, aggiungila.

Proprio come postgres://, possiamo inserire l’autenticazione direttamente nella stringa:

Terminal window
llm://app-name:sk-proj-123456@api.openai.com/gpt-5.2?reasoning_effort=none&temp=0.7

Nota: sì, inserire le credenziali negli URL può essere un rischio per la sicurezza se le incolli in log pubblici. Ma i moderni servizi di logging sono piuttosto bravi a oscurare questi pattern, e onestamente, tratti il tuo file .env molto meglio? Verifica, sanifica e usa con cautela.

Resilienza? Perché diamine no.

Molte librerie di database supportano il failover round-robin specificando più host. Perché i nostri agenti AI non dovrebbero avere la stessa affidabilità?

Terminal window
llms://primary.gpt,backup.gpt/gpt-6?temp=0.9

Quella s in llms:// non è un errore di battitura. È plurale. Se primary.gpt si blocca, il client ritenta automaticamente con backup.gpt. Nessuna logica complessa di routing richiesta.

Una sola stringa con tutto, dall’autenticazione all’endpoint agli iperparametri.

Formati alternativi

Non sono sposato con llm://. Lo schema specifico conta meno dello standard stesso.

Potrei immaginare un mondo in cui usiamo schemi specifici per provider per brevità, mantenendo però la struttura standard:

Terminal window
ollama://localhost:11434/llama3
vercel://anthropic/sonnet-4.5?temp=0.8&web_search={"maxUses":3}
bedrock://us-west-2.aws/anthropic/sonnet-4.5?temp=0.8&cacheControl=ephemeral

Indipendentemente dalla sintassi esatta, i vantaggi principali sono innegabili:

  1. Portabilità: Copia e incolla l’intera configurazione da uno script locale a un cloud worker.
  2. CLI Friendly: Passa un singolo argomento ai tuoi script. my-agent --model "llm://..." batte my-agent --model gpt-4 --temp 0.7 --key $KEY --host ....
  3. Indipendente dal linguaggio: Ogni linguaggio di programmazione ha un parser URL robusto. Otteniamo validazione, parsing e sanificazione gratuitamente.
Il mondo dei database ha impiegato decenni per capirlo.
Buone notizie: nelle timeline AI, questo è solo circa mezzo vibe-anno fa.

Il Verdetto

Non ci serve un altro standard complesso di configurazione o un nuovo file manifest basato su YAML. Dobbiamo solo usare l’unico strumento che ha funzionato per il resto di internet negli ultimi 30 anni.

Smettiamo di reinventare la ruota e iniziamo a trattare le nostre connessioni LLM con lo stesso rispetto che diamo ai nostri database. Il tuo file .env (e la tua sanità mentale) ti ringrazieranno.

un cassetto di variabili d'ambiente disordinato