Перейти к содержимому

OpenAI-совместимый формат

Диалог с чатом

POST https://gptunnel.ru/v1/chat/completions

Синхронный запрос к моделям ChatGPT.

Headers

ПараметрТипОписание
Authorization*stringAPI ключ

Request Body

ПараметрТипОписание
model*stringID модели чата
messages*arrayКонтекст сообщений
streamboolОтдавать ответ потоком server-sent events
max_tokensnumberМаксимальная длина ответа в токенах; предел зависит от модели
max_completion_tokensnumberТо же самое под именем из нового OpenAI SDK. Учитывается, если max_tokens не передан
temperaturenumberКреативность (от 0 до 1)
top_pnumberNucleus sampling. На моделях Claude не применяется
frequency_penaltynumberШтраф за повторение. На моделях Claude не применяется
presence_penaltynumberШтраф за присутствие. На моделях Claude не применяется
stopstring | string[]Стоп-последовательности: до них модель остановит ответ
functionsobjectОпределения функций
toolsobject[]Определения инструментов, доступных модели
tool_choicestring | objectКак модель выбирает инструмент: auto | none | required | {"type": "function", "function": {"name": "..."}}
parallel_tool_callsboolfalse — запретить модели вызывать несколько инструментов за один ход
response_formatobjectФормат ответа: {"type": "json_object"} или {"type": "json_schema", ...}. См. раздел «Структурированный вывод»
reasoning_effortstringСколько модель размышляет перед ответом: none | low | medium | high. См. раздел «Управление рассуждениями»
useWalletBalanceboolИспользовать личный счёт
obfuscateboolСкрывать персональные данные (PII) от модели: заменять на плейсхолдеры перед отправкой и восстанавливать в ответе (альфа)
obfuscate_patternsobject[]Свои regex-паттерны для маскирования вместе с obfuscate: массив { pattern, label? }, до 20 штук

Скрытие персональных данных (obfuscate)

При obfuscate: true персональные данные (имена, документы, телефоны, карты, пароли и ключи) во всех сообщениях заменяются на плейсхолдеры до отправки в модель, а в ответе — включая потоковый (stream) и аргументы function/tool-call — восстанавливаются обратно. Провайдер и модель видят только обезличенный текст. Если сервис обфускации недоступен, запрос отклоняется с ошибкой 503 — сырые данные провайдеру не отправляются.

Полный список распознаваемых типов, гарантии и ограничения — на странице Скрытие персональных данных.

Функция в альфа-тесте и пока предоставляется бесплатно.

Управление рассуждениями (reasoning_effort)

Модели с рассуждениями (reasoning) перед ответом тратят отдельные токены на размышления. Их объёмом управляет один параметр — reasoning_effort:

ЗначениеЧто делает
noneРассуждения выключены — быстрее и дешевле
lowМинимум размышлений
mediumЗначение по умолчанию у большинства моделей
highМаксимум размышлений
{
"model": "deepseek-v4-flash",
"messages": [{ "role": "user", "content": "Сколько будет 17 × 23?" }],
"reasoning_effort": "none"
}

Параметр одинаково работает для всех моделей с поддержкой рассуждений. Токены размышлений входят в completion_tokens и тарифицируются как токены ответа — поэтому none заметно дешевле и быстрее.

Обязательный вызов функции

У deepseek-v4-flash и deepseek-v4-pro принудительный вызов инструмента — tool_choice: "required" или tool_choice: {"type": "function", ...} — несовместим с рассуждениями. Передавайте вместе с ним reasoning_effort: "none", иначе запрос выполнится дольше обычного.

Структурированный вывод (response_format)

response_format принимает две формы:

  • {"type": "json_object"} — попросить модель ответить одним JSON-объектом;
  • {"type": "json_schema", "json_schema": {"schema": {...}}} — потребовать ответ по конкретной схеме.

На моделях OpenAI параметр работает так же, как в оригинальном API. У Claude нативного JSON-режима нет, поэтому запрос переводится в ближайший эквивалент Anthropic — и надёжность у двух форм разная. На остальных моделях поле уходит провайдеру как есть, без наших надстроек — см. оговорку в конце раздела.

json_schema становится нативным structured output: модель обязана ответить по схеме. Схему мы дозакрываем сами — Anthropic требует явного additionalProperties: false на каждом объектном узле, и мы проставляем его там, где вы не задали своё значение. Ссылки $ref и definitions при этом не разворачиваются: разверните схему до отправки. Модель, которая structured output не поддерживает, ответит 400.

json_object нативного соответствия не имеет. Мы добавляем в системное сообщение инструкцию ответить одним JSON-объектом и снимаем markdown-обёртку с ответа, если модель всё же в неё завернула. Это best-effort: строгой гарантии нет, поэтому проверяйте результат разбором и предусматривайте повтор запроса.

Если строгий JSON нужен без этой прослойки, у моделей Claude есть второй вход — Anthropic-совместимый /v1/messages. Там тело запроса уходит к Claude как есть и structured outputs работают нативно.

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

import axios from 'axios'
const response = await axios({
method: 'POST',
url: 'https://gptunnel.ru/v1/chat/completions',
headers: {
Authorization: 'YOUR_API_KEY',
},
data: {
model: 'gpt-4o',
max_tokens: 100,
messages: [
{ role: 'system', content: 'My name is Robert.' },
{ role: 'user', content: 'Как тебя зовут?' },
],
},
})
console.log(response.data)

Пример ответа

{
"id": "chatcmpl-8FheRf68Hi4pnuiRqYPHyZJr3UlAU",
"object": "chat.completion",
"created": 1698753407,
"model": "gpt-4o",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Меня зовут Robert."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 24,
"completion_tokens": 8,
"total_tokens": 32,
"prompt_cost": 0.01608,
"completion_cost": 0.0072,
"total_cost": 0.02328
}
}

Prompt-кэш и тарификация

Для моделей Claude мы автоматически включаем prompt-кэш на стороне провайдера — это ускоряет ответ на запросах с длинным повторяющимся началом (system-промпт, инструкции, каталог). Отдельно включать или настраивать его не нужно.

На стоимость запроса кэш не влияет. Весь промпт тарифицируется по обычной цене input-токенов модели, независимо от того, попал запрос в кэш или нет. Цена одного и того же запроса не «плавает» между вызовами, а экономия от кэша остаётся на нашей стороне.

В usage кэш виден для справки:

{
"usage": {
"prompt_tokens": 12480,
"prompt_tokens_details": { "cached_tokens": 11900 },
"completion_tokens": 210,
"total_tokens": 12690,
"prompt_cost": 0.3744,
"completion_cost": 0.0189,
"total_cost": 0.3933
}
}
  • prompt_tokens — все токены промпта, включая прочитанные из кэша. Именно эта величина умножается на цену input в prompt_cost.
  • prompt_tokens_details.cached_tokens — сколько из них обслужено кэшем. Поле присутствует, только если провайдер вернул счётчики кэша.

Ошибки

{
"error": {
"message": "The model 'gpt-5' does not exist",
"type": "invalid_request_error",
"param": null,
"code": "model_not_found"
}
}