DanLevy.net

Es Hora de los Connection Strings para LLM

Simplifica la Configuración de Modelos y Proveedores con URLs llm://

Actualización: Este artículo dio lugar a un Internet-Draft para el esquema URI llm://.

¿Recuerdas los malos tiempos en los que conectarse a una base de datos significaba hacer malabarismos con un conjunto heterogéneo de variables de entorno?

Era una torre de configuración delicada. DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME… o espera, ¿era DB_USERNAME? ¿Es DB_PASS o DB_PWD? ¿Necesito los prefijos PG_* esta vez? ¿Y dónde demonios va la configuración del timeout?

Era un castillo de naipes frágil, listo para derrumbar tu build de producción porque olvidaste poner HOST en mayúsculas.

Entonces, alguien tuvo la brillante idea de simplemente usar una URL¹:

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

Una sola cadena. Todo lo que necesitas. Universalmente parseable. Portable. ¿Me atrevo a decir… hermosa?

Entonces, ¿por qué estamos tratando a los LLM como si fuera 1999?

La Explosión de Variables de Entorno

Ahora mismo, mi archivo .env parece un cementerio de claves API abandonadas. OPENAI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, GROQ_API_KEY. Y ni me hables de Azure—necesitas un endpoint, un nombre de deployment, una versión de API y una clave solo para decir “hola”.

No es solo feo; es fricción. Cada vez que quiero cambiar de modelo o probar un nuevo proveedor, estoy reescribiendo código de inicialización, buscando en la documentación los nombres específicos de parámetros y agregando tres líneas más a mi configuración de entorno.

¿Y si simplemente… robáramos tomáramos prestada la idea de las URLs de base de datos?

Presentando los Connection Strings para LLM

Imagina configurar toda tu interfaz de modelo con una sola línea:

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


Anatomía de un Connection String para LLM

las partes de un connection string para LLM

El esquema es llm://. El host es la URL base de la API del proveedor. La ruta es el nombre del modelo. Y los parámetros de consulta manejan todas las opciones de ejecución que usualmente desordenan tu código.

¿Necesitas autenticación? Perfecto, agrégala.

Al igual que postgres://, podemos incorporar la autenticación directamente:

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

Nota: Sí, poner credenciales en URLs puede ser un riesgo de seguridad si las pegas en logs públicos. Pero los servicios modernos de logging son bastante buenos ocultando estos patrones, y honestamente, ¿estás tratando tu archivo .env mucho mejor? Verifica, sanitiza y usa con precaución.

¿Resiliencia? Por qué demonios no.

Muchas bibliotecas de bases de datos soportan failover round-robin especificando múltiples hosts. ¿Por qué nuestros agentes de IA no deberían tener la misma confiabilidad?

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

Esa s en llms:// no es un error tipográfico. Es plural. Si primary.gpt se cuelga, el cliente reintenta automáticamente con backup.gpt. Sin lógica compleja de enrutamiento requerida.

Una sola cadena con todo, desde tu autenticación hasta tu endpoint hasta tus hiperparámetros.

Formatos Alternativos

No estoy casado con llm://. El esquema específico importa menos que el estándar en sí.

Podría imaginar un mundo donde usemos esquemas específicos de proveedor para mayor brevedad, manteniendo la estructura estándar:

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

Independientemente de la sintaxis exacta, los beneficios principales son innegables:

  1. Portabilidad: Copia y pega toda tu configuración desde un script local a un cloud worker.
  2. Amigable para CLI: Pasa un solo argumento a tus scripts. my-agent --model "llm://..." supera a my-agent --model gpt-4 --temp 0.7 --key $KEY --host ....
  3. Agnóstico al Lenguaje: Cada lenguaje de programación tiene un parser de URL robusto. Obtenemos validación, parsing y sanitización gratis.
El mundo de las bases de datos tardó décadas en descubrir esto.
Buenas noticias, en cronologías de IA, eso fue apenas hace medio vibe-año.

El Veredicto

No necesitamos otro estándar de configuración complejo o un nuevo archivo manifiesto basado en YAML. Solo necesitamos usar la herramienta que ha estado funcionando para el resto de internet durante los últimos 30 años.

Dejemos de reinventar la rueda y empecemos a tratar nuestras conexiones LLM con el mismo respeto que damos a nuestras bases de datos. Tu archivo .env (y tu cordura) te lo agradecerán.

un cajón desordenado de variables de entorno