assistant-fulfillment-helper


Nameassistant-fulfillment-helper JSON
Version 1.0.6 PyPI version JSON
download
home_pagehttps://github.com/totvslabs/assistant-fulfillment-helper
SummaryAssistant Fulfillment Helper Server
upload_time2023-05-15 13:23:10
maintainer
docs_urlNone
authorTotvsLabs
requires_python>=3.7
license
keywords assistant fulfillment helper carol totvs carolina carolapp
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 0.83141s