Руководства
Reasoning (цепочка рассуждений)
Получите доступ к внутренним рассуждениям модели. Reasoning позволяет модели «думать» перед ответом, что повышает качество решений для сложных задач — математика, логика, код, планирование.
Быстрый старт
Для включения reasoning добавьте параметр reasoning: { effort: "high" } в запрос:
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.ZVENOAI_API_KEY,
baseURL: "https://api.zveno.ai/v1",
});
const response = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4",
messages: [
{ role: "user", content: "Сколько будет 27 * 453? Объясни ход решения." }
],
reasoning: { effort: "high" },
});
const msg = response.choices[0].message;
console.log("Reasoning:", msg.reasoning);
console.log("Answer:", msg.content);Форматы reasoning в ответе
ZvenoAI возвращает reasoning в нескольких форматах одновременно для максимальной совместимости с различными SDK:
reasoning / reasoning_content
Строковый формат — полный текст рассуждений модели. Оба поля содержат одинаковое значение. reasoning_content — алиас для совместимости с DeepSeek SDK и некоторыми OpenRouter-обёртками.
reasoning_details
Структурированный массив блоков reasoning. Каждый блок имеет тип:
- •
reasoning.text— текстовый блок рассуждений - •
reasoning.encrypted— зашифрованный блок (для round-trip, Anthropic) - •
reasoning.summary— краткое описание блока рассуждений
{
"choices": [{
"message": {
"role": "assistant",
"content": "27 * 453 = 12 231",
"reasoning": "Мне нужно умножить 27 на 453...",
"reasoning_content": "Мне нужно умножить 27 на 453...",
"reasoning_details": [
{
"type": "reasoning.text",
"text": "Мне нужно умножить 27 на 453..."
}
]
}
}]
}Параметры конфигурации
| Параметр | Тип | Описание |
|---|---|---|
reasoning.effort | string | Уровень усилий модели на reasoning: low, medium, high. Определяет, сколько времени и токенов модель потратит на рассуждения |
reasoning.max_tokens | integer | Максимальное количество токенов, которое модель может потратить на reasoning. Поддерживается Anthropic и Gemini |
reasoning.exclude | boolean | Скрыть reasoning из ответа, но модель всё равно выполнит рассуждения внутренне. Полезно для экономии трафика, если reasoning нужен только для качества |
reasoning.summary | string | Уровень детализации summary: brief, detailed. Добавляет блок reasoning.summary в reasoning_details |
include_reasoning | boolean | deprecated Legacy-параметр. Используйте reasoning вместо него |
Сохранение reasoning между ходами
При использовании tool-calling важно передавать reasoning обратно в assistant-сообщении, чтобы модель сохраняла контекст своих рассуждений между ходами:
Зачем это нужно?
Без передачи reasoning модель теряет ход рассуждений, который привёл к вызову инструмента. Это может привести к непоследовательным ответам или повторным вызовам. Передавайте reasoning_content или reasoning_details в assistant-сообщении.
// Сохранение reasoning между ходами (tool-calling)
const messages = [
{ role: "user", content: "Какая погода в Москве?" },
];
// 1. Первый запрос — модель решает вызвать tool
const response1 = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4",
messages,
reasoning: { effort: "high" },
tools: [{ type: "function", function: { name: "get_weather", ... } }],
});
const assistantMsg = response1.choices[0].message;
// 2. Передаём assistant-сообщение обратно с reasoning
messages.push({
role: "assistant",
content: assistantMsg.content,
tool_calls: assistantMsg.tool_calls,
// Передаём reasoning обратно для сохранения контекста рассуждений
reasoning_content: assistantMsg.reasoning_content,
// Или структурированный формат:
// reasoning_details: assistantMsg.reasoning_details,
});
// 3. Добавляем результат tool call
messages.push({
role: "tool",
tool_call_id: assistantMsg.tool_calls[0].id,
content: JSON.stringify({ temperature: 15, condition: "cloudy" }),
});
// 4. Финальный запрос — модель использует сохранённый reasoning
const response2 = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4",
messages,
reasoning: { effort: "high" },
});Streaming
В streaming-режиме reasoning приходит в отдельных SSE-чанках перед основным контентом. Поле delta.reasoning (или delta.reasoning_content) содержит фрагмент рассуждений:
// Streaming с reasoning
const stream = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4",
messages: [{ role: "user", content: "Реши задачу..." }],
reasoning: { effort: "high" },
stream: true,
});
for await (const chunk of stream) {
const delta = chunk.choices[0]?.delta;
// Reasoning приходит в отдельных чанках перед основным контентом
if (delta?.reasoning) {
process.stdout.write(delta.reasoning); // или delta.reasoning_content
}
if (delta?.content) {
process.stdout.write(delta.content);
}
}Стоимость
Reasoning-токены биллятся отдельно от основных completion-токенов. Стоимость зависит от модели и провайдера.
Как контролировать расходы
- • Используйте
reasoning.effort: "low"для простых задач - • Ограничьте бюджет через
reasoning.max_tokens - • Включите
reasoning.exclude: trueесли вам нужно качество, но не текст рассуждений
Поддерживаемые модели
Reasoning поддерживается моделями, которые имеют встроенную поддержку цепочки рассуждений. Примеры:
| Провайдер | Модели |
|---|---|
| OpenAI | GPT-5.2, GPT-5.2 Pro, GPT-5.1, o4-mini, o3, o3-pro, o3-mini |
| Anthropic | Claude Sonnet 4.6, Claude Opus 4.6, Claude Opus 4.5, Claude Sonnet 4.5, Claude 3.7 Sonnet:thinking |
| Gemini 3.1 Pro, Gemini 3 Pro, Gemini 3 Flash, Gemini 2.5 Pro, Gemini 2.5 Flash | |
| DeepSeek | DeepSeek R1, DeepSeek R1-0528, DeepSeek Prover V2 |
Полный и актуальный список моделей с reasoning доступен в каталоге моделей.