DanLevy.net

Es ist Zeit für LLM-Connection-Strings

Modell- & Provider-Konfiguration mit llm://-URLs vereinfachen

Update: Dieser Artikel führte zu einem Internet-Draft für das llm://-URI-Schema.

Erinnerst du dich an die schlechten alten Zeiten, in denen die Verbindung zu einer Datenbank bedeutete, eine verschiedene Sammlung von Umgebungsvariablen zu jonglieren?

Es war ein fragiles Konstrukt aus Konfiguration. DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME… oder war es doch DB_USERNAME? Ist es DB_PASS oder DB_PWD? Brauche ich dieses Mal die PG_*-Präfixe? Und wo zum Teufel gehört die Timeout-Einstellung hin?

Es war ein fragiles Kartenhaus, bereit, deinen Production-Build zum Absturz zu bringen, weil du vergessen hast, HOST großzuschreiben.

Dann hatte jemand die brillante Idee, einfach eine URL zu verwenden¹:

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

Ein String. Alles, was man braucht. Universell parsbar. Portabel. Fast schon… schön?

Also warum behandeln wir LLMs, als wäre es 1999?

Die Env-Var-Explosion

Meine .env-Datei sieht derzeit aus wie ein Friedhof verwaister API-Keys. OPENAI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, GROQ_API_KEY. Und fang gar nicht erst mit Azure an – du brauchst einen Endpunkt, einen Deployment-Namen, eine API-Version und einen Key, nur um „Hallo” zu sagen.

Es ist nicht nur hässlich; es ist Reibung. Jedes Mal, wenn ich ein Modell tauschen oder einen neuen Provider testen will, schreibe ich Initialisierungscode um, suche in der Dokumentation nach spezifischen Parameternamen und füge drei weitere Zeilen zu meiner Environment-Konfiguration hinzu.

Was wäre, wenn wir die DB-URL-Idee einfach klauen ausleihen würden?

LLM-Connection-Strings

Stell dir vor, du konfigurierst deine gesamte Modellschnittstelle mit einer einzigen Zeile:

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


Anatomie eines LLM-Connection-Strings

die Bestandteile eines LLM-Connection-Strings

Das Schema ist llm://. Der Host ist die API-Basis-URL des Providers. Der Pfad ist der Modellname. Und Query-Parameter kümmern sich um all die Runtime-Optionen, die normalerweise deinen Code zumüllen.

Authentifizierung nötig? Perfekt, füge sie hinzu.

Genau wie bei postgres:// können wir Authentifizierung direkt einbetten:

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

Hinweis: Ja, Credentials in URLs zu packen kann ein Sicherheitsrisiko sein, wenn du sie in öffentliche Logs einfügst. Aber moderne Logging-Dienste sind ziemlich gut darin, diese Patterns zu bereinigen, und ehrlich – behandelst du deine .env-Datei wirklich viel besser? Prüfen, bereinigen und mit Vorsicht verwenden.

Resilienz? Warum zum Teufel nicht.

Viele Datenbankbibliotheken unterstützen Round-Robin-Failover, indem sie mehrere Hosts angeben. Warum sollten unsere KI-Agenten nicht die gleiche Zuverlässigkeit haben?

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

Das s in llms:// ist kein Tippfehler. Es ist Plural. Wenn primary.gpt hängt, wechselt der Client automatisch zu backup.gpt. Keine komplexe Router-Logik erforderlich.

Ein String mit allem – von Authentifizierung über Endpunkt bis hin zu Hyperparametern.

Alternative Formate

Ich bin nicht starr auf llm:// fixiert. Das konkrete Schema ist weniger wichtig als der Standard selbst.

Ich könnte mir eine Welt vorstellen, in der wir provider-spezifische Schemata der Kürze halber verwenden, während die Standardstruktur erhalten bleibt:

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

Unabhängig vom exakten Syntax sind die Kernvorteile unbestreitbar:

  1. Portabilität: Kopiere und füge deine gesamte Konfiguration von einem lokalen Skript in einen Cloud-Worker ein.
  2. CLI-freundlich: Übergib ein einzelnes Argument an deine Skripte. my-agent --model "llm://..." schlägt my-agent --model gpt-4 --temp 0.7 --key $KEY --host ....
  3. Sprachunabhängig: Jede Programmiersprache hat einen robusten URL-Parser. Wir bekommen Validierung, Parsing und Sanitisierung gratis dazu.
Die Datenbankwelt brauchte Jahrzehnte, um das herauszufinden.
Gute Nachricht – in KI-Zeitlinien ist das nur etwa ein halbes Vibe-Jahr her.

Fazit

Wir brauchen keinen weiteren komplexen Konfigurationsstandard oder eine neue YAML-basierte Manifest-Datei. Wir müssen nur das eine Werkzeug verwenden, das seit 30 Jahren für den Rest des Internets funktioniert.

Hör auf, das Rad neu zu erfinden, und fang an, unsere LLM-Verbindungen mit dem gleichen Respekt zu behandeln wie unsere Datenbankverbindungen. Deine .env-Datei (und deine Nerven) werden es dir danken.

ein chaotisches Env-Var-Schubladen-Regal