From 1840d589a4dadda541cbd60934045b32ad4d63e9 Mon Sep 17 00:00:00 2001 From: Reethi Joseph <reethi@amazon.com> Date: Wed, 18 Dec 2024 21:39:18 +0530 Subject: [PATCH 1/4] initial commit - adding Amazon Bedrock Agents pattern --- bedrock-agents-lambda-cdk/README.md | 96 ++++++++++++++++++ bedrock-agents-lambda-cdk/app.py | 23 +++++ bedrock-agents-lambda-cdk/cdk.json | 69 +++++++++++++ .../example-pattern.json | 57 +++++++++++ .../image/architecture.png | Bin 0 -> 112507 bytes .../lambda/bedrock_agents_lambda.py | 32 ++++++ bedrock-agents-lambda-cdk/requirements.txt | 2 + bedrock-agents-lambda-cdk/stacks/__init__.py | 0 .../stacks/bedrock_agents_lambda_cdk_stack.py | 78 ++++++++++++++ 9 files changed, 357 insertions(+) create mode 100644 bedrock-agents-lambda-cdk/README.md create mode 100644 bedrock-agents-lambda-cdk/app.py create mode 100644 bedrock-agents-lambda-cdk/cdk.json create mode 100644 bedrock-agents-lambda-cdk/example-pattern.json create mode 100644 bedrock-agents-lambda-cdk/image/architecture.png create mode 100644 bedrock-agents-lambda-cdk/lambda/bedrock_agents_lambda.py create mode 100644 bedrock-agents-lambda-cdk/requirements.txt create mode 100644 bedrock-agents-lambda-cdk/stacks/__init__.py create mode 100644 bedrock-agents-lambda-cdk/stacks/bedrock_agents_lambda_cdk_stack.py diff --git a/bedrock-agents-lambda-cdk/README.md b/bedrock-agents-lambda-cdk/README.md new file mode 100644 index 000000000..85bfee478 --- /dev/null +++ b/bedrock-agents-lambda-cdk/README.md @@ -0,0 +1,96 @@ +# Serverlessland - Amazon Bedrock Agents with AWS Lambda + +[Image: image/architecture.png] +In this pattern, we show you how to use Amazon Bedrock Agents to call an API and get the results from it for a user. Bedrock Agents is helpful in various situations such as fetching real-time information from APIs, interacting with knowledge bases, and performing actions based on user inputs. For more information on Bedrock agents, see [Automate tasks in your application using AI agents](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html). + +> [!Important] +> this application uses various AWS services and there are costs associated with these services after the Free Tier usage - please see the [AWS Pricing page](https://aws.amazon.com/pricing/) for details. You are responsible for any AWS costs incurred. No warranty is implied in this example. + +## Requirements + +* [Create an AWS account](https://portal.aws.amazon.com/gp/aws/developer/registration/index.html) if you do not already have one and log in. The IAM user that you use must have sufficient permissions to make necessary AWS service calls and manage AWS resources. +* [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) installed and configured +* [Git Installed](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) +* [Install AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) +* [Install Python 3](https://www.python.org/downloads/) +* [Grant Bedrock Model Access for Claude 3 Sonnet](https://docs.aws.amazon.com/bedrock/latest/userguide/model-access.html) + +## Deployment Instructions + +1. Create a new directory, navigate to that directory in a terminal and clone the GitHub repository: + +``` +git clone https://github.com/aws-samples/serverless-patterns +``` + +1. Change directory to the pattern directory: + +``` +cd bedrock-agents-lambda-cdk +``` + +1. Create a virtual environment for Python: + +``` +python3 -m venv .venv +``` + +1. Activate the virtual environment: + +``` +source .venv/bin/activate +``` + +For a Windows platform, activate the virtualenv like this: + +``` +.venv\Scripts\activate.bat +``` + +1. Install the required Python dependencies: + +``` +pip install -r requirements.txt +``` + +1. Bootstrap the AWS environment, if you haven't already done so: + +``` +cdk bootstrap +``` + +1. Review the CloudFormation template AWS CDK generates for the stack: + +``` +cdk synth +``` + +1. Deploy the AWS resources: + +``` +cdk deploy +``` + + +## How it works + +Bedrock agent processes user input through a foundation model to determine its next steps. It then decides whether to invoke an action or query a knowledge base. For performing an action it has action groups defined, in this example we are using a Lambda function which invokes an API. It either executes the action or it gathers more information from its knowledge base or the user. The agent generates an observation from these results, which it uses to generate final response or determine if it needs more user input, allowing for dynamic and context-aware interactions. + +## Testing + +To test the Bedrock agent, we will need to use the AWS console. The Lambda function will call the International Space Station API to fetch its location, so it can answer questions such as “What is the current location of ISS'”, “Where is ISS?'”, “Where is the internation space station now”, etc + +1. Navigate to the Amazon Bedrock Agents page on the AWS console +2. Selected the deployed agent ISSLocationAgent +3. If you don’t see a Test section on the right pane, click on **Test** +4. Enter a message similar to “What is the current location of ISS'” and notice that the results are returned + +## Cleanup + +1. Run below script in the `bedrock-agents-lambda-cdk` directory to delete AWS resources created by this sample stack. + +``` +cdk destroy +``` + + diff --git a/bedrock-agents-lambda-cdk/app.py b/bedrock-agents-lambda-cdk/app.py new file mode 100644 index 000000000..5c253fd45 --- /dev/null +++ b/bedrock-agents-lambda-cdk/app.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +import os + +import aws_cdk as cdk + +from stacks.bedrock_agents_lambda_cdk_stack import BedrockAgentsLambdaCdkStack + + +app = cdk.App() +BedrockAgentsLambdaCdkStack(app, "BedrockAgentsLambdaCdkStack", + # If you don't specify 'env', this stack will be environment-agnostic. + # Account/Region-dependent features and context lookups will not work, + # but a single synthesized template can be deployed anywhere. + + # Uncomment the next line to specialize this stack for the AWS Account + # and Region that are implied by the current CLI configuration. + + #env=cdk.Environment(account=os.getenv('CDK_DEFAULT_ACCOUNT'), region=os.getenv('CDK_DEFAULT_REGION')), + + # For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html + ) + +app.synth() diff --git a/bedrock-agents-lambda-cdk/cdk.json b/bedrock-agents-lambda-cdk/cdk.json new file mode 100644 index 000000000..20c5a8fe0 --- /dev/null +++ b/bedrock-agents-lambda-cdk/cdk.json @@ -0,0 +1,69 @@ +{ + "app": "python3 app.py", + "watch": { + "include": [ + "**" + ], + "exclude": [ + "README.md", + "cdk*.json", + "requirements*.txt", + "source.bat", + "**/__init__.py", + "**/__pycache__", + "tests" + ] + }, + "context": { + "@aws-cdk/aws-lambda:recognizeLayerVersion": true, + "@aws-cdk/core:checkSecretUsage": true, + "@aws-cdk/core:target-partitions": [ + "aws", + "aws-cn" + ], + "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, + "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, + "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, + "@aws-cdk/aws-iam:minimizePolicies": true, + "@aws-cdk/core:validateSnapshotRemovalPolicy": true, + "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, + "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, + "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, + "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, + "@aws-cdk/core:enablePartitionLiterals": true, + "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, + "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, + "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true, + "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true, + "@aws-cdk/aws-route53-patters:useCertificate": true, + "@aws-cdk/customresources:installLatestAwsSdkDefault": false, + "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true, + "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true, + "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true, + "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true, + "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true, + "@aws-cdk/aws-redshift:columnId": true, + "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true, + "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true, + "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true, + "@aws-cdk/aws-kms:aliasNameRef": true, + "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true, + "@aws-cdk/core:includePrefixInUniqueNameGeneration": true, + "@aws-cdk/aws-efs:denyAnonymousAccess": true, + "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true, + "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true, + "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true, + "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true, + "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true, + "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true, + "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true, + "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true, + "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true, + "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true, + "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true, + "@aws-cdk/aws-eks:nodegroupNameAttribute": true, + "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true, + "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true, + "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false + } +} diff --git a/bedrock-agents-lambda-cdk/example-pattern.json b/bedrock-agents-lambda-cdk/example-pattern.json new file mode 100644 index 000000000..c100f208d --- /dev/null +++ b/bedrock-agents-lambda-cdk/example-pattern.json @@ -0,0 +1,57 @@ +{ + "title": "Amazon Bedrock Agents with AWS Lambda", + "description": "Create a agent with Amazon Bedrock with a Lambda function action group", + "language": "Python", + "level": "300", + "framework": "CDK", + "introBox": { + "headline": "How it works", + "text": [ + "In this pattern, we show you how to use Amazon Bedrock Agents to call an API and get the results from it for a user. Bedrock Agents is helpful in various situations such as fetching real-time information from APIs, interacting with knowledge bases, and performing actions based on user inputs.", + "It processes user input through a foundation model to determine its next steps. It then decides whether to invoke an action or query a knowledge base. For performing an action it has action groups defined, in this example we are using a Lambda function which invokes an API. It then either executes the action or it gathers more information from its knowledge base or the user. The agent generates an observation from these results, which it uses to update its understanding. This cycle continues until the agent can provide a final response or needs more user input, allowing for dynamic and context-aware interactions." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/bedrock-agents-lambda-cdk", + "templateURL": "serverless-patterns/bedrock-agents-lambda-cdk", + "projectFolder": "bedrock-agents-lambda-cdk", + "templateFile": "stacks/bedrock_agents_lambda_cdk_stack.py" + } + }, + "resources": { + "bullets": [ + { + "text": "Bedrock Agents", + "link": "https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html" + }, + { + "text": "Creating Bedrock Agent Action Groups", + "link": "https://docs.aws.amazon.com/bedrock/latest/userguide/agents-action-create.html" + } + ] + }, + "deploy": { + "text": [ + "cdk deploy" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "Delete the stack: <code>cdk destroy</code>." + ] + }, + "authors": [ + { + "name": "Reethi Joseph", + "image": "https://drive.google.com/file/d/1fthW0WuTMx8dKt3EPoh6NHFdj-jBrtvf/view", + "bio": "Reethi is a Senior Cloud Engineer at AWS.", + "linkedin": "https://www.linkedin.com/in/reethi-joseph/" + } + ] + } \ No newline at end of file diff --git a/bedrock-agents-lambda-cdk/image/architecture.png b/bedrock-agents-lambda-cdk/image/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2bea8e70b71b14553f79cc5b54b35030353cd90e GIT binary patch literal 112507 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 DQl)ZH literal 0 HcmV?d00001 diff --git a/bedrock-agents-lambda-cdk/lambda/bedrock_agents_lambda.py b/bedrock-agents-lambda-cdk/lambda/bedrock_agents_lambda.py new file mode 100644 index 000000000..4ad6bc28f --- /dev/null +++ b/bedrock-agents-lambda-cdk/lambda/bedrock_agents_lambda.py @@ -0,0 +1,32 @@ +import json +import urllib3 +from urllib3.util import Retry + + +def lambda_handler(event, context): + http = urllib3.PoolManager( + retries=Retry(3, backoff_factor=0.5) + ) + response = http.request( + 'GET', + 'http://api.open-notify.org/iss-now.json', + timeout=10.0 + ) + iss_data = json.loads(response.data.decode('utf-8')) + responseBody = { + "TEXT": { + "body": f"The ISS is currently at latitude {iss_data["iss_position"]['latitude']} and longitude {iss_data["iss_position"]['longitude']}" + } + } + + action_response = { + 'actionGroup': event['actionGroup'], + 'function': event['function'], + 'functionResponse': { + 'responseBody': responseBody + } + } + function_response = {'response': action_response, 'messageVersion': event['messageVersion']} + print("Response: {}".format(function_response)) + + return function_response diff --git a/bedrock-agents-lambda-cdk/requirements.txt b/bedrock-agents-lambda-cdk/requirements.txt new file mode 100644 index 000000000..c7633e36c --- /dev/null +++ b/bedrock-agents-lambda-cdk/requirements.txt @@ -0,0 +1,2 @@ +aws-cdk-lib==2.151.0 +constructs>=10.0.0,<11.0.0 diff --git a/bedrock-agents-lambda-cdk/stacks/__init__.py b/bedrock-agents-lambda-cdk/stacks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/bedrock-agents-lambda-cdk/stacks/bedrock_agents_lambda_cdk_stack.py b/bedrock-agents-lambda-cdk/stacks/bedrock_agents_lambda_cdk_stack.py new file mode 100644 index 000000000..eedcd2271 --- /dev/null +++ b/bedrock-agents-lambda-cdk/stacks/bedrock_agents_lambda_cdk_stack.py @@ -0,0 +1,78 @@ +from aws_cdk import ( + Duration, + Stack, + aws_bedrock as bedrock, + aws_iam as iam, + aws_lambda +) +from constructs import Construct + +class BedrockAgentsLambdaCdkStack(Stack): + + def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: + super().__init__(scope, construct_id, **kwargs) + + # IAM role for Lambda + lambda_role = iam.Role( + self, 'ISSLocationLambdaRole', + assumed_by=iam.ServicePrincipal('lambda.amazonaws.com'), + description='Role for Lambda function', + managed_policies=[ + iam.ManagedPolicy.from_aws_managed_policy_name('service-role/AWSLambdaBasicExecutionRole') + ] + ) + + # Lambda Function + ISS_lambda_function = aws_lambda.Function( + self, 'ISSLocationLambda', + runtime=aws_lambda.Runtime.PYTHON_3_12, + code=aws_lambda.Code.from_asset('lambda'), + handler='bedrock_agents_lambda.lambda_handler', + function_name="ISSLocationLambda", + timeout=Duration.seconds(120), + role=lambda_role + ) + + #IAM role for Bedrock agent + bedrock_agent_role = iam.Role( + self, 'ISSLocationBedrockAgentRole', + assumed_by=iam.ServicePrincipal('bedrock.amazonaws.com'), + description='Role for Bedrock agent' + ) + bedrock_agent_role.add_to_policy(iam.PolicyStatement( + actions=["bedrock:InvokeModel"], + resources= [ + f"arn:aws:bedrock:{self.region}::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0" + ] + )) + + # Bedrock Agent + cfn_agent = bedrock.CfnAgent(self, "ISSLocationAgent", + agent_name="ISSLocationAgent", + agent_resource_role_arn=bedrock_agent_role.role_arn, + foundation_model="anthropic.claude-3-sonnet-20240229-v1:0", + action_groups=[bedrock.CfnAgent.AgentActionGroupProperty( + action_group_name="get_iss_location", + action_group_executor=bedrock.CfnAgent.ActionGroupExecutorProperty( + lambda_= ISS_lambda_function.function_arn + ), + action_group_state="ENABLED", + function_schema=bedrock.CfnAgent.FunctionSchemaProperty( + functions=[bedrock.CfnAgent.FunctionProperty( + name="get_iss_location", + description="Get the current geographic location of the International Space Station", + )] + ), + skip_resource_in_use_check_on_delete=False + )], + instruction="You are an agent skilled at tracking and reporting the location of the International Space Station. Your role is to help users understand where the ISS is currently located by providing its geographic coordinates and other relevant location details.", + auto_prepare=True) + + # Lambda resource based policy to allow Bedrock agent to invoke the Lambda + lambda_resource_policy = aws_lambda.CfnPermission( + self, 'ISSLocationLambdaResourcePolicy', + action='lambda:InvokeFunction', + function_name=ISS_lambda_function.function_name, + principal='bedrock.amazonaws.com', + source_arn=cfn_agent.attr_agent_arn + ) \ No newline at end of file From 60ffa4caed9ee21059c5e0b7c5c3467d68a094ea Mon Sep 17 00:00:00 2001 From: Reethi Joseph <reethi@amazon.com> Date: Wed, 18 Dec 2024 23:04:10 +0530 Subject: [PATCH 2/4] updating README --- bedrock-agents-lambda-cdk/README.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/bedrock-agents-lambda-cdk/README.md b/bedrock-agents-lambda-cdk/README.md index 85bfee478..91839f77d 100644 --- a/bedrock-agents-lambda-cdk/README.md +++ b/bedrock-agents-lambda-cdk/README.md @@ -1,6 +1,7 @@ # Serverlessland - Amazon Bedrock Agents with AWS Lambda -[Image: image/architecture.png] + + In this pattern, we show you how to use Amazon Bedrock Agents to call an API and get the results from it for a user. Bedrock Agents is helpful in various situations such as fetching real-time information from APIs, interacting with knowledge bases, and performing actions based on user inputs. For more information on Bedrock agents, see [Automate tasks in your application using AI agents](https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html). > [!Important] @@ -23,19 +24,19 @@ In this pattern, we show you how to use Amazon Bedrock Agents to call an API and git clone https://github.com/aws-samples/serverless-patterns ``` -1. Change directory to the pattern directory: +2. Change directory to the pattern directory: ``` cd bedrock-agents-lambda-cdk ``` -1. Create a virtual environment for Python: +3. Create a virtual environment for Python: ``` python3 -m venv .venv ``` -1. Activate the virtual environment: +4. Activate the virtual environment: ``` source .venv/bin/activate @@ -47,25 +48,25 @@ For a Windows platform, activate the virtualenv like this: .venv\Scripts\activate.bat ``` -1. Install the required Python dependencies: +5. Install the required Python dependencies: ``` pip install -r requirements.txt ``` -1. Bootstrap the AWS environment, if you haven't already done so: +6. Bootstrap the AWS environment, if you haven't already done so: ``` cdk bootstrap ``` -1. Review the CloudFormation template AWS CDK generates for the stack: +7. Review the CloudFormation template AWS CDK generates for the stack: ``` cdk synth ``` -1. Deploy the AWS resources: +8. Deploy the AWS resources: ``` cdk deploy @@ -81,13 +82,13 @@ Bedrock agent processes user input through a foundation model to determine its n To test the Bedrock agent, we will need to use the AWS console. The Lambda function will call the International Space Station API to fetch its location, so it can answer questions such as “What is the current location of ISS'”, “Where is ISS?'”, “Where is the internation space station now”, etc 1. Navigate to the Amazon Bedrock Agents page on the AWS console -2. Selected the deployed agent ISSLocationAgent +2. Selected the deployed agent **ISSLocationAgent** 3. If you don’t see a Test section on the right pane, click on **Test** 4. Enter a message similar to “What is the current location of ISS'” and notice that the results are returned ## Cleanup -1. Run below script in the `bedrock-agents-lambda-cdk` directory to delete AWS resources created by this sample stack. +Run below script in the `bedrock-agents-lambda-cdk` directory to delete AWS resources created by this sample stack. ``` cdk destroy From 01cb57a301bdb003515a3fbb7fe27b3d602fc725 Mon Sep 17 00:00:00 2001 From: Reethi Joseph <reethi@amazon.com> Date: Wed, 18 Dec 2024 23:09:59 +0530 Subject: [PATCH 3/4] updating README.md --- bedrock-agents-lambda-cdk/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bedrock-agents-lambda-cdk/README.md b/bedrock-agents-lambda-cdk/README.md index 91839f77d..4aa5f731b 100644 --- a/bedrock-agents-lambda-cdk/README.md +++ b/bedrock-agents-lambda-cdk/README.md @@ -1,4 +1,4 @@ -# Serverlessland - Amazon Bedrock Agents with AWS Lambda +# Amazon Bedrock Agents with AWS Lambda  From c1e8ec464422e8b506e3dd6929ae244784acd4fe Mon Sep 17 00:00:00 2001 From: Manju Arakere <23362982+marakere@users.noreply.github.com> Date: Tue, 14 Jan 2025 10:24:41 -0500 Subject: [PATCH 4/4] Create bedrock-agents-lambda-cdk.json --- .../bedrock-agents-lambda-cdk.json | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 bedrock-agents-lambda-cdk/bedrock-agents-lambda-cdk.json diff --git a/bedrock-agents-lambda-cdk/bedrock-agents-lambda-cdk.json b/bedrock-agents-lambda-cdk/bedrock-agents-lambda-cdk.json new file mode 100644 index 000000000..c31d81d22 --- /dev/null +++ b/bedrock-agents-lambda-cdk/bedrock-agents-lambda-cdk.json @@ -0,0 +1,76 @@ +{ + "title": "Amazon Bedrock Agents with AWS Lambda", + "description": "Create a agent with Amazon Bedrock with a Lambda function action group", + "language": "Python", + "level": "300", + "framework": "CDK", + "introBox": { + "headline": "How it works", + "text": [ + "In this pattern, we show you how to use Amazon Bedrock Agents to call an API and get the results from it for a user. Bedrock Agents is helpful in various situations such as fetching real-time information from APIs, interacting with knowledge bases, and performing actions based on user inputs.", + "It processes user input through a foundation model to determine its next steps. It then decides whether to invoke an action or query a knowledge base. For performing an action it has action groups defined, in this example we are using a Lambda function which invokes an API. It then either executes the action or it gathers more information from its knowledge base or the user. The agent generates an observation from these results, which it uses to update its understanding. This cycle continues until the agent can provide a final response or needs more user input, allowing for dynamic and context-aware interactions." + ] + }, + "gitHub": { + "template": { + "repoURL": "https://github.com/aws-samples/serverless-patterns/tree/main/bedrock-agents-lambda-cdk", + "templateURL": "serverless-patterns/bedrock-agents-lambda-cdk", + "projectFolder": "bedrock-agents-lambda-cdk", + "templateFile": "stacks/bedrock_agents_lambda_cdk_stack.py" + } + }, + "resources": { + "bullets": [ + { + "text": "Bedrock Agents", + "link": "https://docs.aws.amazon.com/bedrock/latest/userguide/agents.html" + }, + { + "text": "Creating Bedrock Agent Action Groups", + "link": "https://docs.aws.amazon.com/bedrock/latest/userguide/agents-action-create.html" + } + ] + }, + "deploy": { + "text": [ + "cdk deploy" + ] + }, + "testing": { + "text": [ + "See the GitHub repo for detailed testing instructions." + ] + }, + "cleanup": { + "text": [ + "Delete the stack: <code>cdk destroy</code>." + ] + }, + "authors": [ + { + "name": "Reethi Joseph", + "image": "https://drive.google.com/file/d/1fthW0WuTMx8dKt3EPoh6NHFdj-jBrtvf/view", + "bio": "Reethi is a Senior Cloud Engineer at AWS.", + "linkedin": "reethi-joseph" + } + ], + "patternArch": { + "icon1": { + "x": 20, + "y": 50, + "service": "bedrock", + "label": "Amazon Bedrock Agent" + }, + "icon2": { + "x": 80, + "y": 50, + "service": "lambda", + "label": "AWS Lambda" + }, + "line1": { + "from": "icon1", + "to": "icon2", + "label": "" + } + } +}