Skip to content

Default judge model uses deprecated Claude Sonnet 4 — should be updated #200

Description

@harshitpassi

Description

All LLM-based evaluators default to a deprecated model ID as their judge model.

File: src/strands_evals/evaluators/evaluator.py, line 24

DEFAULT_BEDROCK_MODEL_ID = "us.anthropic.claude-sonnet-4-20250514-v1:0"

Claude Sonnet 4 (claude-sonnet-4-20250514) is now in legacy mode on Amazon Bedrock. While it still functions today, it is deprecated and will eventually be removed. When that happens, all evaluators that rely on the default model will silently fail — Experiment._run_evaluator() catches exceptions and records them as score: 0 results (lines 405-413), so users would see all-zero scores with no obvious indication that the judge model is unavailable.

Impact

All 10 LLM-based evaluators use this default when model=None:

  • OutputEvaluator
  • TrajectoryEvaluator
  • HarmfulnessEvaluator
  • HelpfulnessEvaluator
  • CoherenceEvaluator
  • ConcisenessEvaluator
  • FaithfulnessEvaluator
  • GoalSuccessRateEvaluator
  • InteractionsEvaluator
  • ResponseRelevanceEvaluator

Current Behavior

The default works today since Sonnet 4 is still accessible in legacy mode. However:

  1. It will break without warning once the model is fully retired
  2. Users following documentation examples without passing model= will be affected
  3. The failure mode is silent — errors are caught and recorded as score: 0 with a reason like Evaluator error: ..., which is easy to miss in the default display

Suggested Fix

Update DEFAULT_BEDROCK_MODEL_ID to a current model. The Claude Sonnet 4.6 model ID on Bedrock is:

DEFAULT_BEDROCK_MODEL_ID = "us.anthropic.claude-sonnet-4-6-v1:0"

To prevent this from recurring, consider one of:

  1. Using a model alias/pointer that Bedrock resolves to the latest version (if available)
  2. Raising a clear warning or error when the default model returns a deprecation signal
  3. Documenting the default model prominently so users know to override it

Workaround

Explicitly pass a model to every evaluator:

from strands.models import BedrockModel

evaluator = OutputEvaluator(
    rubric="...",
    model=BedrockModel(model_id="us.anthropic.claude-sonnet-4-6-v1:0")
)

Environment

  • strands-agents-evals version: 0.1.14
  • strands-agents version: 1.35.0
  • Python: 3.12
  • Region: us-east-1

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    Fields

    Language

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions