POST Responses
Responses API — OpenAI-совместимый формат запросов с tool calling и streaming
POST Responses
Responses API — формат, совместимый с OpenAI Responses API. Работает с официальным OpenAI SDK (client.responses.create(...)), Codex CLI и другими каноничными клиентами. Внутри запрос трансформируется в Chat Completions и уходит выбранному провайдеру.
Responses API находится в бета-версии. API может измениться без предварительного уведомления.
Эндпоинты
| Метод | Путь | Назначение |
|---|---|---|
POST | /v1/responses | Создание ответа (обычный и streaming) |
POST | /v1/responses/compact | Компактизация истории диалога |
API stateless. Мы не храним предыдущие ответы: previous_response_id, conversation и store не поддерживаются. Всю историю диалога — включая вызовы инструментов — передавайте в input каждым запросом. Методов GET /v1/responses/{id}, DELETE и /cancel нет.
Основные параметры
| Параметр | Тип | Описание |
|---|---|---|
model | string | ID модели. Поддерживает alias-формат <model>@<key>=<value> (см. ниже) |
input | string / array | Текст или массив input items |
instructions | string | Системные инструкции (эквивалент system-сообщения) |
stream | boolean | Потоковая передача через SSE |
Alias-формат модели
К имени модели можно дописать параметры маршрутизации через @:
openai/gpt-6-astra@reasoning_effort=high&allow_fallbacks=false
Поддерживаемые ключи: provider, reasoning_effort, allow_fallbacks. При конфликте alias и одноимённого поля в теле запроса API вернёт 400.
Дополнительные параметры
| Параметр | Тип | Описание |
|---|---|---|
tools | array | Определения инструментов (см. раздел Tool calling) |
tool_choice | string / object | none, auto, required или {"type":"function","name":"..."} |
parallel_tool_calls | boolean | Разрешить параллельные вызовы инструментов |
max_tool_calls | integer | Ограничение на количество вызовов |
reasoning | object | Настройки reasoning: effort (max/xhigh/high/medium/low/minimal/none), summary, max_tokens, type: adaptive для Claude |
text | object | Формат вывода: {"format": {"type": "text" | "json_object" | "json_schema", ...}} |
max_output_tokens | integer | Максимум выходных токенов |
temperature | float (0–2) | Температура генерации |
top_p | float (0–1) | Nucleus sampling |
top_k | integer | Top-K sampling |
top_logprobs | integer (0–20) | Количество log probabilities |
frequency_penalty / presence_penalty | float (−2…2) | Штрафы за повторы |
include | array | Дополнительные поля вывода, например ["reasoning.encrypted_content"] |
prompt_cache_key | string | Ключ кеширования промпта |
prompt_cache_retention | string | in_memory или 24h |
modalities | array | ["text"], ["text","image"] — для моделей с генерацией изображений |
image_config | object | Параметры генерации изображений |
provider | object | Предпочтения по провайдерам (см. Выбор провайдера) |
plugins | array | Серверные плагины: web, file-parser, moderation, masker, response-healing |
metadata | object | Произвольные key-value данные |
user / safety_identifier | string | Идентификатор конечного пользователя |
Не поддерживаются
Эти поля принимаются ради совместимости с OpenAI SDK, но не влияют на результат:
| Параметр | Что использовать вместо |
|---|---|
previous_response_id | Передавайте всю историю в input |
conversation | То же |
store | Ответы не сохраняются, истории через API нет |
background | Асинхронного режима у Responses API нет |
prompt (reusable prompt templates) | Передавайте текст инструкций в instructions |
models (массив fallback) | Alias model@allow_fallbacks=true |
session_id | metadata или user |
Примеры
curl -X POST "https://api.usellm.ru/v1/responses" \
-H "Authorization: Bearer <USELLM_API_KEY>" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-6-astra",
"input": "Расскажи о квантовых компьютерах"
}'
Структура ответа
{
"id": "gen_581761234567890123",
"object": "response",
"created_at": 1785312000,
"completed_at": 1785312003,
"model": "openai/gpt-6-astra",
"status": "completed",
"error": null,
"output_text": "Квантовые компьютеры — это...",
"output": [
{
"type": "message",
"id": "msg_1785312000_0",
"status": "completed",
"role": "assistant",
"content": [{ "type": "output_text", "text": "Квантовые компьютеры — это...", "annotations": [] }]
}
],
"incomplete_details": null,
"usage": {
"input_tokens": 12,
"output_tokens": 148,
"total_tokens": 160,
"cost_rub": 0.0413
}
}
status — completed, incomplete или failed. При incomplete заполняется incomplete_details.reason (max_output_tokens или content_filter).
В usage поля продублированы в двух неймингах: input_tokens/output_tokens (Responses API) и prompt_tokens/completion_tokens (Chat Completions) — используйте любой. cost_rub — фактическая стоимость запроса, списанная с баланса.
Tool calling
Поддерживается полный цикл: передача tools → получение function_call → отправка результата через function_call_output → финальный ответ модели.
Типы инструментов
type | Поддержка |
|---|---|
function | Оба формата: плоский Responses ({"type":"function","name":...}) и вложенный ({"type":"function","function":{...}}) |
custom | Free-form инструмент. Внутри приводится к функции с единственным строковым полем input, в ответе приходит как function_call с arguments = {"input": "..."} |
web_search, web_search_preview | Включает серверный веб-поиск (эквивалент plugins: [{"id": "web"}]) |
Прочие (code_interpreter, file_search, local_shell) | Не поддерживаются — модель их не увидит |
Возможность вызывать инструменты зависит от модели. Если модель не поддерживает tool calling, инструменты будут проигнорированы провайдером. Проверяйте поддержку в каталоге моделей.
1. Запрос с инструментами
{
"model": "openai/gpt-6-astra",
"input": [{ "role": "user", "content": "Какая погода в Москве?" }],
"tools": [
{
"type": "function",
"name": "get_weather",
"description": "Получить текущую погоду в городе",
"parameters": {
"type": "object",
"properties": { "location": { "type": "string", "description": "Название города" } },
"required": ["location"]
}
}
],
"tool_choice": "auto"
}
2. Ответ с вызовом инструмента
{
"id": "gen_581761234567890123",
"object": "response",
"status": "completed",
"output_text": "",
"output": [
{
"type": "function_call",
"id": "fc_call_abc123",
"call_id": "call_abc123",
"name": "get_weather",
"arguments": "{\"location\":\"Москва\"}",
"status": "completed"
}
]
}
3. Возврат результата инструмента
Выполните функцию на своей стороне и отправьте новый запрос со всей историей: исходное сообщение пользователя, item function_call и item function_call_output с тем же call_id.
{
"model": "openai/gpt-6-astra",
"input": [
{ "role": "user", "content": "Какая погода в Москве?" },
{
"type": "function_call",
"call_id": "call_abc123",
"name": "get_weather",
"arguments": "{\"location\":\"Москва\"}"
},
{
"type": "function_call_output",
"call_id": "call_abc123",
"output": "{\"temp_c\": -3, \"condition\": \"снег\"}"
}
],
"tools": []
}
В поле tools второго запроса передайте те же определения инструментов, что и в первом.
Item function_call обязателен. Если прислать только function_call_output — например, рассчитывая, что историю подтянет previous_response_id, — модель получит результат инструмента без самого вызова и вернёт ошибку вида messages with role 'tool' must be a response to a preceding message with 'tool_calls'. API stateless, историю нужно передавать полностью.
Типы input items
type | Описание |
|---|---|
message (или объект с role) | Сообщение с ролью user, assistant, system или developer |
function_call | Эхо ранее полученного вызова: call_id, name, arguments (JSON-строка) |
function_call_output | Результат вызова: call_id и output (строка или произвольный JSON) |
reasoning | Reasoning-блок предыдущего хода: content, summary, encrypted_content |
Мультимодальный input
В content сообщения можно передать массив частей: input_text, input_image (URL или base64 data URI), input_file (base64 или URL). Подробнее — в гайде Передача медиа на вход.