# `Aludel.Evals.Metric`
[🔗](https://github.com/ccarvalho-eng/aludel/blob/main/lib/aludel/evals/metric.ex#L1)

Contract and shared helpers for evaluation metrics.

Metrics return a normalized result. Compatibility with historical assertion
result maps is handled by `Aludel.Evals.AssertionEvaluator`.

# `input`

```elixir
@type input() :: Aludel.Evals.Metric.Context.t() | String.t()
```

# `json_value`

```elixir
@type json_value() ::
  nil
  | boolean()
  | number()
  | String.t()
  | [json_value()]
  | %{optional(String.t()) =&gt; json_value()}
```

# `evaluate`

```elixir
@callback evaluate(input(), map()) :: Aludel.Evals.Metric.Result.t()
```

# `type`

```elixir
@callback type() :: String.t()
```

# `boolean_result`

```elixir
@spec boolean_result(String.t(), boolean(), String.t(), String.t(), map()) ::
  Aludel.Evals.Metric.Result.t()
```

Builds a normalized metric result from a boolean decision.

Passing results score `100.0`; failing results score `0.0`. The selected
reason and optional metadata are retained in the result.

# `compare_json_values`

```elixir
@spec compare_json_values(term(), term()) :: boolean()
```

Compares JSON-compatible values while preserving scalar types.

Maps and lists are compared through their encoded JSON representation while
scalar values use strict Elixir equality.

# `decode_json`

```elixir
@spec decode_json(String.t()) :: {:ok, json_value()} | {:error, Jason.DecodeError.t()}
```

Decodes JSON output after removing an optional Markdown code fence.

# `invalid_result`

```elixir
@spec invalid_result(String.t()) :: Aludel.Evals.Metric.Result.t()
```

Returns a failed result for an invalid metric configuration.

# `normalize_threshold`

```elixir
@spec normalize_threshold(map()) :: float()
```

Returns an assertion's numeric threshold or the default of `100.0`.

# `output`

```elixir
@spec output(input()) :: String.t()
```

Returns generated output from either a contextual or legacy metric input.

---

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