From 7377e1aa2658e9d03dad715976ec94a41b6b5e6d Mon Sep 17 00:00:00 2001 From: Mike Plachta Date: Tue, 24 Feb 2026 09:59:01 -0800 Subject: [PATCH] fix: bedrock region was always set to "us-east-1" not respecting the env var. (#4582) * fix: bedrock region was always set to "us-east-1" not respecting the env var. code had AWS_REGION_NAME referenced, but not used, unified to AWS_DEFAULT_REGION as per documentation * DRY code improvement and fix caught by tests. * Supporting litellm configuration --- .env.test | 1 - docs/en/concepts/llms.mdx | 4 ++- lib/crewai/src/crewai/cli/constants.py | 2 +- .../llms/providers/bedrock/completion.py | 29 +++++++++++-------- lib/crewai/src/crewai/utilities/llm_utils.py | 4 +-- lib/crewai/tests/llms/bedrock/test_bedrock.py | 27 ++++++++++++++--- lib/crewai/tests/utilities/test_llm_utils.py | 4 +-- 7 files changed, 48 insertions(+), 23 deletions(-) diff --git a/.env.test b/.env.test index 4ef1b503c..44662728d 100644 --- a/.env.test +++ b/.env.test @@ -21,7 +21,6 @@ OPENROUTER_API_KEY=fake-openrouter-key AWS_ACCESS_KEY_ID=fake-aws-access-key AWS_SECRET_ACCESS_KEY=fake-aws-secret-key AWS_DEFAULT_REGION=us-east-1 -AWS_REGION_NAME=us-east-1 # ----------------------------------------------------------------------------- # Azure OpenAI Configuration diff --git a/docs/en/concepts/llms.mdx b/docs/en/concepts/llms.mdx index 88ac16e88..d3e83f754 100644 --- a/docs/en/concepts/llms.mdx +++ b/docs/en/concepts/llms.mdx @@ -470,7 +470,7 @@ In this section, you'll find detailed examples that help you select, configure, To get an Express mode API key: - New Google Cloud users: Get an [express mode API key](https://cloud.google.com/vertex-ai/generative-ai/docs/start/quickstart?usertype=apikey) - Existing Google Cloud users: Get a [Google Cloud API key bound to a service account](https://cloud.google.com/docs/authentication/api-keys) - + For more details, see the [Vertex AI Express mode documentation](https://docs.cloud.google.com/vertex-ai/generative-ai/docs/start/quickstart?usertype=apikey). @@ -652,6 +652,7 @@ In this section, you'll find detailed examples that help you select, configure, # Optional AWS_SESSION_TOKEN= # For temporary credentials AWS_DEFAULT_REGION= # Defaults to us-east-1 + AWS_REGION_NAME= # Alternative configuration for backwards compatibility with LiteLLM. Defaults to us-east-1 ``` **Basic Usage:** @@ -695,6 +696,7 @@ In this section, you'll find detailed examples that help you select, configure, - `AWS_SECRET_ACCESS_KEY`: AWS secret key (required) - `AWS_SESSION_TOKEN`: AWS session token for temporary credentials (optional) - `AWS_DEFAULT_REGION`: AWS region (defaults to `us-east-1`) + - `AWS_REGION_NAME`: AWS region (defaults to `us-east-1`). Alternative configuration for backwards compatibility with LiteLLM **Features:** - Native tool calling support via Converse API diff --git a/lib/crewai/src/crewai/cli/constants.py b/lib/crewai/src/crewai/cli/constants.py index 4de0d0082..2ef8dcc7f 100644 --- a/lib/crewai/src/crewai/cli/constants.py +++ b/lib/crewai/src/crewai/cli/constants.py @@ -69,7 +69,7 @@ ENV_VARS: dict[str, list[dict[str, Any]]] = { }, { "prompt": "Enter your AWS Region Name (press Enter to skip)", - "key_name": "AWS_REGION_NAME", + "key_name": "AWS_DEFAULT_REGION", }, ], "azure": [ diff --git a/lib/crewai/src/crewai/llms/providers/bedrock/completion.py b/lib/crewai/src/crewai/llms/providers/bedrock/completion.py index 47946d949..c707be3af 100644 --- a/lib/crewai/src/crewai/llms/providers/bedrock/completion.py +++ b/lib/crewai/src/crewai/llms/providers/bedrock/completion.py @@ -234,7 +234,7 @@ class BedrockCompletion(BaseLLM): aws_access_key_id: str | None = None, aws_secret_access_key: str | None = None, aws_session_token: str | None = None, - region_name: str = "us-east-1", + region_name: str | None = None, temperature: float | None = None, max_tokens: int | None = None, top_p: float | None = None, @@ -287,15 +287,6 @@ class BedrockCompletion(BaseLLM): **kwargs, ) - # Initialize Bedrock client with proper configuration - session = Session( - aws_access_key_id=aws_access_key_id or os.getenv("AWS_ACCESS_KEY_ID"), - aws_secret_access_key=aws_secret_access_key - or os.getenv("AWS_SECRET_ACCESS_KEY"), - aws_session_token=aws_session_token or os.getenv("AWS_SESSION_TOKEN"), - region_name=region_name, - ) - # Configure client with timeouts and retries following AWS best practices config = Config( read_timeout=300, @@ -306,8 +297,12 @@ class BedrockCompletion(BaseLLM): tcp_keepalive=True, ) - self.client = session.client("bedrock-runtime", config=config) - self.region_name = region_name + self.region_name = ( + region_name + or os.getenv("AWS_DEFAULT_REGION") + or os.getenv("AWS_REGION_NAME") + or "us-east-1" + ) self.aws_access_key_id = aws_access_key_id or os.getenv("AWS_ACCESS_KEY_ID") self.aws_secret_access_key = aws_secret_access_key or os.getenv( @@ -315,6 +310,16 @@ class BedrockCompletion(BaseLLM): ) self.aws_session_token = aws_session_token or os.getenv("AWS_SESSION_TOKEN") + # Initialize Bedrock client with proper configuration + session = Session( + aws_access_key_id=self.aws_access_key_id, + aws_secret_access_key=self.aws_secret_access_key, + aws_session_token=self.aws_session_token, + region_name=self.region_name, + ) + + self.client = session.client("bedrock-runtime", config=config) + self._async_exit_stack = AsyncExitStack() if AIOBOTOCORE_AVAILABLE else None self._async_client_initialized = False diff --git a/lib/crewai/src/crewai/utilities/llm_utils.py b/lib/crewai/src/crewai/utilities/llm_utils.py index 129f064d5..55a42968a 100644 --- a/lib/crewai/src/crewai/utilities/llm_utils.py +++ b/lib/crewai/src/crewai/utilities/llm_utils.py @@ -69,7 +69,7 @@ def create_llm( UNACCEPTED_ATTRIBUTES: Final[list[str]] = [ "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", - "AWS_REGION_NAME", + "AWS_DEFAULT_REGION", ] @@ -146,7 +146,7 @@ def _llm_via_environment_or_fallback() -> LLM | None: unaccepted_attributes = [ "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", - "AWS_REGION_NAME", + "AWS_DEFAULT_REGION", ] set_provider = model_name.partition("/")[0] if "/" in model_name else "openai" diff --git a/lib/crewai/tests/llms/bedrock/test_bedrock.py b/lib/crewai/tests/llms/bedrock/test_bedrock.py index efe3191e7..531e4d967 100644 --- a/lib/crewai/tests/llms/bedrock/test_bedrock.py +++ b/lib/crewai/tests/llms/bedrock/test_bedrock.py @@ -437,17 +437,36 @@ def test_bedrock_aws_credentials_configuration(): """ Test that AWS credentials configuration works properly """ + aws_access_key_id = "test-access-key" + aws_secret_access_key = "test-secret-key" + aws_region_name = "us-east-1" + + # Test with environment variables with patch.dict(os.environ, { - "AWS_ACCESS_KEY_ID": "test-access-key", - "AWS_SECRET_ACCESS_KEY": "test-secret-key", - "AWS_DEFAULT_REGION": "us-east-1" + "AWS_ACCESS_KEY_ID": aws_access_key_id, + "AWS_SECRET_ACCESS_KEY": aws_secret_access_key, + "AWS_DEFAULT_REGION": aws_region_name }): llm = LLM(model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0") from crewai.llms.providers.bedrock.completion import BedrockCompletion assert isinstance(llm, BedrockCompletion) - assert llm.region_name == "us-east-1" + assert llm.region_name == aws_region_name + assert llm.aws_access_key_id == aws_access_key_id + assert llm.aws_secret_access_key == aws_secret_access_key + + # Test with litellm environment variables + with patch.dict(os.environ, { + "AWS_ACCESS_KEY_ID": aws_access_key_id, + "AWS_SECRET_ACCESS_KEY": aws_secret_access_key, + "AWS_REGION_NAME": aws_region_name + }): + llm = LLM(model="bedrock/anthropic.claude-3-5-sonnet-20241022-v2:0") + + from crewai.llms.providers.bedrock.completion import BedrockCompletion + assert isinstance(llm, BedrockCompletion) + assert llm.region_name == aws_region_name # Test with explicit credentials llm_explicit = LLM( diff --git a/lib/crewai/tests/utilities/test_llm_utils.py b/lib/crewai/tests/utilities/test_llm_utils.py index e02173f8d..5d7d70b76 100644 --- a/lib/crewai/tests/utilities/test_llm_utils.py +++ b/lib/crewai/tests/utilities/test_llm_utils.py @@ -81,7 +81,7 @@ def test_create_llm_from_env_with_unaccepted_attributes() -> None: "OPENAI_API_KEY": "fake-key", "AWS_ACCESS_KEY_ID": "fake-access-key", "AWS_SECRET_ACCESS_KEY": "fake-secret-key", - "AWS_REGION_NAME": "us-west-2", + "AWS_DEFAULT_REGION": "us-west-2", }, ): llm = create_llm(llm_value=None) @@ -89,7 +89,7 @@ def test_create_llm_from_env_with_unaccepted_attributes() -> None: assert llm.model == "gpt-3.5-turbo" assert not hasattr(llm, "AWS_ACCESS_KEY_ID") assert not hasattr(llm, "AWS_SECRET_ACCESS_KEY") - assert not hasattr(llm, "AWS_REGION_NAME") + assert not hasattr(llm, "AWS_DEFAULT_REGION") def test_create_llm_with_partial_attributes() -> None: