# `Gemini.Validation.ThinkingConfig`
[🔗](https://github.com/nshkrdotcom/gemini_ex/blob/v0.11.0/lib/gemini/validation/thinking_config.ex#L1)

Validation for thinking configuration parameters based on model capabilities.

## Gemini 3 Models

Use `thinking_level` for Gemini 3 models:
- `:minimal` - Minimal thinking (Flash only). Model may still think for complex tasks.
- `:low` - Minimizes latency and cost
- `:medium` - Balanced thinking (Flash only)
- `:high` - Maximizes reasoning depth (default)

## Model Support

- **Gemini 3 Pro**: `:low`, `:high`
- **Gemini 3 Flash**: `:minimal`, `:low`, `:medium`, `:high`

## Gemini 2.5 Models

Gemini 2.5 series models support thinking budgets with model-specific ranges:
- **2.5 Pro**: 128-32,768 tokens (cannot disable with 0)
- **2.5 Flash**: 0-24,576 tokens (can disable)
- **2.5 Flash Lite**: 0 or 512-24,576 tokens

Special value `-1` enables dynamic thinking (model decides budget) for all models.

## Important

You cannot use both `thinking_level` and `thinking_budget` in the same request.
Doing so will return a 400 error from the API.

See: https://ai.google.dev/gemini-api/docs/gemini-3

# `thinking_level`
[🔗](https://github.com/nshkrdotcom/gemini_ex/blob/v0.11.0/lib/gemini/validation/thinking_config.ex#L36)

```elixir
@type thinking_level() :: :unspecified | :minimal | :low | :medium | :high
```

# `validation_result`
[🔗](https://github.com/nshkrdotcom/gemini_ex/blob/v0.11.0/lib/gemini/validation/thinking_config.ex#L35)

```elixir
@type validation_result() :: :ok | {:error, String.t()}
```

# `validate`
[🔗](https://github.com/nshkrdotcom/gemini_ex/blob/v0.11.0/lib/gemini/validation/thinking_config.ex#L145)

```elixir
@spec validate(map() | struct(), String.t()) :: validation_result()
```

Validate complete thinking config including budget, level, and include_thoughts.

## Parameters
- `config`: Map or ThinkingConfig struct
- `model`: Model name string

## Returns
- `:ok` if valid
- `{:error, message}` if invalid

## Examples

    iex> Gemini.Validation.ThinkingConfig.validate(%{thinking_level: :low}, "gemini-3.1-pro-preview")
    :ok

    iex> Gemini.Validation.ThinkingConfig.validate(%{thinking_budget: 1024, thinking_level: :low}, "gemini-3.1-pro-preview")
    {:error, "Cannot use both thinking_level and thinking_budget in the same request"}

# `validate_budget`
[🔗](https://github.com/nshkrdotcom/gemini_ex/blob/v0.11.0/lib/gemini/validation/thinking_config.ex#L104)

```elixir
@spec validate_budget(integer(), String.t()) :: validation_result()
```

Validate thinking budget for a specific model.

## Parameters
- `budget`: Integer budget value
- `model`: Model name string

## Returns
- `:ok` if valid
- `{:error, message}` with helpful error message

## Examples

    iex> Gemini.Validation.ThinkingConfig.validate_budget(1024, "gemini-2.5-flash")
    :ok

    iex> Gemini.Validation.ThinkingConfig.validate_budget(0, "gemini-2.5-pro")
    {:error, "Gemini 2.5 Pro cannot disable thinking (minimum budget: 128)"}

# `validate_level`
[🔗](https://github.com/nshkrdotcom/gemini_ex/blob/v0.11.0/lib/gemini/validation/thinking_config.ex#L58)

```elixir
@spec validate_level(thinking_level(), String.t() | nil) :: validation_result()
```

Validate thinking level for Gemini 3 models.

## Parameters
- `level`: Thinking level atom (`:minimal`, `:low`, `:medium`, `:high`)
- `model`: Optional model name for Flash-only validation

## Returns
- `:ok` if valid
- `{:error, message}` if invalid

## Examples

    iex> Gemini.Validation.ThinkingConfig.validate_level(:low, "gemini-3.1-pro-preview")
    :ok

    iex> Gemini.Validation.ThinkingConfig.validate_level(:medium, "gemini-3.1-pro-preview")
    {:error, "Thinking level :medium is only supported on Gemini 3 Flash models"}

---

*Consult [api-reference.md](api-reference.md) for complete listing*
