# Responses

`POST /v1/responses`

Responses API без состояния на сервере: ничего не храним. Историю присылайте целиком в каждом запросе, вместе с элементами output прошлых ответов. Так работает Codex. Принимаем только поля из списка: на другое поле ответ 400 с его именем в param. Поле со значением null пропускаем.

- `model` (string, обязательно) — Модель с kind chat, например `openai/gpt-6.1-sol`
- `input` (string | array, обязательно) — Строка или массив элементов: message (type можно не указывать), function_call, function_call_output, custom_tool_call, custom_tool_call_output, reasoning. Части content: текст и изображения input_image
- `instructions` (string) — Системная инструкция
- `max_output_tokens` (integer) — Лимит ответа, от 1 до максимума модели. Без него модель отвечает полностью
- `stream` (boolean) — true: ответ событиями SSE, см. «Стриминг»
- `tools` (array) — Инструменты типа function и custom, см. «Function calling»
- `tool_choice` (string | object) — Вызывать ли инструмент и какой, см. «Function calling»
- `include` (array) — ["reasoning.encrypted_content"]: рассуждения приходят зашифрованными в элементе reasoning. Верните его в input следующего хода, и модель продолжит рассуждать без хранения на сервере. Элементы reasoning без encrypted_content отбрасываем
- `reasoning` (и другие) — Передаём модели как есть: reasoning, text, temperature, top_p, top_logprobs, truncation, max_tool_calls, parallel_tool_calls, stream_options, service_tier (auto или default), metadata, user, safety_identifier

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

curl:

```bash
curl https://api.polyapi.ru/v1/responses \
  -H "Authorization: Bearer $POLYAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-6.1-sol",
    "input": "Привет"
  }'
```

Python:

```python
import os
from openai import OpenAI

client = OpenAI(
    api_key=os.environ["POLYAPI_KEY"],
    base_url="https://api.polyapi.ru/v1",
)

r = client.responses.create(model="openai/gpt-6.1-sol", input="Привет")
print(r.output_text)
```

Node.js:

```js
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.POLYAPI_KEY,
  baseURL: "https://api.polyapi.ru/v1",
});

const r = await client.responses.create({ model: "openai/gpt-6.1-sol", input: "Привет" });
console.log(r.output_text);
```

**Ответ**

```json
{
  "id": "resp_68f2c0a91b7c4e5d",
  "object": "response",
  "status": "completed",
  "model": "openai/gpt-6.1-sol",
  "output": [
    {
      "type": "message",
      "id": "msg_68f2c0a93d1e",
      "status": "completed",
      "role": "assistant",
      "content": [
        {
          "type": "output_text",
          "text": "Привет! Чем помочь?",
          "annotations": []
        }
      ]
    }
  ],
  "usage": {
    "input_tokens": 9,
    "output_tokens": 7,
    "total_tokens": 16
  }
}
```

Изображения передаются частями `input_image` со ссылкой или data URL в `image_url`, в сообщениях user и в выводе инструментов. Остальное как в Chat Completions: изображение в запросе к модели, которая их не понимает, даёт 400. `file_id` не принимаем: файлы не храним.

Текст ответа лежит в `output`: элемент message, часть output_text. SDK собирает его в `output_text`.

Не поддерживаем, ответ 400: `previous_response_id`, `conversation`, `background: true`, элементы item_reference, встроенные инструменты (file_search, code_interpreter, image_generation, mcp и другие), файлы и аудио во входе. `web_search` убираем из tools без ошибки: модель отвечает без поиска. `store` всегда отправляем как false. `prompt_cache_key` заменяем своим ключом разговора, как в Chat Completions.

Источник: https://polyapi.ru/docs/responses
