Провайдеры

Reasoning

Сквозной справочник по reasoning- и thinking-возможностям LLM-моделей у разных провайдеров.

Обзор

Reasoning (у некоторых провайдеров — «thinking») позволяет моделям продемонстрировать пошаговый ход рассуждений перед выдачей итогового ответа. Эта возможность доступна у нескольких провайдеров, но реализована по-разному.

Meridian приводит все провайдер-специфичные форматы reasoning к единой OpenAI-совместимой структуре: поле reasoning в запросе и reasoning_details в ответе.


Матрица поддержки провайдерами

ПровайдерПоле запросаПоле ответаМинимальный бюджетУровни effortStreaming
OpenAIreasoningreasoning_detailsнетminimal, low, medium, high
Anthropicthinkingcontent-блоки1024 токеновтолько enabled
Bedrock (Anthropic)thinkingcontent-блоки1024 токеновтолько enabled
Gemini 2.5+thinking_configthought-части1024только бюджет
Gemini 3.0+thinking_configthought-части1024minimal, low, medium, high + бюджет

Конфигурация запроса

Chat Completions API

{
  "model": "provider/model-name",
  "messages": [...],
  "reasoning": {
    "effort": "high",
    "max_tokens": 4096
  }
}

Responses API

{
  "model": "provider/model-name",
  "input": [...],
  "reasoning": {
    "effort": "high",
    "max_tokens": 4096,
    "summary": "detailed"
  }
}

Responses API принимает те же effort и max_tokens, что и Chat Completions, и дополнительно поддерживает необязательный параметр summary для суммаризации reasoning-вывода.

Справочник параметров

Параметры Chat Completions API

ПараметрТипОписание
effortstringУровень интенсивности reasoning
max_tokensintМаксимум токенов под reasoning (бюджет)

Параметры Responses API

ПараметрТипОписание
effortstringУровень интенсивности reasoning
max_tokensintМаксимум токенов под reasoning (бюджет)
summarystringУровень суммаризации: brief, detailed или json

Responses API принимает те же параметры effort и max_tokens, что и Chat Completions, плюс необязательный summary для суммаризации reasoning-вывода.


Преобразования под конкретных провайдеров

OpenAI

OpenAI использует только effort-режим. Meridian применяет следующий приоритет:

  1. Если задан reasoning.effort → используется напрямую.
  2. Иначе если задан reasoning.max_tokens → effort оценивается из него.
  3. Поле max_tokens удаляется перед отправкой в OpenAI.

Примеры преобразований:

// Запрос Meridian (с effort)
{
  "reasoning": {
    "effort": "high"
  }
}

// Запрос, отправленный в OpenAI
{
  "reasoning": {
    "effort": "high"
  }
}
// Запрос Meridian с effort (нативное поле)
chatReq := &schemas.BifrostChatRequest{
	Provider: schemas.OpenAI,
	Model:    "gpt-4o",
	Input:    messages,
	Params: &schemas.ChatParameters{
		MaxCompletionTokens: schemas.Ptr(4096),
		Reasoning: &schemas.ChatReasoning{
			Effort: schemas.Ptr("high"),
		},
	},
}

// OpenAI получает effort напрямую, max_tokens очищается
// Запрос Meridian (только max_tokens)
{
  "max_completion_tokens": 4096,
  "reasoning": {
    "max_tokens": 3000
  }
}

// Оценка: ratio = 3000/4096 ≈ 0.73 → "high"
// Запрос, отправленный в OpenAI
{
  "reasoning": {
    "effort": "high"
  }
}
// Запрос Meridian только с max_tokens
chatReq := &schemas.BifrostChatRequest{
	Provider: schemas.OpenAI,
	Model:    "gpt-4o",
	Input:    messages,
	Params: &schemas.ChatParameters{
		MaxCompletionTokens: schemas.Ptr(4096),
		Reasoning: &schemas.ChatReasoning{
			MaxTokens: schemas.Ptr(3000),
		},
	},
}

// Meridian оценивает effort из max_tokens
// ratio = 3000/4096 ≈ 0.73 → effort = "high"
// OpenAI получает effort, max_tokens очищается

Поддерживаемые уровни effort: minimal, low, medium, high.

Значение minimal при маршрутизации к не-OpenAI провайдерам конвертируется в low. Сам OpenAI принимает только low, medium, high.


Anthropic

Anthropic использует параметр thinking с другой структурой.

// Запрос Meridian
{
  "reasoning": {
    "effort": "high",
    "max_tokens": 4096
  }
}

// Запрос Anthropic
{
  "thinking": {
    "type": "enabled",
    "budget_tokens": 4096
  }
}
// Ответ Anthropic (content-блоки)
{
  "content": [
    {
      "type": "thinking",
      "thinking": "Разберу шаг за шагом...",
      "signature": "EqoBCkgIAR..."
    },
    {
      "type": "text",
      "text": "Ответ — 42."
    }
  ]
}

// Ответ Meridian
{
  "choices": [{
    "message": {
      "content": "Ответ — 42.",
      "reasoning": "Разберу шаг за шагом...",
      "reasoning_details": [{
        "index": 0,
        "type": "text",
        "text": "Разберу шаг за шагом...",
        "signature": "EqoBCkgIAR..."
      }]
    }
  }]
}

Правила преобразования:

MeridianAnthropicПримечание
reasoning.effortthinking.typeвсегда мапится в "enabled"
reasoning.max_tokensthinking.budget_tokensбюджет токенов под reasoning

Критичное ограничение: Anthropic требует reasoning.max_tokens >= 1024. Запросы с меньшим значением завершатся ошибкой.

Обработка динамического бюджета:

Входное значениеПреобразуется в
-1 (динамический)1024 (минимум по умолчанию)
< 1024Ошибка
>= 1024передаётся без изменений

Ссылка на код: core/providers/anthropic/chat.go:104-134


Bedrock (модели Anthropic)

Bedrock для Claude-моделей использует ту же структуру, что и Anthropic.

// Запрос Meridian
{
  "reasoning": {
    "effort": "high",
    "max_tokens": 4096
  }
}

// Запрос Bedrock (для моделей Anthropic/Claude)
{
  "additionalModelRequestFields": {
    "reasoning_config": {
      "type": "enabled",
      "budget_tokens": 4096
    }
  }
}

К моделям Anthropic в Bedrock применяется то же ограничение в 1024 токена. Попытка задать max_tokens ниже 1024 приведёт к ошибке.

Ссылка на код: core/providers/bedrock/utils.go:34-47


Bedrock (модели Nova)

Модели Bedrock Nova используют effort-подход, аналогичный OpenAI.

// Запрос Meridian
{
  "reasoning": {
    "effort": "high",
    "max_tokens": 4096
  }
}

// Запрос Bedrock (для моделей Nova)
{
  "additionalModelRequestFields": {
    "reasoningConfig": {
      "type": "enabled",
      "maxReasoningEffort": "high"
    }
  }
}
Effort в MeridianEffort в NovaКонфигурация
minimal, low"low"обычные параметры разрешены
medium"medium"обычные параметры разрешены
high"high"очищаются maxTokens, temperature, topP

Ключевые отличия от Anthropic:

  • Нет минимального токен-бюджета.
  • Используются уровни effort вместо токен-бюджета.
  • Режим high автоматически очищает конфликтующие параметры.

Ссылка на код: core/providers/bedrock/utils.go:48-89


Gemini

Gemini использует thinking_config с двойной поддержкой токен-бюджетов и уровней effort — в зависимости от версии модели.

Поддержка по версиям моделей

Версия GeminithinkingBudgetthinkingLevelПримечание
2.5+только бюджет
3.0+бюджет и уровень

Важно: Gemini принимает только ОДИН параметр за раз — либо thinkingBudget, либо thinkingLevel. Если в запросе Meridian заданы и reasoning.max_tokens, и reasoning.effort, приоритет у max_tokens, и он преобразуется в thinkingBudget.

Правила приоритета

Когда заданы и reasoning.max_tokens, и reasoning.effort:

1. Если задан max_tokens → ИСПОЛЬЗУЕТСЯ thinkingBudget (effort игнорируется)
2. Иначе если задан effort:
   - Gemini 3.0+ → ИСПОЛЬЗУЕТСЯ thinkingLevel (нативный путь)
   - Gemini 2.5  → effort КОНВЕРТИРУЕТСЯ в thinkingBudget
3. Иначе → reasoning отключён
// Запрос Meridian — заданы оба поля
{
  "model": "gemini-3.0-flash",
  "reasoning": {
    "effort": "high",        // игнорируется
    "max_tokens": 4096      // имеет приоритет
  }
}

// Запрос в Gemini 3.0+ — отправляется только бюджет
{
  "generation_config": {
    "thinking_config": {
      "include_thoughts": true,
      "thinking_budget": 4096
    }
  }
}
// Запрос Meridian — только effort
{
  "model": "gemini-3.0-flash",
  "reasoning": {
    "effort": "high"
  }
}

// Запрос в Gemini 3.0+ — конвертирован в level
{
  "generation_config": {
    "thinking_config": {
      "include_thoughts": true,
      "thinking_level": "high"
    }
  }
}
// Запрос Meridian — только effort
{
  "model": "gemini-2.5-flash",
  "max_completion_tokens": 4096,
  "reasoning": {
    "effort": "high"
  }
}

// Запрос в Gemini 2.5 — конвертирован в бюджет
// Расчёт: 1024 + (0.80 × (4096 - 1024)) = 3482
{
  "generation_config": {
    "thinking_config": {
      "include_thoughts": true,
      "thinking_budget": 3482
    }
  }
}

Преобразования уровня под конкретные модели

У Pro-моделей Gemini действуют более жёсткие ограничения на thinking-уровни:

Effort в MeridianНе-Pro моделиPro-моделиПримечание
"none"пустая строкапустая строкаотключает thinking
"minimal""minimal""low"Pro не поддерживает minimal
"low""low""low"поддерживается везде
"medium""medium""high"Pro не поддерживает medium
"high""high""high"поддерживается везде

Пример:

// Для "gemini-3.0-flash-thinking-exp" (не Pro)
effort: "medium" → thinkingLevel: "medium"

// Для "gemini-3.0-pro" (Pro-модель)
effort: "medium" → thinkingLevel: "high"  // повышается

Специальные значения

ЗначениеПолеПоведениеСценарий
0max_tokensthinking_budget: 0, include_thoughts: falseявно отключить reasoning
-1max_tokensthinking_budget: -1динамический бюджет (Gemini сам решает)
"none"effortthinking_budget: 0, include_thoughts: falseотключить reasoning
// Запрос Meridian — динамический бюджет
{
  "reasoning": {
    "max_tokens": -1
  }
}

// Запрос Gemini — передаётся как есть
{
  "generation_config": {
    "thinking_config": {
      "include_thoughts": true,
      "thinking_budget": -1
    }
  }
}
// Запрос Meridian — способ 1
{
  "reasoning": {
    "max_tokens": 0
  }
}

// Запрос Meridian — способ 2
{
  "reasoning": {
    "effort": "none"
  }
}

// Запрос Gemini — оба становятся
{
  "generation_config": {
    "thinking_config": {
      "include_thoughts": false,
      "thinking_budget": 0
    }
  }
}

Преобразование ответа

// Ответ Gemini
{
  "candidates": [{
    "content": {
      "parts": [
        {
          "thought": true,
          "text": "Анализирую задачу..."
        },
        {
          "text": "Ответ — 42."
        }
      ]
    }
  }]
}

// Ответ Meridian
{
  "choices": [{
    "message": {
      "content": "Ответ — 42.",
      "reasoning": "Анализирую задачу...",
      "reasoning_details": [{
        "index": 0,
        "type": "text",
        "text": "Анализирую задачу..."
      }]
    }
  }]
}
// После вызова Meridian Chat Completions с Gemini
resp, err := client.ChatCompletionRequest(schemas.NewBifrostContext(ctx, schemas.NoDeadline), chatReq)
if err != nil {
  log.Fatal(err)
}

// Извлечь reasoning из ответа
choice := resp.Choices[0]
message := choice.Message

// Объединённый текст рассуждений
fmt.Printf("Reasoning: %s\n", message.Reasoning)

// Детальные блоки reasoning
for i, details := range message.ReasoningDetails {
  if details.Type == "text" {
    fmt.Printf("Блок thinking %d:\n%s\n", i, details.Text)
  }
}

// Итоговый ответ
fmt.Printf("Ответ:\n%s\n", message.Content)

Сводка преобразований

Meridian → Gemini (запрос):

ВходGemini 2.5Gemini 3.0+Примечание
max_tokens: 4096thinking_budget: 4096thinking_budget: 4096прямой проброс
max_tokens: -1thinking_budget: -1thinking_budget: -1динамический бюджет
max_tokens: 0thinking_budget: 0thinking_budget: 0выключено
только effort: "high"thinking_budget: 3482*thinking_level: "high"оценка или нативный путь
только effort: "medium"thinking_budget: 2330*thinking_level: "medium" или "high"**оценка или нативный путь
effort + max_tokensиспользуется max_tokensиспользуется max_tokensправило приоритета

* при max_completion_tokens: 8192 (по умолчанию), используется формула оценки. ** Pro-модели конвертируют "medium" в "high".

Gemini → Meridian (ответ):

Поле GeminiПоле MeridianПреобразование
thinking_budgetreasoning.max_tokensпрямое мапирование
thinking_levelreasoning.effortмапирование уровень → effort
thought: true-частиreasoning_details[]массив блоков reasoning

Ссылки на код:

  • core/providers/gemini/utils.go (Chat Completions)
  • core/providers/gemini/responses.go (Responses API)
  • core/providers/gemini/types.go (константы)

Два подхода к reasoning: effort и max_tokens

Meridian поддерживает две разных модели reasoning у разных провайдеров:

Типы reasoning-моделей

МодельПровайдерыПоле запросаНативный формат
На основе effortOpenAI, AWS Bedrock Novareasoning.effortreasoning_effort (Chat) / effort (Responses)
На основе max_tokensAnthropic, Cohere, Geminireasoning.max_tokensthinking.budget_tokens

Важно: в одном запросе можно задать и effort, и max_tokens. Meridian использует иерархию приоритетов, чтобы решить, какое из полей применить.

Логика приоритета: нативное vs. оценочное

Когда заданы и effort, и max_tokens, Meridian отдаёт приоритет тому полю, которое нативно для целевого провайдера:

Для провайдеров на основе max_tokens (Anthropic, Cohere, Gemini)

1. Если задан reasoning.max_tokens → ИСПОЛЬЗУЕТСЯ ОНО (нативное поле)
2. Иначе если задан reasoning.effort → max_tokens ОЦЕНИВАЕТСЯ из effort
3. Иначе → reasoning отключён

Пример (Cohere):

// Запрос с обоими полями
{
  "reasoning": {
    "effort": "high",
    "max_tokens": 2000
  }
}

Результат: используется max_tokens: 2000 напрямую, effort игнорируется.

Для провайдеров на основе effort (OpenAI, AWS Bedrock Nova)

1. Если задан reasoning.effort → ИСПОЛЬЗУЕТСЯ ОНО (нативное поле)
2. Иначе если задан reasoning.max_tokens → effort ОЦЕНИВАЕТСЯ из max_tokens
3. Иначе → reasoning отключён

Пример (OpenAI Chat Completions):

// Запрос с обоими полями
{
  "reasoning": {
    "effort": "high",
    "max_tokens": 2000
  }
}

Результат: используется effort: "high" напрямую, max_tokens удаляется из JSON.


Функции-оценщики

Meridian предоставляет две функции для конвертации между подходами reasoning. Они вызываются, когда нативное поле недоступно.

Функция 1: effort → max_tokens

Функция: GetBudgetTokensFromReasoningEffort()

Файл: core/providers/utils/utils.go:1350-1387

Сигнатура:

func GetBudgetTokensFromReasoningEffort(
    effort string,           // "minimal", "low", "medium", "high"
    minBudgetTokens int,     // минимум провайдера (например, 1024 у Anthropic)
    maxTokens int,           // общий лимит токенов под completion
) (int, error)

Алгоритм:

1. Соотношение для уровня effort:
   - "minimal"  → 2.5%  (0.025)
   - "low"      → 15%   (0.15)
   - "medium"   → 42.5% (0.425)
   - "high"     → 80%   (0.80)

2. Расчёт бюджета:
   budget = minBudgetTokens + (ratio × (maxTokens - minBudgetTokens))

3. Ограничение допустимым диапазоном:
   если budget < minBudgetTokens → budget = minBudgetTokens
   если budget > maxTokens → budget = maxTokens

Примеры преобразования (minBudgetTokens=1024, maxTokens=4096):

EffortСоотношениеРасчётРезультат
minimal2.5%1024 + 0.025 × 30721101 → 1024*
low15%1024 + 0.15 × 30721485
medium42.5%1024 + 0.425 × 30722330
high80%1024 + 0.80 × 30723482

*Если результат ниже минимума, он подтягивается к minBudgetTokens (для Anthropic — 1024).

Обработка ошибок:

if minBudgetTokens > maxTokens {
    return 0, fmt.Errorf("max_tokens must be > minBudgetTokens")
}

Пример вызова:

// Cohere: конвертация effort в токен-бюджет
budgetTokens, err := providerUtils.GetBudgetTokensFromReasoningEffort(
    "high",                    // effort
    1,                         // минимум Cohere
    4096,                      // лимит токенов под completion
)
// Возвращает: 3277 токенов

Функция 2: max_tokens → effort

Функция: GetReasoningEffortFromBudgetTokens()

Файл: core/providers/utils/utils.go:1308-1345

Сигнатура:

func GetReasoningEffortFromBudgetTokens(
    budgetTokens int,        // токен-бюджет под reasoning
    minBudgetTokens int,     // минимум провайдера
    maxTokens int,           // общий лимит токенов под completion
) string                     // возвращает: "low", "medium", "high"

Алгоритм:

1. Привести бюджет к допустимому диапазону:
   если budget < min → budget = min
   если budget > max → budget = max

2. Рассчитать соотношение:
   ratio = (budgetTokens - minBudgetTokens) / (maxTokens - minBudgetTokens)

3. Сопоставить соотношение с уровнем effort:
   если ratio ≤ 0.25  → "low"
   если ratio ≤ 0.60  → "medium"
   если ratio > 0.60  → "high"

Примеры преобразования (minBudgetTokens=1024, maxTokens=4096):

Бюджет токеновСоотношениеEffort
10240%low
11012.5%low
150015.6%low
190028.6%medium
250048.1%medium
300064.5%high
340077.6%high

Защитные значения по умолчанию:

if budgetTokens <= 0 {
    return "none"
}
if maxTokens <= 0 {
    return "medium"  // безопасный дефолт
}
if maxTokens <= minBudgetTokens {
    return "high"    // соотношение посчитать невозможно
}

Пример вызова:

// Конвертировать бюджет Anthropic обратно в effort для отображения
effort := providerUtils.GetReasoningEffortFromBudgetTokens(
    3000,   // токен-бюджет из ответа Anthropic
    1024,   // минимум Anthropic
    4096,   // лимит токенов
)
// Возвращает: "high"

Константы по провайдерам

У разных провайдеров — разные ограничения на reasoning-бюджет.

Минимальные значения бюджета

ПровайдерФайлMinBudgetTokensПричина
Anthropiccore/providers/anthropic/types.go1024требование Anthropic API
Bedrock Anthropiccore/providers/bedrock/types.go1024то же, что у Anthropic
Bedrock Novacore/providers/bedrock/types.go1гибче
Coherecore/providers/cohere/types.go1гибко
Geminicore/providers/gemini/types.go1024дефолтный минимум для конвертаций

Лимит completion-токенов по умолчанию (для расчёта соотношения)

Если max_completion_tokens не задан, используются эти значения:

ПровайдерПо умолчаниюФайл
OpenAI, Anthropic, Cohere, Bedrock4096core/providers/*/types.go
Gemini8192core/providers/gemini/types.go

Примеры конвертации effort ↔ токены

Пример 1: оценка токенов из effort (Anthropic)

Вход:

{
  "model": "anthropic/claude-3-5-sonnet",
  "max_completion_tokens": 2000,
  "reasoning": {
    "effort": "high"
  }
}

Процесс конвертации:

  1. effort = "high"ratio = 0.80
  2. minBudgetTokens = 1024 (Anthropic)
  3. maxCompletionTokens = 2000
  4. budget = 1024 + (0.80 × (2000 - 1024))
  5. budget = 1024 + (0.80 × 976)
  6. budget = 1024 + 780
  7. Результат: 1804 токена

Сгенерированный запрос Anthropic:

{
  "thinking": {
    "type": "enabled",
    "budget_tokens": 1804
  }
}

Пример 2: оценка effort из токенов (Bedrock Nova)

Вход:

{
  "model": "bedrock/us.amazon.nova-pro-v1:0",
  "max_completion_tokens": 4096,
  "reasoning": {
    "max_tokens": 2000
  }
}

Процесс конвертации:

  1. budgetTokens = 2000
  2. minBudgetTokens = 1 (Nova)
  3. maxCompletionTokens = 4096
  4. ratio = (2000 - 1) / (4096 - 1)
  5. ratio = 1999 / 4095
  6. ratio = 0.488 (48.8%)
  7. Поскольку 0.25 < 0.488 ≤ 0.60Результат: "medium"

Сгенерированный запрос Bedrock Nova:

{
  "reasoningConfig": {
    "type": "enabled",
    "maxReasoningEffort": "medium"
  }
}

Пример 3: оба поля заданы (применён приоритет)

Вход:

{
  "model": "anthropic/claude-3-5-sonnet",
  "max_completion_tokens": 4096,
  "reasoning": {
    "effort": "medium",
    "max_tokens": 2500
  }
}

Логика для провайдера на основе max_tokens:

  1. Проверка: задан ли max_tokens? → ДА
  2. Использовать max_tokens напрямую (игнорировать effort).
  3. Валидация: 2500 >= 1024? → ДА

Сгенерированный запрос Anthropic:

{
  "thinking": {
    "type": "enabled",
    "budget_tokens": 2500
  }
}

Примечание: effort: "medium" полностью игнорируется, потому что приоритет у max_tokens.


Формат ответа

Стандартный ответ Meridian

Все провайдеры возвращают reasoning в нормализованном массиве reasoning_details:

{
  "choices": [{
    "message": {
      "role": "assistant",
      "content": "Итоговый текст ответа",
      "reasoning_details": [
        {
          "index": 0,
          "type": "text",
          "text": "Пошаговый ход рассуждений...",
          "signature": "необязательная_подпись_для_верификации"
        }
      ]
    }
  }]
}

Поля reasoning_details

ПолеТипОписаниеГде встречается
indexintпозиция в последовательности reasoningвезде
typestringтип содержимого (text, encrypted, summary)везде
textstringсодержимое reasoningChat Completions
summarystringсуммаризация reasoningResponses API
signaturestringкриптографическая подпись для верификацииAnthropic, Bedrock

Сопоставление типов

Тип reasoningКогда применяетсяИсточник
reasoning.textпрямой текст thinking/reasoningAnthropic, Gemini, Bedrock
reasoning.encryptedreasoning с подписьюAnthropic, Bedrock Nova
reasoning.summaryсуммаризованный reasoning (Responses API)все провайдеры

Реализация OpenAI: OpenAI (и Chat Completions, и Responses API) работает на основе effort и следует стандартной логике приоритета: если задан effort, он используется напрямую; если задан только max_tokens, effort оценивается из него. Поле max_tokens затем удаляется перед сериализацией в JSON через MarshalJSON (core/providers/openai/types.go:383-453), поскольку API OpenAI его не принимают.


Streaming

Типы событий стрима

ПровайдерСобытие reasoningСобытие подписи
OpenAIreasoning (на верхнем уровне)
Anthropicthinking_deltasignature_delta
Bedrockthinking_deltasignature_delta
Geminithought (внутри content)thought_signature

Пример streaming у Anthropic

// События стрима
event: content_block_start
data: {"type": "content_block_start", "content_block": {"type": "thinking"}}

event: content_block_delta
data: {"type": "content_block_delta", "delta": {"type": "thinking_delta", "thinking": "Сейчас"}}

event: content_block_delta
data: {"type": "content_block_delta", "delta": {"type": "thinking_delta", "thinking": " разберу..."}}

event: content_block_delta
data: {"type": "content_block_delta", "delta": {"type": "signature_delta", "signature": "EqoB..."}}

event: content_block_stop
data: {"type": "content_block_stop"}

Ответ Meridian в стриме

// Дельта thinking
{
  "choices": [{
    "delta": {
      "reasoning_details": [{
        "index": 0,
        "type": "text",
        "text": "Сейчас разберу..."
      }]
    }
  }]
}

// Дельта подписи
{
  "choices": [{
    "delta": {
      "reasoning_details": [{
        "index": 0,
        "signature": "EqoB..."
      }]
    }
  }]
}

Сводка ограничений


Полное сравнение провайдеров

Модель reasoning

ПровайдерТип моделиТип бюджетаМинимальный бюджетПоддержка подписи
OpenAIна основе effortна основе effortнет
Anthropicthinking-блокитокен-бюджет1024
Bedrock (Anthropic)reasoning_configтокен-бюджет1024
Bedrock (Nova)reasoning_configна основе effortнет
Gemini 2.5+thinking_configтокен-бюджет1024
Gemini 3.0+thinking_configдвойной (бюджет + уровень)1024

Поддержка параметров

Провайдерeffortmax_tokenssummaryStreaming
OpenAI✅ (4 уровня)
Anthropic❌ (бинарный)
Bedrock (Anthropic)❌ (бинарный)
Bedrock (Nova)✅ (3 уровня)⚠️ (игнорируется)
Gemini 2.5+⚠️ (конвертируется в бюджет)
Gemini 3.0+✅ (4 уровня)

Устранение неполадок

Anthropic: reasoning.max_tokens must be >= 1024

Причина: попытка использовать reasoning с max_tokens < 1024.

Решение: для моделей Anthropic и Bedrock Anthropic задавайте reasoning.max_tokens >= 1024.

// ❌ Неверно
{"reasoning": {"effort": "high", "max_tokens": 500}}

// ✅ Верно
{"reasoning": {"effort": "high", "max_tokens": 1024}}

OpenAI: модель не поддерживает reasoning

Причина: используется устаревшая модель без поддержки reasoning (например, gpt-4-turbo).

Решение: используйте модели с поддержкой reasoning: gpt-4o, gpt-4o-mini (серия o1 с нативным reasoning).

Bedrock Nova: параметр max_tokens игнорируется

Ожидаемое поведение: Bedrock Nova работает только в режиме на основе effort.

Решение: для моделей Nova передавайте effort, а не max_tokens.

// ✅ Корректно для Nova
{"reasoning": {"effort": "high"}}

Содержание

ОбзорМатрица поддержки провайдерамиКонфигурация запросаChat Completions APIResponses APIСправочник параметровПараметры Chat Completions APIПараметры Responses APIПреобразования под конкретных провайдеровOpenAIAnthropicBedrock (модели Anthropic)Bedrock (модели Nova)GeminiПоддержка по версиям моделейПравила приоритетаПреобразования уровня под конкретные моделиСпециальные значенияПреобразование ответаСводка преобразованийДва подхода к reasoning: effort и max_tokensТипы reasoning-моделейЛогика приоритета: нативное vs. оценочноеДля провайдеров на основе max_tokens (Anthropic, Cohere, Gemini)Для провайдеров на основе effort (OpenAI, AWS Bedrock Nova)Функции-оценщикиФункция 1: effort → max_tokensФункция 2: max_tokens → effortКонстанты по провайдерамМинимальные значения бюджетаЛимит completion-токенов по умолчанию (для расчёта соотношения)Примеры конвертации effort ↔ токеныПример 1: оценка токенов из effort (Anthropic)Пример 2: оценка effort из токенов (Bedrock Nova)Пример 3: оба поля заданы (применён приоритет)Формат ответаСтандартный ответ MeridianПоля reasoning_detailsСопоставление типовStreamingТипы событий стримаПример streaming у AnthropicОтвет Meridian в стримеСводка ограниченийПолное сравнение провайдеровМодель reasoningПоддержка параметровУстранение неполадокAnthropic: reasoning.max_tokens must be >= 1024OpenAI: модель не поддерживает reasoningBedrock Nova: параметр max_tokens игнорируется