Gemini
Вызывайте модели Gemini через родной Gemini API с помощью Google Gen AI SDK или Gemini CLI. Описаны generateContent, потоковая передача с alt=sse, countTokens и мышление.
Lovely Router обслуживает методы Gemini API generateContent, streamGenerateContent и countTokens по пути /v1beta/models/{model}. Направьте Google Gen AI SDK на https://lovelyrouter.com и передайте свой ключ Lovely Router в качестве API-ключа. Тела запросов передаются без изменений, поэтому справочник по API Google действует для каждого поля.
Настройка SDK#
SDK передают ключ в x-goog-api-key. Параметр запроса ?key= тоже работает.
curl "https://lovelyrouter.com/v1beta/models/gemini-3.1-pro:generateContent" \
-H "x-goog-api-key: $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{
"contents": [{"role": "user", "parts": [{"text": "Explain DNS in two sentences."}]}]
}'Установите SDK командой pip install google-genai или npm install @google/genai. Id моделей соответствуют GET /v1/models; написания Google вроде gemini-3.1-pro-preview указывают на ту же модель. GET /v1beta/models перечисляет все модели, доступные в этом формате, в собственном формате ответа Gemini.
Потоковая передача ответов#
Вызовите :streamGenerateContent?alt=sse, чтобы получать server-sent events. Каждое событие — частичный GenerateContentResponse; последнее содержит итоговый usageMetadata. SDK добавляют alt=sse сами.
curl -N "https://lovelyrouter.com/v1beta/models/gemini-3-flash:streamGenerateContent?alt=sse" \
-H "x-goog-api-key: $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "Count to ten, slowly."}]}]}'Без alt=sse метод передаёт поток в виде одного JSON-массива. Это тоже работает, но SSE проще разбирать, и он позволяет шлюзу отправить аккуратное событие ошибки, если поток застрянет. См. Потоковая передача.
Системная инструкция и мышление#
systemInstruction, generationConfig, safetySettings и tools (объявления функций) передаются так, как их описывает Google. Модели Gemini 3 по умолчанию думают; настройте это через thinkingConfig, как описано в руководстве Google по мышлению.
response = client.models.generate_content(
model="gemini-3.1-pro",
contents="Plan a three-day trip to Kyoto.",
config=types.GenerateContentConfig(
system_instruction="You are a concise travel planner.",
max_output_tokens=4096,
),
)
print(response.text)
print(response.usage_metadata)Токены мышления отражаются в usageMetadata.thoughtsTokenCount и тарифицируются по цене вывода вместе с candidatesTokenCount. Сводки рассуждений возвращаются как части с "thought": true, только если запрос задаёт generationConfig.thinkingConfig.includeThoughts: true, как и в API Google; без этого в ответе нет частей с рассуждениями.
Подсчёт токенов#
:countTokens принимает те же contents, что и вызов генерации, и возвращает totalTokens. Он бесплатный и работает при нулевом балансе. Подсчёт приблизительный: используйте его, чтобы сверить размер с контекстным окном, а не чтобы предсказать точное списание.
curl "https://lovelyrouter.com/v1beta/models/gemini-3.1-pro:countTokens" \
-H "x-goog-api-key: $LOVELY_API_KEY" \
-H "content-type: application/json" \
-d '{"contents": [{"role": "user", "parts": [{"text": "Hello, Gemini"}]}]}'Gemini CLI#
Gemini CLI берёт эндпоинт и ключ из окружения:
export GOOGLE_GEMINI_BASE_URL=https://lovelyrouter.com
export GEMINI_API_KEY="$LOVELY_API_KEY"
gemini -m gemini-3.1-proДругие клиенты описаны в разделе Использовать в своих инструментах.
Кеширование#
Gemini сам кеширует повторяющиеся префиксы промптов (неявное кеширование). Кешированные токены отражаются в usageMetadata.cachedContentTokenCount и тарифицируются по цене чтения из кеша. Шлюз держит каждый разговор на одном канале, чтобы кеш оставался тёплым; см. Кеширование промптов.
Что не поддерживается#
Эти эндпоинты Gemini API возвращают 404: cachedContents (явное кеширование контекста), загрузка файлов, embedContent и batchEmbedContents, пакетный режим и Live API.
Заголовки#
| Заголовок | Примечания |
|---|---|
x-goog-api-key | Ваш ключ Lovely Router. Authorization: Bearer и ?key= тоже работают. |
x-lovely-group | Необязателен. Закрепляет запрос за группой каналов, если ваш ключ к ней не привязан. |
x-session-id | Необязателен. Объединяет запросы в один разговор для маршрутизации с учётом кеша. |
Ошибки возвращаются в формате Gemini, {"error": {"code": 429, "message": "...", "status": "RESOURCE_EXHAUSTED"}}; см. Ошибки.