[Angular] Make a chatbot with DialogFlow
Register a account on https://console.dialogflow.com/api-client/
"Creat a intent" -- you can custom your message here.
"Small Talks" -- the default message from the DialogFlow.
Install:
yarn add api-ai-javascript
Put your API token to the app.
Create a servie:
import {Injectable} from '@angular/core';
import {environment} from '../../../environments/environment';
import {ApiAiClient} from 'api-ai-javascript';
import {Message} from '../models/bot-message';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
@Injectable()
export class ChatbotService {
readonly token = environment.dialogFlow.bot;
readonly client = new ApiAiClient({accessToken: this.token});
conversation = new BehaviorSubject<Message[]>([]);
constructor() {
}
// Adds message to the source
update(msg: Message) {
this.conversation.next([msg]);
}
// Send and receives message via DialogFlow
converse(msg: string) {
const userMessage = new Message(msg, 'user');
this.update(userMessage);
this.client.textRequest(msg)
.then((res) => {
const speech = res.result.fulfillment.speech;
const botMessage = new Message(speech, 'bot');
this.update(botMessage);
}).catch((err) => {
console.error(err);
});
}
}
Component:
import {Component, OnInit} from '@angular/core';
import {ChatbotService} from '../../services/chatbot.service';
import {Observable} from 'rxjs/Observable';
import {Message} from '../../models/bot-message';
import 'rxjs/add/operator/scan';
@Component({
selector: 'chat-dialog',
templateUrl: './chat-dialog.component.html',
styleUrls: ['./chat-dialog.component.scss']
})
export class ChatDialogComponent implements OnInit {
messages$: Observable<Message[]>;
formValue: string;
constructor(private chatService: ChatbotService) {
}
ngOnInit() {
this.messages$ = this.chatService.conversation
.asObservable()
.scan((acc, curr) => acc.concat(curr));
}
sendMessage() {
if (!this.formValue) {
return;
}
this.chatService.converse(this.formValue);
this.formValue = '';
}
}
Template:
<mat-card>
<mat-card-title class="title">
Umi
</mat-card-title>
<hr />
<mat-card-content class="content">
<div fxLayout="column"> <ng-container
*ngFor="let message of messages$ | async">
<div class="message" [ngClass]="{'from': message.sentBy === 'bot',
'to': message.sentBy === 'user'}">
{{message.content}}
</div>
</ng-container> </div>
</mat-card-content>
<mat-card-actions>
<div fxLayout="row" fxLayoutAlign="space-between">
<mat-form-field fxFlex="auto">
<textarea
matInput
type="textarea"
placeholder="What you want to say?..."
[(ngModel)]="formValue"
(keyup.enter)="sendMessage()"></textarea>
</mat-form-field>
<div fxLayout="column" fxLayoutAlign="center center">
<button
color="primary"
class="send-btn"
mat-mini-fab
[disabled]="!formValue"
(click)="sendMessage()">
<mat-icon>
send
</mat-icon>
</button>
</div>
</div>
</mat-card-actions>
</mat-card>
[Angular] Make a chatbot with DialogFlow的更多相关文章
- Chatbot:
讲清了一些最最基本的概念 - Intents(意图)和Entities(关键字) - 基于意图(Intent-based)的对话 和 基于流程(Flow-based)的对话 聊天机器人教学:使用Di ...
- How To Use Rocketbots As A Dialogflow CRM
Ever wished you had a CRM for Dialogflow? We did too, so we built one. This is a best practices arti ...
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- Angular企业级开发(5)-项目框架搭建
1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...
- TypeScript: Angular 2 的秘密武器(译)
本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...
- angular实现统一的消息服务
后台API返回的消息怎么显示更优雅,怎么处理才更简洁?看看这个效果怎么样? 自定义指令和服务实现 自定义指令和服务实现消息自动显示在页面的顶部,3秒之后消失 1. 显示消息 这种显示消息的方式是不是有 ...
- div实现自适应高度的textarea,实现angular双向绑定
相信不少同学模拟过腾讯的QQ做一个聊天应用,至少我是其中一个. 过程中我遇到的一个问题就是QQ输入框,自适应高度,最高高度为3row. 如果你也像我一样打算使用textarea,那么很抱歉,你一开始就 ...
- Angular企业级开发-AngularJS1.x学习路径
博客目录 有链接的表明已经完成了,其他的正在建设中. 1.AngularJS简介 2.搭建Angular开发环境 3.Angular MVC实现 4.[Angular项目目录结构] 5.[SPA介绍] ...
- Angular企业级开发(4)-ngResource和REST介绍
一.RESTful介绍 RESTful维基百科 REST(表征性状态传输,Representational State Transfer)是Roy Fielding博士在2000年他的博士论文中提出来 ...
随机推荐
- TCP的连接管理
创建连接:(三次握手) 第一步: 客户端向服务器发送一个报文,该报文不含有数据段,SYN=1,随机产生sequence number(随机产生可用于避免某些安全性攻击) 第二步: 服务器收到报文,为这 ...
- mysql python中的pymysql模块使用
import pymysql # 在这之前需要给mysql授登录权限 grant all on "; 否则会导致连接时出错 # flush privileges; #创建连接 conn = ...
- 123.static静态函数和函数模板
#include <iostream> using namespace std; //static成员,每个类型都会实例化,创建一个变量,类型一致则共享,否则不共享 template &l ...
- Retrofit请求数据对错误以及网络异常的处理
http://blog.csdn.net/jdsjlzx/article/details/51566683
- react 组件使用的小记第一天
//定义一个子组件 var Child = React.createClass({ getInitialState: function() { return {liked: false}; }, ha ...
- Android 设置屏幕不待机
本文转载于:http://blog.csdn.net/yudajun/article/details/7748760 androidnullservice 目录(?)[+] 最近做项目时正好用到,进行 ...
- JS模式
策略 命令 迭代器 代理 组合 发布/订阅 单例 享元 职责链 中介者 装饰者 状态 适配器 设计原则: 单一职责.最少知识.开放-封闭
- pycharm 添加注册码
https://blog.csdn.net/u014044812/article/details/78727496
- Python excel 功能扩展库 ——> openpyxl 的基本使用
说明:本文档内容参考自 https://www.cnblogs.com/zeke-python-road/p/8986318.html (作者:关关雎鸠`)的文档 from openpyxl impo ...
- vue踩坑- 报错npm ERR! cb() never called!
在vue项目中引入饿了么elementUI组件的步骤之中,出现以下的错误: D:\my-project-first>npm i element-ui -S Unhandled rejection ...