Skip to main content
Когда вы вызываете нативный формат Gemini (/v1beta generateContent), ответ использует структуру Google candidates / parts, отличную от режима совместимости с OpenAI. На этой странице показано, как разбирать как ответ без потоковой передачи (generateContent), так и ответ с потоковой передачей (streamGenerateContent).
Сторона запроса (base_url — https://api.apiyi.com без /v1, x-goog-api-key аутентификации, thinking_level управления) описана в Руководстве по нативному формату Gemini. Эта страница посвящена только стороне ответа. В примерах используется облегченная модель gemini-3.1-flash-lite.

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

Эндпоинт …:generateContent. Ответ находится в candidates[0].content.parts[]:
Чтобы получить ответ, нужно итерировать parts и конкатенировать каждый text:
finishReason — это в верхнем регистре STOP (а не строчный stop в OpenAI); другие значения включают MAX_TOKENS и SAFETY. part может содержать только thoughtSignature и не содержать text, поэтому при итерации фильтруйте по if "text" in p, иначе возникнет KeyError.

Сигнатура мысли

Модели серии Gemini 3 прикрепляют thoughtSignature (зашифрованное состояние рассуждения) к фрагментам — в тестировании даже облегчённый gemini-3.1-flash-lite возвращает его.
  • Один ход: не нужно; игнорируйте это.
  • Многоходовый / вызов функций: передавайте thoughtSignature предыдущего ответа обратно дословно в contents следующего хода, чтобы модель могла продолжить цепочку рассуждения. Официальный google-genai SDK делает это автоматически; при ручной записи REST не пропускайте это поле. См. Вызов функций Gemini.
Это ключевое отличие от режима совместимости с OpenAI: в режиме совместимости модели рассуждения без состояния и не предоставляют сигнатуру; только нативный формат содержит thoughtSignature, который нужно возвращать между ходами.

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

Эндпоинт …:streamGenerateContent. Каждая строка — data: {...}, а приращение каждого чанка находится в candidates[0].content.parts[0].text:
Через шлюз APIYI потоковая передача всегда возвращает строки SSE data:?alt=sse или без него), и завершающего [DONE] нет — завершение происходит на чанке, у которого finishReason == "STOP". Этот последний чанк обычно содержит только thoughtSignature и не содержит text.
usageMetadata присутствует в каждом чанке и является накопительным (candidatesTokenCount растет по мере вывода) — просто возьмите значение последнего чанка; ручное суммирование не требуется.

Ключевые отличия от режима, совместимого с OpenAI

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

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