models

Gemini 3.1 Pro High

Markdown · JSON

Gemini 3.1 Pro High

Мультимодальная модель Google для сложных задач программирования, анализа больших материалов и точной многошаговой работы с инструментами.

О модели

Описание раскрывает возможности модели. Доступные в Ailoot входные данные, результаты и параметры выбранного метода перечислены ниже.

Gemini 3.1 Pro Preview предназначена для работы со сложным материалом и задачами, требующими нескольких последовательных решений. Google выделяет программную инженерию, применение инструментов и согласованность фактических ответов. Модель помогает разбирать большие наборы данных, целые программные репозитории и задачи, в которых текст соединён с визуальными или звуковыми материалами.

Какие материалы понимает модель

В характеристиках Google перечислены текст, изображения, видео, аудио и PDF. В текущем каталоге Ailoot API для текстовых методов заявлены текст и изображения на входе и текст на выходе. Видео, аудио и PDF в этот набор входов не включены. Длинный контекст вмещает до 1 048 576 входных токенов, текстовый ответ — до 65 536 выходных токенов. Понимание изображений и аудио не означает их генерацию: выход этой версии остаётся текстовым.

Рассуждение и работа по шагам

Thinking позволяет выделить дополнительное усилие на внутреннее рассуждение. В описанном Google режиме базовой модели стандартный уровень — high; доступны low, medium, high. Эти значения описывают базовую модель Google; режим и доступность управления через Ailoot API определяются выбранным методом и вариантом модели. Основные сценарии включают сложное программирование, разработку алгоритмов, стратегическое планирование и пошаговое улучшение решения. Это особенно полезно, когда нужно учитывать несколько взаимосвязанных требований и возвращаться к промежуточным результатам.

Возможности модели включают вызовы функций, выполнение кода и структурированные ответы. Поддерживаются кэширование контекста, поисковое обоснование, Google Maps и использование содержимого веб-адресов; предусмотрена пакетная обработка. Такой набор позволяет построить процесс, в котором модель анализирует данные, выбирает следующий инструмент и формирует итог. Фактическая доступность каждого инструмента зависит от метода работы с моделью.

Версия и особенности

Карточка относится к предварительной версии gemini-3.1-pro-preview. В её основе — Gemini 3 Pro. Производитель отдельно обозначает вариант gemini-3.1-pro-preview-customtools, ориентированный на процессы с командной оболочкой и пользовательскими инструментами. Его приоритеты при выборе инструментов и особенности поведения не являются свойствами обычной Preview-версии.

Для модели сохраняются общие ограничения базовой линии: ответы могут содержать вымышленные сведения, а отдельные запросы — выполняться медленно или завершаться по тайм-ауту. Многошаговое рассуждение, большой контекст и доступ к данным помогают работать со сложной задачей, но не превращают каждый сгенерированный вывод в проверенный факт.

Практическая задача

Практическая задача

Технический пример на английском

Plan a dependency-constrained move

A lab move has these constraints: archive samples before unplugging the freezer; test the backup freezer before moving samples; restore temperature monitoring before accepting new samples. Staff propose unplugging first to save time. Produce an ordered checklist, flag the unsafe proposed step and specify evidence needed before accepting new samples. Use only the supplied constraints.

Ожидаемый результат

An ordered checklist, one identified conflict and an acceptance-evidence item.

Проверка результата

The checklist must place backup testing and sample protection before unplugging and monitoring before intake.
Ailoot · Сообщения Anthropic POST /v1/messages gemini-3.1-pro-high

gemini-3.1-pro-high

Google /gemini-3.1-pro-high

Начало

Мультимодальная модель Google для сложных задач программирования, анализа больших материалов и точной многошаговой работы с инструментами.

Допустимые входные данные
Текст · Картинки
Результаты
Текст

Доступно в Ailoot · входные данные и методы

Ailoot · Сообщения Anthropic POST /v1/messages
Входные данные
text, image
Результат
text
Контекст
1 048 576 tokens
Максимальный выход
65 536 tokens
Выходной формат
json или SSE
ПолеТипТребованиеЗначения и ограниченияПо умолчанию
ПолеmodelТипstringТребованиеОбязательноЗначения и ограничения
gemini-3.1-pro-high
По умолчанию—
ПолеmessagesТипmessage[]ТребованиеОбязательноЗначения и ограничения
Минимум элементов: 1
По умолчанию—
Полеmessages[].roleТипstringТребованиеОбязательноЗначения и ограничения
user, assistant
По умолчанию—
Полеmessages[].contentТипstring|content_block[]ТребованиеОбязательноЗначения и ограниченияПо умолчанию—
ПолеsystemТипstring|content_block[]ТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Полеmax_tokensТипintegerТребованиеОбязательноЗначения и ограничения
Минимум: 1
Объект ограничения: точный верхний предел выбранной модели/карточки
По умолчанию—
ПолеstreamТипbooleanТребованиеНеобязательноЗначения и ограниченияПо умолчаниюfalse
ПолеtemperatureТипnumberТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеtop_pТипnumberТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеstop_sequencesТипstring[]ТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеtoolsТипtool[]ТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеtools[].nameТипstringТребованиеНеобязательноЗначения и ограничения
Применяется, когда: передан инструмент
По умолчанию—
Полеtools[].descriptionТипstringТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Полеtools[].input_schemaТипJSON_schemaТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Полеtool_choiceТипobjectТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеthinking.typeТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеthinking.budget_tokensТипintegerТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеoutput_config.effortТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеmetadataТипobjectТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Полеcache_controlТипobjectТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Сочетания входных материалов

Текст · Текст UTF8

messages[].content или блок type=text

Текст + изображение

{type:image,source:{type:base64,media_type,data}} или источник type=url

Параметры и жизненный цикл метода
ПараметрКонтракт
Параметрmaterial_typesКонтрактtext, image
ПараметрrequiredКонтрактmodel, messages, max_tokens
Параметрoptional_controlsКонтрактnull
Параметрcontent_typeКонтрактapplication/json
Параметрtext_file_materialКонтрактфактическое содержимое UTF-8 вставляется как текст; ID файлов и URLs требуют отдельной точной поддержки

Жизненный цикл: exact retained published method

Структуры методов и ID указаны точно; возможности поставщика рассматриваются отдельно от допуска.

Тарифы

Ставки методов Ailoot

Ailoot Сообщения AnthropicPOST /v1/messages
Вход
0,002 $ / 1K
Выход
0,012 $ / 1K
Чтение кэша
0,0002 $ / 1K

Цены по длине запроса · Сообщения Anthropic

Размер запроса, токеновВходВыходЧтение кэшаЗапись в кэшКэш 5 минКэш 1 час
Размер запроса, токенов(0; 200 000]Вход0,002 $Выход0,012 $Чтение кэша0,0002 $Запись в кэшБазовая: —Кэш 5 минБазовая: —Кэш 1 часБазовая: —
Размер запроса, токенов(200 000; ∞)Вход0,004 $Выход0,018 $Чтение кэша0,0004 $Запись в кэшБазовая: —Кэш 5 минБазовая: —Кэш 1 часБазовая: —

Ставки в USD за 1K токенов. Если ставка не задана, наследуется базовая ставка этого метода; «—» означает, что базовая ставка не задана.

Ailoot резервирует расчётную сумму перед запросом. После получения результата списывает итоговую плату по измеренному расходу. Для окончательного списания за потоковый ответ используется итоговая запись расхода. Как работают резервирование и расчёт →

Примеры запросов

Ailoot · Сообщения Anthropic

Пример текстаВход, картинкаPython SDKNode.js SDKПоток Python
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3.1-pro-high", "max_tokens": 1024, "messages": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["messages"]=[{"role":"user","content":"Summarize this material and quote supporting source passages.\n\n"+text}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "gemini-3.1-pro-high", "max_tokens": 1024, "messages": [{"role": "user", "content": [{"type": "text", "text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["messages"][0]["content"].append({"type":"image","source":{"type":"base64","media_type":mime,"data":b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/messages \
  -H "x-api-key: $AILOOT_API_KEY" -H 'anthropic-version: 2023-06-01' -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import json
from pathlib import Path
print(json.dumps(json.loads(Path("result.json").read_text()),ensure_ascii=False,indent=2))
PY_RESULT
import anthropic
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = anthropic.Anthropic(base_url="https://api.ailoot.ai", api_key=os.environ["AILOOT_API_KEY"], max_retries=0)
msg = client.messages.create(
    model="gemini-3.1-pro-high",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain the difference between an observation and a hypothesis in three sentences."}],
)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(msg.to_dict(mode="json"))
import Anthropic from "@anthropic-ai/sdk";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const client = new Anthropic({ baseURL: "https://api.ailoot.ai", apiKey: process.env.AILOOT_API_KEY, maxRetries: 0 });
const msg = await client.messages.create({
  model: "gemini-3.1-pro-high",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Explain the difference between an observation and a hypothesis in three sentences." }],
});
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(msg);
import anthropic,os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=anthropic.Anthropic(base_url="https://api.ailoot.ai",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

with client.messages.stream(model='gemini-3.1-pro-high',max_tokens=1024,messages=[{"role":"user","content":"Explain observations and hypotheses in three sentences."}]) as stream:
    with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
        for event in stream:
            payload=event.to_dict(mode="json")
            log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
            print(json.dumps(payload,ensure_ascii=False))
    final=stream.get_final_message()
    save_result(final.to_dict(mode="json"),"stream-result")

Получить и сохранить результаты

Ailoot · Сообщения Anthropic

json или SSE

Сохраняйте все готовые результаты

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

Сохраняйте все блоки содержимого, подписи рассуждений и фактические ID обращений к инструментам. Собирайте все изменения блоков SSE; первый текстовый блок не является полным выходом.

Если нужно проверить исходный ответ

Сохраняйте ID запросов и ответов, а также заголовки. Общий URL получения текстового задания не предоставлен.

Поля ответа
ПолеТип
ПолеidТипstring
ПолеmodelТипstring
Полеcontent[]Типtext|thinking|tool_use|other content block
Полеstop_reasonТипstring|null
ПолеusageТипobject
Ошибки и дальнейшие шаги
ОтветУсловиеСледующий шаг
Ответ400 · invalid_request_errorУсловиеНеверные обязательные поля, представление материалов или значение параметраСледующий шагИсправьте указанные поля перед новым запросом на создание.

Псевдонимы

Псевдонимы моделей

Ailoot gemini-3.1-pro-high

Псевдонимы путей метода

Используйте пути методов, указанные выше.

Связанные ID для вызова

gemini-3.1-pro-high

Ailoot · Gemini generateContent POST /v1beta/models/{model}:generateContent gemini-3.1-pro-high

gemini-3.1-pro-high

Google /gemini-3.1-pro-high

Начало

Мультимодальная модель Google для сложных задач программирования, анализа больших материалов и точной многошаговой работы с инструментами.

Допустимые входные данные
Текст · Картинки
Результаты
Текст

Доступно в Ailoot · входные данные и методы

Ailoot · Gemini generateContent POST /v1beta/models/{model}:generateContent
Входные данные
text, image
Результат
text
Контекст
1 048 576 tokens
Максимальный выход
65 536 tokens
Выходной формат
json или поддерживаемая потоковая передача
ПолеТипТребованиеЗначения и ограниченияПо умолчанию
Полеpath.modelТипstringТребованиеОбязательноЗначения и ограничения
gemini-3.1-pro-high
По умолчанию—
ПолеcontentsТипcontent[]ТребованиеОбязательноЗначения и ограничения
Минимум элементов: 1
По умолчанию—
Полеcontents[].roleТипstringТребованиеНеобязательноЗначения и ограничения
user, model
По умолчанию—
Полеcontents[].partsТипpart[]ТребованиеОбязательноЗначения и ограниченияПо умолчанию—
ПолеsystemInstructionТипcontentТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
ПолеgenerationConfig.maxOutputTokensТипintegerТребованиеНеобязательноЗначения и ограничения
Минимум: 1
Зависит от модели
По умолчанию—
ПолеgenerationConfig.temperatureТипnumberТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеgenerationConfig.topPТипnumberТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеgenerationConfig.topKТипintegerТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеgenerationConfig.stopSequencesТипstring[]ТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеgenerationConfig.thinkingConfig.includeThoughtsТипbooleanТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеgenerationConfig.thinkingConfig.thinkingBudgetТипintegerТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
Полеtools[].functionDeclarationsТипfunction_declaration[]ТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеtoolConfig.functionCallingConfig.modeТипstringТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеsafetySettingsТипobject[]ТребованиеНеобязательноЗначения и ограничения
Зависит от модели
По умолчанию—
ПолеsessionIdТипstringТребованиеНеобязательноЗначения и ограниченияПо умолчанию—
Сочетания входных материалов

Текст · Текст UTF8

contents[].parts[].text

Текст + изображение

parts[].inlineData={mimeType,data}

Параметры и жизненный цикл метода
ПараметрКонтракт
Параметрmaterial_typesКонтрактtext, image
ПараметрrequiredКонтрактcontents
Параметрoptional_controlsКонтрактnull
Параметрcontent_typeКонтрактapplication/json
Параметрtext_file_materialКонтрактфактическое содержимое UTF-8 вставляется как текст; ID файлов и URLs требуют отдельной точной поддержки

Жизненный цикл: exact retained published method

Структуры методов и ID указаны точно; возможности поставщика рассматриваются отдельно от допуска.

Тарифы

Ставки методов Ailoot

Ailoot Gemini generateContentPOST /v1beta/models/{model}:generateContent
Вход
0,002 $ / 1K
Выход
0,012 $ / 1K
Чтение кэша
0,0002 $ / 1K

Цены по длине запроса · Gemini generateContent

Размер запроса, токеновВходВыходЧтение кэшаЗапись в кэшКэш 5 минКэш 1 час
Размер запроса, токенов(0; 200 000]Вход0,002 $Выход0,012 $Чтение кэша0,0002 $Запись в кэшБазовая: —Кэш 5 минБазовая: —Кэш 1 часБазовая: —
Размер запроса, токенов(200 000; ∞)Вход0,004 $Выход0,018 $Чтение кэша0,0004 $Запись в кэшБазовая: —Кэш 5 минБазовая: —Кэш 1 часБазовая: —

Ставки в USD за 1K токенов. Если ставка не задана, наследуется базовая ставка этого метода; «—» означает, что базовая ставка не задана.

Ailoot резервирует расчётную сумму перед запросом. После получения результата списывает итоговую плату по измеренному расходу. Для окончательного списания за потоковый ответ используется итоговая запись расхода. Как работают резервирование и расчёт →

Примеры запросов

Ailoot · Gemini generateContent

Пример текстаВход, картинкаPython SDKNode.js SDKПоток Python
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_TEXT_FILE:?Set your actual UTF-8 source-material file}"
export AILOOT_TEXT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"contents": []}')
f=Path(os.environ["AILOOT_TEXT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 source material")
text=f.read_text(encoding="utf-8")
if not text.strip():raise SystemExit("Source material must contain text")
p["contents"]=[{"role":"user","parts":[{"text":"Summarize this material and quote supporting source passages.\n\n"+text}]}]
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1beta/models/gemini-3.1-pro-high:generateContent \
  -H "x-goog-api-key: $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
: "${AILOOT_IMAGE_FILE:?Set your actual PNG JPEG or WebP image}"
export AILOOT_IMAGE_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"contents": [{"role": "user", "parts": [{"text": "Read labels and numbers in this image; flag unreadable text."}]}]}')
import base64
f=Path(os.environ["AILOOT_IMAGE_FILE"])
if not f.is_file():raise SystemExit("Choose an actual PNG JPEG or WebP image")
raw=f.read_bytes()
mime="image/png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "image/jpeg" if raw.startswith(b"\xff\xd8") else "image/webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else None
if not mime:raise SystemExit("Use PNG JPEG or WebP")
b64=base64.b64encode(raw).decode()
p["contents"][0]["parts"].append({"inlineData":{"mimeType":mime,"data":b64}})
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1beta/models/gemini-3.1-pro-high:generateContent \
  -H "x-goog-api-key: $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(json.loads(Path("result.json").read_text(encoding="utf-8")))
PY_RESULT
from google import genai
from google.genai import types
import os

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client = genai.Client(
    api_key=os.environ["AILOOT_API_KEY"],
    http_options=types.HttpOptions(base_url="https://api.ailoot.ai"),
)
resp = client.models.generate_content(model="gemini-3.1-pro-high", contents="Explain the difference between an observation and a hypothesis in three sentences.")
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

save_result(resp.to_json_dict())
import { GoogleGenAI } from "@google/genai";

if (!process.env.AILOOT_API_KEY?.trim()) throw new Error("Set AILOOT_API_KEY before making a request");
const ai = new GoogleGenAI({ apiKey: process.env.AILOOT_API_KEY, httpOptions: { baseUrl: "https://api.ailoot.ai" } });
const resp = await ai.models.generateContent({ model: "gemini-3.1-pro-high", contents: "Explain the difference between an observation and a hypothesis in three sentences." });
import { writeFileSync } from "node:fs";

function saveResult(data, stem = "result") {
  writeFileSync(stem + ".json", JSON.stringify(data, null, 2));
  console.log(JSON.stringify(data, null, 2));
  const saveBlob = (encoded, suffix, label) => {
    const raw = Buffer.from(encoded, "base64");
    const ext = raw.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10])) ? "png" : raw[0]===255 && raw[1]===216 ? "jpg" : raw.subarray(0,4).toString()==="RIFF" && raw.subarray(8,12).toString()==="WEBP" ? "webp" : suffix;
    const file = `${stem}-${label}.${ext}`;
    writeFileSync(file, raw); console.log("Saved", file);
  };
  for (const [i, block] of (data.content || []).entries()) console.log("Content", i, JSON.stringify(block));
  for (const choice of data.choices || []) console.log("Choice", choice.index, JSON.stringify(choice.message || choice.delta || {}));
  for (const [i, item] of (data.output || []).entries()) {
    console.log("Output", i, JSON.stringify(item));
    if (item.type === "image_generation_call" && item.result) saveBlob(item.result, item.output_format || "bin", `output-${i}`);
  }
  for (const [ci, candidate] of (data.candidates || []).entries()) {
    for (const [pi, part] of (candidate.content?.parts || []).entries()) {
      console.log("Candidate/part", ci, pi, JSON.stringify(part));
      const blob = part.inlineData || part.inline_data;
      if (blob?.data) {
        const mime = blob.mimeType || blob.mime_type;
        const suffix = ({"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"})[mime] || "bin";
        saveBlob(blob.data, suffix, `candidate-${ci}-part-${pi}`);
      }
    }
  }
}

saveResult(resp);
from google import genai
from google.genai import types
import os
from pathlib import Path

if not os.environ.get("AILOOT_API_KEY", "").strip(): raise SystemExit("Set AILOOT_API_KEY before making a request")
client=genai.Client(api_key=os.environ["AILOOT_API_KEY"],http_options=types.HttpOptions(base_url="https://api.ailoot.ai"))
import base64, json
from pathlib import Path

def save_result(data, stem="result"):
    # Keep every field, including usage, IDs, reasoning and tool requests.
    Path(stem + ".json").write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
    print(json.dumps(data, ensure_ascii=False, indent=2))
    def save_blob(encoded, suffix, label):
        raw = base64.b64decode(encoded, altchars=b"-_", validate=True)
        ext = "png" if raw.startswith(b"\x89PNG\r\n\x1a\n") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4] == b"RIFF" and raw[8:12] == b"WEBP" else suffix
        file = Path(stem + "-" + label + "." + ext)
        file.write_bytes(raw)
        print("Saved", file)
    for index, block in enumerate(data.get("content") or []):
        print("Content", index, json.dumps(block, ensure_ascii=False))
    for choice in data.get("choices") or []:
        print("Choice", choice.get("index"), json.dumps(choice.get("message", choice.get("delta", {})), ensure_ascii=False))
    for index, item in enumerate(data.get("output") or []):
        print("Output", index, json.dumps(item, ensure_ascii=False))
        if item.get("type") == "image_generation_call" and item.get("result"):
            save_blob(item["result"], item.get("output_format") or "bin", "output-" + str(index))
    for ci, candidate in enumerate(data.get("candidates") or []):
        for pi, part in enumerate((candidate.get("content") or {}).get("parts") or []):
            print("Candidate/part", ci, pi, json.dumps(part, ensure_ascii=False))
            blob = part.get("inlineData") or part.get("inline_data")
            if blob and blob.get("data"):
                mime = blob.get("mimeType") or blob.get("mime_type")
                suffix = {"image/png":"png", "image/jpeg":"jpg", "image/webp":"webp", "audio/wav":"wav", "audio/mpeg":"mp3", "video/mp4":"mp4"}.get(mime, "bin")
                save_blob(blob["data"], suffix, "candidate-" + str(ci) + "-part-" + str(pi))

count=0
with Path("stream-events.jsonl").open("w",encoding="utf-8") as log:
    for chunk in client.models.generate_content_stream(model='gemini-3.1-pro-high',contents="Explain observations and hypotheses in three sentences."):
        payload=chunk.to_json_dict()
        log.write(json.dumps(payload,ensure_ascii=False)+"\n"); log.flush()
        save_result(payload,"stream-chunk-"+str(count))
        count+=1

Получить и сохранить результаты

Ailoot · Gemini generateContent

json или поддерживаемая потоковая передача

Сохраняйте все готовые результаты

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

Сохраняйте все варианты и части, включая вызовы функций, подписи рассуждений и данные использования; собирайте части потока по порядку.

Если нужно проверить исходный ответ

Сохраняйте ID запросов и ответов, а также заголовки. Общий URL получения текстового задания не предоставлен.

Поля ответа
ПолеТип
ПолеresponseIdТипstring
ПолеmodelVersionТипstring
Полеcandidates[].content.parts[]Типtext|inlineData|functionCall|other part
Полеcandidates[].finishReasonТипstring
ПолеusageMetadataТипobject
Ошибки и дальнейшие шаги
ОтветУсловиеСледующий шаг
Ответ400 · invalid_request_errorУсловиеНеверные обязательные поля, представление материалов или значение параметраСледующий шагИсправьте указанные поля перед новым запросом на создание.

Псевдонимы

Псевдонимы моделей

Ailoot gemini-3.1-pro-high

Псевдонимы путей метода

Используйте пути методов, указанные выше.

Связанные ID для вызова

gemini-3.1-pro-high

FAQ · Gemini 3.1 Pro High
Какие входные данные и результаты доступны?

POST /v1/messages · gemini-3.1-pro-high: text, image → text

POST /v1beta/models/{model}:generateContent · gemini-3.1-pro-high: text, image → text

Какие поля использует запрос?

POST /v1/messages · gemini-3.1-pro-high: model, messages, system, max_tokens, stream, metadata

POST /v1beta/models/{model}:generateContent · gemini-3.1-pro-high: contents, systemInstruction, sessionId

Какие ограничения действуют?

POST /v1/messages · gemini-3.1-pro-high: ctx: 1048576; max_out: 65536; messages.min_items: 1; max_tokens.minimum: 1

POST /v1beta/models/{model}:generateContent · gemini-3.1-pro-high: ctx: 1048576; max_out: 65536; contents.min_items: 1

Подробнее

Подключите Ailoot к Claude Code, OpenCode, Hermes или своему приложению.

Компания и портфель её проектов

Компания и портфель её проектов: миллионы клиентов; продажи на миллиарды ежемесячно.

Покупайте токены со скидкой.

Скидка по подписке для регулярной работы. Промокоды — до 50% на покупку токенов.

Подписка
Выберите тариф со скидкой для своих регулярных запросов.
Промокод до 50%
Введите код при покупке. Цена пересчитается с учётом действующей акции.
Расходы в истории
Модель, токены и сумма сохраняются для каждого запроса.

Выбрать подписку · Посмотреть цены моделей

Подключайте API к продукту, который вы продаёте.

SaaS, приложения и боты — по оферте и лицензионному договору Ailoot. Для перепродажи запросите реселлерскую лицензию.

Коммерческое приложение
Встраивайте генерацию текста, картинок, видео и звука в платные функции своего сервиса.
Лицензия для реселлера
Пришлите описание проекта и схему доступа. Запросите письменные условия использования и перепродажи.
Документы на сайте
Оферта, лицензионный договор и политика обработки данных доступны до подключения.

Запросить реселлерскую лицензию · Оферта и лицензионный договор