ZvenoAI
Руководства

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.enabledbooleanВключить рассуждения с настройками по умолчанию. Нужен моделям, у которых рассуждения включаются флагом, а не уровнем усилий: это указано в описании модели в каталоге
reasoning.effortstringУровень усилий модели на reasoning: low, medium, high. Определяет, сколько времени и токенов модель потратит на рассуждения
reasoning.max_tokensintegerМаксимальное количество токенов, которое модель может потратить на reasoning. Поддерживается Anthropic и Gemini
reasoning.excludebooleanСкрыть reasoning из ответа, но модель всё равно выполнит рассуждения внутренне. Полезно для экономии трафика, если reasoning нужен только для качества
reasoning.summarystringУровень детализации summary: brief, detailed. Добавляет блок reasoning.summary в reasoning_details
verbositystringПодробность ответа: low, medium, high. ZvenoAI передаёт значение поставщику без изменений. Поддерживают не все модели, см. описание модели в каталоге
include_reasoningbooleandeprecated 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 поддерживается моделями, которые имеют встроенную поддержку цепочки рассуждений. Примеры:

ПровайдерМодели
OpenAIGPT-5.2, GPT-5.2 Pro, GPT-5.1, o4-mini, o3, o3-pro, o3-mini
AnthropicClaude Sonnet 4.6, Claude Opus 4.6, Claude Opus 4.5, Claude Sonnet 4.5, Claude 3.7 Sonnet:thinking
GoogleGemini 3.1 Pro, Gemini 3 Pro, Gemini 3 Flash, Gemini 2.5 Pro, Gemini 2.5 Flash
DeepSeekDeepSeek R1, DeepSeek R1-0528, DeepSeek Prover V2

Полный и актуальный список моделей с reasoning доступен в каталоге моделей.

On this page