这是为 Go 编程语言编写的 RiveScript 解释器库。 RiveScript 是聊天机器人的脚本语言,可以轻松编写触发器/响应对来构建机器人的智能。
该项目目前处于 Beta 状态。 API 应该基本上是稳定的,但事情可能会在你身上发生变化。
RiveScript 是一种用于编写聊天机器人的脚本语言。它的语法非常简单,旨在易于阅读和快速编写。
RiveScript 的一个简单示例如下:
+ hello bot
- Hello human.
这与用户的消息“hello bot”匹配,并会回复“Hello human”。或者举一个稍微复杂一点的例子:
+ my name is *
* <formal> == <bot name> => <set name=<formal>>Wow, we have the same name!
* <get name> != undefined => <set name=<formal>>Did you change your name?
- <set name=<formal>>Nice to meet you, <get name>!
RiveScript 的官方网站是 https://www.rivescript.com/
要在 Web 浏览器中测试 RiveScript,请尝试 RiveScript Playground。
另请查看RiveScript 社区 Wiki ,了解 RiveScript 的常见设计模式以及提示和技巧。
对于开发库:
go get github.com/aichaos/rivescript-go
对于用于测试机器人的独立rivescript
二进制文件:
go get github.com/aichaos/rivescript-go/cmd/rivescript
RiveScript 的发行版包含一个用于测试 RiveScript 机器人的交互式 shell。使用磁盘上包含 RiveScript 文档的文件夹的路径运行它。例子:
# (Linux)
$ rivescript eg/brain
# (Windows)
> rivescript.exe eg/brain
请参阅rivescript -help
了解它接受的选项,包括调试模式和 UTF-8 模式。
当用作编写自己的聊天机器人的库时,概要如下:
package main
import (
"fmt"
"github.com/aichaos/rivescript-go"
)
func main () {
// Create a new bot with the default settings.
bot := rivescript . New ( nil )
// To enable UTF-8 mode, you'd have initialized the bot like:
bot = rivescript . New ( rivescript . WithUTF8 ())
// Load a directory full of RiveScript documents (.rive files)
err := bot . LoadDirectory ( "eg/brain" )
if err != nil {
fmt . Printf ( "Error loading from directory: %s" , err )
}
// Load an individual file.
err = bot . LoadFile ( "./testsuite.rive" )
if err != nil {
fmt . Printf ( "Error loading from file: %s" , err )
}
// Sort the replies after loading them!
bot . SortReplies ()
// Get a reply.
reply , err := bot . Reply ( "local-user" , "Hello, bot!" )
if err != nil {
fmt . Printf ( "Error: %s n " , err )
} else {
fmt . Printf ( "The bot says: %s" , reply )
}
}
构造函数采用可选的Config
结构。这是包含所有支持选项的完整示例。您只需提供与默认值不同的密钥。
bot := rivescript . New ( & rivescript. Config {
Debug : false , // Debug mode, off by default
Strict : false , // No strict syntax checking
UTF8 : false , // No UTF-8 support enabled by default
Depth : 50 , // Becomes default 50 if Depth is <= 0
Seed : time . Now (). UnixNano (), // Random number seed (default is == 0)
SessionManager : memory . New (), // Default in-memory session manager
})
为了方便起见,您可以使用快捷方式:
// A nil config uses all the defaults.
bot = rivescript . New ( nil )
// WithUTF8 enables UTF-8 mode (other settings left as default).
bot = rivescript . New ( rivescript . WithUTF8 ())
许多 RiveScript 实现中的一个常见功能是对象宏,它使您能够编写动态程序代码(用您最喜欢的编程语言)来为您的机器人添加额外的功能。例如,您的机器人可以通过运行一些代码通过 Web API 查找答案来回答“ $location的天气怎么样”的问题。
RiveScript 的 Go 版本支持用 Go 编写的对象宏(在应用程序的编译时)。它还可以使用 goja 库对 JavaScript 对象宏进行可选支持。
以下是定义 Go 对象宏的方法:
bot . SetSubroutine ( func ( rs * rivescript. RiveScript , args [] string ) string {
return "Hello world!"
})
以下是如何通过 goja 模块使 JavaScript 对象宏可用的示例:
package main
import (
"fmt"
"github.com/aichaos/rivescript-go"
"github.com/aichaos/rivescript-go/lang/javascript"
)
func main () {
// Initialize RiveScript first.
bot := rivescript . New ( rivescript . WithUTF8 ())
// Add the JavaScript object macro handler.
js := javascript . New ( bot )
bot . SetHandler ( "javascript" , js )
// You can access the goja VM and set your own global
// variable or function bindings to be called from your
// object macros.
js . VM . Set ( "helloFunc" , func ( name string ) string {
return fmt . Sprintf ( "Hello, %s!" , name )
})
// Load some RiveScript code. This example just tests the
// JavaScript object macro support.
err := bot . Stream ( `
> object add javascript
let a = args[0];
let b = args[1];
return parseInt(a) + parseInt(b);
< object
> object fn javascript
let result = helloFunc(args[0])
return result
< object
+ add # and #
- <star1> + <star2> = <call>add <star1> <star2></call>
+ say hello *
- <call>fn <star></call>
` )
if err != nil {
fmt . Printf ( "Error loading RiveScript document: %s" , err )
}
// Sort the replies after loading them!
bot . SortReplies ()
// Get some replies!
inputs := [] string { "add 5 and 12" , "say hello goja" }
for _ , message := range inputs {
fmt . Printf ( "You said: %s n " , message )
reply , err := bot . Reply ( "local-user" , message )
if err != nil {
fmt . Printf ( "Error: %s n " , err )
} else {
fmt . Printf ( "The bot says: %s n " , reply )
}
}
}
RiveScript 中的 UTF-8 支持被认为是一项实验性功能。默认情况下它是禁用的。
默认情况下(未打开 UTF-8 模式),触发器只能包含基本 ASCII 字符(无外来字符),并且用户的消息将去除除字母、数字和空格之外的所有字符。这意味着,例如,您无法在 RiveScript 回复中捕获用户的电子邮件地址,因为 @ 和 .人物。
启用 UTF-8 模式后,这些限制将被解除。触发器仅限于不包含某些元字符,例如反斜杠,并且用户消息仅去除反斜杠和 HTML 尖括号(如果您在 Web 应用程序中使用 RiveScript,则可以防止明显的 XSS)。此外,常见的标点符号被删除,默认设置为/[.,!?;:]/g
。这可以通过向RiveScript.SetUnicodePunctuation
函数提供新的正则表达式字符串文字来覆盖。例子:
// Make a new bot with UTF-8 mode enabled.
bot := rivescript . New ( rivescript . WithUTF8 ())
// Override the punctuation characters that get stripped
// from the user's message.
bot . SetUnicodePunctuation ( `[.,!?;:]` );
RiveScript 中的<star>
标签将捕获用户的“原始”输入,因此您可以编写回复来获取用户的电子邮件地址或在其姓名中存储外来字符。
我使用 GNU Makefile 来简化此模块的构建和运行。相关命令是:
make setup
- 在新克隆此存储库后运行此命令。它运行git submodule
命令来拉取供应商的依赖项。make build
- 这将从cmd/rivescript
构建前端命令并将其二进制文件放入bin/
目录中。它构建一个与您当前系统相关的二进制文件,因此在 Linux 上这将创建一个 Linux 二进制文件。还建议至少运行一次,因为它将缓存依赖包并加快后续构建和运行的速度。make run
- 运行前端命令并将其指向eg/brain
文件夹作为其 RiveScript 源。make fmt
- 对所有源文件运行gofmt -w
。make test
- 运行单元测试。make clean
- 清理.gopath
、 bin
和dist
目录。rivescript-go 存储库是 RiveScript 测试套件 (rsts) 项目的子模块。如果您没有为 rivescript-go 执行git clone --recursive
,您可以通过以下命令拉取子模块:
git submodule init
git submodule update
然后make test
(或go test
)应该显示从 rsts/ 文件夹运行的测试的结果。
您可以通过运行make linux/amd64
等命令来为单个平台构建版本。目前有效的构建目标如下:
linux/386
和linux/amd64
windows/386
和windows/amd64
darwin/amd64
运行make release
来自动为所有支持的平台构建版本。
该版本的目录在dist/rivescript-$VERSION-$OS-$ARCH/
中创建,其中包含构建的二进制文件、README.md、Changes.md 和示例。您可以稍后检查该目录;其内容会自动压缩(对于 Windows 为 zip)并放置在 git 存储库的根目录中。
如果您要针对不同的系统进行交叉编译,则可能需要修改权限,以便 Go 可以下载新目标的标准库。例子:
% sudo mkdir /usr/lib/golang/pkg/windows_386
% chown your_user:your_user /usr/lib/golang/pkg/windows_386
NullStore
。其他官方会话管理器(例如 Redis)也在这里。 The MIT License (MIT)
Copyright (c) 2017 Noah Petherbridge
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
RiveScript 官方网站,http://www.rivescript.com/