

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon Bedrock Flows 코드 샘플 실행
<a name="flows-code-ex"></a>

다음 코드 샘플에서는 다음과 같은 사전 조건을 충족했다고 가정합니다.

1. Amazon Bedrock 작업에 대한 권한을 갖도록 역할이 설정되어 있습니다. 이렇게 설정되어 있지 않은 경우 [빠른 시작](getting-started.md) 섹션을 참조하세요.

1. AWS API를 사용하도록 자격 증명이 설정되어 있습니다. 이렇게 설정되어 있지 않은 경우 [API 시작하기](getting-started-api.md) 섹션을 참조하세요.

1. 사용자를 대신하여 흐름 관련 작업을 수행하는 서비스 역할이 만들어져 있습니다. 이렇게 설정되어 있지 않은 경우 [Amazon Bedrock에서 Amazon Bedrock Flows의 서비스 역할 생성](flows-permissions.md) 섹션을 참조하세요.

흐름을 만들려면 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용하여 [CreateFlow](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_CreateFlow.html) 요청을 전송합니다. 예제 코드는 [Amazon Bedrock Flows 코드 샘플 실행](#flows-code-ex) 항목을 참조하세요.

필수 필드는 다음과 같습니다.


****  

| 필드 | 기본 설명 | 
| --- | --- | 
| name | 흐름의 이름입니다. | 
| executionRoleArn | [흐름을 만들고 관리할 수 있는 권한이 있는 서비스 역할](flows-permissions.md)의 ARN입니다. | 

다음 필드는 선택 사항입니다.


****  

| 필드 | 사용 사례 | 
| --- | --- | 
| definition | 흐름을 구성하는 nodes 및 connections를 포함합니다. | 
| description | 흐름을 설명합니다. | 
| tags | 태그를 흐름에 연결합니다. 자세한 내용은 [Amazon Bedrock 리소스 태그 지정](tagging.md) 섹션을 참조하세요. | 
| customerEncryptionKeyArn | KMS 키를 사용하여 리소스를 암호화합니다. 자세한 내용은 [Amazon Bedrock Flows 리소스 암호화](encryption-flows.md) 섹션을 참조하세요. | 
| clientToken | API 요청이 한 번만 완료되도록 합니다. 자세한 내용은 [Ensuring idempotency](https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html)를 참조하세요. | 

`definition` 필드는 선택 사항이지만 흐름이 작동하려면 필수입니다. 먼저 정의 없이 흐름을 만들도록 선택한 다음 나중에 흐름을 업데이트할 수 있습니다.

`nodes` 목록의 각 노드에 대해 `type` 필드에 노드 유형을 지정하고 `config` 필드에 노드의 해당 구성을 제공합니다. 다양한 노드 유형의 API 구조에 대한 자세한 내용은 [흐름의 노드 유형](flows-nodes.md) 섹션을 참조하세요.

Amazon Bedrock Flows에 대한 일부 코드 샘플을 사용하려면 선택한 방법의 탭을 선택하고 다음 단계를 따릅니다.

------
#### [ Python ]

1. 다음 노드가 있는 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용하여 [CreateFlow](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_CreateFlow.html) 요청으로 흐름을 만듭니다.
   + 입력 노드
   + 두 가지 변수(`genre` 및 `number`)를 사용하여 음악 재생 목록을 만드는 프롬프트가 인라인으로 정의된 프롬프트 노드
   + 모델 완성을 반환하는 출력 노드

   다음 코드 스니펫을 실행하여 AWS SDK for Python (Boto3)을 로드하고, Amazon Bedrock Agents 클라이언트를 만들고, 노드를 사용하여 흐름을 만듭니다(흐름을 위해 만든 서비스 역할의 ARN으로 `executionRoleArn` 필드를 바꿉니다).

   ```
   # Import Python SDK and create client
   import boto3
   
   client = boto3.client(service_name='bedrock-agent')
   
   # Replace with the service role that you created. For more information, see https://docs.aws.amazon.com/bedrock/latest/userguide/flows-permissions.html
   FLOWS_SERVICE_ROLE = "arn:aws:iam::123456789012:role/MyFlowsRole"
   
   # Define each node
   
   # The input node validates that the content of the InvokeFlow request is a JSON object.
   input_node = {
       "type": "Input",
       "name": "FlowInput",
       "outputs": [
           {
               "name": "document",
               "type": "Object"
           }
       ]
   }
   
   # This prompt node defines an inline prompt that creates a music playlist using two variables.
   # 1. {{genre}} - The genre of music to create a playlist for
   # 2. {{number}} - The number of songs to include in the playlist
   # It validates that the input is a JSON object that minimally contains the fields "genre" and "number", which it will map to the prompt variables.
   # The output must be named "modelCompletion" and be of the type "String".
   prompt_node = {
       "type": "Prompt",
       "name": "MakePlaylist",
       "configuration": {
           "prompt": {
               "sourceConfiguration": {
                   "inline": {
                       "modelId": "amazon.nova-lite-v1:0",
                       "templateType": "TEXT",
                       "inferenceConfiguration": {
                           "text": {
                               "temperature": 0.8
                           }
                       },
                       "templateConfiguration": { 
                           "text": {
                               "text": "Make me a {{genre}} playlist consisting of the following number of songs: {{number}}."
                           }
                       }
                   }
               }
           }
       },
       "inputs": [
           {
               "name": "genre",
               "type": "String",
               "expression": "$.data.genre"
           },
           {
               "name": "number",
               "type": "Number",
               "expression": "$.data.number"
           }
       ],
       "outputs": [
           {
               "name": "modelCompletion",
               "type": "String"
           }
       ]
   }
   
   # The output node validates that the output from the last node is a string and returns it as is. The name must be "document".
   output_node = {
       "type": "Output",
       "name": "FlowOutput",
       "inputs": [
           {
               "name": "document",
               "type": "String",
               "expression": "$.data"
           }
       ]
   }
   
   # Create connections between the nodes
   connections = []
   
   #   First, create connections between the output of the flow input node and each input of the prompt node
   for input in prompt_node["inputs"]:
       connections.append(
           {
               "name": "_".join([input_node["name"], prompt_node["name"], input["name"]]),
               "source": input_node["name"],
               "target": prompt_node["name"],
               "type": "Data",
               "configuration": {
                   "data": {
                       "sourceOutput": input_node["outputs"][0]["name"],
                       "targetInput": input["name"]
                   }
               }
           }
       )
   
   # Then, create a connection between the output of the prompt node and the input of the flow output node
   connections.append(
       {
           "name": "_".join([prompt_node["name"], output_node["name"]]),
           "source": prompt_node["name"],
           "target": output_node["name"],
           "type": "Data",
           "configuration": {
               "data": {
                   "sourceOutput": prompt_node["outputs"][0]["name"],
                   "targetInput": output_node["inputs"][0]["name"]
               }
           }
       }
   )
   
   # Create the flow from the nodes and connections
   response = client.create_flow(
       name="FlowCreatePlaylist",
       description="A flow that creates a playlist given a genre and number of songs to include in the playlist.",
       executionRoleArn=FLOWS_SERVICE_ROLE,
       definition={
           "nodes": [input_node, prompt_node, output_node],
           "connections": connections
       }
   )
   
   flow_id = response.get("id")
   ```

1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [ListFlows](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_ListFlows.html) 요청을 수행하여 방금 만든 흐름을 포함한 계정의 흐름을 나열합니다.

   ```
   client.list_flows()
   ```

1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [GetFlow](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_GetFlow.html) 요청을 수행하여 방금 만든 흐름에 대한 정보를 가져옵니다.

   ```
   client.get_flow(flowIdentifier=flow_id)
   ```

1. 규격 초안의 최신 변경 사항이 적용되고 버전 지정할 수 있도록 흐름을 준비합니다. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [PrepareFlow](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_PrepareFlow.html) 요청을 수행합니다.

   ```
   client.prepare_flow(flowIdentifier=flow_id)
   ```

1. 흐름의 규격 초안을 버전 지정하여 흐름의 정적 스냅샷을 만든 후, 다음 작업을 통해 해당 내용에 대한 정보를 검색합니다.

   1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [CreateFlowVersion](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_CreateFlowVersion.html) 요청을 수행하여 버전을 만듭니다.

      ```
      response = client.create_flow_version(flowIdentifier=flow_id)
                                      
      flow_version = response.get("version")
      ```

   1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [ListFlowVersions](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_ListFlowVersions.html) 요청을 수행하여 흐름의 모든 버전을 나열합니다.

      ```
      client.list_flow_versions(flowIdentifier=flow_id)
      ```

   1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [GetFlowVersion](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_GetFlowVersion.html) 요청을 수행하여 버전에 대한 정보를 가져옵니다.

      ```
      client.get_flow_version(flowIdentifier=flow_id, flowVersion=flow_version)
      ```

1. 생성한 흐름의 버전을 가리키는 별칭을 만든 후, 다음 작업을 통해 해당 별칭에 대한 정보를 검색합니다.

   1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [CreateFlowAlias](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_CreateFlowAlias.html) 요청을 수행하여 별칭을 만들고 방금 생성한 버전을 가리킵니다.

      ```
      response = client.create_flow_alias(
          flowIdentifier=flow_id,
          name="latest",
          description="Alias pointing to the latest version of the flow.",
          routingConfiguration=[
              {
                  "flowVersion": flow_version
              }
          ]
      )
      
      flow_alias_id = response.get("id")
      ```

   1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [ListFlowAliass](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_ListFlowAliass.html) 요청을 수행하여 흐름의 모든 별칭을 나열합니다.

      ```
      client.list_flow_aliases(flowIdentifier=flow_id)
      ```

   1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [GetFlowAlias](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_GetFlowAlias.html) 요청을 수행하여 방금 만든 별칭에 대한 정보를 가져옵니다.

      ```
      client.get_flow_alias(flowIdentifier=flow_id, aliasIdentifier=flow_alias_id)
      ```

1. 다음 코드 스니펫을 실행하여 Amazon Bedrock Agents Runtime 클라이언트를 만들고 흐름을 간접적으로 호출합니다. 요청은 흐름의 프롬프트에 있는 변수를 채우고 모델의 응답을 반환하여 [Amazon Bedrock Agents 런타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-rt)를 사용해 [InvokeFlow](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_InvokeFlow.html) 요청을 수행합니다.

   ```
   client_runtime = boto3.client('bedrock-agent-runtime')
   
   response = client_runtime.invoke_flow(
       flowIdentifier=flow_id,
       flowAliasIdentifier=flow_alias_id,
       inputs=[
           {
               "content": {
                   "document": {
                       "genre": "pop",
                       "number": 3
                   }
               },
               "nodeName": "FlowInput",
               "nodeOutputName": "document"
           }
       ]
   )
   
   result = {}
   
   for event in response.get("responseStream"):
       result.update(event)
   
   if result['flowCompletionEvent']['completionReason'] == 'SUCCESS':
       print("Flow invocation was successful! The output of the flow is as follows:\n")
       print(result['flowOutputEvent']['content']['document'])
   
   else:
       print("The flow invocation completed because of the following reason:", result['flowCompletionEvent']['completionReason'])
   ```

   응답은 3개의 노래가 포함된 팝 음악 재생 목록을 반환해야 합니다.

1. 다음 작업으로 만든 별칭, 버전, 흐름을 삭제합니다.

   1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [DeleteFlowAlias](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_DeleteFlowAlias.html) 요청을 수행하여 별칭을 삭제합니다.

      ```
      client.delete_flow_alias(flowIdentifier=flow_id, aliasIdentifier=flow_alias_id)
      ```

   1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [DeleteFlowVersion](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_DeleteFlowVersion.html) 요청을 수행하여 버전을 삭제합니다.

      ```
      client.delete_flow_version(flowIdentifier=flow_id, flowVersion=flow_version)
      ```

   1. 다음 코드 스니펫을 실행하여 [Amazon Bedrock Agents 빌드 타임 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/bedrock.html#bra-bt)를 사용해 [DeleteFlow](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent_DeleteFlow.html) 요청을 수행하여 흐름을 삭제합니다.

      ```
      client.delete_flow(flowIdentifier=flow_id)
      ```

------