

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

# Amazon Lambda 函数目标
<a name="gateway-add-target-lambda"></a>

Lambda 目标允许您将网关连接到实现您的工具的 Lam Amazon bda 函数。当您想要执行自定义代码以响应工具调用时，这很有用。

您可以使用 Lambda 服务创建 Lambda Amazon 函数。要创建该函数，应执行以下操作：
+ 创建用于定义 Lambda 函数可以调用的工具的工具架构。
+ 了解 Lambda 输入格式。然后，您可以使用自己选择的语言按照《[Amazon Lambda 开发者**构建**指南》](https://docs.amazonaws.cn/lambda/latest/dg/)中的步骤进行操作。

创建函数后，您可以为网关配置访问该函数的权限。

查看关键注意事项和限制，以帮助您决定 Lambda 目标是否适用于您的用例。如果是，则可以创建工具架构和 Lambda 函数，然后为网关设置访问目标的权限。选择一个主题以了解更多信息：

**Topics**
+ [主要考虑因素和限制](#gateway-building-lambda-limitations)
+ [Lambda 函数工具架构](#gateway-lambda-tool-schema)
+ [Lambda 函数输入格式](#gateway-building-lambda-input)

## 主要考虑因素和限制
<a name="gateway-building-lambda-limitations"></a>

使用 Lambda 目标时，请注意以下限制和注意事项：
+ 需要手动从 Lambda 函数 Amazon 的工具名称中删除工具名称前缀。有关更多信息，请参阅[了解 AgentCore 网关工具的命名方式](gateway-tool-naming.md)。
+ 如果您使用的是现有 Amazon Lambda 函数并将其作为工具导入网关，则需要更改函数代码以应对事件和上下文对象的架构更改
+ Lambda 函数必须返回可由网关解析的有效 JSON 响应
+ 应适当配置 Lambda 函数超时，以处理工具的预期处理时间
+ 考虑在 Lambda 函数中实现错误处理，以便向客户端提供有意义的错误消息

## Lambda 函数工具架构
<a name="gateway-lambda-tool-schema"></a>

本节介绍工具架构的结构，该架构定义了您的 Lambda 函数可以返回的工具。定义工具架构后，您可以执行以下操作之一：
+ 将其上传到 Amazon S3 存储桶，并在将目标添加到网关时参考 S3 位置。
+ 将目标添加到网关时，内联粘贴定义。

选择一个主题以了解有关工具架构详细信息的更多信息或查看示例：

**Topics**
+ [工具定义](#gateway-lambda-tool-definition)
+ [输入和输出架构的顶级架构定义](#gateway-lambda-top-level-schema-definition)
+ [属性架构定义](#gateway-lambda-property-schema-definition)
+ [Lambda 工具定义示例](#gateway-lambda-example)

### 工具定义
<a name="gateway-lambda-tool-definition"></a>

当您将 Lambda 函数添加为网关目标时，您在提供目标[ToolDefinition](https://docs.amazonaws.cn/bedrock-agentcore-control/latest/APIReference/API_ToolDefinition.html)配置时提供。工具定义的结构如下：

```
{
    "name": "string",
    "description": "string",
    "inputSchema": {
        "type": "object",
        "description": "string",
        "properties": {
            "string": SchemaDefinition
        },
        "required": ["string"]
    },
    "outputSchema": {
        "type": "object",
        "description": "string",
        "properties": {
            "string": SchemaDefinition
        },
        "required": ["string"]
    }
}
```

工具定义包含以下字段：
+  **名称**（必填）-工具的名称。
+  **描述**（必填）-对工具及其用途和用法的描述。
+  **InputSchema**（必填）— 一个 JSON 对象，用于定义该工具接受的输入的结构。
+  O@@ **utputSchema**（可选）— 一个 JSON 对象，用于定义该工具生成的输出结构。

`inputSchema`和`outputSchema`字段都映射到对象类型 [SchemaDefinition](https://docs.amazonaws.cn/bedrock-agentcore-control/latest/APIReference/API_SchemaDefinition.html)，如下节所述。

### 输入和输出架构的顶级架构定义
<a name="gateway-lambda-top-level-schema-definition"></a>

工具定义顶层的`inputSchema`和`outputSchema`字段都映射到包含以下字段的对象类型 [SchemaDefinition](https://docs.amazonaws.cn/bedrock-agentcore-control/latest/APIReference/API_SchemaDefinition.html)：

```
{
    "type": "object",
    "description": "string",
    "properties": {
        "string": SchemaDefinition
    },
    "required": ["string"]
}
```
+  **类型**（必填）-必须是`object`。
+  **描述**（可选）-对架构及其目的和用法的描述。
+  **属性**（可选）-定义工具属性或参数的 JSON 对象。每个键都是一个属性的名称，并映射到定义该属性的[SchemaDefinition](https://docs.amazonaws.cn/bedrock-agentcore-control/latest/APIReference/API_SchemaDefinition.html)对象。
+  **re** quired（可选）— 枚举对象中所需属性的数组。`properties`

如果您包含用于定义工具参数的`properties`字段，则可以为每个参数提供架构定义。下一节将概述不同类型的架构定义。

### 属性架构定义
<a name="gateway-lambda-property-schema-definition"></a>

顶级架构中的每个属性都`SchemaDefinition`映射到一个要求与顶级架构定义略有不同的[SchemaDefinition](https://docs.amazonaws.cn/bedrock-agentcore-control/latest/APIReference/API_SchemaDefinition.html)对象。可用字段取决于属`type`性的属性。要查看某一类型的形状，请从以下选项卡中进行选择：`SchemaDefinition`

**Example**  

1. f `SchemaDefinition` or a string 属性的结构如下：

   ```
   {
       "type": "string",
       "description": "string"
   }
   ```

1. f `SchemaDefinition` or a number 属性的结构如下：

   ```
   {
       "type": "number",
       "description": "string"
   }
   ```

1. 整数属性的结构如下：`SchemaDefinition`

   ```
   {
       "type": "integer",
       "description": "string"
   }
   ```

1. f `SchemaDefinition` or 布尔属性的结构如下：

   ```
   {
       "type": "boolean",
       "description": "string"
   }
   ```

1. f `SchemaDefinition` or a array 属性的结构如下：

   ```
   {
       "type": "array",
       "description": "string",
       "items": SchemaDefinition
   }
   ```

   该`items`字段的值`SchemaDefinition`是 a，它定义了数组中每项的结构。

1. fo `SchemaDefinition` r a object 属性的结构如下，并且与顶级属性架构定义相匹配。

   ```
   {
       "type": "object",
       "description": "string",
       "properties": {
           "string": SchemaDefinition
       },
       "required": ["string"]
   }
   ```

如果包含另一个对象类型属性，则将以递归方式添加另一个对象类型属性。`SchemaDefinition`

### Lambda 工具定义示例
<a name="gateway-lambda-example"></a>

选择一个选项卡，查看可以包含在 Lambda 函数中的示例工具定义。

**Example**  

1. 以下`get_weather`工具需要`location`字符串参数，可用于返回该位置的天气：

   ```
   {
       "name": "get_weather",
       "description": "Get weather for a location",
       "inputSchema": {
           "type": "object",
           "properties": {
               "location": {
                   "type": "string",
                   "description": "the location e.g. seattle, wa"
               }
           },
           "required": [
               "location"
           ]
       }
   }
   ```

1. 以下`get_time`工具需要`timezone`字符串参数，可用于返回该时区的时间：

   ```
   {
       "name": "get_time",
       "description": "Get time for a timezone",
       "inputSchema": {
           "type": "object",
           "properties": {
               "timezone": {
                   "type": "string"
               }
           },
           "required": [
               "timezone"
           ]
       }
   }
   ```

## Lambda 函数输入格式
<a name="gateway-building-lambda-input"></a>

当 Amazon Bedrock AgentCore 网关调用 Lambda 函数时，它会向该函数传递一个`event`对象和一个`context`对象。您编写的 Lambda 事件处理程序可以访问这些对象中的值。

 **事件对象** 

工具返回的`properties`从`inputSchema`到其值的地图。例如，如果您的输入架构包含属性和`keywords`和`category`，则事件对象可能如下所示：

```
{
  "keywords": "wireless headphones",
  "category": "electronics"
}
```

 **上下文对象** 

包含以下元数据：
+ 基岩 AgentCoreMessageVersion — 消息的版本。
+ 基岩 AgentCoreAwsRequestId — 向 Amazon Bedrock AgentCore 服务提出的请求的 ID。
+ 基石 AgentCoreMcpMessageId — 发送到 MCP 服务器的消息的 ID。
+ bedrock AgentCoreGatewayId — 被调用的网关的 ID。
+ bedrock AgentCoreTargetId — 被调用的网关目标的 ID。
+ 基岩 AgentCoreToolName — 被调用的工具的名称。工具名称的格式为 `${target_name}` *\_* `${tool_name}`。

上下文对象的格式如下：

```
{
  "bedrockAgentCoreMessageVersion": "1.0",
  "bedrockAgentCoreAwsRequestId": "string",
  "bedrockAgentCoreMcpMessageId": "string",
  "bedrockAgentCoreGatewayId": "string",
  "bedrockAgentCoreTargetId": "string",
  "bedrockAgentCoreToolName": "string"
}
```

您编写的 Lambda 函数可以访问事件和上下文对象的属性。你可以使用以下样板代码开始使用：

```
# Access context properties in your Lambda function
def lambda_handler(event, context):
    # Since the visible tool name includes the target name as a prefix, we can use this delimiter to strip the prefix
    delimiter = "___"

    # Get the tool name from the context
    originalToolName = context.client_context.custom['bedrockAgentCoreToolName']
    toolName = originalToolName[originalToolName.index(delimiter) + len(delimiter):]

    # Get other context properties
    message_version = context.client_context.custom['bedrockAgentCoreMessageVersion']
    aws_request_id = context.client_context.custom['bedrockAgentCoreAwsRequestId']
    mcp_message_id = context.client_context.custom['bedrockAgentCoreMcpMessageId']
    gateway_id = context.client_context.custom['bedrockAgentCoreGatewayId']
    target_id = context.client_context.custom['bedrockAgentCoreTargetId']

    # Process the request based on the tool name
    if tool_name == 'searchProducts':
        # Handle searchProducts tool
        pass
    elif tool_name == 'getProductDetails':
        # Handle getProductDetails tool
        pass
    else:
        # Handle unknown tool
        pass
```