

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置 Lambda 函数以发送 Amazon Bedrock 代理从用户那里获取的信息
<a name="agents-lambda"></a>

您可以定义一个 Lambda 函数，用于编写操作组的业务逻辑。在 Amazon Bedrock 代理确定需要在操作组中调用的 API 操作后，它会将来自 API 架构的信息以及相关的元数据作为输入事件发送到 Lambda 函数。要编写函数，您必须了解 Lambda 函数的以下组成部分：
+ **输入事件** – 包含 API 操作请求正文中的相关元数据和已填充字段，或者代理确定必须调用的操作的函数参数。
+ **响应** – 包含从 API 操作或函数返回的响应正文的相关元数据和已填充字段。

您可以编写 Lambda 函数来定义如何处理操作组，并自定义 API 响应的返回方式。您可以使用输入事件中的变量来定义函数，并向代理返回响应。

**注意**  
一个操作组最多可以包含 11 个 API 操作，但您只能编写一个 Lambda 函数。由于 Lambda 函数一次只能接收一个输入事件并针对一个 API 操作返回响应，因此在编写函数时，您应该考虑到可能被调用的不同 API 操作。

要让代理使用 Lambda 函数，您必须将基于资源的策略附加到该函数，以便为代理提供权限。有关更多信息，请参阅 [基于资源的策略，允许 Amazon Bedrock 调用操作组 Lambda 函数](agents-permissions.md#agents-permissions-lambda) 中的步骤。有关 Lambda 中基于资源的策略的更多信息，[请参阅开发人员指南中的对 Lambda 使用基于资源的策略](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)。 AWS Lambda 

要了解如何在创建操作组时定义函数，请参阅 [在 Amazon Bedrock 中向代理添加操作组](agents-action-add.md)。

**Topics**
+ [来自 Amazon Bedrock 的 Lambda 输入事件](#agents-lambda-input)
+ [对 Amazon Bedrock 的 Lambda 响应事件](#agents-lambda-response)
+ [操作组 Lambda 函数示例](#agents-lambda-example)

## 来自 Amazon Bedrock 的 Lambda 输入事件
<a name="agents-lambda-input"></a>

调用使用 Lambda 函数的操作组时，Amazon Bedrock 会发送以下一般格式的 Lambda 输入事件。您可以定义 Lambda 函数，使用任何输入事件字段来处理函数中的业务逻辑，以便成功执行操作。有关 Lambda 函数的更多信息，请参阅开发人员指南中的[事件驱动调用](https://docs.aws.amazon.com/lambda/latest/dg/lambda-services.html#event-driven-invocation)。 AWS Lambda 

输入事件的格式取决于您是使用 API 架构还是使用函数详细信息定义操作组：
+ 如果您使用 API 架构定义操作组，则输入事件的格式如下：

  ```
  {
      "messageVersion": "1.0",
      "agent": {
          "name": "string",
          "id": "string",
          "alias": "string",
          "version": "string"
      },
      "inputText": "string",
      "sessionId": "string",
      "actionGroup": "string",
      "apiPath": "string",
      "httpMethod": "string",
      "parameters": [
          {
              "name": "string",
              "type": "string",
              "value": "string"
          },
      ...
      ],
      "requestBody": {
          "content": {
              "<content_type>": {
                  "properties": [
                     {
                         "name": "string",
                         "type": "string",
                         "value": "string"
                      },
                              ...
                  ]
              }
          }
      },
      "sessionAttributes": {
          "string": "string",
      },
      "promptSessionAttributes": {
          "string": "string"
      }
  }
  ```
+ 如果您使用函数详细信息定义操作组，则输入事件的格式如下：

  ```
  {
      "messageVersion": "1.0",
      "agent": {
          "name": "string",
          "id": "string",
          "alias": "string",
          "version": "string"
      },
      "inputText": "string",
      "sessionId": "string",
      "actionGroup": "string",
      "function": "string",
      "parameters": [
          {
              "name": "string",
              "type": "string",
              "value": "string"
          },
      ...
      ],
      "sessionAttributes": {
          "string": "string",
      },
      "promptSessionAttributes": {
          "string": "string"
      }
  }
  ```

下面的列表介绍了输入事件字段：
+ `messageVersion` – 消息的版本，用于标识进入 Lambda 函数的事件数据格式以及 Lambda 函数的预期响应格式。Amazon Bedrock 仅支持版本 1.0。
+ `agent` – 包含操作组所属代理的名称、ID、别名和版本的相关信息。
+ `inputText` – 用户在对话回合中的输入。
+ `sessionId` – 代理会话的唯一标识符。
+ `actionGroup` – 操作组的名称。
+ `parameters` – 包含对象列表。每个对象都包含 API 操作中参数的名称、类型和值，如 OpenAPI 架构或函数中所定义。
+ 如果您使用 API 架构定义操作组，则输入事件包含以下字段：
  + `apiPath` – API 操作的路径，如 OpenAPI 架构中所定义。
  + `httpMethod` – API 操作的方法，如 OpenAPI 架构中所定义。
  + `requestBody` – 包含请求正文及其属性，如操作组的 OpenAPI 架构中所定义。
+ 如果您使用函数详细信息定义操作组，则输入事件包含以下字段：
  + `function` – 操作组的函数详细信息中定义的函数名称。
+ `sessionAttributes` – 包含[会话属性](agents-session-state.md)及其值。这些属性在[会话](advanced-prompts.md#advanced-prompts-terminology)期间存储，并为代理提供上下文。
+ `promptSessionAttributes` – 包含[提示会话属性](agents-session-state.md)及其值。这些属性在[回合](advanced-prompts.md#advanced-prompts-terminology)中存储，并为代理提供上下文。

## 对 Amazon Bedrock 的 Lambda 响应事件
<a name="agents-lambda-response"></a>

Amazon Bedrock 希望从 Lambda 函数获得符合以下格式的响应。响应由从 API 操作返回的参数组成。代理可以使用 Lambda 函数的响应进行进一步编排或借助它向客户返回响应。

**注意**  
最大有效载荷响应大小与 Lambda 函数的同步响应的最大大小相匹配。有关更多信息，请参阅《 AWS Lambda 开发人员指南》中的*调用负载*资源[配额](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution)。

输入事件的格式取决于您是使用 API 架构还是使用函数详细信息定义操作组：
+ 如果您使用 API 架构定义操作组，则响应格式如下：

  ```
  {
      "messageVersion": "1.0",
      "response": {
          "actionGroup": "string",
          "apiPath": "string",
          "httpMethod": "string",
          "httpStatusCode": number,
          "responseBody": {
              "<contentType>": {
                  "body": "JSON-formatted string" 
              }
          }
      },
      "sessionAttributes": {
          "string": "string",
          ...
      },
      "promptSessionAttributes": {
          "string": "string",
          ...
      },
      "knowledgeBasesConfiguration": [
          {
              "knowledgeBaseId": "string",
              "retrievalConfiguration": {
                  "vectorSearchConfiguration": {
                      "numberOfResults": int,
                      "overrideSearchType": "HYBRID | SEMANTIC",
                      "filter": [RetrievalFilter](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrievalFilter.html) object
                  }
              }
          },
          ...
      ]
  }
  ```
+ 如果您使用函数详细信息定义操作组，则响应格式如下：

  ```
  {
      "messageVersion": "1.0",
      "response": {
          "actionGroup": "string",
          "function": "string",
          "functionResponse": {
              "responseState": "FAILURE | REPROMPT",
              "responseBody": {
                  "<functionContentType>": { 
                      "body": "JSON-formatted string"
                  }
              }
          }
      },
      "sessionAttributes": {
          "string": "string",
      },
      "promptSessionAttributes": {
          "string": "string"
      },
      "knowledgeBasesConfiguration": [
          {
              "knowledgeBaseId": "string",
              "retrievalConfiguration": {
                  "vectorSearchConfiguration": {
                      "numberOfResults": int,
                      "filter": {
                          [RetrievalFilter](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_agent-runtime_RetrievalFilter.html) object
                      }
                  }
              }
          },
          ...
      ]
  }
  ```

下面的列表介绍了响应字段：
+ `messageVersion` – 消息的版本，用于标识进入 Lambda 函数的事件数据格式以及 Lambda 函数的预期响应格式。Amazon Bedrock 仅支持版本 1.0。
+ `response` – 包含有关 API 响应的以下信息。
  + `actionGroup` – 操作组的名称。
  + 如果您使用 API 架构定义操作组，则响应中可能包含以下字段：
    + `apiPath` – API 操作的路径，如 OpenAPI 架构中所定义。
    + `httpMethod` – API 操作的方法，如 OpenAPI 架构中所定义。
    + `httpStatusCode` – 从 API 操作返回的 HTTP 状态代码。
    + `responseBody` – 包含响应正文，如 OpenAPI 架构中所定义。
  + 如果您使用函数详细信息定义操作组，则响应中可能包含以下字段：
    + `responseState`（可选）– 设置为以下状态之一，以定义代理在处理操作后的行为：
      + FAILURE – 代理抛出当前会话的 `DependencyFailedException`。适用于由于依赖项故障而导致函数执行失败的情况。
      + REPROMPT – 代理向模型传递响应字符串，以重新提示模型。适用于由于输入无效而导致函数执行失败的情况。
    + `responseBody` – 包含一个对象，该对象定义了函数执行后的响应。键是内容类型（目前仅支持 `TEXT`），值是包含响应 `body` 的对象。
+ （可选）`sessionAttributes` – 包含会话属性及其值。有关更多信息，请参阅 [会话和提示会话属性](agents-session-state.md#session-state-attributes)。
+ （可选）`promptSessionAttributes` – 包含提示属性及其值。有关更多信息，请参阅 [会话和提示会话属性](agents-session-state.md#session-state-attributes)。
+ （可选）`knowledgeBasesConfiguration` – 包含附加到代理的知识库的查询配置列表。有关更多信息，请参阅 [知识库检索配置](agents-session-state.md#session-state-kb)。

## 操作组 Lambda 函数示例
<a name="agents-lambda-example"></a>

以下是如何在中定义 Lambda 函数的最小示例。Python根据您是使用 OpenAPI 架构还是函数详细信息定义操作组来选择相应的选项卡：

------
#### [ OpenAPI schema ]

```
def lambda_handler(event, context):

    agent = event['agent']
    actionGroup = event['actionGroup']
    api_path = event['apiPath']
    # get parameters
    get_parameters = event.get('parameters', [])
    # post parameters
    post_parameters = event['requestBody']['content']['application/json']['properties']

    response_body = {
        'application/json': {
            'body': "sample response"
        }
    }
    
    action_response = {
        'actionGroup': event['actionGroup'],
        'apiPath': event['apiPath'],
        'httpMethod': event['httpMethod'],
        'httpStatusCode': 200,
        'responseBody': response_body
    }
    
    session_attributes = event['sessionAttributes']
    prompt_session_attributes = event['promptSessionAttributes']
    
    api_response = {
        'messageVersion': '1.0', 
        'response': action_response,
        'sessionAttributes': session_attributes,
        'promptSessionAttributes': prompt_session_attributes
    }
        
    return api_response
```

------
#### [ Function details ]

```
def lambda_handler(event, context):

    agent = event['agent']
    actionGroup = event['actionGroup']
    function = event['function']
    parameters = event.get('parameters', [])

    response_body = {
        'TEXT': {
            'body': "sample response"
        }
    }
    
    function_response = {
        'actionGroup': event['actionGroup'],
        'function': event['function'],
        'functionResponse': {
            'responseBody': response_body
        }
    }
    
    session_attributes = event['sessionAttributes']
    prompt_session_attributes = event['promptSessionAttributes']
    
    action_response = {
        'messageVersion': '1.0', 
        'response': function_response,
        'sessionAttributes': session_attributes,
        'promptSessionAttributes': prompt_session_attributes
    }
        
    return action_response
```

------