Esta é uma biblioteca interpretadora RiveScript escrita para a linguagem de programação Go. RiveScript é uma linguagem de script para chatterbots, facilitando a escrita de pares de gatilho/resposta para desenvolver a inteligência de um bot.
Este projeto está atualmente em status Beta. A API deve ser praticamente estável, mas as coisas podem mudar em você.
RiveScript é uma linguagem de script para criação de chatbots. Possui uma sintaxe muito simples e foi projetado para ser fácil de ler e rápido de escrever.
Um exemplo simples da aparência do RiveScript:
+ hello bot
- Hello human.
Isso corresponde à mensagem de um usuário “olá bot” e responderia “Olá humano”. Ou para um exemplo um pouco mais 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>!
O site oficial do RiveScript é https://www.rivescript.com/
Para testar o RiveScript em seu navegador, experimente o RiveScript Playground.
Verifique também o Wiki da comunidade RiveScript para padrões de design comuns e dicas e truques para RiveScript.
Para a biblioteca de desenvolvimento:
go get github.com/aichaos/rivescript-go
Para o binário rivescript
independente para testar um bot:
go get github.com/aichaos/rivescript-go/cmd/rivescript
A distribuição do RiveScript inclui um shell interativo para testar seu bot RiveScript. Execute-o com o caminho para uma pasta no disco que contém seus documentos RiveScript. Exemplo:
# (Linux)
$ rivescript eg/brain
# (Windows)
> rivescript.exe eg/brain
Consulte rivescript -help
para ver as opções que aceita, incluindo modo de depuração e modo UTF-8.
Quando usado como biblioteca para escrever seu próprio chatbot, a sinopse é a seguinte:
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 )
}
}
O construtor usa uma estrutura Config
opcional. Aqui está um exemplo completo com todas as opções suportadas. Você só precisa fornecer chaves diferentes dos padrões.
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
})
Por conveniência, você pode usar um atalho:
// 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 ())
Um recurso comum em muitas implementações do RiveScript é a macro de objeto, que permite escrever código de programa dinâmico (em sua linguagem de programação favorita) para adicionar recursos extras ao seu bot. Por exemplo, seu bot pode responder a uma pergunta "como está o clima em $location " executando algum código para procurar a resposta por meio de uma API da web.
A versão Go do RiveScript tem suporte para macros de objetos escritas em Go (em tempo de compilação da sua aplicação). Ele também possui suporte opcional para macros de objetos JavaScript usando a biblioteca goja.
Veja como definir uma macro de objeto Go:
bot . SetSubroutine ( func ( rs * rivescript. RiveScript , args [] string ) string {
return "Hello world!"
})
Aqui está um exemplo de como disponibilizar macros de objetos JavaScript por meio do 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 )
}
}
}
O suporte UTF-8 no RiveScript é considerado um recurso experimental. Ele está desabilitado por padrão.
Por padrão (sem o modo UTF-8 ativado), os gatilhos podem conter apenas caracteres ASCII básicos (sem caracteres estrangeiros), e a mensagem do usuário é despojada de todos os caracteres, exceto letras, números e espaços. Isso significa que, por exemplo, você não pode capturar o endereço de e-mail de um usuário em uma resposta do RiveScript, por causa dos caracteres @ e . personagens.
Quando o modo UTF-8 está ativado, essas restrições são suspensas. Os gatilhos são limitados apenas a não conter certos metacaracteres, como a barra invertida, e a mensagem do usuário só é despojada de barras invertidas e colchetes angulares HTML (para proteger contra XSS óbvio se você usar RiveScript em um aplicativo da web). Além disso, os caracteres de pontuação comuns são eliminados, sendo o conjunto padrão /[.,!?;:]/g
. Isso pode ser substituído fornecendo um novo literal de string regexp para a função RiveScript.SetUnicodePunctuation
. Exemplo:
// 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 ( `[.,!?;:]` );
As tags <star>
no RiveScript capturarão a entrada "bruta" do usuário, para que você possa escrever respostas para obter o endereço de e-mail do usuário ou armazenar caracteres estrangeiros em seu nome.
Eu uso um Makefile GNU para facilitar a construção e execução deste módulo. Os comandos relevantes são:
make setup
- execute-o após clonar este repositório recentemente. Ele executa os comandos git submodule
para eliminar dependências do fornecedor.make build
- isso criará o comando front-end a partir de cmd/rivescript
e colocará seu binário no diretório bin/
. Ele cria um binário relevante para o seu sistema atual; portanto, no Linux, isso criará um binário Linux. Também é recomendado executar este pelo menos uma vez, porque ele armazenará pacotes de dependência em cache e acelerará compilações e execuções subsequentes.make run
- executa o comando front-end e aponta para a pasta eg/brain
como sua fonte RiveScript.make fmt
- executa gofmt -w
em todos os arquivos de origem.make test
- executa os testes unitários.make clean
- limpa os diretórios .gopath
, bin
e dist
. O repositório rivescript-go submódula o projeto RiveScript Test Suite (rsts). Se você não fez um git clone --recursive
para rivescript-go você pode extrair o submódulo através dos seguintes comandos:
git submodule init
git submodule update
Então make test
(ou go test
) deve mostrar os resultados dos testes executados na pasta rsts/.
Você pode construir uma versão para uma plataforma individual executando um comando como make linux/amd64
. Os destinos de compilação válidos são atualmente os seguintes:
linux/386
e linux/amd64
windows/386
e windows/amd64
darwin/amd64
Execute make release
para criar versões automaticamente para todas as plataformas suportadas.
Um diretório para o lançamento é criado em dist/rivescript-$VERSION-$OS-$ARCH/
que contém o binário construído, README.md, Changes.md e exemplos. Você pode inspecionar este diretório posteriormente; seu conteúdo é automaticamente compactado (zip para Windows) e colocado na raiz do repositório git.
Se você estiver fazendo compilação cruzada para um sistema diferente, pode ser necessário alterar as permissões para que Go possa baixar a biblioteca padrão para o novo destino. Exemplo:
% sudo mkdir /usr/lib/golang/pkg/windows_386
% chown your_user:your_user /usr/lib/golang/pkg/windows_386
NullStore
para teste. Outros gerenciadores de sessão oficiais (por exemplo, Redis) também estão aqui. 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.
O site oficial do RiveScript, http://www.rivescript.com/