# `CliSubprocessCore.ModelRegistry`
[🔗](https://github.com/nshkrdotcom/cli_subprocess_core/blob/v0.1.0/lib/cli_subprocess_core/model_registry.ex#L1)

Canonical model resolution, validation, and argument payload construction.

# `model`

```elixir
@type model() :: CliSubprocessCore.ModelRegistry.Model.t()
```

# `provider_backend`

```elixir
@type provider_backend() :: :anthropic | :ollama | atom()
```

# `resolution_error`

```elixir
@type resolution_error() ::
  {:unknown_model, String.t() | nil, [String.t()], atom()}
  | {:invalid_reasoning_effort, term(), [String.t()] | [number()], atom()}
  | {:model_unavailable, atom(), term()}
  | {:empty_or_invalid_model, String.t(), atom()}
```

# `selection`

```elixir
@type selection() :: CliSubprocessCore.ModelRegistry.Selection.t()
```

# `build_arg_payload`

```elixir
@spec build_arg_payload(atom(), String.t() | nil, keyword()) ::
  {:ok, CliSubprocessCore.ModelRegistry.Selection.t()}
  | {:error, resolution_error()}
```

Builds the resolved payload used by downstream CLI renderers.

# `default_model`

```elixir
@spec default_model(
  atom(),
  keyword()
) :: {:ok, String.t()} | {:error, {:model_unavailable, atom(), term()}}
```

# `list_visible`

```elixir
@spec list_visible(
  atom(),
  keyword()
) :: {:ok, [String.t()]} | {:error, {:model_unavailable, atom(), term()}}
```

# `normalize_reasoning_effort`

```elixir
@spec normalize_reasoning_effort(
  atom(),
  CliSubprocessCore.ModelRegistry.Model.t() | String.t(),
  term()
) ::
  {:ok,
   %{
     reasoning: String.t() | nil,
     reasoning_effort: number() | nil,
     normalized_reasoning_effort: number() | nil
   }}
  | {:error,
     {:invalid_reasoning_effort, term(), [String.t()] | [number()], atom()}}
```

# `resolve`

```elixir
@spec resolve(atom(), String.t() | nil, keyword()) ::
  {:ok, CliSubprocessCore.ModelRegistry.Selection.t()}
  | {:error, resolution_error()}
```

# `validate`

```elixir
@spec validate(atom(), String.t() | atom() | keyword() | map() | nil) ::
  {:ok, CliSubprocessCore.ModelRegistry.Model.t()}
  | {:error, resolution_error()}
```

---

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