Il s'agit d'une bibliothèque d'interpréteur RiveScript écrite pour le langage de programmation Go. RiveScript est un langage de script pour les chaterbots, facilitant l'écriture de paires déclencheur/réponse pour développer l'intelligence d'un bot.
Ce projet est actuellement en statut bêta. L'API doit être globalement stable, mais les choses peuvent bouger sur vous.
RiveScript est un langage de script pour la création de chatbots. Il a une syntaxe très simple et est conçu pour être facile à lire et rapide à écrire.
Un exemple simple de ce à quoi ressemble RiveScript :
+ hello bot
- Hello human.
Cela correspond au message "Bonjour bot" d'un utilisateur et répondrait "Bonjour humain". Ou pour un exemple un peu plus compliqué :
+ 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>!
Le site officiel de RiveScript est https://www.rivescript.com/
Pour tester RiveScript dans votre navigateur Web, essayez RiveScript Playground.
Consultez également le wiki de la communauté RiveScript pour connaître les modèles de conception courants ainsi que les trucs et astuces pour RiveScript.
Pour la bibliothèque de développement :
go get github.com/aichaos/rivescript-go
Pour le binaire rivescript
autonome permettant de tester un bot :
go get github.com/aichaos/rivescript-go/cmd/rivescript
La distribution de RiveScript comprend un shell interactif pour tester votre bot RiveScript. Exécutez-le avec le chemin d'accès à un dossier sur le disque contenant vos documents RiveScript. Exemple:
# (Linux)
$ rivescript eg/brain
# (Windows)
> rivescript.exe eg/brain
Voir rivescript -help
pour les options qu'il accepte, notamment le mode débogage et le mode UTF-8.
Lorsqu'il est utilisé comme bibliothèque pour écrire votre propre chatbot, le synopsis est le suivant :
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 )
}
}
Le constructeur prend une structure Config
facultative. Voici un exemple complet avec toutes les options prises en charge. Il vous suffit de fournir des clés différentes des valeurs par défaut.
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
})
Pour plus de commodité, vous pouvez utiliser un raccourci :
// 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 ())
Une fonctionnalité commune à de nombreuses implémentations de RiveScript est la macro d'objet, qui vous permet d'écrire du code de programme dynamique (dans votre langage de programmation préféré) pour ajouter des fonctionnalités supplémentaires à votre bot. Par exemple, votre bot pourrait répondre à une question « quel temps fait-il à $location » en exécutant du code pour rechercher sa réponse via une API Web.
La version Go de RiveScript prend en charge les macros d'objet écrites en Go (au moment de la compilation de votre application). Il prend également en charge en option les macros d'objets JavaScript à l'aide de la bibliothèque goja.
Voici comment définir une macro d'objet Go :
bot . SetSubroutine ( func ( rs * rivescript. RiveScript , args [] string ) string {
return "Hello world!"
})
Voici un exemple comment rendre les macros d'objets JavaScript disponibles via le module 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 prise en charge d'UTF-8 dans RiveScript est considérée comme une fonctionnalité expérimentale. Il est désactivé par défaut.
Par défaut (sans le mode UTF-8 activé), les déclencheurs ne peuvent contenir que des caractères ASCII de base (pas de caractères étrangers) et le message de l'utilisateur est dépourvu de tous les caractères à l'exception des lettres, des chiffres et des espaces. Cela signifie que, par exemple, vous ne pouvez pas capturer l'adresse e-mail d'un utilisateur dans une réponse RiveScript, à cause des @ et . personnages.
Lorsque le mode UTF-8 est activé, ces restrictions sont levées. Les déclencheurs sont uniquement limités à ne pas contenir certains métacaractères comme la barre oblique inverse, et le message de l'utilisateur est uniquement dépourvu de barres obliques inverses et de crochets HTML (pour se protéger des XSS évidents si vous utilisez RiveScript dans une application Web). De plus, les caractères de ponctuation courants sont supprimés, le jeu par défaut étant /[.,!?;:]/g
. Cela peut être remplacé en fournissant un nouveau littéral de chaîne d'expression rationnelle à la fonction RiveScript.SetUnicodePunctuation
. Exemple:
// 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 ( `[.,!?;:]` );
Les balises <star>
dans RiveScript captureront l'entrée « brute » de l'utilisateur, afin que vous puissiez écrire des réponses pour obtenir l'adresse e-mail de l'utilisateur ou stocker des caractères étrangers dans son nom.
J'utilise un Makefile GNU pour faciliter la création et l'exécution de ce module. Les commandes concernées sont :
make setup
- exécutez-le après avoir fraîchement cloné ce dépôt. Il exécute les commandes git submodule
pour extraire les dépendances vendues.make build
- cela construira la commande frontale à partir de cmd/rivescript
et placera son binaire dans le répertoire bin/
. Il construit un binaire pertinent pour votre système actuel, donc sous Linux, cela créera un binaire Linux. Il est également recommandé d'exécuter celui-ci au moins une fois, car il mettra en cache les packages de dépendances et accélérera les builds et exécutions ultérieures.make run
- exécute la commande frontale et la pointe vers le dossier eg/brain
comme source RiveScript.make fmt
- exécute gofmt -w
sur tous les fichiers sources.make test
- exécute les tests unitaires.make clean
- nettoie les répertoires .gopath
, bin
et dist
. Le dépôt rivescript-go sous-modules le projet RiveScript Test Suite (rsts). Si vous n'avez pas fait de git clone --recursive
pour rivescript-go, vous pouvez extraire le sous-module via les commandes suivantes :
git submodule init
git submodule update
Ensuite, make test
(ou go test
) devrait afficher les résultats des tests exécutés à partir du dossier rsts/.
Vous pouvez créer une version pour une plate-forme individuelle en exécutant une commande telle que make linux/amd64
. Les cibles de build valides sont actuellement les suivantes :
linux/386
et linux/amd64
windows/386
et windows/amd64
darwin/amd64
Exécutez make release
pour créer automatiquement des versions pour toutes les plates-formes prises en charge.
Un répertoire pour la version est créé dans dist/rivescript-$VERSION-$OS-$ARCH/
qui contient le binaire construit, README.md, Changes.md et des exemples. Vous pouvez inspecter ce répertoire par la suite ; son contenu est automatiquement taré (zip pour Windows) et placé à la racine du dépôt git.
Si vous effectuez une compilation croisée pour un système différent, vous devrez peut-être modifier les autorisations afin que Go puisse télécharger la bibliothèque standard pour la nouvelle cible. Exemple:
% sudo mkdir /usr/lib/golang/pkg/windows_386
% chown your_user:your_user /usr/lib/golang/pkg/windows_386
NullStore
pour les tests. D'autres gestionnaires de session officiels (par exemple Redis) sont également présents. 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.
Le site officiel de RiveScript, http://www.rivescript.com/