Skip to main content
Cost and latency tell you a model is cheaper and faster. Only a score tells you whether it is as good — which is the question a model swap actually turns on. A score is bound to the trace it judges, and optionally to the single observation within it. Record automated evaluations with captureScore() and editable human feedback with captureFeedback() from the agent SDK, or emit a span carrying the OpenTelemetry gen_ai.evaluation.* attributes. captureFeedback() requires a stable feedbackId; captureScore() accepts the equivalent scoreId. Later writes with the same id replace the earlier value in list and summary results; deleted: true writes a tombstone.

List agent scores

Query parameters

source is a first-class field rather than metadata: a human annotation, an automated judge, and an offline eval carry very different weight, and a rollout decision that mixes them without knowing which is which is not a decision.

Response

A categorical score carries its label in string_value and leaves value at 0; a boolean score uses 1 / 0. Scores are never flattened into a single numeric column, because refused and correct do not average.

Summarize agent scores

Rolls scores up by name and data type. Categorical scores produce one row per label instead of a fake numeric average. This is the shape a model comparison needs — a list of individual judgements is not one. Accepts the same filters as the list endpoint minus limit and offset.

Response

For categorical scores, string_value contains the label and avg_value, min_value, and max_value are null.

CLI