getReasoningEffortParams static method

Map<String, dynamic> getReasoningEffortParams({
  1. required String providerId,
  2. required String model,
  3. ReasoningEffort? reasoningEffort,
  4. int? maxTokens,
})

Get reasoning effort parameter for different providers

Implementation

static Map<String, dynamic> getReasoningEffortParams({
  required String providerId,
  required String model,
  ReasoningEffort? reasoningEffort,
  int? maxTokens,
}) {
  if (reasoningEffort == null) return {};

  // Groq doesn't support reasoning effort
  if (providerId == 'groq') {
    return {};
  }

  // OpenRouter format
  if (providerId == 'openrouter') {
    return {
      'reasoning': {
        'effort': reasoningEffort.value,
      },
    };
  }

  // Grok reasoning models
  if (model.contains('grok') && isKnownReasoningModel(model)) {
    return {
      'reasoning_effort': reasoningEffort.value,
    };
  }

  // Claude 3.7 Sonnet thinking support
  if (model.contains('claude-3.7-sonnet') ||
      model.contains('claude-sonnet-4') ||
      model.contains('claude-opus-4')) {
    const effortRatios = {
      ReasoningEffort.high: 0.8,
      ReasoningEffort.medium: 0.5,
      ReasoningEffort.low: 0.2,
    };

    final effortRatio = effortRatios[reasoningEffort];
    if (effortRatio == null) {
      return {};
    }

    final defaultMaxTokens = 4096; // DEFAULT_MAX_TOKENS equivalent
    final effectiveMaxTokens = maxTokens ?? defaultMaxTokens;
    final budgetTokens =
        (effectiveMaxTokens * effortRatio).clamp(1024, 32000).truncate();

    return {
      'thinking': {
        'type': 'enabled',
        'budget_tokens': budgetTokens,
      },
    };
  }

  // Default format (OpenAI, DeepSeek, etc.)
  return {
    'reasoning_effort': reasoningEffort.value,
  };
}