Гайд · TNWS AI
Как подключить Chat API vLLM и проверить model ID до первого запроса
Запускаем vLLM с чат-моделью, получаем фактический model ID и проверяем форму ответа без предположений о содержимом.
Задача и применимость
Вопрос читателя: «как подключить локальный vLLM Chat Completions API». Для vLLM online serving и текстовой модели с chat template; документация сервера проверена 20 сентября 2026 года. Локальный пример предполагает заранее скачанный совместимый checkpoint и разрешение на его использование. Номер версии зафиксируйте через установленный пакет: документация latest со временем меняется.
Для воспроизводимости запишите фактическую версию установленного vLLM, модельный checkpoint и параметры запуска. Путь /models/your-chat-checkpoint либо /models/your-embedding-checkpoint в команде ниже — заполнитель, а не реальный файл. Наличие GPU, объём памяти и условия лицензии весов проверяются до запуска. Демонстрация не утверждает, что ответ модели заранее известен по буквам.
Проверенные возможности
Официальный сервер поддерживает /v1/chat/completions для генеративных моделей с chat template; идентификатор модели передают в поле model. Пример документации запускает vllm serve и отправляет messages. Разработчики отдельно предупреждают: параметр user игнорируется, а совместимость специфических полей следует проверять.
Пошаговая процедура
- Уточните, что checkpoint является чат-моделью с собственным chat template.
- Запустите сервер только на локальном адресе для теста.
- Получите GET /v1/models и возьмите реальный data[0].id.
- Передайте системное и пользовательское сообщения в /v1/chat/completions.
- Проверьте choices и сохранившийся model id прежде, чем подключать интерфейс.
Команда для тестового запуска на локальном адресе (подставьте законно полученный checkpoint):
vllm serve /models/your-chat-checkpoint --host 127.0.0.1 --port 8000
Готовый запрос и контроль ответа
В приведённом фрагменте используется стандартная библиотека Python и простой общий помощник для отправки JSON. Подставьте при необходимости Bearer-токен через защищённую переменную окружения и проверьте, что ваш сервер его ожидает.
import json, urllib.request
BASE = "http://127.0.0.1:8000"
def call(path, payload):
data = json.dumps(payload, ensure_ascii=False).encode("utf-8")
request = urllib.request.Request(BASE + path, data=data,
headers={"Content-Type": "application/json"}, method="POST")
with urllib.request.urlopen(request, timeout=120) as reply:
return json.load(reply)
model = json.load(urllib.request.urlopen(BASE + "/v1/models"))["data"][0]["id"]
payload = {"model": model, "messages": [
{"role": "system", "content": "Отвечай только по данному тексту."},
{"role": "user", "content": "Текст: доставка по будням. Когда доставка?"}],
"stream": False, "max_tokens": 80}
answer = call("/v1/chat/completions", payload)
print(answer["choices"][0]["message"]["content"])
Пример входа и ожидаемого результата
На входе короткое правило «доставка по будням». Ожидаемый смысл ответа — доставка по будням; модель может сформулировать его иначе. Обязательная техническая проверка: есть choices[0].message.content, а ID берётся именно из /v1/models, не из названия файла наугад.
Как интерпретировать результат
Не путайте доступность порта и готовность полезного ответа. Сервер может запуститься, а конкретный checkpoint иметь несовместимый чат-шаблон; тогда сообщение user сериализуется плохо либо запрос вернёт ошибку. Сначала проделайте контрольный опыт из двух строк с известным ответом. Если он неудачен, исследуйте логи модели и формат template, а не меняйте сразу десять параметров сэмплирования. При создании приложения зафиксируйте checkpoint, версию vLLM и команду запуска, иначе повторение теста через месяц может описывать другую конфигурацию.
Развёртывание без потери контекста
Список /v1/models полезен для обнаружения реального имени загруженной модели. Когда клиент отправляет неизвестную строку model, сложнее понять: сломался сервер или не совпали имена. Проверяйте ответ на этапе инициализации и явно сообщайте оператору о пустом списке. Для русскоязычного продукта проверьте контрольные вопросы на кириллице, числах и отрицаниях. То, что модель технически отвечает по-русски, не доказывает корректного понимания фактов; исследуйте отдельную подборку с ожидаемыми ответами.
Проверки качества и границы метода
После успешного запроса не переносите диагностический адрес 127.0.0.1 прямо в фронтенд пользователя. Браузер клиента не обращается к localhost вашего сервера; ему потребуется ваш защищённый backend. Отделите auth приложения от auth модели и ограничьте вывод в логи. Если модель не смогла ответить по входной строке, выводите отказ, а не подставляйте внешние знания. Для миграции SDK сначала проверьте OpenAI-подобную структуру на своей сборке: название интерфейса не является обещанием абсолютной совместимости всех параметров.
План проверки включает также второй вопрос без ответа во входе: «Работает ли доставка ночью?» Ожидаемое поведение по инструкции — не заявлять время ночной доставки. Если ответ выдуман, причина может быть в модели, system-инструкции или длине контекста; HTTP 200 при этом всё равно означает лишь успешный обмен данными. Сохраняйте эти два теста как регрессионные после смены веса или настроек запуска.
Критерии готовности
- Фактический model id получен из сервера.
- Структура ответа содержит choices[0].message.content.
- Ответ опирается на указанное условие о буднях.
Типичные ошибки и чего не делать
- Не выдумывать модельный ID.
- Не считать HTTP 200 подтверждением фактов.
- Не подключать публичный фронтенд напрямую к локальному API.
Частые вопросы
Нужен ли шаблон чата?
Да, Chat API рассчитан на модель с chat template.
Где узнать model?
В ответе /v1/models.
Хранит ли один запрос историю другого?
Передавайте историю явно в messages.
Официальные источники
Частые вопросы
Нужен ли шаблон чата?
Да, Chat API рассчитан на модель с chat template.
Где узнать model?
В ответе /v1/models.
Хранит ли один запрос историю другого?
Передавайте историю явно в messages.
Читайте также
Как извлечь JSON по схеме в vLLM через response_format
Схема для извлечения артикула и количества из текста: разбираем ответ и проверяем значения против исходника.
Как обработать named tool call в vLLM без произвольного выполнения кода
Требуем вызов одной безопасной функции, валидируем аргументы и не отдаём модели право запускать произвольные команды.
Как ограничить ответ vLLM вариантами choice при классификации заявок
Получаем одну из заранее разрешённых меток и отдельно проверяем, что классификация совпала с текстом обращения.
Комментарии
Пока тихо. Скажите первое слово