Esta es una biblioteca de intérpretes RiveScript escrita para el lenguaje de programación Go. RiveScript es un lenguaje de programación para chatterbots, que facilita la escritura de pares de activación/respuesta para desarrollar la inteligencia de un bot.
Este proyecto se encuentra actualmente en estado Beta. La API debería ser mayoritariamente estable, pero es posible que las cosas se muevan.
RiveScript es un lenguaje de programación para crear chatbots. Tiene una sintaxis muy simple y está diseñado para ser fácil de leer y rápido de escribir.
Un ejemplo sencillo de cómo se ve RiveScript:
+ hello bot
- Hello human.
Esto coincide con el mensaje de un usuario de "hola robot" y respondería "Hola humano". O para un ejemplo un poco más complicado:
+ 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>!
El sitio web oficial de RiveScript es https://www.rivescript.com/
Para probar RiveScript en su navegador web, pruebe RiveScript Playground.
Consulte también el Wiki de la comunidad RiveScript para conocer patrones de diseño comunes, consejos y trucos para RiveScript.
Para la biblioteca de desarrollo:
go get github.com/aichaos/rivescript-go
Para el binario rivescript
independiente para probar un bot:
go get github.com/aichaos/rivescript-go/cmd/rivescript
La distribución de RiveScript incluye un shell interactivo para probar su bot RiveScript. Ejecútelo con la ruta a una carpeta en el disco que contenga sus documentos RiveScript. Ejemplo:
# (Linux)
$ rivescript eg/brain
# (Windows)
> rivescript.exe eg/brain
Consulte rivescript -help
para conocer las opciones que acepta, incluido el modo de depuración y el modo UTF-8.
Cuando se utiliza como biblioteca para escribir su propio chatbot, la sinopsis es la siguiente:
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 )
}
}
El constructor toma una estructura Config
opcional. Aquí hay un ejemplo completo con todas las opciones admitidas. Solo necesita proporcionar claves diferentes a las predeterminadas.
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
})
Para mayor comodidad, puede utilizar un atajo:
// 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 ())
Una característica común en muchas implementaciones de RiveScript es la macro de objetos, que le permite escribir código de programa dinámico (en su lenguaje de programación favorito) para agregar capacidades adicionales a su bot. Por ejemplo, su bot podría responder una pregunta sobre "¿cómo está el clima en $ubicación ?" ejecutando algún código para buscar su respuesta a través de una API web.
La versión Go de RiveScript admite macros de objetos escritas en Go (en el momento de la compilación de su aplicación). También tiene soporte opcional para macros de objetos JavaScript usando la biblioteca goja.
A continuación se explica cómo definir una macro de objeto Go:
bot . SetSubroutine ( func ( rs * rivescript. RiveScript , args [] string ) string {
return "Hello world!"
})
A continuación se muestra un ejemplo de cómo hacer que las macros de objetos JavaScript estén disponibles a través del módulo goja:
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 )
}
}
}
La compatibilidad con UTF-8 en RiveScript se considera una característica experimental. Está deshabilitado de forma predeterminada.
De forma predeterminada (sin el modo UTF-8 activado), los activadores solo pueden contener caracteres ASCII básicos (sin caracteres extranjeros) y el mensaje del usuario carece de todos los caracteres excepto letras, números y espacios. Esto significa que, por ejemplo, no puede capturar la dirección de correo electrónico de un usuario en una respuesta de RiveScript debido a @ y . personajes.
Cuando el modo UTF-8 está habilitado, estas restricciones se eliminan. Los activadores solo se limitan a no contener ciertos metacaracteres como la barra invertida, y el mensaje del usuario solo está libre de barras invertidas y corchetes en ángulo HTML (para protegerlo de XSS obvio si usa RiveScript en una aplicación web). Además, se eliminan los caracteres de puntuación comunes y el conjunto predeterminado es /[.,!?;:]/g
. Esto se puede anular proporcionando un nuevo literal de cadena de expresión regular a la función RiveScript.SetUnicodePunctuation
. Ejemplo:
// 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 ( `[.,!?;:]` );
Las etiquetas <star>
en RiveScript capturarán la entrada "sin procesar" del usuario, por lo que puede escribir respuestas para obtener la dirección de correo electrónico del usuario o almacenar caracteres extranjeros en su nombre.
Utilizo un GNU Makefile para facilitar la creación y ejecución de este módulo. Los comandos relevantes son:
make setup
: ejecute esto después de clonar recientemente este repositorio. Ejecuta los comandos git submodule
para eliminar las dependencias proporcionadas.make build
: esto generará el comando de front-end desde cmd/rivescript
y colocará su binario en el directorio bin/
. Crea un binario relevante para su sistema actual, por lo que en Linux esto creará un binario de Linux. También se recomienda ejecutar este al menos una vez, ya que almacenará en caché los paquetes de dependencia y acelerará las compilaciones y ejecuciones posteriores.make run
: ejecuta el comando de interfaz de usuario y lo apunta a la carpeta eg/brain
como fuente de RiveScript.make fmt
: ejecuta gofmt -w
en todos los archivos fuente.make test
: ejecuta las pruebas unitarias.make clean
: limpia los directorios .gopath
, bin
y dist
. El repositorio rivescript-go submódulo del proyecto RiveScript Test Suite (rsts). Si no hiciste un git clone --recursive
para rivescript-go, puedes extraer el submódulo mediante los siguientes comandos:
git submodule init
git submodule update
Luego make test
(o go test
) debería mostrar los resultados de las pruebas realizadas en la carpeta rsts/.
Puede crear una versión para una plataforma individual ejecutando un comando como make linux/amd64
. Los objetivos de compilación válidos son actualmente los siguientes:
linux/386
y linux/amd64
windows/386
y windows/amd64
darwin/amd64
Ejecute make release
para crear automáticamente versiones para todas las plataformas compatibles.
Se crea un directorio para la versión en dist/rivescript-$VERSION-$OS-$ARCH/
que contiene el binario compilado, README.md, Changes.md y ejemplos. Puede inspeccionar este directorio después; su contenido se guarda automáticamente (zip para Windows) y se coloca en la raíz del repositorio de git.
Si está realizando una compilación cruzada para un sistema diferente, es posible que deba modificar los permisos para que Go pueda descargar la biblioteca estándar para el nuevo destino. Ejemplo:
% sudo mkdir /usr/lib/golang/pkg/windows_386
% chown your_user:your_user /usr/lib/golang/pkg/windows_386
NullStore
para pruebas. Otros administradores de sesiones oficiales (por ejemplo, Redis) también se encuentran aquí. 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.
El sitio web oficial de RiveScript, http://www.rivescript.com/