# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Shows how to use the AWS SDK for Python (Boto3) with the Amazon Bedrock Agents Runtime to manage an Amazon Bedrock flow. """ import logging from time import sleep from botocore.exceptions import ClientError logging.basicConfig( level=logging.INFO ) logger = logging.getLogger(__name__) # snippet-start:[python.example_code.bedrock-agent.create_flow] def create_flow(client, flow_name, flow_description, role_arn, flow_def): """ Creates an Amazon Bedrock flow. Args: client: Amazon Bedrock agent boto3 client. flow_name (str): The name for the new flow. role_arn (str): The ARN for the IAM role that use flow uses. flow_def (json): The JSON definition of the flow that you want to create. Returns: dict: The response from CreateFlow. """ try: logger.info("Creating flow: %s.", flow_name) response = client.create_flow( name=flow_name, description=flow_description, executionRoleArn=role_arn, definition=flow_def ) logger.info("Successfully created flow: %s. ID: %s", flow_name, {response['id']}) return response except ClientError as e: logger.exception("Client error creating flow: %s", {str(e)}) raise except Exception as e: logger.exception("Unexepcted error creating flow: %s", {str(e)}) raise # snippet-end:[python.example_code.bedrock-agent.create_flow] # snippet-start:[python.example_code.bedrock-agent.prepare_flow] def prepare_flow(client, flow_id): """ Prepares an Amazon Bedrock Flow. Args: client: Amazon Bedrock agent boto3 client. flow_id (str): The identifier of the flow that you want to prepare. Returns: str: The status of the flow preparation """ try: # Prepare the flow. logger.info("Preparing flow ID: %s", flow_id) response = client.prepare_flow( flowIdentifier=flow_id ) status = response.get('status') while status == "Preparing": logger.info("Preparing flow ID: %s. Status %s", flow_id, status) sleep(5) response = client.get_flow( flowIdentifier=flow_id ) status = response.get('status') print(f"Flow Status: {status}") if status == "Prepared": logger.info("Finished preparing flow ID: %s. Status %s", flow_id, status) else: logger.warning("flow ID: %s not prepared. Status %s", flow_id, status) return status except ClientError as e: logger.exception("Client error preparing flow: %s", {str(e)}) raise except Exception as e: logger.exception("Unexepcted error preparing flow: %s", {str(e)}) raise # snippet-end:[python.example_code.bedrock-agent.prepare_flow] # snippet-start:[python.example_code.bedrock-agent.update_flow] def update_flow(client, flow_id, flow_name, flow_description, role_arn, flow_def): """ Updates an Amazon Bedrock flow. Args: client: bedrock agent boto3 client. flow_id (str): The ID for the flow that you want to update. flow_name (str): The name for the flow. role_arn (str): The ARN for the IAM role that use flow uses. flow_def (json): The JSON definition of the flow that you want to create. Returns: dict: Flow information if successful. """ try: logger.info("Updating flow: %s.", flow_id) response = client.update_flow( flowIdentifier=flow_id, name=flow_name, description=flow_description, executionRoleArn=role_arn, definition=flow_def ) logger.info("Successfully updated flow: %s. ID: %s", flow_name, {response['id']}) return response except ClientError as e: logger.exception("Client error updating flow: %s", {str(e)}) raise except Exception as e: logger.exception("Unexepcted error updating flow: %s", {str(e)}) raise # snippet-end:[python.example_code.bedrock-agent.update_flow] # snippet-start:[python.example_code.bedrock-agent.delete_flow] def delete_flow(client, flow_id): """ Deletes an Amazon Bedrock flow. Args: client: Amazon Bedrock agent boto3 client. flow_id (str): The identifier of the flow that you want to delete. Returns: dict: The response from the DeleteFLow operation. """ try: logger.info("Deleting flow ID: %s.", flow_id) # Call DeleteFlow operation response = client.delete_flow( flowIdentifier=flow_id, skipResourceInUseCheck=True ) logger.info("Finished deleting flow ID: %s", flow_id) return response except ClientError as e: logger.exception("Client error deleting flow: %s", {str(e)}) raise except Exception as e: logger.exception("Unexepcted error deleting flow: %s", {str(e)}) raise # snippet-end:[python.example_code.bedrock-agent.delete_flow] # snippet-start:[python.example_code.bedrock-agent.get_flow] def get_flow(client, flow_id): """ Gets an Amazon Bedrock flow. Args: client: bedrock agent boto3 client. flow_id (str): The identifier of the flow that you want to get. Returns: dict: The response from the GetFlow operation. """ try: logger.info("Getting flow ID: %s.", flow_id) # Call GetFlow operation. response = client.get_flow( flowIdentifier=flow_id ) logger.info("Retrieved flow ID: %s. Name: %s", flow_id, response['name']) return response except ClientError as e: logger.exception("Client error getting flow: %s", {str(e)}) raise except Exception as e: logger.exception("Unexepcted error getting flow: %s", {str(e)}) raise # snippet-end:[python.example_code.bedrock-agent.get_flow] # snippet-start:[python.example_code.bedrock-agent.list_flows] def list_flows(client): """ Lists versions of an Amazon Bedrock flow. Args: client: Amazon Bedrock agent boto3 client. flow_id (str): The identifier of the flow. Returns: Nothing. """ try: finished = False logger.info("Listing flows:") response = client.list_flows(maxResults=10) while finished is False: for flow in response['flowSummaries']: print(f"ID: {flow['id']}") print(f"Name: {flow['name']}") print( f"Description: {flow.get('description', 'No description')}") print(f"Latest version: {flow['version']}") print(f"Status: {flow['status']}\n") if 'nextToken' in response: next_token = response['nextToken'] response = client.list_flows(maxResults=10, nextToken=next_token) else: finished = True logging.info("Successfully listed flows.") except ClientError as e: logging.exception("Client error listing flow versions: %s", str(e)) raise except Exception as e: logging.exception("Unexpected error listing flow versions: %s", str(e)) raise # snippet-end:[python.example_code.bedrock-agent.list_flows]