Pular para o conteúdo principal
Atualizado em Nov 4, 2026

Editor de expressões CEL

Use CEL em mensagens de agentes, condições de ações, saídas de workflows e comportamento de formulários. O AutoTalk usa CEL-Go no navegador e no servidor. Funções compartilhadas usam <family>.<camelCase>; funções importadas do tenant usam <slug>.<function>. A referência mostra sintaxe e disponibilidade por contexto.

A geração 4 mantém o descritor {expr, ...options} e usa nomes mais curtos. Escritas CEL na API enviam X-Autotalk-Cel-Schema: 4; ferramentas MCP que recebem código CEL usam celSchemaGeneration: "4". Código com os prefixos antigos precisa da migração revisada antes de executar nesta geração.

Onde aparecem as expressões​

O emblema CEL identifica o campo de expressão. Os locais comuns incluem mensagens/pré-ações/pós-ações de agentes, etapas de workflow, templates e rótulos/visibilidade/previews de Custom Types. Nomes de campos e identificadores literais de abas/referências não são expressões automaticamente.

Editor compacto​

O editor compacto oferece destaque de sintaxe, validação, formatação e Expandir. Use Ctrl+Shift+F para formatar. Diagnósticos de sintaxe/tipos ajudam a localizar problemas; testes verificam o comportamento com valores reais.

Nomes de chamadas recebem destaque pela sintaxe, inclusive chamadas desconhecidas. A cor do namespace usa os metadados atuais de funções/importações; uma seleção como values.name continua sendo dado. A cor não confirma disponibilidade nem validade de uma função.

Campo CEL nativo compacto com uma biblioteca do tenant fixada

A chamada equivalente na geração 4 é labels.normalizeName na versão v1 fixada.

As capturas abaixo usam dados sintéticos da geração 3; seus rótulos autotalk.*/tenant.* são anteriores aos nomes curtos dos exemplos desta página.

CEL nativo e texto literal​

Cada campo de expressão armazena uma única expressão CEL nativa. Para texto simples, escreva uma string CEL entre aspas e escape aspas ou quebras de linha dentro dela. O editor expandido mostra essa mesma expressão. Para texto dinâmico, escreva "Hello " + contact.name + "!", ou use uma chamada explícita de template:

text.template("Hello {name}!", {
"name": values.coalesce(maps.get(contact, "name"), "Guest")
})

Chaves como {{contact.name}} dentro de uma string continuam sendo texto literal.

String CEL entre aspas com chaves duplas literais

"Hello {{contact.name}}" é texto literal; as chaves não substituem um valor.

JSON e MCP usam o mesmo descritor em todos os lugares, incluindo rótulos de Custom Types, abas, previews e condições de monitores:

{"expr": "\"Hello \" + contact.name + \"!\"", "onFailure": "throw"}

Opções avançadas​

OpçãoFinalidade
Em caso de falhaGerar erro, retornar null, usar texto literal alternativo ou manter a expressão original
Tipo do resultadoResultado esperado: any, string, number, boolean, date, array ou object
Valor alternativoTexto literal usado pela política de fallback

Um fallback não torna correta uma expressão inválida. Teste os resultados esperados e as falhas antes de depender dele.

Ambiente de trabalho completo​

Expanda o campo para abrir o editor completo. A barra abre Explorador e Teste. Os editores compacto e expandido compartilham as importações exatas do documento; validação, sugestões e Teste usam as mesmas versões. Salve o agente, workflow, Custom Type ou rascunho da biblioteca para persistir a expressão e suas versões fixadas.

Explorador​

O Explorador lista variáveis do contexto e funções com assinaturas. Funções compartilhadas são agrupadas por família, como maps e text; recursos CEL padrão mantêm sua sintaxe. Importações exatas acrescentam funções na raiz do slug, como labels.normalizeName. Pesquise e selecione entradas para inseri-las; funções indisponíveis no contexto são excluídas.

Explorador com uma função nativa compartilhada e sua assinatura

O Explorador filtra as funções disponíveis no campo atual e mostra suas assinaturas.

ContextoEntradas comuns
Agentecontact, contactMessage, conversation, company, parâmetros de ferramenta declarados
Workflow_workflow, occurrenceDate, entradas manuais e doc, prev, op, model do trigger
Formuláriovalues, item, args, company, employee quando fornecidos pelo formulário
Função de bibliotecaSomente parâmetros nomeados declarados e variáveis locais

A variável de contato é contact. Entradas manuais/de ferramenta são nomes no nível superior, não um mapa parameters implícito. Quando um agente precisa de dados de funcionário, obtenha-os com uma ação de dados e leia a saída declarada.

Teste​

  1. Forneça valores JSON representativos para as variáveis.
  2. Execute pelo botão ou Ctrl+Enter.
  3. Compare valor/tipo ou examine o diagnóstico.

Teste de CEL nativo retornando o rótulo de demonstração normalizado

Teste avalia a função pura fixada e retorna example label.

Inclua dados ausentes/null/vazios e casos de limite. Teste não executa ações de workflow automaticamente para produzir saídas de etapas; funções de contexto e bibliotecas precisam do contexto do campo e do conjunto exato de importações.

Valores opcionais e lógica tipada​

Raízes ausentes e acesso direto a campos ausentes geram erro. Use caminhos seguros ou seleção opcional:

values.coalesce(maps.get(contact, "name"), "Guest")
contact.?nickname.orValue("Guest")
cel.bind(name, maps.get(contact, "name"),
values.present(name) ? name : "Guest")

Presença e null são diferentes: um null presente não usa fallback opcional. has(contact.name) verifica presença; maps.has(contact,"name") verifica um caminho não null. Conversões nativas usam tipos CEL e podem falhar. Preserve unidades externas com datetime.fromMillis / toMillis; timestamp(int) nativo usa segundos Unix.

Exemplos de saídas de etapas​

workflow.stepOk(0)
workflow.stepData(0, "title", "Unknown")
workflow.stepData(1, "choices.0.message.content", "")
workflow.stepError(2)

O caminho é relativo a data quando esse envelope existe; não repita data. Ações com saída na raiz usam seus campos declarados. Veja dados da etapa e saídas na raiz.

Executar código publica result, então workflow.stepData(N,"count") lê workflow.step(N).result.count. Campos raiz files, logs e executionTimeMs precisam de maps.get(workflow.step(N),"files",[]). Caminhos ausentes usam o padrão, mas índices inexistentes geram erro.

Bibliotecas do tenant​

Bibliotecas permitem reutilizar regras sem repetir uma expressão grande. Abra Automações → Bibliotecas e escolha Nova biblioteca → CEL. Informe o nome e um namespace (slug) estável e escolha Criar biblioteca para abrir o editor de funções. Adicione funções tipadas e fixtures e use Verificar para conferir compilação e testes. Salve o rascunho com o botão Salvar da página. Publicar vN publica a revisão salva e verifica novamente compilação e fixtures configuradas.

Cada função possui parâmetros nomeados, tipo de retorno e corpo CEL. Só lê parâmetros, variáveis locais, funções puras compartilhadas e funções puras importadas. Passe contatos, relógios e outros dados explicitamente; bibliotecas não leem estado ambiente de agente/formulário/etapa nem realizam I/O.

Rascunho de exemplo​

{
"imports": [],
"functions": [{
"name": "normalizeName",
"parameters": [{"name": "value", "type": "string"}],
"returnType": "string",
"body": {"expr": "text.nameKey(value)"},
"tests": [
{"name": "accents-and-spaces", "args": {"value": " Álice Silva "}, "expected": "alice silva"},
{"name": "empty", "args": {"value": ""}, "expected": ""}
]
}]
}

Use esse rascunho em uma biblioteca de slug labels. Fixtures fornecem exatamente os argumentos nomeados e um único expected ou expectedError. Erros esperados correspondem a códigos do avaliador. Os tipos aceitam primitivas CEL, list<T>, map<K,V> e optional<T>. Valores JSON especiais usam o codec $cel, por exemplo:

{"$cel": "timestamp", "seconds": "1705276800", "nanos": 0}

Publicar e selecionar uma versão exata​

Versões publicadas são imutáveis. Para a primeira importação, selecione uma função do tenant legível e ainda não importada nas sugestões ou aplique a correção de importação ausente; isso adiciona a versão exata ao documento. Com importações existentes, abra a contagem de bibliotecas ao lado do título do documento/página para gerenciá-las e escolher outra versão publicada. Uma expressão que chama uma função importada também oferece Gerenciar no chip de biblioteca do rodapé. O gerenciador compartilha as importações atuais com os editores compacto e expandido. Salve o documento para persistir mudanças. Por MCP/API ou no modo JSON, use os IDs exatos retornados:

{"celLibraries": [{"libraryId": "000000000000000000000001", "releaseId": "000000000000000000000002"}]}

Quando o documento omite celLibraries, ele usa as importações padrão da empresa. Uma lista própria substitui esses padrões; [] os desativa explicitamente. Documentos existentes com uma lista vazia continuam sem herdar os padrões. Mensagens de agentes/Workflows usam as importações resolvidas de quem as executou, e templates usam as importações do próprio template. Mensagens enviadas pela API, por contacts.sendMessage ou pela interface de conversas do funcionário salvam as versões exatas no envio. Alterações posteriores na empresa não mudam as ações de opções das mensagens já enviadas. O agente atribuído à conversa não fornece as importações de uma mensagem do funcionário.

A autoria direta de ações executáveis em opções exige acesso de leitura às bibliotecas importadas. A ferramenta MCP send_message não aceita actions nas opções e as rejeita antes do envio; use contacts.sendMessage com automation:admin para essas mensagens.

Substitua pelos seus IDs. Depois é possível chamar:

labels.normalizeName(
values.coalesce(maps.get(contact, "name"), ""))

Editar ou publicar não atualiza chamadores automaticamente. Selecione outra versão exata deliberadamente; dependências também fixam versões exatas. Recarregue um rascunho desatualizado antes de salvar/publicar novamente.

labels.normalizeName(value) é uma função definida pelo tenant neste exemplo. Cada tenant precisa definir e importar sua biblioteca labels; o namespace não fornece uma função global do AutoTalk nem a implementação de outro tenant.

Criação por MCP e API​

Clientes MCP usam create_document / update_document com type:"cel_libraries". Atualizações incluem o draftRevision lido. Descubra as ações com list_functions e use execute_function para validateDraft, testDraft e publish:

Em escritas de bibliotecas com código CEL, passe celSchemaGeneration: "4" ao lado de type e document/data, nunca dentro do rascunho salvo. Exemplo: create_document({type: "cel_libraries", document, celSchemaGeneration: "4"}). Um rascunho candidate em execute_function também precisa desse argumento; a leitura get_cel_reference não precisa.

{"type":"cel_libraries","id":"LIBRARY_ID","functionName":"publish","args":{"expectedDraftRevision":1},"celSchemaGeneration":"4"}

Use o ID e a revisão atuais. Validação/testes aceitam candidate não salvo. get_cel_reference com context:"library" e importações celLibraries exatas retorna assinaturas compartilhadas e importadas permitidas.

A API pública autenticada oferece as mesmas ações: POST /v1/dynadata/type/cel_libraries/item/{id}/executeFunction/{functionName}. O JSON do corpo contém os argumentos, como expectedDraftRevision para publicar. Escritas HTTP com código CEL incluem X-Autotalk-Cel-Schema: 4, também em clientes fora do navegador. CRUD usa os endpoints e permissões Dynadata normais.

Diagnosticar uma expressão em execução​

Erros visíveis para a equipe identificam a expressão e sua origem. Expanda, copie a expressão e examine seção/índice e diagnóstico. Com logs de depuração, valores disponíveis ajudam a criar uma fixture representativa.

Diagnóstico CEL recolhido com dados sintéticos de demonstração

Um diagnóstico recolhido de demonstração identifica o erro e mostra uma prévia curta.

Diagnóstico CEL expandido mostrando expressão e origem

Expanda o diagnóstico para ver expressão, origem, seção e índice.

Aba Variáveis CEL com valores sintéticos de contato e empresa

A aba Variáveis CEL mostra os valores capturados para o diagnóstico. Estes cartões de demonstração ilustram contact.nickname ausente; não contêm registros de clientes.

Corrija a expressão no agente/workflow/formulário ou rascunho correspondente. Teste e salve; no caso de bibliotecas, publique e atualize deliberadamente a importação exata do chamador. Rascunhos não alteram comportamento ativo até que o chamador importe uma versão.