# Responses

> POST /v1/responses в формате OpenAI Responses. Без состояния, поэтому каждый раз отправляйте всю переписку.


OpenAI Responses API на тех же моделях, ключах и с той же оплатой, что и chat completions. Используйте его, если ваш SDK или цикл агента (Codex, OpenAI Agents SDK) говорит на Responses, а не на chat.

```endpoint
POST https://api.notholy.com/v1/responses
```

## Запрос

| Поле | Тип | Обязательное | Примечания |
|---|---|---|---|
| `model` | string | Да | ID модели, например `notholy-specter` |
| `input` | string или array | Да | Промпт или список элементов `message`, `function_call` и `function_call_output`. Элементы других типов отбрасываются |
| `instructions` | string | Нет | Системный промпт, ставится перед `input` |
| `max_output_tokens` | number | Нет | Лимит выхода. По умолчанию максимум модели, больше него не бывает |
| `stream` | boolean | Нет | `true` возвращает именованные события `response.*` |
| `tools` | array | Нет | Функции. Инструменты других типов отбрасываются |
| `tool_choice` | string или object | Нет | Используется, если задано `tools` |
| `reasoning.effort` | string | Нет | Одно из значений `reasoning_efforts` модели. Любое другое значение возвращает `400` |
| `temperature`, `top_p` | number | Нет | Передаются модели |

Эндпоинт не хранит состояние. `previous_response_id` возвращает `400 unsupported_parameter`, а `store`, `metadata` и `text.format` игнорируются. Отправляйте всю переписку в `input`, включая прежние элементы `function_call` и `function_call_output`.

## Ответ без стриминга

```json
{
  "id": "resp_6mQ2x9",
  "object": "response",
  "created_at": 1793836800,
  "status": "completed",
  "model": "notholy-specter",
  "output": [
    { "type": "reasoning", "id": "rs_1", "summary": [{ "type": "summary_text", "text": "…" }] },
    {
      "type": "message",
      "id": "msg_1",
      "status": "completed",
      "role": "assistant",
      "content": [{ "type": "output_text", "text": "AV:N means the attack works over the network…", "annotations": [] }]
    }
  ],
  "usage": {
    "input_tokens": 18,
    "input_tokens_details": { "cached_tokens": 0 },
    "output_tokens": 96,
    "output_tokens_details": { "reasoning_tokens": 40 },
    "total_tokens": 114
  },
  "error": null,
  "incomplete_details": null,
  "store": false
}
```

- `status` равен `incomplete` с `incomplete_details.reason: "max_output_tokens"`, если лимит выхода обрезал ответ.
- Вызовы инструментов возвращаются как элементы `{"type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"}`.
- Если модель рассуждала, первым идёт элемент `reasoning`.

## Стриминг

С `"stream": true` приходят события `response.created`, `response.in_progress`, затем для каждого элемента вывода `response.output_item.added`, дельты текста или рассуждений, их события `.done` и `response.output_item.done`, и в конце `response.completed` (или `response.incomplete`) с `usage`. Строки `[DONE]` нет. Сбой посреди потока приходит как `response.failed`.

## Пример

```bash test
curl https://api.notholy.com/v1/responses \
  -H "Authorization: Bearer $NOTHOLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "notholy-specter", "input": "Summarize what CVSS 3.1 AV:N means."}'
```

```python test
import os
from openai import OpenAI

client = OpenAI(base_url="https://api.notholy.com/v1", api_key=os.environ["NOTHOLY_API_KEY"])

r = client.responses.create(model="notholy-specter", input="Summarize what CVSS 3.1 AV:N means.")
print(r.output_text)
```

```js test
import OpenAI from 'openai';

const client = new OpenAI({ baseURL: 'https://api.notholy.com/v1', apiKey: process.env.NOTHOLY_API_KEY });

const stream = await client.responses.create({ model: 'notholy-specter', input: 'Name two sources of EPSS data.', stream: true });
for await (const ev of stream) if (ev.type === 'response.output_text.delta') process.stdout.write(ev.delta);
console.log();
```

## Ошибки

Те же коды, что и у chat completions: `400` нет `model` или `input` · `401` неверный ключ · `402` закончились кредиты · `404` неизвестная модель · `429` занято (соблюдайте `retry-after`) · `503` модель недоступна. См. [Ошибки](/ru/guides/errors).
