Skip to content

Conversation

@Leundai
Copy link

@Leundai Leundai commented Dec 4, 2025

Summary

The BedrockProvider.model_profile method previously only handled 2-character regional prefixes (e.g., us., eu.), causing issues with models using longer prefixes like us-gov. (AWS GovCloud) and global..

Problem

When using extended thinking with us-gov.anthropic.* models via Bedrock, the model_profile method doesn't recognize the us-gov. prefix because it only strips 2-character prefixes:

# Previous implementation:
parts = model_name.split('.', 2)
if len(parts) > 2 and len(parts[0]) == 2:
    parts = parts[1:]

This causes bedrock_send_back_thinking_parts to stay at its default False value. As a result, ThinkingPart blocks from previous conversation turns are converted to text blocks with thinking tags instead of reasoningContent, causing Bedrock to reject the request with:

Expected `thinking` or `redacted_thinking`, but found `text`

Solution

  1. Added _strip_geo_prefix() helper function that properly handles all known geo prefixes including us-gov. and global.
  2. Updated _AWS_BEDROCK_INFERENCE_GEO_PREFIXES constant to include us-gov. (the comment in the code already suggested this)
  3. Added comprehensive parametrized tests for all 8 geo prefixes

Affected Models

  • us-gov.anthropic.claude-sonnet-4-5-20250929-v1:0
  • us-gov.anthropic.claude-3-7-sonnet-20250219-v1:0
  • global.anthropic.claude-opus-4-5-20251101-v1:0
  • And any other cross-region inference profile using multi-character prefixes

Testing

All existing tests pass, plus new parametrized tests for all geo prefixes



# Known geo prefixes for cross-region inference profile IDs
_BEDROCK_GEO_PREFIXES: tuple[str, ...] = ('us.', 'eu.', 'apac.', 'jp.', 'au.', 'ca.', 'global.', 'us-gov.')
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think at some point it might be worth unifying this and the other private constant in models/bedrock.py

But this just extends it to support govcloud and global. Its been a real issue since Claude 4.5 came out and AWS doing cross-region inferencing

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you should definitely not duplicate it, since we're already importing the BedrockModelProfile in models/bedrock.py we should make this public and import it there.

from pydantic_ai.providers.bedrock import BedrockModelProfile

@DouweM do you agree?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good!

Copy link
Contributor

@dsfaccini dsfaccini left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thank you for the PR @Leundai ! I've requested a couple changes, let me know if you have any questions.



# Known geo prefixes for cross-region inference profile IDs
_BEDROCK_GEO_PREFIXES: tuple[str, ...] = ('us.', 'eu.', 'apac.', 'jp.', 'au.', 'ca.', 'global.', 'us-gov.')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you should definitely not duplicate it, since we're already importing the BedrockModelProfile in models/bedrock.py we should make this public and import it there.

from pydantic_ai.providers.bedrock import BedrockModelProfile

@DouweM do you agree?

The BedrockProvider.model_profile method previously only handled 2-character
regional prefixes (e.g., 'us.', 'eu.'), causing issues with models using
longer prefixes like 'us-gov.' (AWS GovCloud) and 'global.'.

This caused extended thinking to fail in multi-turn conversations because
bedrock_send_back_thinking_parts stayed at its default False value for these
models. ThinkingPart blocks from previous turns were converted to text blocks
instead of reasoningContent, causing Bedrock to reject requests with:
'Expected thinking or redacted_thinking, but found text'

Changes:
- Add _strip_geo_prefix() helper function to properly handle all known
  geo prefixes including us-gov. and global.
- Update _AWS_BEDROCK_INFERENCE_GEO_PREFIXES to include us-gov.
- Add comprehensive tests for all geo prefixes

Fixes cross-region inference for AWS GovCloud environments.
… BEDROCK_GEO_PREFIXES

This test ensures we don't add new model names with geo prefixes that
aren't handled by the provider's model_profile method.

Also exports BEDROCK_GEO_PREFIXES in __all__.
Model names with geo prefixes have 3+ dot-separated parts, so we can
detect them without knowing the provider names.
@Leundai Leundai force-pushed the fix/bedrock-us-gov-regional-prefixes branch from 53d0013 to 745e2eb Compare December 6, 2025 21:58
Updated the docstring for the test_bedrock_provider_model_profile_all_geo_prefixes function to be more concise. Modified the error message in the test_latest_bedrock_model_names_geo_prefixes_are_supported function to remove the file path reference, enhancing clarity.
@Leundai Leundai requested a review from dsfaccini December 6, 2025 22:58
@Leundai
Copy link
Author

Leundai commented Dec 6, 2025

@dsfaccini Thanks so much for taking a look! I've addressed your comments here.

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.

2 participants