💥 Introducing JevEval: Jev-as-a-Judge for LLM evaluation. Read the post →
Multi-Turn

Goal Accuracy

LLM-as-a-judge
Jev-as-a-judge
Multi-turn
Referenceless
Agent
Multimodal

The Goal Accuracy metric is a multi-turn agentic metric that evaluates your LLM agent's abilities on planning and executing the plan to finish a task or reach a goal. It is a self-explaining eval, which means it outputs a reason for its metric score.

Required Arguments

To use the GoalAccuracyMetric, you'll have to provide the following arguments when creating a ConversationalTestCase:

  • turns

You can learn more about how it is calculated here.

Usage

First, set the eval mode:

deepeval set-eval-mode llm         # LLM-as-a-judge (default)
deepeval set-eval-mode hybrid      # LLM extracts, Jev decides
deepeval set-eval-mode system_one  # Jev-as-a-judge, no LLM

The GoalAccuracyMetric() can be used for end-to-end multi-turn evaluations of agents.

from deepeval.test_case import Turn, ConversationalTestCase, ToolCall
from deepeval.metrics import GoalAccuracyMetric
from deepeval import evaluate

convo_test_case = ConversationalTestCase(
    turns=[
        Turn(role="...", content="..."), 
        Turn(role="...", content="...", tools_called=[...])
    ],
)
metric = GoalAccuracyMetric(threshold=0.5)

# To run metric as a standalone
# metric.measure(convo_test_case)
# print(metric.score, metric.reason)

evaluate(test_cases=[convo_test_case], metrics=[metric])

There are NINE optional parameters when creating a GoalAccuracyMetric:

  • [Optional] threshold: a number representing the minimum passing threshold. Can also be set to None to run the metric in score-only mode. Defaulted to 0.5.
  • [Optional] model: a string specifying which of OpenAI's GPT models to use, OR any custom LLM model of type DeepEvalBaseLLM. Defaulted to gpt-5.4.
  • [Optional] include_reason: a boolean which when set to True, will include a reason for its evaluation score. Defaulted to True.
  • [Optional] strict_mode: a boolean which when set to True, enforces a binary metric score: 1 for perfection, 0 otherwise. It also overrides the current threshold and sets it to 1. Defaulted to False.
  • [Optional] async_mode: a boolean which when set to True, enables concurrent execution within the measure() method. Defaulted to True.

  • [Optional] verbose_mode: a boolean which when set to True, prints the intermediate steps used to calculate said metric to the console, as outlined in the How Is It Calculated section. Defaulted to False.
  • [Optional] flaky: a boolean which when set to True, marks the metric as flaky. Defaulted to False.
  • [Optional] system_one_model: the Jev model to use, as a string or a DeepEvalBaseSystemOneModel. Only used under hybrid or system_one eval_mode. Defaulted to jev-latest.
  • [Optional] eval_mode: llm, hybrid or system_one, choosing whether an LLM, Jev, or both judge. Defaulted to the configured eval mode (llm unless set).

As a standalone

You can also run the GoalAccuracyMetric on a single test case as a standalone, one-off execution.

...

metric.measure(convo_test_case)
print(metric.score, metric.reason)

How Is It Calculated

You can change how the GoalAccuracyMetric is calculated by setting the eval mode.

LLM-as-a-judge

The GoalAccuracyMetric score is calculated using the following steps:

  • Find individual goals and steps taken by your LLM agent for each user-assistat interactions.
  • Find goal accuracy scores for each of the goal-steps pairs using the evaluation model.
  • Find plan quality and plan adherence scores for each of the goal-step pairs using the evaluation model.
Goal Accuracy Score=Goal Evaluation Score + Plan Evaluation Score2\text{Goal Accuracy Score} = \frac{\text{Goal Evaluation Score + Plan Evaluation Score}}{\text{2}}

Hybrid

Under the hybrid eval mode, the goal accuracy and plan quality of each interaction are rated by Jev, a System One model, on a five-level scale mapped onto 0 to 1. Each interaction's reason states Jev's score and confidence, and the LLM writes the final reason. If a Jev call fails, the LLM makes that decision instead.

Jev-as-a-judge

Under the system_one eval mode, Jev judges the whole metric in one request. It is sent the whole conversation (with the tools called in each turn) and asked three questions:

QuestionTypeWeight
Every goal the user states in turns is fully and correctly achieved in the assistant turns that follow it, as seen by the user.Noul2
Across turns, how fully and correctly do the assistant's visible replies achieve the goals the user states? (Not achieved → Fully achieved)Score1
Across turns, how clear and complete is the assistant's plan (including its tools_called) for each user goal, and how closely does it follow that plan? (No plan → Complete plan, fully followed)Score1

Each answer becomes a value in [0,1][0, 1] and the score is their weighted mean. No LLM is called: the reason lists each answer with its probability, and metric.confidence reports how decisive Jev was.

FAQs

My agent answered every message but still failed the user's actual goal — will this catch it?
Yes. GoalAccuracyMetric extracts the underlying task from the user's messages and judges whether the agent's plan and steps actually reached it. A conversation can look responsive turn by turn yet score low if the goal was never accomplished.
What's the difference between the goal score and the plan score?
The final score averages a goal evaluation score (did it reach the goal) and a plan evaluation score (plan quality and adherence). The average reflects both reaching the goal and how well it was planned.
How does it know the goal if I never pass an expected outcome?
It infers the goal from the "user" messages, then evaluates the steps taken to satisfy it. You only supply turns on the ConversationalTestCase.
Does it account for tool calls when scoring the plan?
Yes. Turns can include tools_called, and the metric factors tool usage into the plan it reconstructs and how well that plan reached the goal.

On this page