Документация

POST /v1/responses

OpenAI Responses API — эндпоинт /v1/responses API LLMost, совместимый с OpenAI Responses API.

OpenAI Responses API — более новый формат запросов к моделям от OpenAI, идущий на смену Chat Completions: единое поле input вместо массива messages, встроенные инструменты (web_search, file_search, code_interpreter) и структура ответа output, ориентированная на агентные сценарии. Эндпоинт совместим с OpenAI Responses API — существующий код на официальных SDK OpenAI работает без изменений, достаточно поменять base_url и API-ключ.

Основная информация

Эндпоинт: POST https://llmost.ru/api/v1/responses

Аутентификация — API-ключ LLMost в заголовке Authorization: Bearer llmost_... (см. Аутентификация).

Совместимость с OpenAI SDK

Существующий код на официальных SDK OpenAI работает без изменений: поменяйте base_url на https://llmost.ru/api/v1, подставьте ключ LLMost и вызывайте responses.create().

API stateless — store и previous_response_id не поддерживаются

В отличие от api.openai.com, LLMost не хранит историю ответов на своей стороне: это чистый прокси-эндпоинт без состояния.

  • Параметр store игнорируется на приём — сервер ничего не сохраняет вне зависимости от его значения.
  • Параметр previous_response_id отклоняется апстримом с ошибкой 400, если модель не может найти ответ с таким id (а она не может — он нигде не хранится).

Передавайте всю историю диалога явно в input при каждом запросе — так же, как messages в Chat Completions API.

Быстрый старт

cURL

curl https://llmost.ru/api/v1/responses \
  -H "Authorization: Bearer llmost_ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "input": "В чём смысл жизни?"
  }'

Python с OpenAI SDK

from openai import OpenAI

client = OpenAI(
    base_url="https://llmost.ru/api/v1",
    api_key="llmost_ВАШ_КЛЮЧ",
)

response = client.responses.create(
    model="openai/gpt-4o",
    input="В чём смысл жизни?",
)

print(response.output_text)

TypeScript с OpenAI SDK

import OpenAI from 'openai';

const openai = new OpenAI({
  baseURL: 'https://llmost.ru/api/v1',
  apiKey: 'llmost_ВАШ_КЛЮЧ',
});

const response = await openai.responses.create({
  model: 'openai/gpt-4o',
  input: 'В чём смысл жизни?',
});

console.log(response.output_text);

Передача истории диалога

Поскольку previous_response_id не поддерживается, каждый следующий запрос должен содержать всю накопленную историю в input — в том же формате, что и messages в Chat Completions:

const response = await openai.responses.create({
  model: 'openai/gpt-4o',
  input: [
    { role: 'user', content: 'Как создать REST API на Node.js?' },
    { role: 'assistant', content: 'Для REST API на Node.js обычно используют Express...' },
    { role: 'user', content: 'А как добавить аутентификацию?' },
  ],
});

Структура ответа

{
  "id": "resp_67ccd2bed1ec8190b14f964abc0542670bb6a6b6a90c391",
  "object": "response",
  "created_at": 1741476542,
  "status": "completed",
  "model": "openai/gpt-4o",
  "output": [
    {
      "type": "message",
      "id": "msg_67ccd2bf17f0819081ff3bb2cf6508e60bb6a6b6a90c391",
      "role": "assistant",
      "status": "completed",
      "content": [
        {
          "type": "output_text",
          "text": "Смысл жизни — философский вопрос...",
          "annotations": []
        }
      ]
    }
  ],
  "output_text": "Смысл жизни — философский вопрос...",
  "usage": {
    "input_tokens": 15,
    "input_tokens_details": { "cached_tokens": 0 },
    "output_tokens": 120,
    "output_tokens_details": { "reasoning_tokens": 0 },
    "total_tokens": 135,
    "cost": 0.0004,
    "cost_details": {
      "upstream_inference_input_cost": 0.00003,
      "upstream_inference_output_cost": 0.00036
    }
  }
}

Поле model в ответе — тот же слаг, что был передан в запросе (слаг каталога LLMost, не внутреннее имя апстрима).

usage

  • input_tokens / output_tokens — входные и выходные токены
  • input_tokens_details.cached_tokens — часть input_tokens, покрытая кэшем промптов
  • output_tokens_details.reasoning_tokens — токены рассуждений (для reasoning-моделей)
  • total_tokens — сумма входных и выходных токенов
  • cost — расширение LLMost: фактически списанная сумма в рублях, уже с учётом наценки LLMost
  • cost_details — расширение LLMost: детализация списания по инпуту и аутпуту

Потоковая передача

Включается параметром stream: true — ответ приходит как Server-Sent Events в формате событий Responses API (response.created, response.output_text.delta, response.completed и т.д.). Событие response.completed содержит финальный объект response с полем usage, куда уже применена наценка LLMost.

curl https://llmost.ru/api/v1/responses \
  -H "Authorization: Bearer llmost_ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-4o",
    "input": "Напиши короткое стихотворение",
    "stream": true
  }'
const stream = await openai.responses.create({
  model: 'openai/gpt-4o',
  input: 'Напиши короткое стихотворение',
  stream: true,
});

for await (const event of stream) {
  if (event.type === 'response.output_text.delta') {
    process.stdout.write(event.delta);
  }
}

Общие принципы SSE (буферизация, отмена через AbortController) — см. Потоковую передачу; формат самих событий здесь — Responses API, а не chat-completion-подобный.

Обработка ошибок

Ошибки возвращаются в том же формате, что и остальной API LLMost:

{
  "error": {
    "code": 400,
    "message": "Invalid value: 'previous_response_id' is not supported",
    "metadata": {}
  }
}

Коды ошибок

КодПричина
400Невалидный запрос, модель не найдена, либо previous_response_id отклонён апстримом
401Недействительный или отсутствующий API-ключ
402Недостаточно средств на балансе — пополните баланс
403Запрос отклонён модерацией провайдера
408Истекло время ожидания запроса на стороне провайдера
429Превышен лимит запросов
500Сбой прокси-запроса к шлюзу LLMost
502Модель или провайдер временно недоступны, либо вернули некорректный ответ
503Нет доступных провайдеров для модели
504Провайдер не ответил вовремя (таймаут запроса к апстриму)

См. Ошибки для общего формата ошибок API и подробностей по каждому коду.

Следующие шаги

POST /v1/responses | Документация | LLMost