Problem
For Claude Code runs through Bedrock, task.json.model_used can record the Claude SDK's friendly alias rather than the fully qualified route model. This makes the persisted comparison key less precise than the model that actually handled the run.
Reproduced with coder-eval 0.9.5 and 0.8.4:
- experiment
agent_config.model: eu.anthropic.claude-sonnet-5
- exported
BEDROCK_MODEL: eu.anthropic.claude-sonnet-5
environment_info.bedrock_model: eu.anthropic.claude-sonnet-5
- effective Bedrock route / execution stream:
eu.anthropic.claude-sonnet-5
- persisted
task.json.model_used: claude-sonnet-5
- persisted iteration
model_used: claude-sonnet-5
The same alias is exposed by AssistantMessage.model. In src/coder_eval/agents/claude_code_agent.py, _capture_assistant_message() assigns that value to sdk_model_used, which is then used as the turn/result model_used value.
Impact
Runs on distinct Bedrock routes can be grouped under a non-route-specific alias, and a campaign that pins fully qualified model IDs cannot prove that pin from the primary model_used field alone. Consumers must know to cross-check environment_info.bedrock_model and the execution stream.
Expected behavior
Persist the resolved/effective route model in the comparison-facing model_used field. If the raw SDK-reported alias is useful telemetry, preserve it separately rather than replacing the route identity.
Acceptance
- A Claude Code Bedrock run pinned to
eu.anthropic.claude-sonnet-5 records that fully qualified string as the effective comparison model.
- The raw
AssistantMessage.model alias remains available under a clearly named raw-SDK field if needed.
- Tests cover a fully qualified Bedrock route whose
AssistantMessage.model is a friendly alias.
🤖 Generated with Claude Code
Co-Authored-By: Claude
Problem
For Claude Code runs through Bedrock,
task.json.model_usedcan record the Claude SDK's friendly alias rather than the fully qualified route model. This makes the persisted comparison key less precise than the model that actually handled the run.Reproduced with coder-eval 0.9.5 and 0.8.4:
agent_config.model:eu.anthropic.claude-sonnet-5BEDROCK_MODEL:eu.anthropic.claude-sonnet-5environment_info.bedrock_model:eu.anthropic.claude-sonnet-5eu.anthropic.claude-sonnet-5task.json.model_used:claude-sonnet-5model_used:claude-sonnet-5The same alias is exposed by
AssistantMessage.model. Insrc/coder_eval/agents/claude_code_agent.py,_capture_assistant_message()assigns that value tosdk_model_used, which is then used as the turn/resultmodel_usedvalue.Impact
Runs on distinct Bedrock routes can be grouped under a non-route-specific alias, and a campaign that pins fully qualified model IDs cannot prove that pin from the primary
model_usedfield alone. Consumers must know to cross-checkenvironment_info.bedrock_modeland the execution stream.Expected behavior
Persist the resolved/effective route model in the comparison-facing
model_usedfield. If the raw SDK-reported alias is useful telemetry, preserve it separately rather than replacing the route identity.Acceptance
eu.anthropic.claude-sonnet-5records that fully qualified string as the effective comparison model.AssistantMessage.modelalias remains available under a clearly named raw-SDK field if needed.AssistantMessage.modelis a friendly alias.🤖 Generated with Claude Code
Co-Authored-By: Claude