Reasoning
Включите reasoning для моделей с поддержкой цепочки рассуждений через ZvenoAI. Получайте пошаговый ход мыслей модели в ответах API.
Получите доступ к внутренним рассуждениям модели. 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);from openai import OpenAI
client = OpenAI(
api_key="ваш_ключ_zvenoai",
base_url="https://api.zveno.ai/v1",
)
response = client.chat.completions.create(
model="anthropic/claude-sonnet-4",
messages=[
{"role": "user", "content": "Сколько будет 27 * 453? Объясни ход решения."}
],
extra_body={"reasoning": {"effort": "high"}},
)
msg = response.choices[0].message
print("Reasoning:", getattr(msg, "reasoning", None))
print("Answer:", msg.content)curl https://api.zveno.ai/v1/chat/completions \
-H "Authorization: Bearer $ZVENOAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"messages": [
{"role": "user", "content": "Сколько будет 27 * 453? Объясни ход решения."}
],
"reasoning": {"effort": "high"}
}'Форматы 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 | 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 доступен в каталоге моделей.
Web Search
Подключите поиск в интернете к любой LLM-модели через ZvenoAI. Добавьте :online к имени модели для доступа к актуальной информации в реальном времени.
Обработка ошибок
Как обрабатывать ошибки LLM API в ZvenoAI — HTTP коды статусов, стратегия повторов с exponential backoff, fallback по моделям и логирование.