Skip to content

fix(models): populate LlmResponse.model_version in AnthropicLlm - #6851

Open
feiiiiii5 wants to merge 1 commit into
google:mainfrom
feiiiiii5:fix/anthropic-model-version-6847
Open

fix(models): populate LlmResponse.model_version in AnthropicLlm#6851
feiiiiii5 wants to merge 1 commit into
google:mainfrom
feiiiiii5:fix/anthropic-model-version-6847

Conversation

@feiiiiii5

Copy link
Copy Markdown

Description

AnthropicLlm never set LlmResponse.model_version on either path, so the model id Anthropic actually served was lost for every direct-API response. Model aliases (e.g. claude-sonnet-5) resolve to a dated snapshot server-side, and model_version is ADK's existing mechanism for recording which snapshot served a response — event telemetry, DatabaseSessionService-persisted Event rows, and the gen_ai.response.model span attribute all read it. Every other first-party wrapper already populates it: google_llm.py (Gemini response), lite_llm.py (response.model), apigee_llm.py (response.get('model')).

Changes

  • Non-streaming (message_to_generate_content_response): model_version=message.model.
  • Streaming: capture event.message.model in the message_start handler (alongside the existing usage accounting reads) and carry it on the final aggregated LlmResponse. The capture is guarded on isinstance(..., str) so streams that omit the field cannot poison a typed field.
  • Intermediate partial=True chunks are unchanged — the aggregated final response is the authoritative record, matching how usage metadata is handled.

Fixes #6847

Tests

  • test_message_to_generate_content_response_sets_model_version — non-streaming: the builder propagates message.model.
  • test_streaming_final_response_carries_model_version — streaming: message_start's resolved id reaches the final yield (partial=False).
  • Both fail on main (model_version is None); full tests/unittests/models/test_anthropic_llm.py suite: 138 passed with the change.
  • pyink 25.12 / ruff 0.15.17 (project pins) clean.

CLA

Google CLA signed.

AnthropicLlm never set model_version on either path, so the resolved
snapshot id (model aliases resolve server-side, e.g. claude-sonnet-5 ->
a dated snapshot) was lost for every direct-API response. Every other
first-party wrapper already records it: google_llm from the Gemini
response, lite_llm from response.model, apigee_llm from the payload.
Downstream consumers rely on it — event telemetry, persisted Event
rows, and the gen_ai.response.model span attribute.

- message_to_generate_content_response: model_version=message.model
- streaming: capture event.message.model at message_start, yield it on
  the final aggregated response (guarded on str so partial/mock streams
  that omit the field cannot poison the field)

Fixes google#6847

Signed-off-by: fei <204683769+feiiiiii5@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

AnthropicLlm never populates LlmResponse.model_version

2 participants