Playbook 工具

您可以使用工具将 Playbook 连接到外部系统。这些系统可以增强 Playbook 的知识,使其能够高效地执行复杂任务。

您可以使用内置工具,也可以根据自己的要求构建自定义工具。

工具测试

创建工具后,您可以使用工具测试功能来验证其是否正常运行。查看工具时,点击工具窗格上方的测试按钮。这会打开用于在模拟器中输入内容的工具。 提供工具输入,然后点击查看输出以验证工具输出是否正确。

在向示例添加工具时,您也可以使用工具测试功能。

内置工具

内置工具由 Google 托管。您可以在代理中激活这些工具,而无需进行手动配置。

支持的内置工具包括:

  • Code Interpreter:这款 Google 第一方工具结合了代码生成和代码执行功能,可让用户执行各种任务,包括:数据分析、数据可视化、文本处理、解题或优化问题。

您的代理经过优化,可确定应如何以及何时调用这些工具,但您可以提供其他示例以适应您的用例。

示例应采用如下架构:

{
  "toolUse": {
    "tool": "projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/tools/df-code-interpreter-tool",
    "action": "generate_and_execute",
    "inputParameters": [
      {
        "name": "generate_and_execute input",
        "value": "4 + 4"
      }
    ],
    "outputParameters": [
      {
        "name": "generate_and_execute output",
        "value": {
          "output_files": [
            {
              "name": "",
              "contents": ""
            }
          ],
          "execution_result": "8",
          "execution_error": "",
          "generated_code": "GENERATED_CODE"
        }
      }
    ]
  }
}

OpenAPI 工具

代理可以通过提供 OpenAPI 架构,使用 OpenAPI 工具连接到外部 API。默认情况下,客服人员会代表您调用 API。或者,您也可以在客户端上执行 OpenAPI 工具。

架构示例:

openapi: 3.0.0
info:
  title: Simple Pets API
  version: 1.0.0
servers:
  - url: 'https://api.pet-service-example.com/v1'
paths:
  /pets/{petId}:
    get:
      summary: Return a pet by ID.
      operationId: getPet
      parameters:
        - in: path
          name: petId
          required: true
          description: Pet id
          schema:
            type: integer
      responses:
        200:
          description: OK
  /pets:
    get:
      summary: List all pets
      operationId: listPets
      parameters:
        - name: petName
          in: query
          required: false
          description: Pet name
          schema:
            type: string
        - name: label
          in: query
          description: Pet label
          style: form
          explode: true
          required: false
          schema:
            type: array
            items:
              type: string
        - name: X-OWNER
          in: header
          description: Optional pet owner provided in the HTTP header
          required: false
          schema:
            type: string
        - name: X-SESSION
          in: header
          description: Dialogflow session id
          required: false
          schema:
            $ref: "@dialogflow/sessionId"
      responses:
        '200':
          description: An array of pets
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Pet'
    post:
      summary: Create a new pet
      operationId: createPet
      requestBody:
        description: Pet to add to the store
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Pet'
      responses:
        '201':
          description: Pet created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pet'
components:
  schemas:
    Pet:
      type: object
      required:
        - id
        - name
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        owner:
          type: string
        label:
          type: array
          items:
            type: string

您可以选择使用内部架构引用 @dialogflow/sessionId 作为参数架构类型。使用此参数架构类型时,系统会将当前对话的 Dialogflow 会话 ID 作为参数值提供。例如:

- name: X-SESSION
   in: header
   description: Dialogflow session id
   required: false
   schema:
     $ref: "@dialogflow/sessionId"

OpenAPI 工具限制

存在以下限制:

  • 支持的参数类型包括 pathqueryheadercookie 参数类型尚不受支持。
  • OpenAPI 架构定义的参数支持以下数据类型:stringnumberintegerbooleanarrayobject 类型尚不受支持。
  • 您目前无法在控制台示例编辑器中指定查询参数。
  • 请求和响应正文必须为空或 JSON。

OpenAPI 工具 API 身份验证

调用外部 API 时,支持以下身份验证选项:

  • Dialogflow Service Agent 身份验证
    • Dialogflow 可以使用 Dialogflow 服务代理生成 ID 令牌访问令牌。当 Dialogflow 调用外部 API 时,系统会在授权 HTTP 标头中添加令牌。
    • service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com 授予 roles/cloudfunctions.invokerroles/run.invoker 角色后,ID 令牌便可用于访问 Cloud Run 函数和 Cloud Run 服务。如果 Cloud Run 函数和 Cloud Run 服务位于同一资源项目中,您无需额外的 IAM 权限即可调用它们。
    • service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com 授予所需角色后,访问令牌便可用于访问其他 API。 Google Cloud
  • 服务账号身份验证

    • 服务账号可用于对任何支持服务账号的 Google API 发出的工具请求进行身份验证。由于服务账号是主账号,因此您可以为服务账号授予角色(就像为任何其他主账号授予角色一样),以便服务账号能够访问您项目中的资源。系统会使用服务账号电子邮件地址生成访问令牌,并将其发送在工具请求的 Authorization 标头中。
    • 如需使用此功能,您需要获得以下权限:

      • roles/iam.serviceAccountUser 角色,以便创建或更新工具的用户使用服务账号身份验证。
      • roles/iam.serviceAccountTokenCreator 角色授予 Dialogflow 服务代理
    • 如果您尝试在多个项目中使用服务账号,请确保您的组织政策支持。您需要在包含服务账号的项目中授予这两项权限。

  • API 密钥

    • 您可以通过提供密钥名称、请求位置(标头或查询字符串)和 API 密钥来配置 API 密钥身份验证,以便 Dialogflow 在请求中传递 API 密钥。
    • 我们建议您使用 Secret Manager 提供 API 密钥。
  • OAuth

    • 服务器到服务器身份验证支持 OAuth 客户端凭据流程:

      • 如果 Agent Builder 控制台是资源所有者,并且无需最终用户授权,则可以使用此流程。
      • 您需要在 Dialogflow 中配置 OAuth 提供程序的客户端 ID、客户端密钥和令牌端点。
      • Dialogflow 会从 OAuth 提供程序交换 OAuth 访问令牌,并将其传递到请求的 auth 标头中。
    • 对于需要最终用户授权的其他 OAuth 流程(例如授权代码流程和 PKCE 流程):

      1. 您需要实现自己的登录界面,并在客户端获取访问令牌。
      2. 然后,您可以:

        a. 使用 Bearer 令牌身份验证选项将令牌传递给 OpenAPI 工具。调用该工具时,Dialogflow 会在授权标头中添加此令牌。

        b. 使用“函数”工具在客户端自行调用该工具,并将工具调用结果传递给 Dialogflow。

  • 不记名令牌

    • 您可以配置 Bearer 身份验证,以便从客户端动态传递 Bearer 令牌。此令牌包含在请求的身份验证标头中。
    • 设置工具身份验证时,您可以指定一个会话参数来充当 Bearer 令牌。例如,使用 $session.params.<parameter-name-for-token> 指定令牌。
    • 在运行时,将 Bearer 令牌分配给会话参数:
    DetectIntentRequest {
      ...
      query_params {
        parameters {
          <parameter-name-for-token>: <the-auth-token>
        }
      }
      ...
    }
    
    • 如果您需要配置静态令牌,而不是从会话参数中提取令牌,我们建议您使用 Secret Manager 提供令牌。
  • 双向 TLS 身份验证

    • 请参阅双向 TLS 身份验证文档。
    • 支持自定义客户端证书。您可以在代理设置的“安全”标签页下,在代理级别设置客户端证书。证书(PEM 格式)和私钥(PEM 格式)是必填字段。设置后,此客户端证书将在双向 TLS 期间用于所有工具和 webhook。
  • 自定义 CA 证书

Secret Manager 身份验证

如果您使用 OAuth、API 密钥或不记名令牌,则可以使用 Secret Manager 将凭据存储为密钥。以下是使用密钥对工具进行身份验证的必要步骤:

  1. 如果您还没有 Secret,请创建 Secret
  2. Dialogflow 服务代理授予对新 Secret 的 Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) 角色。
  3. 将您的凭据复制到剪贴板。
  4. 向密文添加新的密文版本。将您的凭据粘贴为 Secret 值。
    • 请省略末尾的所有换行符。
  5. 复制您刚刚添加的 Secret 版本的名称。名称格式为 projects/{project_id}/secrets/{secret_id}/versions/{version_id}"
  6. 打开工具修改屏幕,然后执行以下操作:
    • 如果您使用 OAuth,请选择 OAuth 作为身份验证类型,然后点击 Client secret(客户端密钥)下的 Secret version(密钥版本),并将密钥版本名称粘贴到 Secret version(密钥版本)输入框中。
    • 如果您使用 API 密钥,请选择 API 密钥作为身份验证类型,然后点击 API 密钥下的密钥版本。将 Secret 版本名称粘贴到 Secret 版本输入框中。
    • 如果您使用 Bearer 令牌,请选择 Bearer 令牌作为身份验证类型,然后点击 Bearer 令牌下的密钥版本。将 Secret 版本名称粘贴到 Secret 版本输入框中。
  7. 点击保存

OpenAPI 工具专用网络访问

OpenAPI 工具与 Service Directory 专用网络访问集成,因此可以连接到 VPC 网络内的 API 目标。这样便可保留在 Google Cloud 网络内部的流量,并强制执行 IAMVPC Service Controls

如需设置以专用网络为目标的 OpenAPI 工具,请执行以下操作:

  1. 按照 Service Directory 专用网络配置中的说明来配置 VPC 网络和 Service Directory 端点。

  2. 您的代理项目必须存在具有以下地址的 Dialogflow Service Agent 服务账号

    service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com
    Dialogflow 服务代理服务账号授予以下 IAM 角色:

    • Service Directory 项目的 servicedirectory.viewer
    • 网络项目的 servicedirectory.pscAuthorizedService
  3. 创建工具时,提供 Service Directory 服务以及 OpenAPI 架构和可选的身份验证信息。

OpenAPI 工具会话参数访问

Open API 工具输入是根据用户与 LLM 的对话,以架构为指导而得出。在某些情况下,您可能需要从流程中收集的会话参数派生输入,或者将输入作为查询参数输入与用户输入一起提供。

需要作为输入传递的会话参数可以指定为

     parameters:
       - in: query
         name: petId
         required: true
         description: Pet id
         schema:
           type: integer
           x-agent-input-parameter: petId # Reads from the $session.params.petId
       - in: header
         name: X-other
         schema:
           type: string
           x-agent-input-parameter: $request.payload.header # Reads from the header specified in the request payload input
     requestBody:
       required: false
       content:
         application/json:
           schema:
             type: object
             properties:
               name:
                 type: string
                 x-agent-input-parameter: petName # Reads from the $session.params.petName
                 description: Name of the person to greet (optional).
               breed:
                 type: string
                 description: Bread of the pet.

如果没有此类会话参数,系统会将 LLM 生成的输入传递给该工具。

OpenAPI 工具默认值

Open API 架构可用于指定默认值。只有在没有为该参数或属性生成 LLM 输入值或基于会话参数的输入值时,才会使用默认值。

您可以在架构中指定默认值,如下所示:

     parameters:
       - in: query
         name: zipcode
         required: true
         description: Zip code to search for
         schema:
           type: integer
           default: 94043
     requestBody:
       content:
         application/json:
           schema:
             type: object
             properties:
               breed:
                 type: string
                 description: Bread of the pet.
               page_size:
                 type: integer
                 description: Number of pets to return.
                 default: 10

如果没有 LLM 生成的值、会话参数值或默认值,则输入将未指定。

数据存储区工具

如需了解如何将数据存储区工具与 Playbook 搭配使用,请参阅数据存储区工具文档。

连接器工具

代理可以使用连接器工具,通过您在集成连接器中配置的连接执行操作。每个连接器工具都配置了一个连接和一个或多个操作。如果需要,您可以为单个连接创建多个工具,以便将不同的操作归为一组,供您的代理使用。

连接器工具支持以下连接器类型

示例应通过演示代理应如何调用工具和使用响应,来帮助代理更好地使用连接器工具。

创建连接

如需创建连接并将其关联到您的代理,您可以依次前往 Tools > Create,选择 Connector 工具类型和您选择的连接器类型,然后使用 Create Connection 按钮。这会将您转到“创建集成连接器”页面,其中预先填充了一些字段。

或者,您也可以前往“集成连接器”,然后按照创建连接的说明操作。

连接器操作

对于每个连接器工具,都可以向您的代理提供两种类型的操作(如需了解详情,请参阅实体、操作和动作):

  1. 实体 CRUD 操作

    您的每个连接都有与该数据源的对象对应的“实体”(对于 BigQuery,这些是表;对于 Salesforce,这些是对象,例如“Order”或“Case”)。

    您可以对每个实体执行 CRUD 操作:

    • 创建:创建具有指定字段值的实体
    • 列表:基于过滤条件搜索实体实例
    • 更新:用于更改实体字段值的基于过滤条件的方法
    • 删除:删除实体
    • Get 使用 entityId 检索单个实体

    如需详细了解实体 CRUD 操作,请参阅连接器文档

  2. 连接器专用操作

    许多连接器都支持 “ExecuteCustomQuery” 操作,该操作允许对数据源执行 SQL 查询,其中每个数据源实体都可以引用为表。如需查看支持的连接器,请参阅此列表。

    其他操作因连接器类型而异,例如,请参阅 BigQuery 连接器操作Salesforce 连接器操作

为 CRUD 操作配置输入 / 输出字段

通过为连接器工具操作选择要使用的特定输入或输出字段,您可以限制代理执行这些操作的复杂性。

例如,如果您只需创建包含部分字段的实体,则在操作中配置这组字段可简化代理的操作。

指定一组输出字段可缩减工具响应大小(如果令牌限制是问题,则非常有用),并通过仅公开相关字段来简化代理对输出的处理。

身份验证

如果您使用的连接配置为允许身份验证替换,则可以将该工具配置为传递指定会话参数中的凭据。

作为代理构建者,您负责决定如何将这些凭据填充到会话参数中,并且当调用工具的操作时,该工具会自动将这些凭据传递给数据源以进行身份验证。

函数工具

如果您的客户端代码可以访问某项功能,但 OpenAPI 工具无法访问,您可以使用函数工具。函数工具始终在客户端执行,而不是由代理执行。

具体过程如下:

  1. 您的客户端代码会发送检测意图请求。
  2. 代理检测到需要函数工具,并且检测意图响应包含该工具的名称以及输入参数。此会话会暂停,直到收到包含工具结果的另一个检测 intent 请求。
  3. 您的客户端代码调用该工具。
  4. 您的客户端代码会发送另一个检测 intent 请求,以便将工具结果作为输出参数提供。

以下示例展示了函数工具的输入和输出架构:

{
  "type": "object",
  "properties": {
    "location": {
      "type": "string",
      "description": "The city and state, for example, San Francisco, CA"
    }
  },
  "required": [
    "location"
  ]
}
{
  "type": "object",
  "properties": {
    "temperature": {
      "type": "number",
      "description": "The temperature"
    }
  }
}

以下示例展示了使用 REST 的初始检测 intent 请求和响应:

HTTP method and URL:
POST https://REGION_ID-dialogflow.googleapis.com/v3/projects/PROJECT_ID/locations/LOCATION_ID/agents/AGENT_ID/sessions/SESSION_ID:detectIntent
{
  "queryInput": {
    "text": {
      "text": "what is the weather in Mountain View"
    },
    "languageCode": "en"
  }
}
{
  "queryResult": {
    "text": "what is the weather in Mountain View",
    "languageCode": "en",
    "responseMessages": [
      {
        "source": "VIRTUAL_AGENT",
        "toolCall": {
          "tool": "<tool-resource-name>",
          "action": "get-weather-tool",
          "inputParameters": {
            "location": "Mountain View"
          }
        }
      }
    ]
  }
}

以下示例展示了第二个检测 intent 请求,该请求会提供工具结果:

{
  "queryInput": {
    "toolCallResult": {
      "tool": "<tool-resource-name>",
      "action": "get-weather-tool",
      "outputParameters": {
        "temperature": 28.0
      }
    },
    "languageCode": "en"
  }
}

客户端执行

与函数工具一样,您可以通过在与会话互动时应用 API 替换项,在客户端执行 OpenAPI 和数据存储工具。

例如:

DetectIntentRequest {
  ...
  query_params {
    playbook_state_override {
      playbook_execution_mode: ALWAYS_CLIENT_EXECUTION
    }
  }
  ...
}

具体过程如下:

  1. 您的客户端代码会发送用于指定客户端执行的检测 intent 请求。
  2. 代理检测到需要使用某个工具,并且检测 intent 响应包含该工具的名称以及输入参数。此会话会暂停,直到收到包含工具结果的另一个检测 intent 请求。
  3. 您的客户端代码调用该工具。
  4. 您的客户端代码会发送另一个检测 intent 请求,以便将工具结果作为输出参数提供。