dialog_flowtter

构建您与 DialogFlow 的集成,更快、更轻松。

DialogFlowtter 是一个帮助您更轻松、更快速地构建与 DialogFlow 集成的软件包。

  • 使用 Google Auth Json 进行身份验证
  • 获取一个已身份验证的 http 客户端,以便您可以与您的 DialogFlow 代理进行通信
  • 轻松访问所有 DialogFlow 响应和模型
  • 检查 DialogFlow 响应可能具有的值

为什么选择 DialogFlowtter

Pub 上现有的 DialogFlow 集成包存在的问题是它们

  • 完全被放弃
  • 文档不完善
  • 功能缺失
  • 灵活性不足

本项目旨在解决这些问题并添加更多用户期望的功能。有关更多信息,请查看待办事项部分。

平台支持

此软件包在 AndroidiOSWeb 上得到全面支持。
我们计划在 Flutter SDK 的这些平台成熟时,进行测试并增加对 WindowsLinuxMacOS 的支持。

安装

  1. 将软件包添加到您的 Flutter 依赖项中的 pubspec.yaml

    dependencies:
        dialog_flowtter: ^0.3.1
    
  2. 确保将您的 dialog_flow_auth.json 添加到 pubspec.yaml 的 assets 中

     flutter:
         uses-material-design: true
         assets:
             - assets/dialog_flow_auth.json
    
  3. 将您的 DialogFlow Auth JSON 添加到 assets 文件夹中,并将其重命名为 dialog_flow_auth.json

您可以在代码中稍后更改 JSON 的名称和路径。只需确保在 pubspec.yaml 中使用相同的名称和路径。

  1. 从以下位置获取软件包

    flutter packages get
    

获取您的密钥

请参阅 创建服务账号并下载私钥文件

如何使用

检索您的密钥

您可以通过多种方式设置您的 DialogFlow 身份验证密钥。

  1. 从内存中的 JSON
DialogAuthCredentials credentials = DialogAuthCredentials.fromJson(json);
  1. 从 JSON 文件
DialogAuthCredentials credentials = await DialogAuthCredentials.fromFile(path);

此方法是异步的!

  1. 从网络
DialogAuthCredentials credentials = await DialogAuthCredentials.fromNetwork(url);

此方法是异步的!

然后,将您的凭据传递给 DialogFlowtter

DialogFlowtter instance = DialogFlowtter(
  credentials: credentials,
);

您也可以在实例化 DialogFlowtter 类时使用这些方法的简写形式。

DialogFlowtter jsonInstance = DialogFlowtter.fromJson(json);

//! async
DialogFlowtter fileInstance = await DialogFlowtter.fromFile(path);

//! async
DialogFlowtter networkInstance = await DialogFlowtter.fromNetwork(url);

检测意图

DialogFlow 的核心功能之一是检测一个人想说什么。您可以通过检测您在 DialogFlow 控制台 中定义的意图来做到这一点。

  1. 创建 DialogFlowtter 的实例,并设置将用于标识用户与 DialogFlow 当前对话的 sessionId

强烈建议为用户与助手建立的每次对话使用不同的 sessionId

  final DialogFlowtter dialogFlowtter = DialogFlowtter(
    credentials: credentials,
    sessionId: "YOUR_SESSION_ID_HERE",
  );
  1. 创建一个 QueryInput,您可以在其中指定要发送到 DialogFlow 的数据。
  final QueryInput queryInput = QueryInput(
    text: TextInput(
      text: "Hi. How are you?",
      languageCode: "en",
    ),
  );
  1. 通过 detectIntent 函数将您的输入发送到 DialogFlow。
  DetectIntentResponse response = await dialogFlowtter.detectIntent(
    queryInput: queryInput,
  );

有关可以发送和接收的信息,请查看代码以获取更多信息。

从意图中获取信息

您可以从 detectIntent 函数返回的 DetectIntentResponse 中访问 DialogFlow 返回的信息。

从响应中获取文本

  DetectIntentResponse response = await dialogFlowtter.detectIntent(
    queryInput: QueryInput(text: TextInput(text: "Hi")),
  );
  
  String? textResponse = response.text;

  print(textResponse); // Hi, how may I help you?

如果 DialogFlow 没有返回文本,或者返回的第一个消息不是 MessageType.text 类型,则 response.text 将返回 null。

从响应中获取消息

有关模型属性的信息,请参阅 Message
另外,请参阅 此 issue,了解如何创建和使用 富响应,例如卡片和轮播。

  DetectIntentResponse response = await dialogFlowtter.detectIntent(
    queryInput: QueryInput(text: TextInput(text: "Hi")),
  );
  
  Message? messageResponse = response.message;

从响应中获取音频

  1. detectIntent 函数中设置音频配置
  DetectIntentResponse response = await dialogFlowtter.detectIntent(
    queryInput: QueryInput(text: TextInput(text: "Hi")),
    
    // You can set your own configuration with the OutputAudioConfig class
    audioConfig: OutputAudioConfig(),
  );
  1. 从响应中检索音频
  String? audioBase64 = response.outputAudio;
  Uint8List? audioBytes = response.outputAudioBytes;
  1. 使用您喜欢的插件播放音频响应!

请参阅 Soundpool 以从内存中播放音频。

获取消息的响应类型

  MessageType? messageType = response.message.type;

  print(messageType); /// MessageType.card

如果 DialogFlow 没有返回消息,则 response.message 将返回 null。

请确保在使用完实例后将其处置。

  dialogFlowtter.dispose();

更改项目 ID

您可以更改 DialogFlowtter 将用于在 DialogFlow 中查找您的意图的项目 ID。

  1. 创建 DialogFlowtter 的实例
  final DialogFlowtter dialogFlowtter = DialogFlowtter(
    credentials: credentials,
  );
  1. 更改实例的 projectId 属性;
  dialogFlowtter.projectId = "deimos-apps-0905";
  • 专业提示。您可以使用 Dart 特有的 级联符号 来执行与上述相同的操作。

      final DialogFlowtter dialogFlowtter = DialogFlowtter(
        credentials: credentials,
      )..projectId = "deimos-apps-0905";
    

向您的 DialogFlow 项目发出已身份验证的 http 请求

您可以通过调用实例中的 client 属性来访问由该软件包生成的已身份验证的 http 客户端。

请记住,如果您在此之前已处置了实例,则此属性可能变为 null

创建您自己的已身份验证的 http 客户端

如果您调用静态函数,可以获取一个已身份验证的、自动刷新的 http 客户端,其中包含您的自定义 json 数据。

final credentials = DialogAuthCredentials.fromJson(yourJson);
final client = DialogFlowtter.getClient(credentials)

请注意,这仅使用 Google 提供的 json 进行身份验证。

有关更多信息,请参阅 googleapis_auth

进一步的注意事项

每次实例化 DialogFlowtter 时,该类都会创建一个已身份验证的 http 客户端,其中包含从 DialogFlow Auth JSON 获取的凭据。请确保保存此实例并重复使用它,以避免内存泄漏。

内存泄漏

请确保在使用完 DialogFlowtter 实例后将其 dispose。这可以确保关闭已身份验证的 http 客户端及其所有 StreamSubscription,以避免内存泄漏。

模型过多

我们几乎编写了您在使用此软件包时可能需要使用的所有 Dialog Flow 模型,因此您不必处理恼人的 Map<String, dynamic> 对象。如果您发现有模型缺失,请随时要求添加。

未编码的模型被包含为恼人的 Map<String, dynamic>,并标记为 //? 如果需要,请创建模型

待办事项

  • [x] 添加对 null safety 的支持
  • [x] 添加对卡片、图片等的支持
  • [x] 内存、文件和远程 auth JSON
  • [ ] 安全 DialogFlow auth JSON
  • [ ] 支持音频查询
  • [ ] 添加支持的语言目录
  • [ ] 添加对常用属性的直接访问
  • [ ] 支持使用自定义 HTTP Client

Starware

DialogFlowtter 是 Starware。
这意味着您可以自由使用此项目,只要您在 GitHub 上为其仓库点星。
您的赞赏使我们不断成长和发光。⭐

GitHub

https://github.com/Deimos-Applications/dialog_flowtter