Implantar o Pacote de Componentes em um Serviço
Você pode hospedar o pacote de componentes personalizados de um contêiner incorporado do Digital Assistant, do Oracle Cloud Infrastructure Functions, do Mobile Hub ou de um servidor Node.js externo.
Para serviços de componentes incorporados, implante o pacote ao criar o serviço. Para os serviços do Oracle Cloud Infrastructure Functions, do servidor Node.js externo e do Mobile Hub, implante primeiro o pacote no serviço, conforme descrito aqui, antes de adicioná-lo a uma habilidade como serviço de componente.
Implantar em um Servidor Node.js
Para hospedar um pacote de componentes personalizados em um servidor Node.js externo, use a CLI bots-node-sdk pack --service express
para copiar suas pastas do pacote de componentes e fazer algumas alterações que são específicas do Express; em seguida, instale o pacote de componentes e inicie-o em seu servidor.
-
Na pasta de nível superior do pacote de componentes personalizados (o que contém o arquivo
main.js
), digite este comando em uma janela de terminal:bots-node-sdk pack --service express
O comando faz o seguinte:
- Copia arquivos e subpastas para
service-express-<package version>
. - Adiciona um encapsulador de serviços
index.js
. - Cria um arquivo
api.js
, que é um encapsulador do Express paramain.js
. - Modifica o arquivo
package.json
para definir o arquivo principal comoindex.js
e adicionar as dependências.
Esta etapa mostra o comando básico da CLI. Para obter mais informações, consulte
https://github.com/oracle/bots-node-sdk/blob/master/bin/CLI.md
. - Copia arquivos e subpastas para
-
Execute estes comandos:
npm install npm start
Implantar no Oracle Cloud Infrastructure Functions
Você pode implantar seus componentes personalizados no Oracle Cloud Infrastructure Functions.
No momento, o Oracle Digital Assistant não pode acessar handlers de eventos de entidade em pacotes que você implanta no Oracle Cloud Infrastructure Functions.
Estas são as etapas de alto nível:
Obter nomes e permissões de artefatos para a implantação do Oracle Cloud Infrastructure Functions
Para poder implantar componentes personalizados no Oracle Cloud Infrastructure Functions, obtenha os nomes dos artefatos usados para implantação e verifique se você tem permissão para usá-los.
Para configurar sua instância para implantação do Oracle Cloud Infrastructure Functions, o administrador do tenancy concluiu as etapas em Configurar e Políticas para o Oracle Functions. Como parte do processo, eles criaram os artefatos a seguir. Peça ao administrador seus nomes, que você precisará ao concluir as etapas em Configurar Sua Conta de Usuário para o Oracle Functions:
-
Os nomes da região e do compartimento a serem usados para suas funções.
-
O nome do compartimento da rede virtual (VCN) do aplicativo de função. Normalmente, esse é o mesmo compartimento usado para funções.
-
O nome da VCN a ser usada para o aplicativo de função.
Além disso, peça ao administrador para verificar se você pertence a um grupo que tem as permissões necessárias para desenvolvedores de funções, que inclui acesso a esses artefatos.
Configurar Sua Conta de Usuário para o Oracle Functions
Para poder implantar pacotes de componentes personalizados no Oracle Cloud Infrastructure Functions, conclua estas etapas na console do Oracle Cloud Infrastructure:
Você precisará saber o nome dos compartimentos e da rede virtual (VCN) a serem usados e deverá pertencer a um grupo que permita o desenvolvimento da função, conforme descrito em Obter Nomes e Permissões de Artefato para a Implantação do Oracle Cloud Infrastructure Functions.
-
Acesse a Console e, na barra superior, selecione a região na qual o compartimento de desenvolvimento da função está.
-
Você implantará no Oracle Cloud Infrastructure Functions por meio do Oracle Cloud Infrastructure Registry. Se você ainda não tiver um repositório de registro que possa usar, faça o seguinte para criar um.
-
Clique em
na parte superior esquerda para abrir o menu de navegação, clique em Serviços do Desenvolvedor, clique em Registro de Contêiner e, em seguida, na seção Escopo da Lista, selecione o compartimento que foi configurado para o desenvolvimento da função.
-
Clique em Criar Repositório.
-
Dê um nome ao repositório e clique em Criar Repositório.
-
-
Se você não tiver um aplicativo de funções para seus pacotes de componentes personalizados, crie um. Na página Serviços do Desenvolvedor, clique em Funções e, em seguida, clique em Criar Aplicativo. Forneça um nome, selecione uma VCN, selecione pelo menos uma sub-rede e clique em Criar.
Se você não vir VCNs entre as quais escolher, talvez não esteja na região correta.
Há limites para o número de aplicativos e funções. Para saber os limites padrão, consulte Limites de Funções na Documentação do Oracle Cloud Infrastructure .
-
Na página Aplicativos, clique no aplicativo que você usa para implantação de função, clique em Conceitos Básicos na seção Recursos e, em seguida, clique em Configuração Local.
Conforme mostrado na captura de tela a seguir, a página exibe vários comandos que você precisará usar para configurar seu computador local e implantar seu pacote de componentes personalizados. Copie e salve os comandos das etapas 3 a 7.
Você irá usá-los depois de instalar o software necessário na sua máquina local e estará pronto para implantar seus componentes personalizados. Se preferir, marque essa página para que você possa retornar a ela quando precisar usar os comandos.
Não execute esses comandos agora. Basta copiá-los.
-
No comando copiado, semelhante ao seguinte, altere
[OCIR-REPO]
para o nome do seu repositório de registro.fn update context registry phx.ocir.io/devdigital/[OCIR-REPO]
-
Clique no ícone Perfil no canto superior direito e clique em Definições do Usuário para ir até a página Detalhes do Usuário.
-
Na próxima etapa, você criará um arquivo PEM que precisará armazenar em uma pasta
.oci
na sua máquina local. Se a sua pasta home na máquina local não tiver esse diretório, crie um em uma janela de terminal.-
Linux e Mac:
cd ~ mkdir .oci
-
Janelas:
cd C:\Users\<your-user-name> mkdir .oci
-
-
Você precisa de um arquivo
PEM
público e privado para acesso seguro. Se você ainda não tiver configurado um para sua conta de usuário, em Detalhes do Usuário na Console, clique em Chaves de API na seção Recursos e clique em Adicionar Chave de API.Salve o arquivo de chave privada (o arquivo
PEM
) no diretório.oci
na pasta home. - Anote a Impressão Digital associada à chave de API. Quando você tiver várias chaves de API, deverá saber qual impressão digital usar para cada arquivo
PEM
privado. -
Se você ainda não tiver configurado um arquivo
config
para a impressão digital na sua máquina local, na seção Chaves de API, execute estas etapas:-
Clique em
na linha da impressão digital da sua chave de API e, em seguida, clique em Exibir arquivo de Configuração.
-
Copie o conteúdo da Visualização do Arquivo de Configuração.
-
Na pasta
.oci
da sua máquina local (a mesma pasta na qual você salvou seu arquivo de chave privada), crie um arquivo com o nomeconfig
e cole o conteúdo copiado no arquivo.
-
-
No arquivo
config
, altere a propriedadekey_file
para apontar para o local do arquivo PEM privado. Por exemplo:key_file=/home/joe/.oci/my-private.pem
-
Se você não tiver um token de autenticação, clique em Tokens de Autenticação no menu Recursos e, em seguida, clique em Gerar Token. Copie o token de autenticação imediatamente para um local seguro de onde poderá recuperá-lo posteriormente, porque você não o verá novamente na console. Use o token de autenticação como senha quando acessar para enviar seu pacote de componentes personalizados ao registro do Oracle Infrastructure para implantação.
Configurar Sua Máquina Local para o Oracle Functions
Instale o cURL, a interface de linha de comando (CLI), o Fn e o Docker na sua máquina local para permitir a implantação no Oracle Cloud Infrastructure Functions. Se sua máquina for executada no Windows, execute uma das seguintes opções para usar o Fn:
-
Instale o Fn e o Docker no Linux em um Oracle VM VirtualBox seguindo as etapas deste tópico.
-
Instale o Docker e o Fn no Windows e, em seguida, instale o subsistema Linux para Windows conforme descrito em Como: Executar o cliente Fn no Windows e estabelecer conexão com um servidor Fn remoto.
- Implante seus componentes personalizados no Cloud Shell. Consulte Cloud Shell na Documentação do Oracle Cloud Infrastructure.
Para configurar sua máquina local:
-
(Somente Windows na VM) Se quiser usar um convidado do Linux no Oracle VM VirtualBox para implantar seu pacote de componentes personalizados no Oracle Cloud Infrastructure Functions, siga estas etapas:
-
Instale o VirtualBox em https://www.virtualbox.org/.
-
Faça download de um ISO Linux. Por exemplo, para obter o ISO para Ubuntu-Mate, vá para https://ubuntu-mate.org/download/ e clique em 64-bit PCs/Macs.
-
No VirtualBox, crie uma máquina virtual com base no ISO. Você encontra as instruções para criar uma máquina virtual Ubunto-Mate em https://itsfoss.com/install-linux-in-virtualbox/. Esse será o seu convidado do Linux.
-
Inicie o convidado do Linux.
-
Em uma janela de terminal, execute este comando:
sudo apt-get update
Isso atualiza as listas de pacotes para novos pacotes e pacotes que precisam de upgrade.
Dica:
Para abrir uma janela de terminal no Ubuntu, pressione Ctrl-Alt-T. -
Para copiar e colar em uma janela de terminal, você precisará das adições de convidados. Faça download do http://download.virtualbox.org/virtualbox/<release>/VBoxGuestAdditions_<release>.iso e instale e configure as adições usando as instruções em https://itsfoss.com/virtualbox-guest-additions-ubuntu/
Certifique-se de configurar Devices > Drag and Drop para bidirectional.
-
Digite esse comando em uma janela de terminal para instalar node.js e npm no convidado.
sudo apt install npm
-
Arraste a pasta
.oci
no seu diretório home da sua máquina local para a pasta home do convidado do Linux.Como é um arquivo oculto, pressione Ctrl-H ou selecionar View > Show Hidden Files na pasta home para vê-lo.
-
Na pasta
.oci
do convidado do Linux, abra o arquivoconfig
e alterekey_file
para apontar para o local do arquivo no seu convidado do Linux. Por exemplo:key_file=/home/joe/.oci/my-private.pem
-
Conclua as etapas restantes deste tópico no convidado do Linux.
-
- (Somente Mac) Se você ainda não tiver feito isso, instale o Homebrew para permitir que você instale o cURL, a CLI do OCI e o Fn. Consulte https://docs.brew.sh/Installation. Se preferir, você poderá usar os comandos MacPorts equivalentes.
-
Se o acesso à Internet for por meio de uma VPN, você poderá precisar configurar proxies. Por exemplo :
export http-proxy = http://<external_ip>:80 export https-proxy = http://<external_ip>:80 export no_proxy = localhost,127.0.0.1,<list> export noproxy = localhost,127.0.0.1,<list> export no_proxy = localhost,127.0.0.1,<list> # Example for apt nano /etc/apt/apt.conf Acquire::http::Proxy "http://<external_ip>:80"; Acquire::https::Proxy "http://<external_ip>:80";
-
Execute o comando apropriado para trazer os pacotes atualizados.
-
Linux:
sudo apt update && sudo apt upgrade
-
Mac:
brew update && brew upgrade
-
-
(Somente Linux) Você usará o cURL para instalar o OCI e o Fn. Digite esse comando em uma janela de terminal. A última instrução é verificar se ela foi instalada com sucesso.
sudo apt install curl curl --version
-
O Fn usa a CLI do OCI para implantar os componentes personalizados no Oracle Cloud Infrastructure Functions. Execute o comando apropriado para instalar a CLI e aceite todos os padrões.
-
Linux:
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"
-
Mac:
brew update && brew install oci-cli
- Windows (se estiver usando o subsistema Linux no Windows): Siga as etapas do Windows em Início Rápido na Documentação do Oracle Cloud Infrastructure.
-
-
Em Configurar Sua Conta de Usuário para o Oracle Functions, você criou um arquivo
config
. Agora você precisa configurar a CLI para usar esse arquivo. Abra uma nova janela de terminal, execute esse comando, forneça o local do seu arquivoconfig
e digiten
para as perguntas restantes (o seu arquivoconfig
já tem as definições necessárias).oci setup config
Por exemplo :
$ oci setup config This command provides a walkthrough of creating a valid CLI config file. ... Enter a location for your config [/home/joe/.oci/config]: Config file: /home/joe/.oci/config already exists. Do you want add a profile here? (If no, you will be prompted to overwrite the file) [Y/n]: n File: /home/joe/.oci/config already exists. Do you want to overwrite (Removes existing profiles!!!)? [y/N]: n
-
Você precisa do Docker 17.10.0-ce ou mais recente para enviar o pacote de componentes personalizados para o registro.
-
No Ubuntu, as instruções de instalação estão em https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository
-
No Mac, as instruções de instalação estão em https://docs.docker.com/docker-for-mac/install/
Consulte https://docs.docker.com/engine/install/linux-postinstall/ se não quiser prefaciar o comando
docker
comsudo
. -
-
Se você estiver usando VPN, siga as instruções em https://docs.docker.com/network/proxy/
Se você estiver usando o subsistema Linux no Windows, poderá definir os proxies na página Recursos, nas Definições do Docker Desktop.
-
Verifique se o Docker está em execução. Não será possível iniciar o Fn, que você instala em seguida, se o Docker não estiver em execução.
-
Você usará o Fn, que é uma plataforma leve de funções sem servidor baseada no Docker, para configurar o contexto e implantar o pacote. Se você ainda não tiver instalado o Fn, siga as instruções para instalá-lo, iniciar o servidor Fn e testar a instalação em https://fnproject.io/tutorials/install/
Não é necessário configurar o contexto ou definir o registro nesse momento. Você fará isso quando concluir as etapas em Implantar os Componentes Personalizados no Oracle Cloud Infrastructure Functions.
Modificar o Pacote de Componentes Personalizados para o Oracle Functions
Para poder implantar um pacote de componentes personalizados no Oracle Cloud Infrastructure Functions, adicione os arquivos func.js
e func.yaml
, adicione uma dependência do desenvolvedor para o fnproject FDK e instale o FDK.
(Somente Windows VM) Se você estiver usando um convidado do Linux, conclua essas etapas na sua máquina local e use o arraste e solte para copiar o pacote de componentes para o seu convidado do Linux. Se preferir, instale o node.js e o Bots Node SDK, conforme descrito na Etapa 1: Instalar o Software para Criar Componentes Personalizados, em seu convidado do Linux antes de executar as etapas.
-
Se você tiver usado o comando
bots-node-sdk init
para criar seu pacote de componentes personalizados, ele poderá ter criado um arquivo chamadoDockerfile
na pasta superior. Se sim, você deve excluí-lo. Caso contrário, sua implantação falhará. -
Na pasta superior do seu pacote de componentes personalizados (a pasta que contém
main.js
), crie um arquivo com o nomefunc.js
e adicione o código a seguir. Esse é o arquivo que o Oracle Cloud Infrastructure Functions chamará./*** This function handles an invocation that sets the "Oracle-Bots-Fn-Path" header to determine which component to invoke or if metadata should be returned. ***/ const fdk = require('@fnproject/fdk'); const OracleBotLib = require('@oracle/bots-node-sdk/lib'); const path = require("path"); const BOTS_FN_PATH_HEADER = "Oracle-Bots-Fn-Path"; const METADATA_PATH = "metadata"; const COMPONENT_PREFIX = "components/"; let shell; let componentsRegistry; const getComponentsRegistry = function (packagePath) { let registry = require(packagePath); if (registry.components) { return OracleBotLib.ComponentRegistry.create(registry.components, path.join(process.cwd(), packagePath)); } return null; } componentsRegistry = getComponentsRegistry('.'); if (componentsRegistry && componentsRegistry.getComponents().size > 0) { shell = OracleBotLib.ComponentShell({logger: console}, componentsRegistry); if (!shell) { throw new Error("Failed to initialize Bots Node SDK"); } } else { throw new Error("Unable to process component registry because no components were found in package: " + packagePath); } const _handle = function (input, ctx) { let botsFnPath = ctx.getHeader(BOTS_FN_PATH_HEADER); if (!botsFnPath) { throw new Error("Missing required header " + BOTS_FN_PATH_HEADER); } else if (botsFnPath === METADATA_PATH) { return shell.getAllComponentMetadata(); } else if (botsFnPath.startsWith(COMPONENT_PREFIX)) { let componentName = botsFnPath.substring(COMPONENT_PREFIX.length); if (!componentName) { throw new Error("The component name is missing from the header " + BOTS_FN_PATH_HEADER + ": " + botsFnPath); } return new Promise((resolve) => { let callback = (err, data) => { if (!err) { resolve(data); } else { console.log("Component invocation failed", err.stack); throw err; } }; shell.invokeComponentByName(componentName, input, {logger: () => console}, callback); }); } }; fdk.handle(function (input, ctx) { try { return _handle(input, ctx); } catch (err) { console.log("Function failed", err.stack); throw err; } });
-
Na mesma pasta, crie um arquivo com o nome
func.yaml
e adicione o seguinte conteúdo:schema_version: 20180708 name: <custom component package name> version: 0.0.1 runtime: [node11|node14] build_image: [fnproject/node:11-dev|fnproject/node:14-dev] run_image: [fnproject/node:11|fnproject/node:14] entrypoint: node func.js
-
Na propriedade
name
, altere<custom component package name>
para o nome do seu pacote de componentes personalizados e salve suas alterações. O nome geralmente é o mesmo especificado no arquivopackage.json
.O nome não deve ter mais de 255 caracteres e só pode conter letras, números,
_
e-
. -
Defina estas propriedades:
-
runtime
: A linguagem e a versão do Nó. Especifiquenode11
ounode14
. -
build_image
: A imagem base do build-time que contém as bibliotecas e ferramentas específicas do idioma para criar funções executáveis. Especifiquefnproject/node:11-dev
oufnproject/node:14-dev
. -
run_image
: A imagem base do runtime que fornece o ambiente de runtime específico do idioma no qual executar funções executáveis. Especifiquefnproject/node:11
oufnproject/node:14
.
-
-
Em uma janela de terminal, vá para a pasta superior do pacote e digite este comando para instalar o FDK e adicioná-lo como dependência de pacote no arquivo
package.json
:npm install --save-dev @fnproject/fdk
-
(Opcional – Somente Linux, Mac e subsistema Linux no Windows) Execute este comando para instalar dependências de pacotes:
npm install
Observe que, se a pasta
node_modules
não existir, o comandofn deploy
que você executar mais tarde chamaránpm install
para você. -
(Somente Windows VM) Conclua estas etapas para copiar seu código de componente personalizado no seu convidado do Linux para implantação:
-
Arraste e solte a pasta de nível superior no convidado do Linux.
-
Em uma janela de terminal, vá para a pasta de nível superior (a que contém
main.js
) e digite esse comando para adicionar permissões de execução para a pasta.chmod 755 components
-
Exclua a pasta
node_modules
para garantir que você não tenha módulos de nó dependentes da plataforma. -
(Opcional) Execute esse comando para reinstalar as dependências do módulo de nó.
npm install
Observe que, se a pasta
node_modules
não existir, o comandofn deploy
que você executar posteriormente chamaránpm install
para você.
-
Agora você está pronto para concluir as etapas em Implantar os Componentes Personalizados no Oracle Cloud Infrastructure Functions.
Implantar os Componentes Personalizados no Oracle Cloud Infrastructure Functions
Depois de criar o arquivo func.js
, adicionar o fnproject às dependências de desenvolvimento e instalar as dependências, conforme descrito em Modificar o Pacote de Componentes Personalizados para o Oracle Functions, você estará pronto para implantar uma imagem do Docker do pacote de componentes no Oracle Cloud Infrastructure Functions.
Quando tiver concluído as etapas em Configurar sua Conta de Usuário para o Oracle Functions, você terá copiou os comandos da Configuração Local, na página Conceitos Básicos, para as etapas de 3 a 7. Você usará esses comandos copiados para implantar seus componentes personalizados.
Se você estiver usando o Cloud Shell, use os comandos semelhantes mostrados em Configuração do Cloud Shell.
Para implantar os componentes personalizados:
-
Certifique-se de que o Docker e o servidor Fn estejam em execução.
-
Em uma janela de terminal, vá para o diretório superior do seu pacote de componentes personalizados e digite os comandos copiados equivalentes para configurar o contexto.
fn create context <context> --provider oracle fn use context <context> fn update context oracle.compartment-id <compartment-ocid> fn update context api-url https://functions.<region-identifier>.oci.oraclecloud.com
Você não precisará executar esses comandos novamente até precisar alterar as configurações de contexto.
Se você receber o erro "Fn: error replace file with tempfile" quando alterar o contexto, edite manualmente
~/.fn/config.yaml
e altere o contexto nesse arquivo. -
Se seu arquivo de configuração tiver vários perfis, digite esse comando para apontar para o perfil criado em Configurar Sua Conta de Usuário para o Oracle Functions.
fn update context oracle.profile <profile-name>
-
Para apontar o repositório de registro criado em Configurar Sua Conta de Usuário para o Oracle Functions, digite seu comando copiado que seja equivalente ao seguinte. Caso ainda não tenha feito isso, altere
[OCIR-REPO]
para o nome do seu repositório.fn update context registry <region-key>.ocir.io/<tenancy-namespace>/[OCIR-REPO]
Você não precisará executar esse comando novamente até precisar alterar a configuração do repositório.
-
Se você não tiver acessado o Docker na sua sessão atual, execute o comando copiado equivalente ao mostrado aqui.
Quando ele solicitar uma senha, digite seu token de autenticação, que é o token obtido durante a conclusão das etapas em Configurar Sua Conta de Usuário para o Oracle Functions.
docker login -u '<tenancy-namespace>/<user-name>' <region-key>.ocir.io
-
Para implantar os componentes personalizados, execute este comando:
fn deploy --app <application>
Se você vir a mensagem a seguir, abra o arquivo
.oci/config
e verifique sefingerprint
mostra a impressão digital correta para okey_file
especificado. Caso contrário, vá para as definições do usuário na Console, clique em Chaves de API, exiba o arquivo de configuração da impressão digital correta e substitua o conteúdo do seu arquivo de configuração pelo conteúdo exibido.Fn: Service error:NotAuthenticated. The required information to complete authentication was not provided or was incorrect.. http status code: 401.
Seus componentes personalizados estão prontos para uso em uma habilidade, conforme descrito em Adicionar Serviço do Oracle Functions.
Implantar no Mobile Hub
Para hospedar um pacote de componentes personalizados no Mobile Hub, use a CLI bots-node-sdk pack --service mobile-api
para copiar as pastas do pacote de componentes e fazer algumas alterações que são específicas do Mobile Hub, incluindo o arquivo RAML. Em seguida, crie a API personalizada com base no arquivo RAML e faça upload de um ZIP do pacote de componentes na API personalizada.
-
Na pasta de nível superior do pacote de componentes personalizados (o que contém o arquivo
main.js
), digite este comando em uma janela de terminal:bots-node-sdk pack --service mobile-api
O comando faz o seguinte:
- Copia arquivos e subpastas para
service-mobile-api-<package version>
. - Adiciona um arquivo
component.service.raml
, que contém os pontos finais e as operações necessários. - Cria um arquivo
api.js
, que é um encapsulador do Mobile Hub paramain.js
. - Modifica o arquivo
package.json
para definir o arquivo principal comoapi.js
, definir as dependências e adicionar a configuração de nó do Mobile Hub.
Esta etapa mostra o comando básico da CLI. Para obter mais informações, consulte
https://github.com/oracle/bots-node-sdk/blob/master/bin/CLI.md
. - Copia arquivos e subpastas para
- Verifique o arquivo
package.json
e confirme se o nome do pacote está em conformidade com as seguintes restrições do Mobile Hub: Modifique o nome conforme necessário para ficar em conformidade.- O nome deve ter apenas letras (A-Za-z), números (0-9) e sublinhados (_).
- O nome deve começar com uma letra.
- O nome deve ter 100 caracteres ou menos.
-
Na página APIs do Mobile Hub, clique em Nova API > API e crie a API personalizada fazendo upload do arquivo
component.service.raml
. -
Na guia Segurança, desative Log-in Obrigatório e clique em Salvar.
-
Compacte a pasta
service-mobile-api-<package version>
e, em seguida, faça upload do arquivo ZIP na guia Implementação da API personalizada. -
Na página Teste, chame a solicitação
GET
. A resposta deve mostrar os metadados do componente.Dica:
Se você obtiver o status 500 e o erro for que não é possível encontrar uma definição de rota correspondente, verifique seus arquivos para ver se há sintaxe JavaScript inválida, pois essa é a causa típica.