Gemini 3.1 Pro
Мультимодальная модель Google для сложных задач программирования, анализа больших материалов и точной многошаговой работы с инструментами.
- Ailoot · Сообщения Anthropic
POST /v1/messagesgemini-3.1-pro - Ailoot · Gemini generateContent
POST /v1beta/models/{model}:generateContentgemini-3.1-pro
О модели
Описание раскрывает возможности модели. Доступные в 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-версии.
Для модели сохраняются общие ограничения базовой линии: ответы могут содержать вымышленные сведения, а отдельные запросы — выполняться медленно или завершаться по тайм-ауту. Многошаговое рассуждение, большой контекст и доступ к данным помогают работать со сложной задачей, но не превращают каждый сгенерированный вывод в проверенный факт.
Практическая задача
Практическая задача
Технический пример на английском
Schedule dependent engineering work
Plan these tasks with two engineers, one task per engineer at a time: A takes 2 days; B takes 3 days after A; C takes 2 days after A; D takes 1 day after both B and C. No task may be split. Give a day-by-day allocation, earliest finish and dependency check.Ожидаемый результат
A two-engineer schedule, total elapsed days and a concise check that every prerequisite is satisfied.Проверка результата
Neither B nor C starts before A ends, and D waits for both; recompute the claimed finish from the allocation.Ailoot · Сообщения Anthropic POST /v1/messages gemini-3.1-pro
gemini-3.1-proНачало
Мультимодальная модель 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 | По умолчанию— |
Поле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
POST /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
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", "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", "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",
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",
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',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
Псевдонимы путей метода
Используйте пути методов, указанные выше.
Связанные ID для вызова
Ailoot · Gemini generateContent POST /v1beta/models/{model}:generateContent gemini-3.1-pro
gemini-3.1-proНачало
Мультимодальная модель 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 | По умолчанию— |
Поле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
POST /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
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: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: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", 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", 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',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
Псевдонимы путей метода
Используйте пути методов, указанные выше.
Связанные ID для вызова
FAQ · Gemini 3.1 Pro
- Какие входные данные и результаты доступны?
POST /v1/messages·gemini-3.1-pro:text,image→textPOST /v1beta/models/{model}:generateContent·gemini-3.1-pro:text,image→text- Какие поля использует запрос?
POST /v1/messages·gemini-3.1-pro:model,messages,system,max_tokens,stream,metadataPOST /v1beta/models/{model}:generateContent·gemini-3.1-pro:contents,systemInstruction,sessionId- Какие ограничения действуют?
POST /v1/messages·gemini-3.1-pro:ctx:1048576;max_out:65536;messages.min_items:1;max_tokens.minimum:1POST /v1beta/models/{model}:generateContent·gemini-3.1-pro:ctx:1048576;max_out:65536;contents.min_items:1