DanLevy.net

Пора ввести connection strings для LLM

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

Обновление: Благодаря этой статье появился 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 и ключ, просто чтобы сказать «привет».

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

А что если просто… стащить позаимствовать идею connection strings из мира баз данных?

Представляем connection strings для 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


Анатомия connection string для LLM

части connection string для LLM

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

Нужна авторизация? Отлично, добавьте её.

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

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

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

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

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

Итог

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

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

ящик с переменными окружения в беспорядке