Skip to content

Commit c9bacd4

Browse files
anxkhncopybara-github
authored andcommitted
fix: avoid crash on first turn with empty user content
Merge #6405 PiperOrigin-RevId: 949112659
1 parent c03f333 commit c9bacd4

2 files changed

Lines changed: 34 additions & 2 deletions

File tree

src/google/adk/evaluation/simulation/per_turn_user_simulator_quality_v1.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,9 +302,15 @@ def _evaluate_first_turn(
302302
eval_status=EvalStatus.NOT_EVALUATED,
303303
)
304304

305+
user_text = get_text_from_content(first_invocation.user_content)
306+
if user_text is None:
307+
return PerInvocationResult(
308+
actual_invocation=first_invocation,
309+
eval_status=EvalStatus.NOT_EVALUATED,
310+
)
311+
305312
score = int(
306-
get_text_from_content(first_invocation.user_content).strip()
307-
== conversation_scenario.starting_prompt.strip()
313+
user_text.strip() == conversation_scenario.starting_prompt.strip()
308314
)
309315
return PerInvocationResult(
310316
actual_invocation=first_invocation,

tests/unittests/evaluation/simulation/test_per_turn_user_simulation_quality_v1.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,32 @@ def test_evaluate_first_turn_failure():
514514
assert result.eval_status == EvalStatus.FAILED
515515

516516

517+
@pytest.mark.parametrize(
518+
"user_content",
519+
[
520+
types.Content(role="user", parts=[]),
521+
types.Content(),
522+
],
523+
)
524+
def test_evaluate_first_turn_not_evaluated_when_user_content_has_no_text(
525+
user_content,
526+
):
527+
"""First turn with empty/None parts is not evaluated instead of crashing."""
528+
evaluator = _create_test_evaluator(
529+
threshold=1.0, stop_signal="test stop signal"
530+
)
531+
conversation_scenario = _create_test_conversation_scenario(
532+
conversation_plan="plan",
533+
starting_prompt="test starting prompt",
534+
)
535+
invocation = Invocation(invocation_id="1", user_content=user_content)
536+
537+
result = evaluator._evaluate_first_turn(invocation, conversation_scenario) # pylint: disable=protected-access
538+
539+
assert result.score is None
540+
assert result.eval_status == EvalStatus.NOT_EVALUATED
541+
542+
517543
def test_aggregate_conversation_results_all_pass_produces_pass():
518544
evaluator = _create_test_evaluator()
519545
results = [

0 commit comments

Comments
 (0)