Справочник API
Responses
POST /v1/responses в формате OpenAI Responses. Без состояния, поэтому каждый раз отправляйте всю переписку.
OpenAI Responses API на тех же моделях, ключах и с той же оплатой, что и chat completions. Используйте его, если ваш SDK или цикл агента (Codex, OpenAI Agents SDK) говорит на Responses, а не на chat.
https://api.notholy.com/v1/responsesPOST 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.
Ответ без стриминга
{
"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.
Пример
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."}'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)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 модель недоступна. См. Ошибки.