DialogFlow的Flutter实现,已改进。

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

关于软件包

Dialog Flow on Flutter,现已支持Null Safety!

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

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

为什么选择DialogFlowtter

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

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

此包旨在解决这些问题并添加更多用户希望看到的功能。请查看待办事项部分了解更多信息。

平台支持

该软件包完全支持AndroidiOSWeb
我们计划在Flutter SDK支持的平台成熟时,对WindowsLinuxMacOS进行测试并添加支持。

安装

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

    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中的信息。

从响应中获取文本

  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
另外,请查看此问题,了解如何创建和使用富响应(如卡片和轮播)。

  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客户端

如果您调用静态函数,则可以使用自定义json数据获取已认证、自动刷新的http客户端。

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>,并标记为//? Create model if necessary

待办事项

  • 添加对null safety的支持
  • 添加对卡片、图片等的支持。
  • 内存、文件和远程auth JSON
  • 保护DialogFlow auth JSON
  • 支持音频查询
  • 添加支持的语言目录
  • 添加对常用属性的直接访问
  • 支持使用自定义HTTP客户端

Starware

DialogFlowtter是Starware。
这意味着您可以自由使用该项目,前提是您在GitHub仓库中对其进行star。
您的赞赏使我们不断成长和发光。⭐

贡献

您的帮助总是值得赞赏的。

您可以检查我们的贡献指南或打开一个问题来做出贡献。

GitHub

查看 Github