vLLM выкатил исправление в 0.32.0rc0: флаг --allowed-origins теперь по умолчанию пустой вместо ["*"]. На версии 0.31 без API-ключа любой сайт через браузер мог отправлять запросы к серверу и читать ответы — ваше GPU-время горело даром. В чём была дыра. Флаг --allowed-origins с дефолтом ["*"] открывал CORS для всех origin'ов. Добавить --api-key не помогало: защищёнными оказались только /v1, /v2, /inference и /cohere, а вот /invocations, /score и /pooling оставались доступны без ключа. Браузерный JS любого сайта мог слать запросы и получать ответы. Что изменилось в 0.32. По умолчанию vLLM теперь отвечает кодом 400 на preflight-запросы и не пробрасывает заголовок Access-Control-Allow-Origin. Если ваше веб-приложение обращается к vLLM напрямую из браузера — оно сломается. Придётся явно задать --allowed-origins со списком разрешённых доменов. Автор не запускал vLLM на GPU и не тестировал на реальном железе — только на тестовом Starlette-приложении. Поведение может отличаться, если перед vLLM стоит NGINX или API-шлюз, который добавляет свои CORS-заголовки. Что это значит: если вы держите vLLM открытым или проксируете через NGINX — проверьте свои эндпоинты и настройте --allowed-origins до обновления на 0.32.