Skip to content

Google Gemini API

Google Gemini API — это нативный протокол генеративного ИИ от Google. Если ваш клиент уже разработан в соответствии со спецификациями SDK Google GenAI, просто переключите Base URL и API Key на RouteAPI для прямого использования без переписывания структуры запросов.

Gemini API использует уникальный дизайн, где имя модели встроено в путь URL. Тело запроса использует массив contents для выражения разговоров, каждое сообщение имеет роль user или model (обратите внимание: не assistant). Структура ответа использует обертку массива candidates, поддерживая фильтрацию безопасности и генерацию нескольких кандидатов.

Сценарии использования:

СценарийОписание
SDK Google GenAISDK Python / Node.js google-generativeai, измените только base_url
Клиент REST GeminiПриложения, уже разработанные для REST API Gemini
Мультимодальные приложенияСценарии, требующие нативной поддержки ввода изображений, видео, аудио
Экспорт Google AI StudioКод, экспортированный из AI Studio, можно напрямую мигрировать

Если ваш клиент поддерживает только протокол OpenAI, используйте вместо этого Chat Completions. RouteAPI выполнит необходимую адаптацию формата внутри, но приоритет протоколу, нативно поддерживаемому вашим клиентом, обеспечивает лучшую совместимость.

Дизайн конечных точек Gemini API отличителен: имя модели напрямую встроено в путь URL.

POST /v1beta/models/{model}:generateContent

Пример полного адреса:

https://api.routeapi.ai/v1beta/models/gemini-1.5-pro:generateContent

Потоковая конечная точка:

https://api.routeapi.ai/v1beta/models/gemini-1.5-pro:streamGenerateContent

Замените часть {model} фактическим именем модели, таким как gemini-1.5-pro, gemini-1.5-flash, gemini-2.0-flash-exp и т.д. Обратите внимание, что между именем модели перед двоеточием и именем метода после него нет пробела.

Заголовки запроса:

Authorization: Bearer sk-your-routeapi-token
Content-Type: application/json

Все протоколы используют один и тот же тип токена RouteAPI. Сохраняйте токен на стороне сервера и не раскрывайте его в браузерах, мобильных устройствах или публичных репозиториях.

ПолеТипОбязательноОписание
contentsarrayДаСписок контента разговора, минимум одна запись
generationConfigobjectНетПараметры конфигурации генерации
safetySettingsarrayНетНастройки фильтрации безопасности
systemInstructionobjectНетСистемная инструкция, независимое поле
toolsarrayНетОпределения инструментов вызова функций
toolConfigobjectНетКонфигурация вызова инструментов

Пример базового запроса:

{
"contents": [
{
"role": "user",
"parts": [
{ "text": "Пожалуйста, представьте RouteAPI в одном предложении" }
]
}
],
"generationConfig": {
"temperature": 0.7,
"maxOutputTokens": 1024
}
}

Уникальная структура contents

Section titled “Уникальная структура contents”

Gemini API использует трехуровневую вложенную структуру:

  1. Массив contents содержит несколько сообщений
  2. Каждое сообщение имеет поля role и parts
  3. Массив parts содержит фактические блоки контента

Ключевые отличия:

  • role может быть только user или model (не assistant)
  • Контент должен быть размещен в массиве parts, каждый элемент является объектом part
  • Поддерживает мультимодальные parts: текст, изображения, видео, аудио могут быть смешаны в parts одного сообщения
{
"contents": [
{
"role": "user",
"parts": [
{ "text": "Проанализируйте это изображение" },
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "данные изображения в кодировке base64..."
}
}
]
},
{
"role": "model",
"parts": [
{ "text": "Это изображение, показывающее..." }
]
}
]
}
ПараметрТипОписание
temperaturenumberТемпература сэмплирования, диапазон 0 до 2, по умолчанию 1.0
topPnumberПараметр nucleus sampling, по умолчанию 0.95
topKintegerСэмплировать только из K токенов с наивысшей вероятностью
maxOutputTokensintegerМаксимальное количество выходных токенов
stopSequencesarrayПользовательские последовательности остановки, максимум 5
candidateCountintegerКоличество кандидатов для генерации, по умолчанию 1
responseMimeTypestringФормат ответа, например "application/json"
responseSchemaobjectJSON Schema для ограничения структуры вывода

Пример:

{
"generationConfig": {
"temperature": 0.9,
"topP": 0.95,
"topK": 40,
"maxOutputTokens": 2048,
"stopSequences": ["END", "STOP"]
}
}

Системная инструкция — независимое поле, не в contents:

{
"systemInstruction": {
"parts": [
{ "text": "Вы строгий технический помощник, который даёт краткие ответы." }
]
},
"contents": [
{
"role": "user",
"parts": [{ "text": "Объясните, что такое API-шлюз" }]
}
]
}

Управляет уровнями фильтрации безопасности контента:

{
"safetySettings": [
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_MEDIUM_AND_ABOVE"
}
]
}

Общие категории: HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT.

Варианты порогов: BLOCK_NONE, BLOCK_LOW_AND_ABOVE, BLOCK_MEDIUM_AND_ABOVE, BLOCK_ONLY_HIGH.

Мультимодальный контент

Section titled “Мультимодальный контент”

Gemini API нативно поддерживает мультимодальный ввод через различные типы в массиве parts.

{ "text": "Это текстовый контент" }

Встроенное изображение (base64)

Section titled “Встроенное изображение (base64)”
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "/9j/4AAQSkZJRgABAQAAAQ..."
}
}

Поддерживаемые форматы изображений: image/jpeg, image/png, image/webp, image/heic, image/heif.

{
"fileData": {
"mimeType": "image/jpeg",
"fileUri": "https://example.com/image.jpg"
}
}
{
"fileData": {
"mimeType": "video/mp4",
"fileUri": "gs://bucket-name/video.mp4"
}
}

Поддержка видео: video/mp4, video/mpeg, video/mov и т.д. Поддержка аудио: audio/wav, audio/mp3, audio/aac и т.д.

Пример смешанного мультимодального контента

Section titled “Пример смешанного мультимодального контента”
{
"contents": [
{
"role": "user",
"parts": [
{ "text": "Проанализируйте связь между этим видео и этим изображением" },
{
"fileData": {
"mimeType": "video/mp4",
"fileUri": "gs://my-bucket/video.mp4"
}
},
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "base64..."
}
}
]
}
]
}
{
"candidates": [
{
"content": {
"parts": [
{
"text": "RouteAPI — это API-шлюз, который объединяет управление несколькими поставщиками моделей ИИ."
}
],
"role": "model"
},
"finishReason": "STOP",
"safetyRatings": [
{
"category": "HARM_CATEGORY_HARASSMENT",
"probability": "NEGLIGIBLE"
}
]
}
],
"usageMetadata": {
"promptTokenCount": 12,
"candidatesTokenCount": 18,
"totalTokenCount": 30
}
}
ПолеОписание
candidatesМассив ответов-кандидатов, по умолчанию один
candidates[].contentСгенерированный контент, та же структура, что и элемент contents в запросе
candidates[].content.roleВсегда "model"
candidates[].finishReasonПричина завершения
candidates[].safetyRatingsДетали оценки безопасности
usageMetadataСтатистика использования токенов
ЗначениеЗначение
STOPМодель завершилась естественно
MAX_TOKENSДостигнут лимит maxOutputTokens
SAFETYЗаблокировано из-за срабатывания фильтра безопасности
RECITATIONЗаблокировано из-за обнаружения повторяющегося контента
OTHERДругие причины
ПолеОписание
promptTokenCountКоличество входных токенов
candidatesTokenCountКоличество выходных токенов (сумма всех кандидатов)
totalTokenCountОбщее количество токенов
cachedContentTokenCountКоличество кэшированных токенов (если используется кэширование контекста)

Используйте конечную точку streamGenerateContent для реализации потокового ответа:

POST /v1beta/models/{model}:streamGenerateContent

Потоковый ответ использует формат SSE (Server-Sent Events), каждое событие является объектом JSON:

data: {"candidates":[{"content":{"parts":[{"text":"RouteAPI"}],"role":"model"},"finishReason":""}],"usageMetadata":{"promptTokenCount":12,"candidatesTokenCount":1,"totalTokenCount":13}}
data: {"candidates":[{"content":{"parts":[{"text":" это"}],"role":"model"},"finishReason":""}],"usageMetadata":{"promptTokenCount":12,"candidatesTokenCount":3,"totalTokenCount":15}}
data: {"candidates":[{"content":{"parts":[{"text":" API-шлюз"}],"role":"model"},"finishReason":""}],"usageMetadata":{"promptTokenCount":12,"candidatesTokenCount":5,"totalTokenCount":17}}
data: {"candidates":[{"content":{"parts":[{"text":""}],"role":"model"},"finishReason":"STOP","safetyRatings":[{"category":"HARM_CATEGORY_HARASSMENT","probability":"NEGLIGIBLE"}]}],"usageMetadata":{"promptTokenCount":12,"candidatesTokenCount":18,"totalTokenCount":30}}

Характеристики потока:

  • Каждый chunk — это полный объект JSON, содержащий полную структуру candidates
  • finishReason — пустая строка для продолжения, имеет значение для указания завершения
  • Последний chunk содержит полные safetyRatings и финальные usageMetadata
  • Потоковый ответ не имеет явного маркера [DONE], полагается на finishReason для определения завершения

Вызов функций (Function Calling)

Section titled “Вызов функций (Function Calling)”

Gemini API поддерживает вызов функций, позволяя модели вызывать внешние инструменты.

Определение инструмента

Section titled “Определение инструмента”
{
"tools": [
{
"functionDeclarations": [
{
"name": "get_weather",
"description": "Запросить текущую погоду для указанного города. Используйте полное название города.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Название города, например Москва"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["city"]
}
}
]
}
]
}

Модель возвращает запрос вызова функции:

{
"candidates": [
{
"content": {
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": {
"city": "Москва",
"unit": "celsius"
}
}
}
],
"role": "model"
},
"finishReason": "STOP"
}
]
}

Возврат результатов функции

Section titled “Возврат результатов функции”

Вернуть результаты выполнения функции как новое сообщение user:

{
"contents": [
{
"role": "user",
"parts": [{ "text": "Какая сейчас погода в Москве?" }]
},
{
"role": "model",
"parts": [
{
"functionCall": {
"name": "get_weather",
"args": { "city": "Москва", "unit": "celsius" }
}
}
]
},
{
"role": "user",
"parts": [
{
"functionResponse": {
"name": "get_weather",
"response": {
"content": "Москва, солнечно, температура 23 градуса Цельсия, влажность 45%."
}
}
}
]
}
]
}

Сравнение с форматом OpenAI

Section titled “Сравнение с форматом OpenAI”

Таблица сравнения структур

Section titled “Таблица сравнения структур”
ЭлементGemini APIOpenAI Chat Completions
Формат конечной точки/v1beta/models/{model}:generateContent/v1/chat/completions
Указание моделиВ пути URLПоле model тела запроса
Поле массива разговораcontentsmessages
Структура сообщенияrole + массив partsrole + строка/массив content
Имена ролейuser / modeluser / assistant / system
Системная инструкцияОбъект systemInstructionrole: "system" в messages
Обертка ответаМассив candidatesМассив choices
Расположение контента ответаcandidates[0].content.parts[0].textchoices[0].message.content
Поле причины завершенияfinishReasonfinish_reason
Поле статистики использованияusageMetadatausage

Таблица сопоставления параметров

Section titled “Таблица сопоставления параметров”
Gemini APIOpenAI Chat CompletionsПримечания
generationConfig.temperaturetemperatureGemini макс 2, OpenAI тоже 2
generationConfig.topPtop_pРазный стиль именования
generationConfig.topKНет эквивалентаOpenAI не поддерживает
generationConfig.maxOutputTokensmax_tokens / max_completion_tokensРазное имя поля
generationConfig.stopSequencesstopРазное имя
generationConfig.candidateCountnТа же семантика
generationConfig.responseMimeTyperesponse_format.typeРазный метод управления
generationConfig.responseSchemaresponse_format.json_schemaРазная иерархия
safetySettingsНет эквивалентаOpenAI использует API модерации контента
tools[].functionDeclarationstools[].functionРазный уровень обертки
toolConfigtool_choiceРазное имя поля и структура

Соображения при миграции

Section titled “Соображения при миграции”

При миграции с OpenAI на Gemini API проверьте в следующем порядке:

  1. Переместить имя модели в путь URL: /v1beta/models/gemini-1.5-pro:generateContent
  2. Переименовать messages в contents, изменить структуру каждого сообщения на role + массив parts
  3. Изменить все роли assistant на model
  4. Изменить поле content на массив parts, обернуть текстовый контент как { "text": "..." }
  5. Переместить системный промпт из массива messages в объект systemInstruction
  6. Обернуть параметры генерации в объект generationConfig и отрегулировать имена полей (например maxOutputTokens, stopSequences)
  7. Изменить парсинг ответа для извлечения контента из candidates[0].content.parts[0].text
  8. Изменить потоковую конечную точку на streamGenerateContent, каждый chunk — полный JSON
  9. Изменить определение инструмента на обертку functionDeclarations, поле параметров на parameters

Сопоставление имен ролей

Section titled “Сопоставление имен ролей”
GeminiOpenAIClaude
useruseruser
modelassistantassistant
Нет независимой ролиsystemНет независимой роли
Нет независимой ролиtoolНет независимой роли

Gemini и Claude оба поднимают системную инструкцию на поле верхнего уровня, не обрабатывая её как роль сообщения.

Базовый разговор (Python SDK)

Section titled “Базовый разговор (Python SDK)”

Используя Python SDK Google GenAI, измените только client_options:

import os
import google.generativeai as genai
from google.api_core.client_options import ClientOptions
# Настроить конечную точку RouteAPI
genai.configure(
api_key=os.environ["ROUTEAPI_KEY"],
transport="rest",
client_options=ClientOptions(
api_endpoint="https://api.routeapi.ai/v1beta"
)
)
model = genai.GenerativeModel("gemini-1.5-pro")
response = model.generate_content(
"Пожалуйста, представьте RouteAPI в одном предложении",
generation_config={
"temperature": 0.7,
"max_output_tokens": 1024
}
)
print(response.text)
print(f"Входные токены: {response.usage_metadata.prompt_token_count}")
print(f"Выходные токены: {response.usage_metadata.candidates_token_count}")

Пример ввода изображения (Python SDK)

Section titled “Пример ввода изображения (Python SDK)”
import os
import google.generativeai as genai
from google.api_core.client_options import ClientOptions
from PIL import Image
genai.configure(
api_key=os.environ["ROUTEAPI_KEY"],
transport="rest",
client_options=ClientOptions(
api_endpoint="https://api.routeapi.ai/v1beta"
)
)
model = genai.GenerativeModel("gemini-1.5-pro")
image = Image.open("screenshot.jpg")
response = model.generate_content(
["Какие элементы управления пользовательского интерфейса есть на этом изображении?", image],
generation_config={"max_output_tokens": 2048}
)
print(response.text)

Пример потокового вывода (Python SDK)

Section titled “Пример потокового вывода (Python SDK)”
import os
import google.generativeai as genai
from google.api_core.client_options import ClientOptions
genai.configure(
api_key=os.environ["ROUTEAPI_KEY"],
transport="rest",
client_options=ClientOptions(
api_endpoint="https://api.routeapi.ai/v1beta"
)
)
model = genai.GenerativeModel("gemini-1.5-pro")
response = model.generate_content(
"Объясните пошагово, что такое API-шлюз",
stream=True
)
for chunk in response:
print(chunk.text, end="", flush=True)
print()

Примечания о совместимости

Section titled “Примечания о совместимости”
  • Фактическая поддержка параметров зависит от выбранной модели и возможностей upstream-сервиса. Некоторые продвинутые функции (такие как кэширование контекста, выполнение кода) следует сначала проверить в тестовой среде.
  • Необязательные параметры, явно переданные как 0 или false, обрабатываются как значения, установленные пользователем, а не как значения по умолчанию, которые нужно отбросить.
  • Производственные среды должны фиксировать ID моделей и не полагаться на временные псевдонимы или отображаемые имена.
  • Записывайте ID модели, код состояния и использование токенов для каждого запроса, чтобы облегчить устранение аномалий задержки и стоимости.
  • При использовании fileUri с протоколом gs:// убедитесь, что файл доступен upstream, или используйте inlineData для прямой передачи.
  • Формат ответа об ошибке может отличаться от OpenAI/Claude, см. Обработка ошибок.