Skip to main content
Когда вы вызываете совместимый режим, каждая модель — OpenAI, Claude, Gemini, Grok, Qwen, GLM и другие — возвращает одну и ту же схему OpenAI. Почти вся ваша логика парсинга общая: следуйте приведенным ниже шаблонам, и при переключении моделей не потребуется менять код. Эта страница помогает сразу правильно настроить обработку ответов: сначала общее, затем одна таблица с немногими различиями, которые вам нужно учитывать (и ни одно из них не мешает интеграции).
Сторона запроса (base_url, auth, переключение моделей) описана в Вызовы в совместимом режиме. Эта страница посвящена исключительно стороне ответа: тому, как разбирать полученные данные.

Два режима, один endpoint

Один и тот же endpoint /v1/chat/completions; только флаг stream меняет форму:

Ответ без потоковой передачи

Стабильная структура — просто прочитайте choices[0].message.content:
Вывод без потоковой передачи очень стабилен во всех основных моделях — choices[0].message.content работает везде. Некоторые модели (например, семейство OpenAI) также добавляют annotations и refusal в message; читайте их, если они вам нужны, и игнорируйте, если нет.

Потоковый ответ (SSE)

Потоковая передача отправляет фрагменты как Server-Sent Events, по одному в строке как data: {...}, завершаясь data: [DONE]:
С официальным SDK просто выполняйте итерацию; суть в накоплении delta.content:

Примечания по интеграции: несколько различий, обрабатываемых единообразно

Детали потоковой передачи немного различаются между моделями, но соблюдение правил ниже позволяет одному кодовому пути покрыть их все.
choices последнего чанка может быть пустым массивом. Последний чанк, который содержит usage, у некоторых моделей (gpt-4.1-mini, grok, qwen, glm) — "choices":[]; индексация choices[0] там вызывает ошибку. Проверьте, что choices не пустой, прежде чем читать его.

Надежный парсер ссылок

Когда вы обрабатываете raw SSE самостоятельно (без SDK), это покрывает все различия выше:
Модели рассуждения (grok, qwen, glm и т. д.) сначала передают в поток delta.reasoning_content (chain of thought), затем delta.content (ответ). Парсер выше читает только content, поэтому thinking пропускается автоматически. Чтобы отобразить thinking, см. Вывод модели рассуждения.

Использование и тарификация

  • usage возвращается встроенно в ответах без потоковой передачи; при потоковой передаче оно приходит в завершающем фрагменте (место указано в таблице выше — «записывайте всякий раз, когда присутствует»).
  • Разбивка полей отличается: семейство OpenAI добавляет completion_tokens_details, Gemini/Claude добавляют input_tokens/output_tokens, модели с reasoning добавляют reasoning_tokens. Ориентируйтесь на три стандартных поля: prompt_tokens / completion_tokens / total_tokens.
Не доверяйте потоковому total_tokens. При тестировании некоторые модели (например, gpt-5.4-mini) выдают завершающий фрейм, где total ≠ prompt + completion, тогда как у той же модели в режиме без потоковой передачи все корректно. Списывайте по выписке по вашему счету, а не по этому потоковому фрейму.

Связанные ссылки