Sign inGet Started

Referência de nós de sequência de voz

Warning: Voice sequences are in preview. Steps, entry data, and the sequence definition format can change in ways that break existing sequences and API requests.

Use esta referência para escrever o sequence.definition que você envia com Criar chamada. Bird executa uma definição inline uma vez e não a salva. Para manter uma sequência, crie-a no editor do painel.

Definição

CampoValor
schema_version1.
expression_environment"bird.cel.v1".
nodesArray de objetos de nó. A ordem do array não afeta a execução.
settingsOmita ou envie {}. Um objeto não vazio falha com unsupported_contract; um valor que não é um objeto falha com invalid_envelope.
presentationLayout e rótulos opcionais do editor. Não afeta a execução, mas conta para os limites de tamanho.

Cada nó tem estes campos:

CampoValor
idÚnico na definição. Começa com uma letra minúscula, seguida de letras minúsculas, dígitos ou _, até 64 caracteres.
typeUm tipo de nó desta página, como voice.say.
type_version1 para cada tipo de nó nesta página.
configConfiguração que define a forma do nó, como os resultados declarados. Use {} quando o nó não tiver nenhuma.
inputValores que o nó usa ao ser executado. Use {} quando o nó não tiver nenhum.
connectionsMapa de um nome de resultado para { "node_id": "<target>", "port": "input" }.

As conexões não podem formar um loop, e cada nó deve ser alcançável a partir de uma entrada. Um resultado ausente em connections fica desconectado. Resultados desconectados encerram a execução normalmente, exceto quando o nó indicar o contrário.

Valores e expressões

A maioria dos campos aceita JSON literais. Campos marcados com binds também aceitam $expr ou $template; campos marcados com expr também aceitam apenas $expr:

  • {"$expr": "trigger.data.customer_name"} retorna um valor tipado.
  • {"$template": ["Hello ", {"$expr": "trigger.data.customer_name"}, "."]} retorna texto. Templates são arrays; {{name}} permanece como texto literal.

Expressões usam CEL e podem ler estes valores:

ValorConteúdo
trigger.dataOs dados de entrada, correspondendo ao data_schema da entrada.
trigger.node_idO ID da entrada que iniciou esta visita.
trigger.typeO tipo da entrada que iniciou esta visita, como trigger.start_call.
steps.<id>.outputSaída de um nó concluído anteriormente nesta visita.
variables.<key>Valores salvos por um nó data.set nesta visita.
execution.id, execution.started_atO ID da execução e seu horário de início. Use string(execution.started_at) em fala.
execution.callO id da chamada, session_id, e as partes originais orig e dest, cada uma podendo ser null.

Proteja valores opcionais antes de lê-los, por exemplo has(trigger.data.name) ? trigger.data.name : 'caller'. A macro has está disponível; map, filter, all, exists e exists_one não estão.

Entrada

trigger.start_call

Onde uma chamada começa. entry_node_id na solicitação Create Call nomeia este nó.

CampoValor
config.data_schemaEsquema de objeto JSON Schema (draft 2020-12) opcional para trigger_data. Apenas $ref local é suportado. Sem ele, a entrada aceita apenas {}.
Resultadoevent.

Os dados de entrada são limitados a 16 KiB.

Fala e áudio

voice.say

CampoValor
input.textObrigatório, binds. Texto a ser falado, no máximo 160 bytes.
input.languageObrigatório. Código de idioma da fala, como en.
Resultadonext.

voice.play

CampoValor
input.asset_idObrigatório. ID de um recurso de áudio disponível neste espaço de trabalho. Um recurso indisponível pode causar falha na chamada quando o passo é executado.
Resultadonext.

voice.tone

CampoValor
input.frequency_hzObrigatório. 100 a 3000.
input.duration_msObrigatório. 1 a 10000.
Resultadonext.

logic.pause

Aguarda com a chamada conectada.

CampoValor
input.duration_msObrigatório. 1 a 60000.
Resultadonext.

Entrada por teclado

voice.gather

Reproduz prompts, que um pressionamento de tecla interrompe, e coleta dígitos do teclado.

CampoValor
input.promptsObrigatório. Até 4 prompts. Cada um é {"type": "say", "text", "language"}, {"type": "play", "asset_id"}, {"type": "tone", "frequency_hz", "duration_ms"} ou {"type": "pause", "duration_ms"}, com os mesmos limites do nó correspondente. As durações de tom e pausa juntas são no máximo 60.000 ms. O text do prompt aceita binds.
input.max_digitsObrigatório. 1 a 32.
input.timeout_secondsObrigatório. Segundos de espera pela primeira tecla, 1 a 10.
input.inter_digit_timeout_secondsObrigatório. Segundos de espera entre teclas, 1 a 5.
input.finish_on_keyObrigatório. Um entre 0–9, *, #, A–D que encerra a entrada, ou null.
input.matchesObrigatório. Mapa de um nome de resultado para os dígitos exatos que o selecionam, como {"hours": "1"}. Nomes e dígitos devem ser únicos. Um nome não pode ser input, timeout ou fallback. Os dígitos têm no máximo max_digits de comprimento e não podem conter finish_on_key.
input.privateOpcional, padrão false. Quando true, os passos seguintes não conseguem ler os dígitos, e eles são omitidos do rastreamento.
ResultadosCada nome em matches, timeout quando nenhuma tecla é pressionada e fallback para qualquer outra entrada.
Saídadigits e reason: initial_timeout, max_digits, finish_key ou inter_digit_timeout.

Lógica e dados

logic.branch

Verifica as condições em ordem e segue a primeira que for verdadeira.

CampoValor
config.casesObrigatório. Pelo menos um {"port": "<name>", "when": {"$expr": "<boolean>"}}.
config.default_portObrigatório. Nome do outcome quando nenhum caso é verdadeiro.
OutcomesCada port em cases, e default_port.
Saídabranch: o nome do outcome selecionado.

data.set

Salva valores para etapas posteriores na mesma visita.

CampoValor
inputObjeto de valores, cada um dos quais aceita binds. Cada chave se torna variables.<key>. Todo valor é calculado a partir das variáveis como estavam antes deste nó.
Outcomenext.
OutputO objeto salvo.

Chamadas e transferências

voice.dial

Liga para outro número e conecta à chamada atual.

CampoValor
input.toObrigatório, binds. Número E.164, como +12025550123.
input.timeout_secondsObrigatório, expr. Segundos de toque, 1 a 120.
Resultadossuccess, busy, no_answer e failure. success ocorre depois que a chamada conectada termina e o áudio da chamada original é restaurado, não quando o destino atende. Um failure não conectado falha a execução.

logic.voice_goto

Inicia outra entrada na mesma definição. A nova visita recebe trigger.data novos e limpa as saídas e variáveis de etapas anteriores; a chamada continua.

CampoValor
input.entry_node_idObrigatório. ID de um nó trigger.start_call nesta definição.
input.dataOpcional, expr, padrão {}. Dados de entrada para o esquema desse nó.
ResultadosNenhum.

Encerramento da chamada

logic.exit

Encerra a chamada com um resultado.

CampoValor
config.statusObrigatório. succeeded ou failed.
config.reasonOpcional, expr. Código estável de letras minúsculas, dígitos e _, começando com uma letra ou dígito, até 64 caracteres. Omita-o em vez de enviar null.
input.outputObjeto obrigatório, que pode ser {}. Seus valores de nível superior aceitam binds.
ResultadosNenhum.

voice.hangup

Encerra a chamada sem um resultado definido pelo autor. Não tem campos nem resultados.

Etapas em acesso antecipado

voice.webhook, voice.record_start, voice.record_stop e logic.voice_goto com dependency_id para correio de voz gerenciado ou gravação de chamadas estão em acesso antecipado e não estão documentados aqui. Para usá-los, é necessário acesso para o seu espaço de trabalho.

Exemplo: transferir para uma pessoa

Esta definição cumprimenta o destinatário, disca um número de suporte e registra se a transferência foi conectada:

Exemplo de código
{
  "schema_version": 1,
  "expression_environment": "bird.cel.v1",
  "nodes": [
    {
      "id": "start",
      "type": "trigger.start_call",
      "type_version": 1,
      "config": {},
      "input": {},
      "connections": { "event": { "node_id": "greeting", "port": "input" } }
    },
    {
      "id": "greeting",
      "type": "voice.say",
      "type_version": 1,
      "config": {},
      "input": { "text": "Connecting you to our support team.", "language": "en" },
      "connections": { "next": { "node_id": "support", "port": "input" } }
    },
    {
      "id": "support",
      "type": "voice.dial",
      "type_version": 1,
      "config": {},
      "input": { "to": "+12025550123", "timeout_seconds": 30 },
      "connections": {
        "success": { "node_id": "connected", "port": "input" },
        "busy": { "node_id": "unavailable", "port": "input" },
        "no_answer": { "node_id": "unavailable", "port": "input" },
        "failure": { "node_id": "unavailable", "port": "input" }
      }
    },
    {
      "id": "connected",
      "type": "logic.exit",
      "type_version": 1,
      "config": { "status": "succeeded", "reason": "transferred" },
      "input": { "output": {} }
    },
    {
      "id": "unavailable",
      "type": "logic.exit",
      "type_version": 1,
      "config": { "status": "failed", "reason": "support_unavailable" },
      "input": { "output": {} }
    }
  ]
}

Envie como sequence.definition com "entry_node_id": "start" e "trigger_data": {}.

Continue com a documentação, guias e exemplos sobre este tópico.