# Assistant Fulfillment Helper
Esta biblioteta tem como objetivo facilitar a criação de *webhooks* para os nós de intenção da [Assistente TOTVS](https://produtos.totvs.com/ficha-tecnica/tudo-sobre-o-totvs-carol-assistente/). Com poucas linhas de código, é possivel criar uma regra de negócio customizada em sua própria estrutura de servidor.
## Pré-requisitos:
- [>= Python 3.7](https://www.python.org/downloads/)
## Por onde começar?
Crie um projeto novo e instale o módulo usando PyPI:
```sh
pip install assistant-fulfillment-helper
```
Importe e instancie a classe ``FulfillmentHelper`` para poder definir sua própria regra de negócio.
```python
from assistant_fulfillment_helper import FulfillmentHelper
fh = FulfillmentHelper()
fh.start() # Inicia um servidor local
```
O código acima irá instanciar o módulo e servirá um Webhook pronto para receber as requisições dos seus nós de intenção da Assistente. Para checar se está tudo certo, abra seu navegador e acesse http://127.0.0.1:5052 (endereço padrão).
O endereço (path) raíz possui dois roteamentos:
- ``GET``: Trás uma mensagem de sucesso com ``http response 200``, e pode ser utilizada como *health check*.
- ``POST``: Iniciará o processamento das [intenções definidas](#definindo-uma-intenção) na sua aplicação. É a chamada que o servidor espera receber da Assistente.
## Definindo uma Intenção
Para definir uma intenção, basta adicionar o decorator ``intent()`` no método que deverá ser o callback para aquela intenção. Uma intenção deverá estar vinculada à um Webhook, o qual é definido no momento da criação do callback.
Por exemplo:
```python
from assistant_fulfillment_helper import FulfillmentHelper
fh = FulfillmentHelper()
@fh.intent(webhook='pedidos', node='Novo pedido', token='{token}')
def cb_novo_pedido(args):
""" Sua regra de negócio aqui """
pass
```
Nesse exemplo, o "Novo pedido" no UI da Assistente deverá estar definido nas configurações do Fullfilment (webhook): ``http://meu-servidor.com.br/pedidos``.
### intent()
O decorator ``intent()`` definirá o callback pra cada intenção em uma lista de intenções dentro de um contexto de webhook. Será efetuado uma chamada para o método declarado como callback toda a vez que o servidor receber uma chamada vinda de um nó da Assistente para a intenção definida.
É possível registrar quantos callback de intenções e webhooks forem necessários, mas apenas um callback é permitido para cada intenção (nó).
**Parâmetros:**
| Parâmetro | Obrigatório? | Tipo | Descrição |
|-----------|--------------|------|-----------|
| ``webhook`` | Sim | ``Str`` | Path do webhook, para o qual a Assistant requisitará nesse nó |
| ``token`` | Sim | ``Str`` | Token disponibilizado pela Assistente na configuração do Nó de Intenção |
| ``node`` | Sim | ``Str`` | Nome do Nó de Intenção cadastrado na Assistente |
| ``fallback_message`` | Não | ``Str`` | Mensagem padrão de retorno em caso de falha na execução do callback |
## Criando um callback
Na chamada do callback, será passado uma variável do tipo ``Dict`` com alguns argumentos que poderão ser utilizados na regra de negócio como quiser.
Exemplo de um método para callback de um Nó de Intenção:
```python
from assistant_fulfillment_helper import FulfillmentHelper, FulfillmentHelperResponse
fh = FulfillmentHelper()
@fh.intent(webhook='pedidos', node='Novo pedido', token='{token}')
def cb_novo_pedido(params):
session = params.get('sessionId')
message = f"Olá Usuário, nosso id de sessão é: {session}"
return FulfillmentHelperResponse(
message = message
)
```
Os parametros passados na chamada do callback são:
| Parâmetro | Tipo | Descrição |
|-----------|------|-----------|
| intent_name | ``Str`` | Nome do nó sendo processado |
| parameters | ``Dict`` | Todos os parametros desse contexto de conversa |
| sessionLog | ``List`` | Lista de ID de sessões até esse ponto da conversa |
| namedQueries | ``Dict`` | Resultados da Named Query (se houver) |
| query | ``Str`` | Query executada (se houver) |
| language | ``Str`` | Idioma da conversa |
| carolOrganization | ``Str`` | Nome da Organização |
| carolEnvironment | ``Str`` | Nome do Ambiente |
| carolOrganizationId | ``Str`` | Id da Organização |
| carolEnvironmentId | ``Str`` | Id do Ambiente |
| sessionId | ``Str`` | Id da sessão da conversa atual |
| isProduction | ``Bool`` | Informa se a convesa está acontecendo em Produção ou Desenvolvimento |
| channelName | ``Str`` | Nome do canal por onde a mensagem chegou |
### Retorno do Callback
O metodo de callback deve retornar uma classe do tipo ``FulfillmentHelperResponse``, como no [exemplo acima](#criando-um-callback). Essa classe possui os seguintes atributos para retorno:
| Parâmetro | Obrigatório? | Tipo | Descrição |
|-----------|--------------|------|-----------|
| ``message`` | Sim | ``Str`` | Mensagem que será retornada na conversa |
| ``short_message`` | Não | ``Str`` | Mensagem curta de retorno |
| ``jump_to`` | Não | ``Str`` | Nome do nó para o qual a conversa será direcionada |
| ``options`` | Não | ``List[Str]`` | Lista de opções pré-definidas que aparecerão como botões na resposta |
| ``logout`` | Não | ``Bool`` | Destrói a sessão de usuário na conversa ``(default: False)`` |
| ``parameters`` | Não | ``Dict`` | Parametros que serão adicionados no contexto da conversa |
Exemplo de uso:
```python
@fh.intent(webhook='boas-vindas', node='Boas vindas', token='{token}')
def callback_boas_vindas(params):
message = f"Olá, o que deseja fazer agora?"
return FulfillmentHelperResponse(
message = message,
short_message = "Boas vindas",
jump_to = "Pedidos",
options = [
"Criar Pedido",
"Consultar Pedido",
"Cancelar Pedido"
],
logout = False,
parameters = { 'onboarding' : True }
)
```
### Falha do Callback
Se por algum motivo houver uma excessão na execução do callback, o servidor responderá uma mensagem de fallback padrão para a assistente ("Desculpe, não consegui processar seu pedido no momento."). Essa mensagem pode ser alterada na definição da intenção.
Por exemplo:
```python
@fh.intent(webhook='login', node='Login', token='{token}', fallback_message='Estamos passando por alguns problemas.')
def callback_login(params):
resposta = 'lorem'*1/params # raises a TypeError Exception
return FulfillmentHelperResponse(
message = resposta
)
```
Na execução desse callback, a excessão `TypeError` será capturada pelo servidor. O qual, por sua vez, retornará para o usuário na Assistente a mensagem de fallback definida para esse callback e o detalhes do erro será disponibilizado no console do servidor.
## Iniciando um servidor local
Existem diferentes formas de executar o servidor webhook. A biblioteca disponibiliza o método ``start()`` para rodar o servidor diretamente pelo código e o método ``get_app_context()`` para poder executar externamente por outra biblioteca (ex: gunicorn) e executar testes.
### get_app_context()
O método ``get_app_context()`` retornará o contexto do servidor em uma variável, o que é util para executar testes e rodar a aplicação utilizando bibliotecas externas e deixar pronto para receber requisições como um Webhook.
Por exemplo:
```python
fh = FulfillmentHelper()
application = fh.get_app_context()
```
Agora a aplicação pode ser executada com o comando:
```sh
gunicorn my_app
```
> NOTA: nesse exemplo a variável ``application`` poderá ser utilizada por bibliotecas de testes também.
### start()
O método ``start()`` é responsável por iniciar um servidor e deixar pronto para receber requisições como um Webhook. Por esse método, o servidor pode ser configurado passando algumas propriedades no momento da chamada.
Por exemplo:
```python
fh = FulfillmentHelper()
fh.start(
debug = True
)
```
As configurações customizáveis para o servidor local são:
| Parâmetro | Obrigatório? | Tipo | Default | Descrição |
|-----------|--------------|------|---------|-----------|
| ``debug`` | Não | ``Bool`` | ``False`` | O Debug ativo habilita verbosidade e reinicia o servidor em cada alteração de código |
| ``host`` | Não | ``Str`` | ``0.0.0.0`` | Nome ou IP do host local |
| ``port`` | Não | ``Int`` | ``5052`` | Porta do host local |
## Exceções
Os possíveis erros são tratados pelas exceções da biblioteca. Aqui está a lista das exceções existentes:
| Exceção | Problema |
|-----------|--------|
| ``DuplicatedIntentNodeException()`` | Foi tentado adicionar dois métodos de callback para o mesmo Nó de Intenção |
| ``IntentCallbackNotFoundException()`` | O WebHook recebeu uma chamada para um Nó de Intenção indefinido |
| ``IntentResponseInstanceException()`` | O Callback invocado não retornou a classe de resposta esperada (``FulfillmentHelperResponse()``) |
| ``InvalidWebhookTokenException()`` | O WebHook token utilizado na chamada é diferente do token informado no registro do nó |
| ``WebhookNotFoundException()`` | O servidor recebeu uma requisição para um webhook indefinido |
## Executando em ambiente de DEV:
> Dica: Ao invocar o metodo ``start()``, [habilite o Debug](#iniciando-um-servidor-local) para um desenvolvimento mais rápido.
Ao iniciar o webhook local, será necessario disponibilizar a aplicação para fora da sua rede. Para isso recomendamos a utilização de algum software de proxy local, como, por exemplo, o [ngrok](https://ngrok.com/download). Após instalação, execute o comando abaixo em seu terminal para obter a URL pública da sua aplicação. Essa URL poderá ser adicionada como WebHook nas configurações dos seus nós na Assistente para um teste local.
```sh
ngrok http http://127.0.0.1:5052
```
> NOTA: Informe o host e porta definida na inicialiazação do servidor WebHook.
## Executando com Gunicorn
É possivel executar o servidor do webhook utilizando [Gunicorn](https://gunicorn.org/), uma vez que o contexto da aplicação esteja acessível no arquivo de chamada raíz da sua aplicação. Há duas formas pra obter o contexto da aplicação no seu arquivo.
1. Utilizando o método `get_app_context()`:
```python
from assistant_fulfillment_helper import FulfillmentHelper
fh = FulfillmentHelper()
...
application = fh.get_app_context()
```
2. Importando a `application` (contexto da aplicação) diretamente:
```python
from assistant_fulfillment_helper import FulfillmentHelper, application
fh = FulfillmentHelper()
...
```
Agora é só iniciar o servidor com [Gunicorn](https://gunicorn.org/):
```
gunicorn -w 4 main
```
> NOTA: `main` deve ser o nome do arquivo raíz da sua aplicação, o qual possui o contexto do app acessível (`application`).
## Licença
MIT (LICENSE)
Raw data
{
"_id": null,
"home_page": "https://github.com/totvslabs/assistant-fulfillment-helper",
"name": "assistant-fulfillment-helper",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": "",
"keywords": "assistant fulfillment helper carol totvs carolina carolapp",
"author": "TotvsLabs",
"author_email": "info@totvslabs.com",
"download_url": "https://files.pythonhosted.org/packages/c7/53/4847e4c5ee88e10354d7f8acb01b97519513b8bba4d6286fb0e8ea66daf6/assistant-fulfillment-helper-1.0.6.tar.gz",
"platform": null,
"description": "# Assistant Fulfillment Helper\nEsta biblioteta tem como objetivo facilitar a cria\u00e7\u00e3o de *webhooks* para os n\u00f3s de inten\u00e7\u00e3o da [Assistente TOTVS](https://produtos.totvs.com/ficha-tecnica/tudo-sobre-o-totvs-carol-assistente/). Com poucas linhas de c\u00f3digo, \u00e9 possivel criar uma regra de neg\u00f3cio customizada em sua pr\u00f3pria estrutura de servidor.\n\n## Pr\u00e9-requisitos:\n- [>= Python 3.7](https://www.python.org/downloads/)\n\n## Por onde come\u00e7ar?\nCrie um projeto novo e instale o m\u00f3dulo usando PyPI:\n```sh\npip install assistant-fulfillment-helper\n```\n\nImporte e instancie a classe ``FulfillmentHelper`` para poder definir sua pr\u00f3pria regra de neg\u00f3cio. \n```python\nfrom assistant_fulfillment_helper import FulfillmentHelper\n\nfh = FulfillmentHelper()\nfh.start() # Inicia um servidor local\n```\n\nO c\u00f3digo acima ir\u00e1 instanciar o m\u00f3dulo e servir\u00e1 um Webhook pronto para receber as requisi\u00e7\u00f5es dos seus n\u00f3s de inten\u00e7\u00e3o da Assistente. Para checar se est\u00e1 tudo certo, abra seu navegador e acesse http://127.0.0.1:5052 (endere\u00e7o padr\u00e3o).\n\nO endere\u00e7o (path) ra\u00edz possui dois roteamentos:\n- ``GET``: Tr\u00e1s uma mensagem de sucesso com ``http response 200``, e pode ser utilizada como *health check*.\n- ``POST``: Iniciar\u00e1 o processamento das [inten\u00e7\u00f5es definidas](#definindo-uma-inten\u00e7\u00e3o) na sua aplica\u00e7\u00e3o. \u00c9 a chamada que o servidor espera receber da Assistente.\n\n## Definindo uma Inten\u00e7\u00e3o\nPara definir uma inten\u00e7\u00e3o, basta adicionar o decorator ``intent()`` no m\u00e9todo que dever\u00e1 ser o callback para aquela inten\u00e7\u00e3o. Uma inten\u00e7\u00e3o dever\u00e1 estar vinculada \u00e0 um Webhook, o qual \u00e9 definido no momento da cria\u00e7\u00e3o do callback. \n\nPor exemplo:\n```python\nfrom assistant_fulfillment_helper import FulfillmentHelper\n\nfh = FulfillmentHelper()\n\n@fh.intent(webhook='pedidos', node='Novo pedido', token='{token}')\ndef cb_novo_pedido(args):\n \"\"\" Sua regra de neg\u00f3cio aqui \"\"\"\n pass\n```\n\nNesse exemplo, o \"Novo pedido\" no UI da Assistente dever\u00e1 estar definido nas configura\u00e7\u00f5es do Fullfilment (webhook): ``http://meu-servidor.com.br/pedidos``.\n\n### intent()\nO decorator ``intent()`` definir\u00e1 o callback pra cada inten\u00e7\u00e3o em uma lista de inten\u00e7\u00f5es dentro de um contexto de webhook. Ser\u00e1 efetuado uma chamada para o m\u00e9todo declarado como callback toda a vez que o servidor receber uma chamada vinda de um n\u00f3 da Assistente para a inten\u00e7\u00e3o definida.\n\u00c9 poss\u00edvel registrar quantos callback de inten\u00e7\u00f5es e webhooks forem necess\u00e1rios, mas apenas um callback \u00e9 permitido para cada inten\u00e7\u00e3o (n\u00f3).\n\n**Par\u00e2metros:**\n| Par\u00e2metro | Obrigat\u00f3rio? | Tipo | Descri\u00e7\u00e3o | \n|-----------|--------------|------|-----------|\n| ``webhook`` | Sim | ``Str`` | Path do webhook, para o qual a Assistant requisitar\u00e1 nesse n\u00f3 |\n| ``token`` | Sim | ``Str`` | Token disponibilizado pela Assistente na configura\u00e7\u00e3o do N\u00f3 de Inten\u00e7\u00e3o |\n| ``node`` | Sim | ``Str`` | Nome do N\u00f3 de Inten\u00e7\u00e3o cadastrado na Assistente |\n| ``fallback_message`` | N\u00e3o | ``Str`` | Mensagem padr\u00e3o de retorno em caso de falha na execu\u00e7\u00e3o do callback |\n\n## Criando um callback\nNa chamada do callback, ser\u00e1 passado uma vari\u00e1vel do tipo ``Dict`` com alguns argumentos que poder\u00e3o ser utilizados na regra de neg\u00f3cio como quiser. \nExemplo de um m\u00e9todo para callback de um N\u00f3 de Inten\u00e7\u00e3o:\n```python\nfrom assistant_fulfillment_helper import FulfillmentHelper, FulfillmentHelperResponse\n\nfh = FulfillmentHelper()\n\n@fh.intent(webhook='pedidos', node='Novo pedido', token='{token}')\ndef cb_novo_pedido(params):\n session = params.get('sessionId')\n message = f\"Ol\u00e1 Usu\u00e1rio, nosso id de sess\u00e3o \u00e9: {session}\"\n \n return FulfillmentHelperResponse(\n message = message\n )\n```\n\nOs parametros passados na chamada do callback s\u00e3o:\n\n| Par\u00e2metro | Tipo | Descri\u00e7\u00e3o |\n|-----------|------|-----------|\n| intent_name | ``Str`` | Nome do n\u00f3 sendo processado |\n| parameters | ``Dict`` | Todos os parametros desse contexto de conversa |\n| sessionLog | ``List`` | Lista de ID de sess\u00f5es at\u00e9 esse ponto da conversa |\n| namedQueries | ``Dict`` | Resultados da Named Query (se houver) |\n| query | ``Str`` | Query executada (se houver) |\n| language | ``Str`` | Idioma da conversa |\n| carolOrganization | ``Str`` | Nome da Organiza\u00e7\u00e3o |\n| carolEnvironment | ``Str`` | Nome do Ambiente |\n| carolOrganizationId | ``Str`` | Id da Organiza\u00e7\u00e3o |\n| carolEnvironmentId | ``Str`` | Id do Ambiente |\n| sessionId | ``Str`` | Id da sess\u00e3o da conversa atual |\n| isProduction | ``Bool`` | Informa se a convesa est\u00e1 acontecendo em Produ\u00e7\u00e3o ou Desenvolvimento |\n| channelName | ``Str`` | Nome do canal por onde a mensagem chegou |\n\n### Retorno do Callback \nO metodo de callback deve retornar uma classe do tipo ``FulfillmentHelperResponse``, como no [exemplo acima](#criando-um-callback). Essa classe possui os seguintes atributos para retorno:\n\n| Par\u00e2metro | Obrigat\u00f3rio? | Tipo | Descri\u00e7\u00e3o | \n|-----------|--------------|------|-----------|\n| ``message`` | Sim | ``Str`` | Mensagem que ser\u00e1 retornada na conversa |\n| ``short_message`` | N\u00e3o | ``Str`` | Mensagem curta de retorno |\n| ``jump_to`` | N\u00e3o | ``Str`` | Nome do n\u00f3 para o qual a conversa ser\u00e1 direcionada |\n| ``options`` | N\u00e3o | ``List[Str]`` | Lista de op\u00e7\u00f5es pr\u00e9-definidas que aparecer\u00e3o como bot\u00f5es na resposta |\n| ``logout`` | N\u00e3o | ``Bool`` | Destr\u00f3i a sess\u00e3o de usu\u00e1rio na conversa ``(default: False)`` |\n| ``parameters`` | N\u00e3o | ``Dict`` | Parametros que ser\u00e3o adicionados no contexto da conversa |\n\nExemplo de uso:\n```python\n@fh.intent(webhook='boas-vindas', node='Boas vindas', token='{token}')\ndef callback_boas_vindas(params):\n message = f\"Ol\u00e1, o que deseja fazer agora?\"\n \n return FulfillmentHelperResponse(\n message = message,\n short_message = \"Boas vindas\",\n jump_to = \"Pedidos\",\n options = [\n \"Criar Pedido\", \n \"Consultar Pedido\",\n \"Cancelar Pedido\"\n ],\n logout = False,\n parameters = { 'onboarding' : True }\n )\n```\n\n### Falha do Callback \nSe por algum motivo houver uma excess\u00e3o na execu\u00e7\u00e3o do callback, o servidor responder\u00e1 uma mensagem de fallback padr\u00e3o para a assistente (\"Desculpe, n\u00e3o consegui processar seu pedido no momento.\"). Essa mensagem pode ser alterada na defini\u00e7\u00e3o da inten\u00e7\u00e3o. \n\nPor exemplo:\n```python\n@fh.intent(webhook='login', node='Login', token='{token}', fallback_message='Estamos passando por alguns problemas.')\ndef callback_login(params):\n resposta = 'lorem'*1/params # raises a TypeError Exception\n \n return FulfillmentHelperResponse(\n message = resposta\n )\n```\n\nNa execu\u00e7\u00e3o desse callback, a excess\u00e3o `TypeError` ser\u00e1 capturada pelo servidor. O qual, por sua vez, retornar\u00e1 para o usu\u00e1rio na Assistente a mensagem de fallback definida para esse callback e o detalhes do erro ser\u00e1 disponibilizado no console do servidor. \n\n## Iniciando um servidor local\nExistem diferentes formas de executar o servidor webhook. A biblioteca disponibiliza o m\u00e9todo ``start()`` para rodar o servidor diretamente pelo c\u00f3digo e o m\u00e9todo ``get_app_context()`` para poder executar externamente por outra biblioteca (ex: gunicorn) e executar testes.\n\n### get_app_context()\nO m\u00e9todo ``get_app_context()`` retornar\u00e1 o contexto do servidor em uma vari\u00e1vel, o que \u00e9 util para executar testes e rodar a aplica\u00e7\u00e3o utilizando bibliotecas externas e deixar pronto para receber requisi\u00e7\u00f5es como um Webhook.\n\nPor exemplo:\n```python\nfh = FulfillmentHelper()\n\napplication = fh.get_app_context()\n```\n\nAgora a aplica\u00e7\u00e3o pode ser executada com o comando:\n```sh\ngunicorn my_app\n```\n\n> NOTA: nesse exemplo a vari\u00e1vel ``application`` poder\u00e1 ser utilizada por bibliotecas de testes tamb\u00e9m.\n\n### start()\nO m\u00e9todo ``start()`` \u00e9 respons\u00e1vel por iniciar um servidor e deixar pronto para receber requisi\u00e7\u00f5es como um Webhook. Por esse m\u00e9todo, o servidor pode ser configurado passando algumas propriedades no momento da chamada. \n\nPor exemplo:\n```python\nfh = FulfillmentHelper()\n\nfh.start(\n debug = True\n)\n```\n\nAs configura\u00e7\u00f5es customiz\u00e1veis para o servidor local s\u00e3o:\n\n| Par\u00e2metro | Obrigat\u00f3rio? | Tipo | Default | Descri\u00e7\u00e3o | \n|-----------|--------------|------|---------|-----------|\n| ``debug`` | N\u00e3o | ``Bool`` | ``False`` | O Debug ativo habilita verbosidade e reinicia o servidor em cada altera\u00e7\u00e3o de c\u00f3digo |\n| ``host`` | N\u00e3o | ``Str`` | ``0.0.0.0`` | Nome ou IP do host local |\n| ``port`` | N\u00e3o | ``Int`` | ``5052`` | Porta do host local |\n\n\n## Exce\u00e7\u00f5es \nOs poss\u00edveis erros s\u00e3o tratados pelas exce\u00e7\u00f5es da biblioteca. Aqui est\u00e1 a lista das exce\u00e7\u00f5es existentes:\n\n\n| Exce\u00e7\u00e3o | Problema | \n|-----------|--------|\n| ``DuplicatedIntentNodeException()`` | Foi tentado adicionar dois m\u00e9todos de callback para o mesmo N\u00f3 de Inten\u00e7\u00e3o |\n| ``IntentCallbackNotFoundException()`` | O WebHook recebeu uma chamada para um N\u00f3 de Inten\u00e7\u00e3o indefinido |\n| ``IntentResponseInstanceException()`` | O Callback invocado n\u00e3o retornou a classe de resposta esperada (``FulfillmentHelperResponse()``) |\n| ``InvalidWebhookTokenException()`` | O WebHook token utilizado na chamada \u00e9 diferente do token informado no registro do n\u00f3 |\n| ``WebhookNotFoundException()`` | O servidor recebeu uma requisi\u00e7\u00e3o para um webhook indefinido |\n\n## Executando em ambiente de DEV:\n> Dica: Ao invocar o metodo ``start()``, [habilite o Debug](#iniciando-um-servidor-local) para um desenvolvimento mais r\u00e1pido.\n\nAo iniciar o webhook local, ser\u00e1 necessario disponibilizar a aplica\u00e7\u00e3o para fora da sua rede. Para isso recomendamos a utiliza\u00e7\u00e3o de algum software de proxy local, como, por exemplo, o [ngrok](https://ngrok.com/download). Ap\u00f3s instala\u00e7\u00e3o, execute o comando abaixo em seu terminal para obter a URL p\u00fablica da sua aplica\u00e7\u00e3o. Essa URL poder\u00e1 ser adicionada como WebHook nas configura\u00e7\u00f5es dos seus n\u00f3s na Assistente para um teste local.\n\n```sh\nngrok http http://127.0.0.1:5052 \n```\n> NOTA: Informe o host e porta definida na inicialiaza\u00e7\u00e3o do servidor WebHook.\n\n## Executando com Gunicorn\n\u00c9 possivel executar o servidor do webhook utilizando [Gunicorn](https://gunicorn.org/), uma vez que o contexto da aplica\u00e7\u00e3o esteja acess\u00edvel no arquivo de chamada ra\u00edz da sua aplica\u00e7\u00e3o. H\u00e1 duas formas pra obter o contexto da aplica\u00e7\u00e3o no seu arquivo.\n\n1. Utilizando o m\u00e9todo `get_app_context()`:\n```python\nfrom assistant_fulfillment_helper import FulfillmentHelper\n\nfh = FulfillmentHelper()\n...\n\napplication = fh.get_app_context()\n```\n\n2. Importando a `application` (contexto da aplica\u00e7\u00e3o) diretamente:\n```python\nfrom assistant_fulfillment_helper import FulfillmentHelper, application\n\nfh = FulfillmentHelper()\n...\n```\n\nAgora \u00e9 s\u00f3 iniciar o servidor com [Gunicorn](https://gunicorn.org/):\n```\ngunicorn -w 4 main\n```\n\n> NOTA: `main` deve ser o nome do arquivo ra\u00edz da sua aplica\u00e7\u00e3o, o qual possui o contexto do app acess\u00edvel (`application`).\n\n## Licen\u00e7a\nMIT (LICENSE)",
"bugtrack_url": null,
"license": "",
"summary": "Assistant Fulfillment Helper Server",
"version": "1.0.6",
"project_urls": {
"Homepage": "https://github.com/totvslabs/assistant-fulfillment-helper"
},
"split_keywords": [
"assistant",
"fulfillment",
"helper",
"carol",
"totvs",
"carolina",
"carolapp"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "c7534847e4c5ee88e10354d7f8acb01b97519513b8bba4d6286fb0e8ea66daf6",
"md5": "c29b6b9562a7a5c6b3dbaee50c0c96aa",
"sha256": "3e39f4fb70507da7ed13955decf680e7744eff96f5a7a0917704772df3470b90"
},
"downloads": -1,
"filename": "assistant-fulfillment-helper-1.0.6.tar.gz",
"has_sig": false,
"md5_digest": "c29b6b9562a7a5c6b3dbaee50c0c96aa",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 18679,
"upload_time": "2023-05-15T13:23:10",
"upload_time_iso_8601": "2023-05-15T13:23:10.171620Z",
"url": "https://files.pythonhosted.org/packages/c7/53/4847e4c5ee88e10354d7f8acb01b97519513b8bba4d6286fb0e8ea66daf6/assistant-fulfillment-helper-1.0.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-15 13:23:10",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "totvslabs",
"github_project": "assistant-fulfillment-helper",
"github_not_found": true,
"lcname": "assistant-fulfillment-helper"
}