Гайд · TNWS AI

Как включить streaming в Groq API и правильно собрать ответ из chunks

5 мин

Потоковый Chat Completion через stream=True: обработка delta.content, пустых дельт, завершения потока и проверка собранного ответа.

Что решает этот гайд

Материал отвечает на запрос «как включить streaming Groq API». Все параметры и ограничения сверены 12 сентября 2026 года с официальной документацией Groq. Задача статьи — получить воспроизводимый результат и показать, как доказать его корректность, а не ограничиться фразой «запрос сработал».

Применимость

Groq Chat Completions в Python, включая синхронный и асинхронный клиенты. Поток возвращает итератор дельт вместо одного полного объекта.

Перед внедрением откройте страницы Models и Limits своей организации. Модельный каталог и персональные квоты меняются, поэтому статья не подменяет живую проверку. Зафиксируйте model id, версию SDK и контрольный вход в журнале теста.

Подтвержденные факты

  • Streaming включается параметром stream=True.
  • Синхронный результат итерируется обычным for.
  • AsyncGroq поддерживает async for по chunks.
  • Текст находится в chunk.choices[0].delta.content и может быть пустым в служебном событии.

Groq использует OpenAI-подобную структуру Chat Completions: массив messages, выбранную model, choices, finish_reason и usage. При этом совместимость не означает равенство всех параметров. Проверяйте документацию конкретной возможности и не отправляйте неизвестные поля «на всякий случай».

Пошаговая настройка

  1. Сформулируйте машинный критерий: точная строка, валидная JSON Schema, допустимый tool call или определенный HTTP-код. Субъективное «ответ нормальный» не подходит.
  2. Создайте отдельный ключ для dev/stage/prod и храните его как GROQ_API_KEY на backend. Не включайте Authorization в логи, браузерный bundle и репозиторий.
  3. Скопируйте актуальный model id из Groq Console и проверьте поддержку нужной функции. Возможность Chat Completion не гарантирует structured output, reasoning или кэш.
  4. Выполните минимальный пример ниже. На первом прогоне отключите собственные retry и middleware, чтобы увидеть исходный HTTP-код и тело ошибки.
  5. Сравните ответ с условием: Три пункта появляются постепенно, итоговая строка совпадает с показанным текстом, а завершение потока подтверждено finish_reason.
  6. Проведите отрицательный тест: неподдерживаемый параметр, невалидные аргументы, испорченная строка JSONL или искусственный 429/498. Ошибка должна обрабатываться явно.
  7. Затем добавьте ограниченные повторы, jitter, таймаут и метрики. Не повторяйте 400; исправляйте тело. Для 429 уважайте retry-after, для Flex отдельно обрабатывайте 498.

Рабочий пример

from groq import Groq
client=Groq(); parts=[]; finish=None
stream=client.chat.completions.create(
 model="llama-3.3-70b-versatile", stream=True,
 messages=[{"role":"user","content":"Дай три пункта проверки резервной копии"}])
for chunk in stream:
    if chunk.choices:
        text=chunk.choices[0].delta.content or ""
        parts.append(text); print(text,end="",flush=True)
        finish=chunk.choices[0].finish_reason or finish
answer="".join(parts)
assert answer.strip() and finish is not None

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

Готовый промпт для проверки

Ты инженер приемки Groq API. Проверь приложенные request и response для сценария «как включить streaming Groq API».
Верни таблицу: проверка | фактическое значение | PASS/FAIL | исправление.
Обязательно проверь HTTP-код, model, finish_reason, usage и условие результата.
Не восстанавливай отсутствующие поля и не считай HTTP 200 достаточным.

Перед передачей логов удалите ключ, персональные данные и лишний prompt. Решение о PASS принимает код по заданным правилам; языковая модель может только помочь найти несоответствия.

Контрольный вход и ожидаемый результат

Контрольный вход встроен в пример. Сохраните точные messages, model id и параметры. Сначала выполните пять одинаковых запросов, затем меняйте ровно один параметр. Это отделяет случайность генерации от ошибки конфигурации.

Ожидаемый результат: Три пункта появляются постепенно, итоговая строка совпадает с показанным текстом, а завершение потока подтверждено finish_reason.

HTTP 200 подтверждает транспорт, но не формат и смысл. Проверяйте choices, finish_reason, непустой content, JSON Schema, аргументы инструментов или полноту batch-результатов. Отсутствующее поле нельзя молча заменять нулем: это скроет обрыв streaming или изменение SDK.

Критерии приемки

  • пустые delta разрешены
  • части склеиваются без разделителей
  • finish_reason сохранен
  • обрыв считается ошибкой
  • таймаут настроен

Сохраняйте request id, model, длительность, число входных и выходных токенов и итог локальной проверки. Для streaming отдельно измеряйте время первого токена и факт финального события. Для batch сверяйте множество custom_id, а не порядок строк.

Типичные ошибки и что не делать

  • Печатать None как текст.
  • Считать закрытие соединения гарантией полного ответа.
  • Парсить каждый текстовый chunk как самостоятельный JSON.

Не запускайте бесконечный retry. Четырехсотые ошибки чаще означают неверный запрос; повтор не исправит schema или model id. При временном отказе ограничьте число попыток, добавьте экспоненциальную задержку и случайный разброс, а после исчерпания верните задачу в очередь.

Не измеряйте качество одним красивым ответом. Соберите 20–50 обезличенных кейсов: короткий и длинный ввод, кириллица, пустое поле, конфликт инструкций, невалидный enum и превышение лимита. Проверяйте долю технических успехов и долю ответов, прошедших бизнес-валидацию, отдельно.

Проверка результата на реальных данных

Для классификации возьмите размеченные обращения, для JSON — набор граничных типов, для tools — разрешенные и запрещенные аргументы. У каждого примера должно быть машинное условие. После смены модели, SDK или system prompt прогоните весь набор заново.

Полезная итоговая метрика — стоимость и задержка одного валидного результата. Она учитывает отбраковку, retry и ошибки формата. Средняя скорость успешного HTTP-запроса не показывает, сколько ответов реально пригодны пользователю.

FAQ

Достаточно ли одного успешного запроса?

Нет. Нужна серия и минимум один отрицательный тест.

Где брать точные model id и лимиты?

В актуальных разделах Models и Limits Groq Console для вашей организации.

Можно ли хранить GROQ_API_KEY в браузере?

Нет. Постоянный ключ должен оставаться на backend или в менеджере секретов.

Что логировать?

Request id, model, HTTP-код, finish_reason, usage, длительность и результат валидации — без ключа и лишних персональных данных.

Официальный источник

Частые вопросы

Достаточно ли HTTP 200?

Нет, проверьте finish_reason, usage и бизнес-условие.

Где брать model id?

В актуальном разделе Models Groq Console.

Можно ли хранить ключ в браузере?

Нет, постоянный ключ хранится на backend.

Нужен ли негативный тест?

Да, он доказывает безопасную обработку отказа.

Читайте также

Комментарии

Пока тихо. Скажите первое слово