Customizações Avançadas
Bibliotecas
Pipelines Lua
o que é? o sistema de pipelines permite criar interações conversacionais customizadas através de scripts em lua podendo ser utilizada como uma ferramenta de linha de comando ou como um servidor de forma simplificada pode ser entendido como um questionário que é definido através de scripts lua como funciona uma pipeline? para utilizarmos o sistema, primeiramente devemos criar uma pasta em nosso sistema operacional que será utilizada para armazenar todos os nossos workspaces, cada um contem os seus respectivos scripts lua após isso criamos outra pasta que vai conter o nosso projeto especifico o nome da pasta não é restritivo, mas para fins didáticos vou me referir a ela como workspaces exemplo workspaces/projeto exemplo passo um criação da tabela de pipelines a tabela de pipelines é especial e deve ser definida uma única vez no workspace , ela é responsável pela definição de quais são as pipelines presentes no workspace vamos começar criando uma arquivo lua main lua dentro de um workspace conforme exemplo acima \ arquivo main lua pipelines = { "questionario dados pessoais", "consultar chamado" } acima criamos a tabela pipelines que informa ao sistema a existência de duas pipelines questionario dados pessoais e consultar chamado passo dois definição de uma pipeline vamos agora definir a pipeline questionario dados pessoais , para isso devemos criar a tabela própria da pipeline contendo as perguntas que ela possui \ arquivo main lua pipelines = { "questionario dados pessoais", "consultar chamado" } questionario dados pessoais = { "perguntar nome", "perguntar idade", } perceba que os nomes devem corresponder nas tabelas de pipelines e em sua própria definição passo tres definição das perguntas cada pergunta é representada por uma tabela com o seu respectivo nome que foi definido acima, a tabela contem quatro campos output é a resposta da pergunta atual show define se a pergunta deve ser feita ou não select é um conjunto de possíveis escolhas mostrada ao usuário junto ao output o label é a frase mostrada de cada opção, no qual há um número id associado respectivamente accept define se a pergunta atual atende condições especificas e pode ser mostrada reject é a resposta da pergunta atual caso o accept seja falso exemplo completo \ arquivo main lua pipelines = { "questionario dados pessoais", "consultar chamado" } questionario dados pessoais = { "perguntar nome", "perguntar idade", "perguntar localidade" } \ pergunta simplificada perguntar nome = { output = "olá, qual é o seu nome?", string show = true, boolean accept = true, boolean reject = "mensagem de rejeição" string } \ pergunta com condições perguntar idade = { output = function(respostas) \ o output pode ser um função caso deseje utilizar as respostas \ anteriores return "olá" respostas perguntar nome ", qual é a sua idade?" end, show = function(respostas) \ o show pode ser uma função caso deseje fazer alguma condição para \ determinar se o sistema deve fazer essa pergunta ao usuário ou não if respostas perguntar nome == "felipe" then \ se a resposta da primeira pergunta for felipe \ o sistema não vai perguntar sua idade return false end return true end, accept = function(atual, repostas) \ aqui definimos condições para aceitar o input do usuário \ baseado na resposta atual ou anteriores if tonumber(atual) < 18 then return false end return true end, reject = function(atual, respostas) \ podemos usar a reposta atual e as anteriores para rejeitar \ a resposta do usuário return "digite uma idade maior " respostas perguntar nome end, } perguntar localidade = { output = "localidade ", show = true, accept = true, select = { { label = "acre", id = 2}, { label = "alagoas", id = 3 }, { label = "amapá", id = 4}, { label = "distrito federal", id = 5}, { label = "espírito santo", id = 6}, { label = "goiás", id = 7}, { label = "maranhão", id = 8}, { label = "mato grosso", id = 9}, { label = "mato grosso do sul", id = 10}, { label = "minas gerais", id = 11}, { label = "pará", id = 12}, { label = "paraíba", id = 13}, { label = "paraná", id = 14}, { label = "pernambuco", id = 15}, { label = "piauí", id = 16}, { label = "rio de janeiro", id = 17}, { label = "rio grande do norte", id = 18}, { label = "rio grande do sul", id = 19}, { label = "rondônia", id = 20}, { label = "roraima", id = 21}, { label = "santa catarina", id = 22}, { label = "são paulo", id = 23}, { label = "sergipe", id = 24}, { label = "tocantins", id = 25}, }, reject = "mensagem de rejeição" } estrutura de projeto e biblioteca global dentro da pasta usada para guardar os workspaces, é possível criar um projeto especial com o nome lib global que compartilha todo o seu conteúdo com os outros projetos e repositórios, ele pode ser usado para escrever funções utilitárias que são usadas amplamente em todos os outros projetos por exemplo estrutura de exemplo workspaces ├── cliente x │ ├── arquivo x lua │ ├── arquivo g lua │ └── subpasta x │ ├── arquivo t lua │ ├── arquivo y lua ├── cliente y │ ├── arquivo t lua │ └── subpasta z │ ├── arquivo t lua │ ├── arquivo y lua └── lib global 	├── arquivo h lua └── subpasta ├── cnbbb luaa como pode se ver a estrutura de pastas dentro de cada projeto é livre para se decidir e usar da forma que preferir bibliotecas disponíveis no lua os seguintes pacotes vão estar disponíveis no ambiente de desenvolvimento através do luarocks lua cjson https //luarocks org/modules/openresty/lua cjsonhttp https //luarocks org/modules/daurnimator/httpxml2lua https //github com/manoelcampos/xml2luainspect https //luarocks org/modules/kikito/inspectbase64 https //luarocks org/modules/iskolbin/base64urlencode https //luarocks org/modules/moznion/urlencodeopenssl https //luarocks org/modules/zhaozg/openssl alem dos pacotes externos está disponível também as seguintes bibliotecas de sistema table https //www lua org/manual/5 4/manual html#6 6string https //www lua org/manual/5 4/manual html#6 4coroutine https //www lua org/manual/5 4/manual html#6 2package https //www lua org/manual/5 4/manual html#6 3math https //www lua org/manual/5 4/manual html#6 7debug https //www lua org/manual/5 4/manual html#6 10 formas de execução do sistema o sistema de pipelines possui duas formas de ser executado, ferramenta de linha de comando (cli) e servidor http o sistema pode ser instalado localmente usar o seguinte comando no local do repositório cargo install path repl (cli) modo de linha de comando comando para se executar no modo de linha de comando cargo run repl client \<client> pipeline \<pipeline> descrição dos parâmetros w, workdir \<workdir> workspaces directory, uses current dir as default c, client \<client> client name p, pipeline \<pipeline> pipeline name h, help print help v, version print version server modo de servidor http comando para se executar no modo servidor cargo run server port \<port> username \<username> password \<password> descrição dos parâmetros w, workdir \<workdir> workspaces directory, uses current dir as default s, sync synchronize with git p, port \<port> server port u, username username p, password password h, help print help v, version print version importante para se utilizar a sincronização com git é necessário configurar o arquivo config toml dentro do seu diretório utilizado como workdir utilizando o seguinte modelo exemplo de arquivo config toml \[cliente xpto] url = "https //github com/centralit governanca corporativa/cliente xpto git" username = "git user" password = "secret password" \[nome do cliente] url = "url do github" username = "git user" password = "secret password" documentação da api a api suporta requisições para quatro recursos diferentes workspaces recursos utilizados para manipular os workspaces reload all workspaces method get endpoint /workspace/reload description reloads all workspaces reload one workspace method get endpoint /workspace/reload/{client} description reloads a specific workspace identified by the client git recursos utilizados para se sincronizar o git sync all repositories method get endpoint /git/sync description synchronizes all git repositories sync one repository method get endpoint /git/sync/{client} description synchronizes a specific git repository identified by the client conversation recursos utilizadas para interagir com as conversas importante esse recurso está protegido por basic auth , as credenciais são as mesmas utilizadas na inicialização do servidor create conversation method post endpoint /conversation/spawn/{client}/{pipeline}/{conversation uuid} authentication basic auth description creates a new conversation instance within a specific pipeline and conversation uuid for the given client process conversation method post endpoint /conversation/process/{conversation uuid} authentication basic auth description processes the specified conversation within the given pipeline for the client body { input "user input here" } has conversation method get endpoint /conversation/{conversation uuid} authentication basic auth description verify if a conversation within a specific conversation uuid exists exposição de funções para web é possível expor funções que podem ser chamadas através de endpoints específicos que serão consumidos por outros serviços que desejem se comunicar com nosso sistema pelos protocolos http para expor alguma função primeiro é necessário declarar uma tabela essa tabela pode ser declarada dentro de um arquivo que já contenha um fluxo conversacional das pipelines ou pode ser criado em um arquivo separado dentro da pasta do projeto para nosso exemplo, criaremos um arquivo chamado webservice workspaces/projeto exemplo/webservice lua dentro do arquivo temos 5 (cinco) tabelas \ arquivo webservice lua allow get routes = {} allow post routes = {} allow put routes = {} allow patch routes = {} allow delete routes = {} cada tabela corresponde a um método http (get, post, put, patch e delete) agora vamos criar uma função dentro desse arquivo \ arquivo webservice lua function teste() return "hello word" end com a função criada, precisamos expô la para que seja acessada via web neste caso vamos expô la para que seja acessada pelo método get \ arquivo webservice lua allow get routes = { "teste" } allow post routes = {} allow put routes = {} allow patch routes = {} allow delete routes = {} function teste() return "hello word" end dessa forma, podemos acessar essa função construindo a url abaixo http //dominio exemplo/get/projeto exemplo/teste dominio exemplo domínio que roda o sistema get constitui a url para informar que iremos buscar uma função declarada no allow get routes \ o método http também deve ser o get projeto exemplo nome do projeto em que o arquivo webservice lua se encontra teste nome da função que você deseja acessar chamado então esse endpoint, você receberá como reposta o que foi retornado na função hello word importante todas as funções recebem 3 (três) parâmetros o primeiro são os headers da requisição, o segundo os query params e o terceiro o body dessa forma podemos modificar nossa função afim de receber esses parametros e realizar alguma lógica utilizando os \ arquivo webservice lua allow get routes = { "teste" } allow post routes = {} allow put routes = {} allow patch routes = {} allow delete routes = {} function teste(headers, query) \ lógica a ser aplicada com os parâmetros return "hello word" end observação 1 caso você use o parâmetro query e no endpoint não seja enviado query params, ela estará vázio observação 2 caso você declare um terceiro parâmetro na função ele será entendido como o body da requisição, e no caso do método http get, que não há body, ele virá como uma string vazia vamos agora criar outra função para ser chamada via método http post criaremos a função consulta autorizacao no mesmo arquivo que estávamos webservice lua essa função receberá os 3 (três) parâmetros citados acima ela será exposta na tabela allow post routes para estar disponível para acesso via http \ arquivo webservice lua allow get routes = { "teste" } allow post routes = { "consulta autorizacao" } allow put routes = {} allow patch routes = {} allow delete routes = {} function teste() return "hello word" end function consulta autorizacao(headers, query, body) \ lógica para consultar alguma autorização return "autorizado" end o endpoint para chamar a função que criamos agora é http //dominio exemplo/post/projeto exemplo/consulta autorizacao lembrando que essa função foi exposta no allow post routes, sendo assim é necessário que você utilize o método http post e na construção da url, após o dominio base, você deverá insirir /post/ para que sua função seja chamada corretamente