One answer per question, keyed by the CALLER's keys. The keys are addressing, not content: they are never transmitted, so a key may be a tool, skill or agent name verbatim.
:calibrated reports whether the probabilities are calibrated. systemone
reports true; llm reports false unless it derived them from provider token
probabilities. A threshold tuned against one backend does not transfer to
another.
Summary
Functions
Read a choice answer.
Read a noul answer; a wrong-type or absent key is an error, never a match failure.
Read a score answer.
Types
@type t() :: %Toolnexus.Classifier.Decision{ answers: %{required(String.t()) => struct()}, calibrated: boolean(), model: String.t() | nil, usage: Toolnexus.Classifier.Usage.t() }
Functions
@spec choice(t(), String.t()) :: {:ok, Toolnexus.Classifier.ChoiceAnswer.t()} | {:error, String.t()}
Read a choice answer.
@spec noul(t(), String.t()) :: {:ok, Toolnexus.Classifier.NoulAnswer.t()} | {:error, String.t()}
Read a noul answer; a wrong-type or absent key is an error, never a match failure.
@spec score(t(), String.t()) :: {:ok, Toolnexus.Classifier.ScoreAnswer.t()} | {:error, String.t()}
Read a score answer.