diff --git a/docs/en/concepts/llms.mdx b/docs/en/concepts/llms.mdx index 2d6a452f2..ee0b86df3 100644 --- a/docs/en/concepts/llms.mdx +++ b/docs/en/concepts/llms.mdx @@ -311,20 +311,38 @@ In this section, you'll find detailed examples that help you select, configure, + Amazon Bedrock supports two authentication methods: + + **Method 1: IAM Role Authentication (Recommended for Production)** ```toml Code AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION= ``` + **Method 2: API Key Authentication (Recommended for Development)** + ```toml Code + AWS_BEARER_TOKEN_BEDROCK= + AWS_DEFAULT_REGION= + ``` + Example usage in your CrewAI project: ```python Code + # Using IAM role authentication + llm = LLM( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0" + ) + + # Using API key authentication llm = LLM( model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0" ) ``` - Before using Amazon Bedrock, make sure you have boto3 installed in your environment + **Requirements:** + - Before using Amazon Bedrock, make sure you have boto3 v1.393+ installed in your environment + - For API key authentication, you can generate a 30-day API key from the [Amazon Bedrock console](https://console.aws.amazon.com/bedrock/) + - For production applications, use IAM roles or temporary credentials instead of long-term API keys [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html) is a managed service that provides access to multiple foundation models from top AI companies through a unified API, enabling secure and responsible AI application development. diff --git a/docs/pt-BR/concepts/llms.mdx b/docs/pt-BR/concepts/llms.mdx index b32c0b712..85219bc51 100644 --- a/docs/pt-BR/concepts/llms.mdx +++ b/docs/pt-BR/concepts/llms.mdx @@ -309,20 +309,38 @@ Nesta seção, você encontrará exemplos detalhados que ajudam a selecionar, co + O Amazon Bedrock suporta dois métodos de autenticação: + + **Método 1: Autenticação por Função IAM (Recomendado para Produção)** ```toml Code AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION= ``` + **Método 2: Autenticação por Chave de API (Recomendado para Desenvolvimento)** + ```toml Code + AWS_BEARER_TOKEN_BEDROCK= + AWS_DEFAULT_REGION= + ``` + Exemplo de uso em seu projeto CrewAI: ```python Code + # Usando autenticação por função IAM + llm = LLM( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0" + ) + + # Usando autenticação por chave de API llm = LLM( model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0" ) ``` - Antes de usar o Amazon Bedrock, certifique-se de ter o boto3 instalado em seu ambiente + **Requisitos:** + - Antes de usar o Amazon Bedrock, certifique-se de ter o boto3 v1.393+ instalado em seu ambiente + - Para autenticação por chave de API, você pode gerar uma chave de 30 dias no [console do Amazon Bedrock](https://console.aws.amazon.com/bedrock/) + - Para aplicações de produção, use funções IAM ou credenciais temporárias em vez de chaves de API de longo prazo [Amazon Bedrock](https://docs.aws.amazon.com/bedrock/latest/userguide/models-regions.html) é um serviço gerenciado que fornece acesso a múltiplos modelos fundamentais dos principais provedores de IA através de uma API unificada, permitindo o desenvolvimento seguro e responsável de aplicações de IA. @@ -881,4 +899,4 @@ Saiba como obter o máximo da configuração do seu LLM: llm = LLM(model="openai/gpt-4o") # 128K tokens ``` - \ No newline at end of file + diff --git a/src/crewai/cli/constants.py b/src/crewai/cli/constants.py index 306f1108b..6d6c67c79 100644 --- a/src/crewai/cli/constants.py +++ b/src/crewai/cli/constants.py @@ -62,6 +62,10 @@ ENV_VARS = { "prompt": "Enter your AWS Region Name (press Enter to skip)", "key_name": "AWS_REGION_NAME", }, + { + "prompt": "Enter your AWS Bedrock API Key (press Enter to skip)", + "key_name": "AWS_BEARER_TOKEN_BEDROCK", + }, ], "azure": [ { diff --git a/tests/test_bedrock_authentication.py b/tests/test_bedrock_authentication.py new file mode 100644 index 000000000..09453e513 --- /dev/null +++ b/tests/test_bedrock_authentication.py @@ -0,0 +1,109 @@ +import os +import pytest +from unittest.mock import patch, MagicMock +from crewai import LLM + + +class TestBedrockAuthentication: + """Test AWS Bedrock authentication methods.""" + + @patch.dict(os.environ, { + 'AWS_ACCESS_KEY_ID': 'test-key-id', + 'AWS_SECRET_ACCESS_KEY': 'test-secret-key', + 'AWS_DEFAULT_REGION': 'us-east-1' + }) + @patch('litellm.completion') + def test_bedrock_iam_authentication(self, mock_completion): + """Test Bedrock with IAM role authentication.""" + mock_completion.return_value = MagicMock() + mock_completion.return_value.choices = [MagicMock()] + mock_completion.return_value.choices[0].message.content = "Test response" + + llm = LLM(model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0") + result = llm.call("test message") + + mock_completion.assert_called_once() + assert result == "Test response" + + @patch.dict(os.environ, { + 'AWS_BEARER_TOKEN_BEDROCK': 'test-api-key', + 'AWS_DEFAULT_REGION': 'us-east-1' + }) + @patch('litellm.completion') + def test_bedrock_api_key_authentication(self, mock_completion): + """Test Bedrock with API key authentication.""" + mock_completion.return_value = MagicMock() + mock_completion.return_value.choices = [MagicMock()] + mock_completion.return_value.choices[0].message.content = "Test response" + + llm = LLM(model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0") + result = llm.call("test message") + + mock_completion.assert_called_once() + assert result == "Test response" + + def test_bedrock_missing_credentials(self): + """Test Bedrock fails gracefully with missing credentials.""" + with patch.dict(os.environ, {}, clear=True): + llm = LLM(model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0") + assert llm.model == "bedrock/anthropic.claude-3-sonnet-20240229-v1:0" + + @patch.dict(os.environ, { + 'AWS_BEARER_TOKEN_BEDROCK': 'test-api-key', + 'AWS_DEFAULT_REGION': 'us-east-1' + }) + @patch('litellm.completion') + def test_bedrock_api_key_with_streaming(self, mock_completion): + """Test Bedrock API key authentication with streaming.""" + mock_completion.return_value = iter([ + MagicMock(choices=[MagicMock(delta=MagicMock(content="Test"))]), + MagicMock(choices=[MagicMock(delta=MagicMock(content=" response"))]) + ]) + + llm = LLM(model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0") + result = list(llm.stream("test message")) + + mock_completion.assert_called_once() + assert len(result) == 2 + + @patch.dict(os.environ, { + 'AWS_ACCESS_KEY_ID': 'test-key-id', + 'AWS_SECRET_ACCESS_KEY': 'test-secret-key', + 'AWS_DEFAULT_REGION': 'us-east-1' + }) + @patch('litellm.completion') + def test_bedrock_iam_with_custom_parameters(self, mock_completion): + """Test Bedrock IAM authentication with custom parameters.""" + mock_completion.return_value = MagicMock() + mock_completion.return_value.choices = [MagicMock()] + mock_completion.return_value.choices[0].message.content = "Test response" + + llm = LLM( + model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0", + temperature=0.7, + max_tokens=100 + ) + result = llm.call("test message") + + mock_completion.assert_called_once() + call_args = mock_completion.call_args + assert call_args[1]['temperature'] == 0.7 + assert call_args[1]['max_tokens'] == 100 + assert result == "Test response" + + @patch.dict(os.environ, { + 'AWS_BEARER_TOKEN_BEDROCK': 'test-api-key', + 'AWS_DEFAULT_REGION': 'us-west-2' + }) + @patch('litellm.completion') + def test_bedrock_api_key_different_region(self, mock_completion): + """Test Bedrock API key authentication with different region.""" + mock_completion.return_value = MagicMock() + mock_completion.return_value.choices = [MagicMock()] + mock_completion.return_value.choices[0].message.content = "Test response" + + llm = LLM(model="bedrock/anthropic.claude-3-sonnet-20240229-v1:0") + result = llm.call("test message") + + mock_completion.assert_called_once() + assert result == "Test response"