Включите SSE#
Установите stream: true и stream_options: { include_usage: true }. Читайте каждую строку data как JSON; добавляйте choices[0].delta.content, когда он присутствует. Не считайте, что сетевой фрагмент является одним событием.
Завершение и использование#
finish_reason закрывает выбор; финальный кадр использования может прийти отдельно. Останавливайтесь только на [DONE] или терминальной ошибке. Сохраняйте итоги использования, а не оценивайте токены по символам.
Прерванные запросы#
Шлюз сохраняет расчётное резервирование до тех пор, пока не станет доступно подтверждённое использование у провайдера. Обрыв соединения в браузере не является доказательством того, что провайдер прекратил генерацию. Если итоговое использование отсутствует, резервирование остаётся в ожидании сверки, а не молча списывает оценку.
Доставка в браузер#
Держите API-ключ на сервере. Используйте собственную конечную точку того же происхождения для пересылки SSE в браузер; см. рецепт потоковой передачи в браузер.
Пример запроса
curl https://weightsapi.com/v1/chat/completions \
-H "Authorization: Bearer $WEIGHTSAPI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-32B",
"messages": [
{
"role": "user",
"content": "Hello!"
}
],
"stream": true
}'