> For the complete documentation index, see [llms.txt](https://docs.chatlayer.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chatlayer.ai/chatlayer-documentation-pt-br/integrateandcode/expression-syntax.md).

# Sintaxe de expressões

A sintaxe de expressão se refere à estrutura de instruções na linguagem de código usada para incorporar conteúdo dinâmico, variáveis ou funções internas específicas em seu chatbot. Ela pode ser ativada nas [configurações de comportamento do bot](/chatlayer-documentation-pt-br/navegacao/settings/settings.md#bot-behaviour). Veja essa página para instruções detalhadas.

<figure><img src="/files/4ab8a9bf56c255a51f89a82540f9859bd17111c8" alt="" width="375"><figcaption><p>Exemplo de sintaxe de expressão dentro de uma mensagem de texto.</p></figcaption></figure>

{% hint style="danger" %}
Tenha também em mente as [**mudanças que quebram a compatibilidade**](#breaking-changes) que estão ocorrendo para bots existentes.
{% endhint %}

Ao contrário das ações de código tradicionais, que exigem conhecimento de JavaScript e podem consumir muitos recursos, a sintaxe de expressão no Chatlayer torna funcionalidades avançadas acessíveis sem a necessidade de habilidades extensas de programação.

{% hint style="info" %}
Neste artigo, o termo 'expressão' refere-se à combinação de identificadores usando funções, operadores, constantes e valores ao programar. Portanto, não deve ser confundido com o conceito de [expressões](/chatlayer-documentation-pt-br/navegacao/natural-language-processing-nlp/intents.md) no seu modelo de NLP.
{% endhint %}

## Como usar a sintaxe de expressão

A sintaxe de expressão pode ser usada dentro de [Etapas de texto](#text-step) e [Condições](/chatlayer-documentation-pt-br/buildabot/flow-logic/dialog-state/plugins.md), usando tipos específicos [tipos de dados](#data-types), [operadores](#operators) e [funções](#functions).

### Use funções de sintaxe no seu bot

Para usar a sintaxe de expressão no seu chatbot:

1. Abra o seu [bloco](/chatlayer-documentation-pt-br/buildabot/flow-logic/dialog-state.md).
2. Vá para o seu campo de texto.
3. Digite ‘{' dentro de um campo de texto ou digite o nome de uma função interna. Alguns casos de uso são mostrados abaixo.

#### **Etapa de texto**

Use a sintaxe de expressão dentro de uma etapa de texto para exibir o resultado dentro da mensagem do seu bot.

<figure><img src="/files/7900a2f79a09053318aac5ddb2baa971700fc29c" alt="" width="188"><figcaption><p>Use funções da sintaxe de expressão dentro de uma etapa de texto</p></figcaption></figure>

<figure><img src="/files/da674854884aacb7106cc233b58681ba11a8397b" alt="" width="188"><figcaption><p>Use uma variável da sintaxe de expressão dentro de uma etapa de texto</p></figcaption></figure>

#### **Bloco de condição**

Use a sintaxe de expressão dentro de uma [Condição](/chatlayer-documentation-pt-br/buildabot/flow-logic/dialog-state/plugins.md) como uma [variável](/chatlayer-documentation-pt-br/navegacao/settings/secure-variables-gdpr.md).

<figure><img src="/files/400c41d185d42a20a0365e9937eea31bfa6ca515" alt="" width="188"><figcaption><p>Use uma variável da sintaxe de expressão como uma variável dentro de uma instrução de condição.</p></figcaption></figure>

Leia abaixo exemplos de casos de uso:

* [Obter a hora atual](#get-the-current-time)
* [Minúsculas](#downcase)
* [Criar uma lista](#create-a-list)

### **Funções**

Funções, sejam [internas](#built-in-functions) ou [personalizadas](#custom-functions), formam a espinha dorsal da sintaxe de expressão. Elas impulsionam tarefas e operações específicas dentro do fluxo conversacional do seu chatbot.

#### Funções internas

Aqui está a lista de funções internas que você pode usar:

<table><thead><tr><th width="191">Nome</th><th>Resumo</th><th>Exemplo</th></tr></thead><tbody><tr><td>ABS</td><td>Retorna o valor absoluto de um número.</td><td>operation: (n: any) => Math.abs(n)</td></tr><tr><td>APPEND</td><td>Adiciona um ou mais itens ao final de uma lista.</td><td>operation: (arr: any, ...items: any[]) => arr.concat(...items)</td></tr><tr><td>BASE64_DECODE</td><td>Decodifica texto codificado em Base64.</td><td>operation: (text: any) => Buffer.from(text, 'base64').toString('utf8')</td></tr><tr><td>BASE64_ENCODE</td><td>Codifica texto usando o algoritmo de codificação Base64.</td><td>operation: (text: any) => Buffer.from(text + '', 'utf8').toString('base64')</td></tr><tr><td>CAPITALIZE</td><td>Coloca o primeiro caractere do texto em maiúscula e converte os caracteres restantes em minúsculas.</td><td>operation: (value: any) => lodash.capitalize(value)</td></tr><tr><td>CEIL</td><td>Arredonda para cima e retorna o menor inteiro maior ou igual a um número dado.</td><td>operation: (n: any) => Math.ceil(n)</td></tr><tr><td>DAY</td><td>Retorna o dia da data fornecida ou o dia atual se nenhuma data for fornecida (1-12).</td><td>operation: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).day</td></tr><tr><td>DOWNCASE</td><td>Coloca cada caractere do texto em minúscula.</td><td>operation: (value: any) => lodash.toLower(value)</td></tr><tr><td>FIRST</td><td>Retorna o primeiro elemento de uma lista.</td><td>operation: (value: any) => lodash.first(value)</td></tr><tr><td>FLOOR</td><td>Arredonda para baixo e retorna o maior inteiro menor ou igual a um número dado.</td><td>operation: (n: any) => Math.floor(n)</td></tr><tr><td>FORMAT</td><td>Retorna a data formatada de acordo com a string de formato.</td><td>operation: (d: any, format: any, locale: any) => DateTime.fromMillis(d).toFormat(format, { locale: locale || 'en' })</td></tr><tr><td>HOUR</td><td>Retorna a hora da data fornecida ou a hora atual se nenhuma data for fornecida (0-23).</td><td>operation: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).hour</td></tr><tr><td>INCLUDES</td><td>Retorna VERDADEIRO se o alvo (que pode ser texto, um objeto ou um array) incluir o valor; caso contrário, retorna FALSO.</td><td>operation: (haystack: any, needle: string) => lodash.includes(haystack, needle)</td></tr><tr><td>JSON_PARSE</td><td>Analisa um valor JSON serializado.</td><td>operation: (value: any) => JSON.parse(value)</td></tr><tr><td>LAST</td><td>Retorna o último elemento de uma lista.</td><td>operation: (value: any) => lodash.last(value)</td></tr><tr><td>MAX</td><td>Retorna o valor máximo dos argumentos fornecidos.</td><td>operation: (...args: any) => Math.max(...args)</td></tr><tr><td>MD5</td><td>Calcula o hash MD5 codificado em hexadecimal de um texto.</td><td>operation: (t: any) => crypto.createHash('md5').update(t + '').digest('hex')</td></tr><tr><td>MINUTE</td><td>Retorna o minuto da data fornecida ou o minuto atual se nenhuma data for fornecida (0-59).</td><td>operation: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).minute</td></tr><tr><td>MONTH</td><td>Retorna o mês da data fornecida ou o mês atual se nenhuma data for fornecida (1-12).</td><td>operation: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).month</td></tr><tr><td>NOW</td><td>Retorna a data e hora atuais.</td><td>operation: () => DateTime.now().toMillis()</td></tr><tr><td>PARSE</td><td>Analisa uma data formatada de acordo com a string de formato.</td><td>operation: (d: string, format: any, locale: any) => DateTime.fromFormat(d, format, { locale }).toMillis()</td></tr><tr><td>ROUND</td><td>Retorna o valor de um número arredondado para a precisão mais próxima.</td><td>operation: (n: any, precision = 0) => Math.round(n * Math.pow(10, precision)) / Math.pow(10, precision)</td></tr><tr><td>SPLIT</td><td>Divide o texto de entrada em uma lista usando o delimitador como separador.</td><td>operation: (text: any, delimiter: any) => (text + '').split(delimiter + '')</td></tr><tr><td>STRINGIFY</td><td>Serializa um valor em uma string JSON.</td><td>operation: (value: any) => stringify(value, null, 0)</td></tr><tr><td>TODAY</td><td>Retorna a data de hoje com a hora definida para 00:00.</td><td>operation: () => DateTime.now().startOf('day').toMillis()</td></tr><tr><td>TOMORROW</td><td>Retorna a data de amanhã com a hora definida para 00:00.</td><td>operation: () => DateTime.now().startOf('day').plus({ days: 1 }).toMillis()</td></tr><tr><td>TO_NUMBER</td><td>Converte um valor em número.</td><td>operation: (value: any) => value - 0</td></tr><tr><td>TO_STRING</td><td>Converte um valor em string.</td><td>operation: (value: any) => value?.toString()</td></tr><tr><td>UUID</td><td>Gera um identificador universalmente único (V4).</td><td>operation: () => uuid()</td></tr><tr><td>WEEKDAY</td><td>Obtenha o dia da semana. 1 é segunda-feira e 7 é domingo.</td><td>operation: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).weekday</td></tr><tr><td>YEAR</td><td>Retorna o ano da data fornecida ou o mês atual se nenhuma data for fornecida.</td><td>operation: (d: any) => DateTime.fromMillis(d || DateTime.now().toMillis()).year</td></tr><tr><td>YESTERDAY</td><td>Retorna a data de ontem com a hora definida para 00:00.</td><td>operation: () => DateTime.now().startOf('day').plus({ days: -1 }).toMillis()</td></tr></tbody></table>

#### **Funções personalizadas**

Você pode criar as suas próprias [funções](#functions) como quiser, usando as [operadores](#operators).

Alguns exemplos de funções personalizadas:

* **`1 + 2`**
* **`1 + (2 * 3)`**
* **`MAX(1,2)`**
* **`a ? b : c`**
* **`a.b.c.d`**

### **Operadores**

As operações abrangem uma variedade de ações, cálculos e manipulações de dados no código. O uso de operadores oferece respostas mais dinâmicas e com mais contexto ao seu chatbot.

<table><thead><tr><th width="124">Precedência</th><th>Operador</th><th>Descrição</th><th>Associatividade</th></tr></thead><tbody><tr><td>1</td><td>()</td><td>Chamada de função</td><td>Da esquerda para a direita</td></tr><tr><td></td><td>.</td><td>Nome qualificado ou acesso a campo</td><td></td></tr><tr><td></td><td>[]</td><td>Indexação</td><td></td></tr><tr><td>2</td><td>- (unário)</td><td>Negação</td><td>Da direita para a esquerda</td></tr><tr><td></td><td>!</td><td>NÃO lógico</td><td></td></tr><tr><td>3</td><td>*</td><td>Multiplicação</td><td>Da esquerda para a direita</td></tr><tr><td></td><td>/</td><td>Divisão</td><td></td></tr><tr><td></td><td>%</td><td>Resto</td><td></td></tr><tr><td>4</td><td>+</td><td>Adição</td><td></td></tr><tr><td></td><td>- (binário)</td><td>Subtração</td><td></td></tr><tr><td>5</td><td>== != &#x3C; > &#x3C;= >=</td><td>Relações</td><td></td></tr><tr><td>6</td><td>&#x26;&#x26;</td><td>E lógico</td><td></td></tr><tr><td>7</td><td>?:</td><td>Condicional</td><td>Da direita para a esquerda</td></tr></tbody></table>

### **Tipos de dados**

Oferecemos suporte a um subconjunto de tipos JavaScript para proporcionar flexibilidade na sua jornada de criação de bots:

* número
* string
* booleano
* mapa
* lista
* nulo

## Casos de uso da sintaxe de expressão

Nesta seção, encontre alguns exemplos de casos de uso em que a sintaxe de expressão é usada

### Obter a hora

Há várias maneiras de retornar informações sobre o tempo com funções de sintaxe de expressão.

#### Obter a hora atual

Imagine que você quer que o seu bot saiba ou exiba a hora atual. É fácil recuperar a hora com as funções a seguir:

* `FORMAT()` retorna o horário de acordo com uma string.
* `NOW()` retorna a data e hora atuais com base no fuso horário UTC.

Combine essas opções para criar uma função que retorne a hora com horas e minutos:

```javascript
 {FORMAT(NOW(), "T")}
```

{% hint style="info" %}
Para saber mais sobre formatação de hora, dê uma olhada em [esta tabela](https://moment.github.io/luxon/#/formatting?id=table-of-tokens).
{% endhint %}

<figure><img src="/files/785a0dbf0adfe8e2b5cbd10573794f9cfecc3843" alt=""><figcaption><p>Use a sintaxe de expressão para retornar a hora atual dentro de uma conversa.</p></figcaption></figure>

#### Obter um fuso horário UTC+1

Imagine um cenário em que seus usuários finais estejam localizados em um fuso horário UTC+1. Para que eles saibam se sua loja está aberta agora, o seu bot precisa determinar que horas são na Bélgica.

Você pode usar as funções:

* `NOW()` retorna a data e hora atuais com base no fuso horário UTC.
* `HOUR()` extrai a hora do momento atual.
* `HOUR(NOW())` extrai o componente da hora do fuso horário UTC atual.
* `+1` adiciona 1.

Combine essas funções na seguinte expressão personalizada:

```jsx
{HOUR(NOW())+1}
```

Esta expressão extrai a hora do fuso horário UTC atual e adiciona 1 a ela para que corresponda ao horário belga.

<figure><img src="/files/b4526a001476539418c1090de18f25a4e702ddb3" alt=""><figcaption><p>Use uma sintaxe de expressão personalizada para obter a hora atual no fuso horário do seu cliente.</p></figcaption></figure>

### Minúsculas

Digamos que seu cliente tenha informado o nome em letras maiúsculas. Você quer converter todos os caracteres de entrada para minúsculas para que isso possa seguir um processo padronizado.

* `DOWNCASE()` converte todos os caracteres de um texto fornecido para minúsculas.
* `@username` é o nome da variável em que o nome do seu cliente é salvo.

Combine esses elementos em uma função personalizada que coloca todas as letras do seu nome de usuário em minúsculas:

```javascript
DOWNCASE(@userName)
```

<figure><img src="/files/1b6f1588b2c8402a7fcf5074b1c78ab25048d117" alt=""><figcaption><p>Use a sintaxe de expressão para padronizar a entrada do usuário.</p></figcaption></figure>

### Criar uma lista

Digamos que você tenha uma mensagem que consiste em uma lista de elementos que gostaria de tratar separadamente, por exemplo, uma lista de frutas.

Sua mensagem de exemplo seria a seguinte string:

```javascript
"Apple Banana Orange"
```

* `SPLIT()` divide uma string em uma lista
* `FIRST()` e `LAST()` recuperam o primeiro e o último elementos de uma lista, respectivamente

Combine essas funções para retornar o primeiro e o último elemento da lista de frutas:

```jsx
{FIRST(SPLIT("Apple Banana Orange"," "))}
{LAST(SPLIT("Apple Banana Orange"," "))}
```

<figure><img src="/files/ec63ed7fbbf0726175f2a9487cb059a7bacbe461" alt=""><figcaption><p>Recupere elementos da lista usando a sintaxe de expressão.</p></figcaption></figure>

## 🚨 Mudanças que quebram a compatibilidade

Para garantir uma transição suave para a sintaxe de expressão, é fundamental abordar algumas mudanças que quebram a compatibilidade e que podem impactar os fluxos atuais do seu bot.

### **Restrição ao nome da variável**

Nomes de variáveis existentes como `a-b`, `a b`, number ou usar '-' em Ir para variáveis não são mais compatíveis.

Certifique-se de ajustar os nomes das suas variáveis de acordo com a nova sintaxe de expressão.

<figure><img src="/files/c4f4d36e5853304c2595ade742f159061fbbd5cc" alt=""><figcaption><p>Exemplos de nomes de variáveis que não são mais compatíveis com a sintaxe de expressão.</p></figcaption></figure>

### **Requisito de identificador JavaScript**

Somente identificadores JavaScript válidos são suportados. Se suas variáveis não estiverem em conformidade, ajuste-as agora para evitar problemas. Consulte esta documentação para [diretrizes](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types) .

### **Remoção do`|` operador**

O `|` operador não é mais compatível. Se ele fizer parte do fluxo do seu bot, faça os ajustes necessários para alinhar à nova sintaxe.

Antes da atualização, se o fluxo do seu bot envolvesse o uso do operador |, ele poderia se parecer com isto:

```
notUnderstoodCounter|increment
```

Com a atualização da sintaxe de expressão, o `|` operador não é mais compatível. Modifique o nome da sua variável.

### **`JSON.stringif` não é mais compatível**

Certifique-se de revisar suas variáveis anteriores e confirmar que nenhuma delas dependa de `JSON.stringify`. Use STRINGIFY ou TO\_STRING em vez disso.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.chatlayer.ai/chatlayer-documentation-pt-br/integrateandcode/expression-syntax.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
