Перейти к содержимому
Форматы API

OpenAI Responses

Формат Responses в Veda AI Gateway. Элементы ввода и вывода, потоковые события, инструменты, структурированный вывод и рассуждения.

Veda AI Gateway реализует формат OpenAI Responses. Вместо списка сообщений запрос передаёт input: строку или массив элементов. Ответ содержит массив output из элементов: сообщений, вызовов функций, рассуждений. Формат подходит агентам, которые работают с цепочками вызовов инструментов, и его использует, например, Codex CLI.

Адрес и аутентификация

ПараметрЗначение
Базовый адрес$VEDA_BASE_URL/v1
МаршрутPOST /v1/responses
АутентификацияAuthorization: Bearer $VEDA_API_KEY

Первый запрос

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.VEDA_API_KEY,
  baseURL: `${process.env.VEDA_BASE_URL}/v1`,
});

const response = await client.responses.create({
  model: "openai/gpt-6.1-sol",
  instructions: "Отвечай кратко.",
  input: "Почему небо голубое?",
});

console.log(response.output_text);

Свойство SDK output_text собирает текст из всех элементов output типа message. В ответе HTTP ищите элементы message с частями output_text.

Диалог из нескольких ходов

Передавайте историю в input массивом элементов. Ответы модели можно добавлять в историю как есть:

const history: OpenAI.Responses.ResponseInput = [
  { role: "user", content: "Придумай название для кофейни." },
];

const first = await client.responses.create({ model: "openai/gpt-6.1-sol", input: history });
history.push(...first.output);
history.push({ role: "user", content: "А теперь ещё три варианта." });

const second = await client.responses.create({ model: "openai/gpt-6.1-sol", input: history });
console.log(second.output_text);

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

С "stream": true ответ приходит типизированными событиями Server-Sent Events. Основные события: response.created, response.output_text.delta с фрагментом текста, response.output_item.done и завершающее response.completed с полным ответом и расходом токенов.

const stream = await client.responses.create({
  model: "openai/gpt-6.1-sol",
  input: "Напиши короткое стихотворение о море.",
  stream: true,
});

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

Вызов инструментов

В Responses функция описывается плоским объектом: name, description и parameters на верхнем уровне. Модель возвращает элементы function_call с call_id и arguments. Результат отправляется элементом function_call_output с тем же call_id.

const tools: OpenAI.Responses.Tool[] = [
  {
    type: "function",
    name: "getWeather",
    description: "Текущая погода в городе",
    parameters: {
      type: "object",
      properties: { location: { type: "string", description: "Город и страна" } },
      required: ["location"],
    },
    strict: false,
  },
];

const input: OpenAI.Responses.ResponseInput = [{ role: "user", content: "Какая погода в Казани?" }];
const first = await client.responses.create({ model: "anthropic/claude-sonnet-5.5", input, tools });
input.push(...first.output);

for (const item of first.output) {
  if (item.type !== "function_call") continue;
  const { location } = JSON.parse(item.arguments);
  const result = { location, temperatureC: 18 }; // здесь ваш код
  input.push({ type: "function_call_output", call_id: item.call_id, output: JSON.stringify(result) });
}

const second = await client.responses.create({ model: "anthropic/claude-sonnet-5.5", input, tools });
console.log(second.output_text);

tool_choice принимает "auto", "none", "required" или конкретную функцию. Вызов инструментов работает, если модель его поддерживает.

Структурированный вывод

В Responses формат ответа задаётся в text.format:

const response = await client.responses.create({
  model: "openai/gpt-6.1-sol",
  input: "Извлеки данные: Анна, 34 года, Новосибирск.",
  text: {
    format: {
      type: "json_schema",
      name: "person",
      strict: true,
      schema: {
        type: "object",
        properties: {
          name: { type: "string" },
          age: { type: "integer" },
          city: { type: "string" },
        },
        required: ["name", "age", "city"],
        additionalProperties: false,
      },
    },
  },
});

const person = JSON.parse(response.output_text);

Строгое соответствие схеме зависит от модели. Проверьте результат на выбранной модели.

Рассуждения

Глубина рассуждения задаётся объектом reasoning, например { "effort": "high" }. Модели без уровней принимают { "max_tokens": 2048 } или { "enabled": true }; готовый пример для конкретной модели есть на её странице в каталоге.

curl "$VEDA_BASE_URL/v1/responses" \
  -H "Authorization: Bearer $VEDA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-6.1-sol",
    "input": "Объясни парадокс Монти Холла по шагам.",
    "reasoning": { "effort": "high" }
  }'

Изображения на входе

Изображение передаётся частью input_image внутри сообщения, рядом с input_text:

{
  "model": "google/gemini-3.8-flash",
  "input": [
    {
      "role": "user",
      "content": [
        { "type": "input_text", "text": "Опиши это изображение." },
        { "type": "input_image", "image_url": "https://example.com/photo.jpg" }
      ]
    }
  ]
}

image_url принимает публичный URL или data URL с base64. В журнале запросов встроенные данные заменяются пометкой с размером.

Codex CLI

Codex CLI работает через формат Responses. Добавьте провайдер в ~/.codex/config.toml:

[model_providers.veda]
name = "Veda AI Gateway"
base_url = "http://localhost:3002/v1"
env_key = "VEDA_API_KEY"
wire_api = "responses"

Замените base_url на $VEDA_BASE_URL/v1 вашей установки и запустите:

codex --model 'openai/gpt-6.1-sol' -c 'model_provider="veda"'

Для работы агента модель должна поддерживать вызов инструментов.

Параметры

Veda передаёт тело запроса модели без изменений. Поддержку необязательных параметров определяет модель.

ПараметрТипОписание
modelstringОбязательный. Идентификатор модели
inputstring или arrayОбязательный. Текст или элементы: сообщения, вызовы функций, их результаты
instructionsstringСистемные инструкции
streambooleanПотоковая передача. По умолчанию false
max_output_tokensintegerОграничение длины ответа
temperature, top_pnumberПараметры выборки
tools, tool_choice, parallel_tool_callsarray, string или object, booleanВызов инструментов
textobjectФормат вывода, в том числе json_schema
reasoningobjectНастройки рассуждений

Ошибки

Ошибки проверки ключа и лимитов приходят в формате { "error": { "code": ..., "message": ... } }, коды те же, что для Chat Completions: 401 неверный или неактивный ключ, 402 лимит расходов, 429 ограничение частоты. Полный список в обзоре API.

На этой странице