Skip to main content

lib/agent_sea/evaluate/metric/exact_match.ex

defmodule AgentSea.Evaluate.Metric.ExactMatch do
  @moduledoc "Scores 1.0 when the output equals the expected value (trimmed, case-insensitive)."
  @behaviour AgentSea.Evaluate.Metric

  @impl true
  def name, do: "exact_match"

  @impl true
  def evaluate(%{output: output} = example, _opts) do
    expected = Map.get(example, :expected)
    score = if normalize(output) == normalize(expected), do: 1.0, else: 0.0
    %{score: score, passed: score == 1.0}
  end

  defp normalize(value), do: value |> to_string() |> String.trim() |> String.downcase()
end