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 передаёт тело запроса модели без изменений. Поддержку необязательных параметров определяет модель.
| Параметр | Тип | Описание |
|---|---|---|
model | string | Обязательный. Идентификатор модели |
input | string или array | Обязательный. Текст или элементы: сообщения, вызовы функций, их результаты |
instructions | string | Системные инструкции |
stream | boolean | Потоковая передача. По умолчанию false |
max_output_tokens | integer | Ограничение длины ответа |
temperature, top_p | number | Параметры выборки |
tools, tool_choice, parallel_tool_calls | array, string или object, boolean | Вызов инструментов |
text | object | Формат вывода, в том числе json_schema |
reasoning | object | Настройки рассуждений |
Ошибки
Ошибки проверки ключа и лимитов приходят в формате { "error": { "code": ..., "message": ... } }, коды те же, что для Chat Completions: 401 неверный или неактивный ключ, 402 лимит расходов, 429 ограничение частоты. Полный список в обзоре API.
OpenAI Chat Completions
Подключение OpenAI SDK и любых OpenAI-совместимых клиентов к Veda AI Gateway. Потоковая передача, инструменты, структурированный вывод, рассуждения и изображения.
Anthropic Messages
Подключение Anthropic SDK и Claude Code к Veda AI Gateway. Потоковая передача, инструменты, расширенное мышление и изображения в формате Anthropic.