DanLevy.net

Пора вводить строки подключения для LLM

Упрощаем конфигурацию моделей и провайдеров с помощью llm:// URL

Обновление: Эта статья привела к появлению Internet-Draft для URI-схемы llm://.

Помните те мрачные времена, когда подключение к базе данных означало жонглирование разношёрстным набором переменных окружения?

Это была башня из хрупких конфигов. DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME… или погодите, может DB_USERNAME? Это DB_PASS или DB_PWD? Нужны ли на этот раз префиксы PG_*? И куда, чёрт возьми, делся таймаут?

Это был карточный домик, готовый рухнуть при первом же деплое из-за того, что вы забыли написать HOST с большой буквы.

А потом кому-то пришла гениальная идея — просто использовать URL¹:

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

Одна строка. Всё, что нужно. Универсально парсится. Переносима. Осмелюсь сказать… красиво?

Так почему мы обращаемся с LLM так, будто на дворе 1999-й?

Взрыв переменных окружения

Прямо сейчас мой .env выглядит как кладбище заброшенных API-ключей. OPENAI_API_KEY, ANTHROPIC_API_KEY, MISTRAL_API_KEY, GROQ_API_KEY. И не дай бог заговорить про Azure — там нужны эндпоинт, имя развёртывания, версия API и ключ, чтобы просто сказать «привет».

Это не просто уродливо — это трение. Каждый раз, когда я хочу сменить модель или протестировать нового провайдера, я переписываю инициализационный код, охочусь за документацией по конкретным именам параметров и добавляю три новых строки в конфигурацию окружения.

Что если мы просто… украдём позаимствуем идею DB URL?

Представляем строки подключения для LLM

Представьте, что вы настраиваете весь интерфейс модели одной строкой:

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


Анатомия строки подключения LLM

составные части строки подключения LLM

Схема — llm://. Хост — базовый URL API провайдера. Путь — имя модели. А параметры запроса отвечают за все опции времени выполнения, которые обычно засоряют ваш код.

Нужна аутентификация? Отлично, добавляем.

Прямо как в postgres://, мы можем встроить аутентификацию прямо в строку:

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

Примечание: Да, помещать учётные данные в URL может быть небезопасно, если вставлять их в публичные логи. Но современные системы логирования неплохо умеют вычищать такие паттерны, и, честно говоря, разве вы обращаетесь со своим .env намного лучше? Проверяйте, очищайте и используйте с осторожностью.

Отказоустойчивость? А почему бы и нет.

Многие библиотеки для работы с базами данных поддерживают round-robin failover, указывая несколько хостов. Почему наши AI-агенты не заслуживают такой же надёжности?

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

Это s в llms:// — не опечатка. Это множественное число. Если primary.gpt зависает, клиент автоматически переходит на backup.gpt. Никакой сложной логики роутера.

Одна строка — всё от аутентификации до эндпоинта и гиперпараметров.

Альтернативные форматы

Я не привязан именно к llm://. Конкретная схема важна меньше, чем сам стандарт.

Можно представить мир, где мы используем схемы, специфичные для провайдеров, сохраняя при этом стандартную структуру:

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

Независимо от точного синтаксиса, основные преимущества неоспоримы:

  1. Переносимость: Скопируйте и вставьте всю конфигурацию из локального скрипта в облачный воркер.
  2. Удобство для CLI: Передавайте один аргумент в скрипты. my-agent --model "llm://..." побеждает my-agent --model gpt-4 --temp 0.7 --key $KEY --host ....
  3. Языковая независимость: В каждом языке программирования есть надёжный парсер URL. Мы получаем валидацию, разбор и санацию бесплатно.
Миру баз данных потребовались десятилетия, чтобы до этого додуматься.
Хорошая новость: по AI-меркам это всего полвибро-года назад.

Вердикт

Нам не нужен очередной сложный стандарт конфигурации или новый YAML-манифест. Нам просто нужно использовать тот инструмент, который работает для остального интернета последние 30 лет.

Давайте перестанем изобретать велосипед и начнём относиться к своим LLM-подключениям с тем же уважением, что и к базам данных. Ваш .env (и ваш рассудок) скажут вам спасибо.

беспорядок из переменных окружения