Ir para a navegação

Procedimentos estruturados

Uma sequência fixa de etapas tipadas que seu agente executa sempre da mesma forma

Visão geral

Um procedimento estruturado é um procedimento que executa uma sequência fixa de etapas. Um procedimento de formato livre é uma orientação em linguagem natural que o agente interpreta e adapta à situação. Um procedimento estruturado é uma lista ordenada de etapas tipadas que o agente executa na ordem definida sempre que o procedimento se aplica.

Use um procedimento estruturado quando etapas específicas precisarem ocorrer da mesma forma em todas as chamadas: verificar a identidade de quem liga, escalar um ticket ou processar um pagamento. Você o cria como uma lista curta de etapas em linguagem simples.

Como todo procedimento, um procedimento estruturado tem um gatilho que descreve quando ele se aplica. Quando uma conversa corresponde ao gatilho, o agente executa as etapas do procedimento em ordem e depois retorna ao restante da conversa.

Editor de procedimento
estruturado

Quando usar um procedimento estruturado

Use um procedimento estruturado quando etapas específicas precisarem ser executadas sempre da mesma forma, mas você ainda quiser criar rapidamente usando etapas simples. Procedimentos estruturados são mais fáceis de escrever do que um workflow, mas são menos expressivos. Para saber como eles se comparam a procedimentos de formato livre, workflows e ao prompt do sistema, consulte Quando usar procedimentos.

Anatomia de um procedimento estruturado

Um procedimento estruturado tem três partes: um nome, um gatilho e uma lista ordenada de etapas.

Nome

Um rótulo curto que identifica o procedimento no painel. O nome nunca é enviado ao LLM, portanto não afeta o comportamento do agente.

Gatilho

Uma descrição em linguagem simples de quando o agente deve executar este procedimento, por exemplo, Quando o usuário pedir o reembolso de um pedido. O agente compara a intenção do usuário com o gatilho de cada procedimento e executa o correspondente, então os gatilhos devem ser concretos e distintos. O agente vê apenas o texto do gatilho, nunca o nome ou o ID do procedimento. Um gatilho funciona da mesma forma que em qualquer procedimento; consulte Como escrever gatilhos.

Deixe o gatilho vazio para tornar o procedimento um subprocesso que só é executado quando outro procedimento o chama.

Etapas

O corpo do procedimento é uma lista ordenada de etapas tipadas. Há vários tipos de etapa, que você combina para descrever a tarefa.

EtapaO que faz
PerguntarPede informações ao usuário e aguarda. Continua perguntando até que o usuário responda. Esta é a única etapa que pausa para o usuário.
InformarFaz o agente comunicar algo com suas próprias palavras e depois seguir para a próxima etapa.
DizerFaz o agente falar uma mensagem exata, palavra por palavra, e depois seguir para a próxima etapa. Uma etapa Dizer pode ter uma tradução configurada especificamente para cada idioma compatível com o agente.
FerramentaChama uma ferramenta específica. Você pode instruir o LLM em linguagem simples sobre como chamar a ferramenta ou definir explicitamente valores de parâmetros quando for necessário o máximo de determinismo. Também é possível definir etapas para executar se a chamada da ferramenta falhar.
SeAvalia uma ou mais condições em ordem e executa as etapas da primeira correspondência. Um Senão opcional é executado quando não há correspondência.
SubprocedimentoExecuta outro procedimento estruturado. Quando suas etapas são concluídas, o controle retorna à próxima etapa deste procedimento (chamador).
Ferramenta do sistemaExecuta uma ação integrada do sistema. No momento, apenas encerrar a chamada é compatível.
Tentar novamenteExecuta novamente o manipulador de falha de uma etapa Ferramenta, incluindo a chamada da ferramenta, até três vezes. Disponível apenas dentro do manipulador de falha de uma etapa Ferramenta.

Menu de tipo de etapa de
procedimento estruturado

Nem todas as etapas podem aparecer em qualquer lugar. Dentro de uma ramificação Se, você pode usar qualquer etapa, exceto outro Se ou uma etapa Tentar novamente. Dentro do manipulador de falha de uma etapa Ferramenta, você pode usar qualquer etapa, exceto um Se ou outra Ferramenta.

Referência de etapas da API

O content de um procedimento estruturado é um documento codificado em JSON que contém um array steps. Cada etapa é um objeto identificado por seu type. O gatilho é um campo separado de nível superior no procedimento, não faz parte de content. As cargas úteis da API e do SDK usam type: "deterministic" para o próprio procedimento.

Perguntar

Uma etapa Perguntar instrui o agente a solicitar informações e aguardar até que o usuário forneça uma resposta adequada.

  • Tipo da API: ask
  • instruction: String obrigatória e não vazia.
{
"type": "ask",
"instruction": "Ask the user for their order ID."
}

Informar

Uma etapa Informar instrui o agente a gerar uma única mensagem com suas próprias palavras. Ela não aguarda uma resposta do usuário antes de continuar.

  • Tipo da API: tell
  • instruction: String obrigatória e não vazia.
{
"type": "tell",
"instruction": "Explain that the refund normally takes five to ten business days."
}

Dizer

Uma etapa Dizer fala o texto fornecido exatamente como foi escrito e depois continua. Forneça message_translations para dar ao agente uma mensagem exata para cada idioma adicional compatível com ele, identificada pelo código do idioma.

  • Tipo da API: say
  • message: String obrigatória e não vazia.
  • message_translations: Objeto opcional que mapeia um código de idioma para { "value": "..." }.
{
"type": "say",
"message": "Your refund has been submitted.",
"message_translations": {
"es": { "value": "Su reembolso ha sido enviado." }
}
}

Se, senão se e senão

Uma etapa Se contém uma ou mais ramificações condicionais ordenadas. A primeira ramificação correspondente é executada. O array fallback opcional é a ramificação Senão.

  • Tipo da API: branch
  • branches: Lista obrigatória e não vazia de ramificações condicionais.
  • fallback: Lista opcional de etapas Senão.
  • Cada ramificação exige uma condition e uma lista steps não vazia.
{
"type": "branch",
"branches": [
{
"condition": {
"type": "llm",
"condition": "The user is on an annual plan."
},
"steps": [
{
"type": "say",
"message": "Your annual plan is eligible for a prorated refund."
}
]
}
],
"fallback": [
{
"type": "tell",
"instruction": "Explain that the account's plan could not be determined."
}
]
}

Isso funciona como if/else-if/else:

  1. As condições são avaliadas em ordem.
  2. A primeira ramificação correspondente é executada.
  3. Se nenhuma condição corresponder, fallback é executado.
  4. Após o término de uma ramificação, o procedimento retorna à sequência principal.

O exemplo acima usa uma condição de texto, que o modelo avalia em linguagem natural. As condições também podem ser expressões sobre variáveis dinâmicas:

{
"type": "expression",
"expression": {
"type": "eq_operator",
"left": {
"type": "dynamic_variable",
"name": "plan_tier"
},
"right": {
"type": "string_literal",
"value": "annual"
}
}
}

Uma condição de expressão testa variáveis dinâmicas, que são preenchidas por resultados de ferramentas ou definidas quando a conversa começa. Ela não pode ler a resposta mais recente do usuário. Para criar uma ramificação com base no que o usuário disse, use uma condição de texto.

Todas as ramificações de uma etapa Se devem usar o mesmo tipo de condição: llm ou expression.

Ferramenta

Uma etapa Ferramenta chama uma ferramenta específica.

  • Tipo da API: tool_call
  • tool_id: ID da ferramenta obrigatório e não vazio. A ferramenta deve estar associada ao agente.
  • tool_name: Nome obrigatório da ferramenta, que deve corresponder à ferramenta.
  • instruction: Instrução opcional que descreve como chamar a ferramenta.
  • schema_overrides: Valores fixos opcionais para os parâmetros da ferramenta.
  • on_failure: Manipulador de falha opcional.
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "lookup_order",
"instruction": "Look up the order using the order ID provided by the user."
}

Valores fixos de parâmetros

Use schema_overrides quando um parâmetro sempre precisar ter um valor específico. O modelo não vê nem escolhe um parâmetro substituído. As chaves são caminhos de parâmetros no esquema da ferramenta; cada valor nomeia uma origem:

sourceCamposComportamento
constantconstant_valueSempre envia o valor informado.
dynamic_variabledynamic_variableEnvia o valor atual da variável dinâmica nomeada.
llmprompt (opcional)Permite que o modelo escolha o valor, com uma substituição opcional de prompt.
omitOmite o parâmetro da chamada.
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "update_ticket",
"schema_overrides": {
"request_body.status": { "source": "constant", "constant_value": "pending" },
"request_body.ticket_id": { "source": "dynamic_variable", "dynamic_variable": "ticket_id" }
}
}

Tratamento de falhas

Sem on_failure, uma chamada de ferramenta com falha encerra a conversa. Adicione on_failure para executar etapas de recuperação.

  • fallback: Lista obrigatória e não vazia de etapas executadas quando a ferramenta falha.
  • branches: Reservado para tratamento condicional de falhas. Deixe vazio.
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "lookup_order",
"on_failure": {
"branches": [],
"fallback": [
{
"type": "tell",
"instruction": "Explain that the order could not be retrieved and offer to connect the user with support."
}
]
}
}

Um manipulador de falha pode conter etapas Perguntar, Informar, Dizer, Subprocedimento, Ferramenta do sistema e Tentar novamente. Ele não pode conter etapas Ferramenta ou Se. Após a execução do manipulador, o procedimento continua com a etapa após a etapa Ferramenta.

Tentar novamente

Uma etapa Tentar novamente executa de novo o manipulador de falha que a contém, incluindo a chamada da ferramenta. Cada tentativa chama a ferramenta novamente e, se ela falhar outra vez, executa todas as etapas do manipulador novamente. Quando as tentativas se esgotam, a conversa é encerrada.

  • Tipo da API: retry
  • max_retries: Número inteiro opcional de 1 a 3. O padrão é 1.
  • O valor conta as tentativas após a chamada original da ferramenta.
  • Tentar novamente é válido apenas dentro de on_failure.
  • Tentar novamente deve ser a etapa final em seu manipulador de falha, pois as etapas posteriores seriam inacessíveis.
{
"type": "retry",
"max_retries": 2
}

Subprocedimento

Uma etapa Subprocedimento executa outro procedimento estruturado. Quando as etapas desse procedimento são concluídas, a execução retorna à etapa após a etapa Subprocedimento.

  • Tipo da API: sub_procedure
  • procedure_id: ID do procedimento obrigatório e não vazio.
  • O destino deve existir no mesmo agente.
  • O destino deve ser um procedimento estruturado.
  • Um procedimento não pode invocar a si mesmo.
{
"type": "sub_procedure",
"procedure_id": "agtprc_6qbpwdq8n01bxhk44bgjy6f10ck3"
}

Ferramenta do sistema

Uma etapa Ferramenta do sistema executa uma ação integrada do sistema.

  • Tipo da API: system_tool
  • system_tool_name: Nome obrigatório da ferramenta do sistema.
  • No momento, apenas end_call é compatível. Mais ferramentas do sistema poderão ser adicionadas futuramente.
  • Como end_call é terminal, deve ser a etapa final na sequência, ramificação ou manipulador de falha que o contém.
{
"type": "system_tool",
"system_tool_name": "end_call"
}

Regras de validação

A publicação do agente ou o salvamento do rascunho do agente rejeita um procedimento estruturado que viola qualquer uma destas regras. O erro indica a etapa com problema pelo respectivo caminho.

  • Duas etapas Se não podem ser colocadas uma após a outra.
  • Etapas Se não podem ser aninhadas.
  • Uma etapa Se com condições de expressão não pode vir diretamente após uma etapa Perguntar.
  • Todas as condições em uma etapa Se devem ser do mesmo tipo: llm ou expression.
  • Tentar novamente só pode aparecer dentro de on_failure e deve ser a última etapa nesse local.
  • end_call deve ser a última etapa em qualquer lista em que apareça.
  • O fallback de um manipulador de falha deve conter pelo menos uma etapa.
  • Um Subprocedimento deve apontar para um procedimento estruturado existente no mesmo agente e não para ele próprio.
  • tool_id deve ser uma ferramenta do agente, tool_name deve corresponder, e schema_overrides deve corresponder ao esquema da ferramenta.
  • A lista steps, cada instruction e cada message devem ser não vazios.

Para saber como reestruturar um procedimento que viola uma dessas regras, consulte Boas práticas.

Exemplo completo de API

Este exemplo processa o cancelamento de um pedido com base no status de envio. Ele fixa um parâmetro de ferramenta, se recupera de uma chamada de ferramenta com falha, invoca outro procedimento estruturado e então encerra a chamada.

{
"steps": [
{
"type": "ask",
"instruction": "Ask the user for their order ID."
},
{
"type": "branch",
"branches": [
{
"condition": {
"type": "llm",
"condition": "The user says the order has already shipped."
},
"steps": [
{
"type": "tell",
"instruction": "Explain that shipped orders must be returned before they can be refunded."
}
]
},
{
"condition": {
"type": "llm",
"condition": "The user says the order has not shipped."
},
"steps": [
{
"type": "tool_call",
"tool_id": "tool_abc123",
"tool_name": "cancel_order",
"instruction": "Cancel the order using the order ID provided by the user.",
"schema_overrides": {
"request_body.notify_customer": { "source": "constant", "constant_value": true }
},
"on_failure": {
"branches": [],
"fallback": [
{
"type": "tell",
"instruction": "Apologize that the cancellation did not go through and say you will try once more."
},
{
"type": "retry",
"max_retries": 1
}
]
}
}
]
}
],
"fallback": [
{
"type": "ask",
"instruction": "Ask whether the order has already shipped."
}
]
},
{
"type": "sub_procedure",
"procedure_id": "agtprc_6qbpwdq8n01bxhk44bgjy6f10ck3"
},
{
"type": "say",
"message": "Thank you for contacting us. Goodbye.",
"message_translations": {
"es": { "value": "Gracias por contactarnos. Adiós." }
}
},
{
"type": "system_tool",
"system_tool_name": "end_call"
}
]
}

Como um procedimento estruturado é executado

Transformar as etapas de um procedimento estruturado no formato que o agente executa é chamado de compilação. A plataforma compila todos os procedimentos estruturados quando o rascunho do agente é salvo ou o agente é publicado; quem cria os procedimentos nunca precisa compilar nada.

Quando a solicitação do usuário corresponde ao gatilho de um procedimento, a plataforma entra no procedimento e executa suas etapas em ordem. Dentro do procedimento estruturado, o agente se concentra em cada etapa isoladamente. Quando chega ao fim, a plataforma devolve o controle ao restante da conversa.

As conexões de workflow não podem apontar para nem partir de um procedimento estruturado. Use uma etapa Subprocedimento para encadear procedimentos estruturados. A plataforma gerencia a entrada por um gatilho correspondente e a conclusão, incluindo devolver o controle ao nó do workflow em que o procedimento começou.

As regras a seguir descrevem o comportamento das etapas em tempo de execução.

Todas as etapas, exceto Perguntar, são executadas imediatamente, e o controle passa para a próxima etapa no mesmo turno. Uma etapa Informar ou Dizer entrega sua mensagem e continua. Não há etapa que pause a conversa além de Perguntar, nem etapa que encerre o turno atual. Se precisar da entrada do usuário, use uma etapa Perguntar. Se a conversa precisar ser encerrada, use a ferramenta do sistema end_call.

Quando a última etapa é concluída, o procedimento termina e o agente retorna ao restante da conversa com o turno ainda aberto, portanto pode falar mais. Quando um subprocedimento é concluído, o controle retorna à próxima etapa do procedimento que o chamou.

Uma etapa Ferramenta não pode criar ramificações com base em um código de status ou no corpo da resposta. Se a ferramenta for bem-sucedida, o procedimento continua. Se ela falhar e a etapa não tiver um manipulador de falha, a conversa será encerrada. Se houver um, as etapas do manipulador são executadas e o procedimento continua para a próxima etapa. Uma etapa Tentar novamente dentro do manipulador executa de novo a ferramenta e, se ela falhar outra vez, todas as etapas do manipulador, até que a ferramenta seja bem-sucedida ou as tentativas se esgotem. Se elas se esgotarem, a conversa será encerrada.

As condições são avaliadas em ordem, e a primeira correspondência é executada. A ramificação Senão é executada quando não há correspondência. Se não houver Senão e nada corresponder, o procedimento continua com a etapa após o Se. Um caso não tratado não é um erro.

Nada decidido dentro de uma ramificação Se é lembrado pelas etapas posteriores. Se algo aprendido em uma ramificação for necessário depois, persista-o explicitamente com uma chamada de ferramenta ou uma variável dinâmica.

Apenas etapas Ferramenta podem chamar ferramentas. Não é necessário instruir uma etapa Perguntar, Informar ou Dizer a não chamar ferramentas; ela não pode fazer isso.

Gerenciar um procedimento estruturado

Abra seu agente no painel e selecione Procedimentos. Use + para criar um procedimento estruturado. Adicione um gatilho, selecione um tipo para cada etapa e publique as alterações do agente.

O painel valida procedimentos estruturados enquanto você os edita. Se um procedimento violar uma regra de validação, o botão Publicar exibirá um estado de erro, a aba Procedimentos exibirá um indicador de erro e a prévia não poderá iniciar até que o procedimento seja corrigido. Selecione o indicador de erro para ver qual procedimento e etapa foram afetados.

Editor de procedimento estruturado com o botão Publicar no estado de erro e um indicador de
1 erro

Caixa de diálogo de detalhes de validação que lista o procedimento com falha e a etapa que precisa de uma
mensagem

Práticas recomendadas

Cada tipo de etapa já impõe seu próprio comportamento, então você raramente precisa explicá-lo. Escreva a intenção de cada etapa e deixe que o tipo de etapa faça o resto. As orientações abaixo abordam os casos que vale a pena acertar.

Para testar um procedimento estruturado, siga Iterando em um procedimento.

Escolhendo tipos de etapa

Uma etapa Ask espera uma resposta. Se você agrupar várias perguntas em uma única instrução, o agente tende a pular algumas ou juntá-las. Use uma etapa Ask para cada informação.

Uma etapa Tell transmite sua mensagem e segue adiante sem esperar. Uma etapa Tell formulada como pergunta nunca recebe uma resposta. Se uma etapa precisa de uma resposta do usuário, ela é uma Ask.

Uma etapa Ask avança quando recebe uma resposta adequada. Se o que conta como resposta não estiver claro na pergunta, informe isso na instrução, por exemplo, _Peça o ID do pedido; um ID válido tem oito dígitos _.

Use uma etapa Tell quando o agente deve compor a própria mensagem e uma etapa Say quando a redação precisa ser literal ou traduzida. Ambas transmitem exatamente uma mensagem, então não é necessário instruir uma etapa a enviar uma única mensagem.

As etapas Ask, Tell e Say não podem chamar ferramentas. Escrever não chame nenhuma ferramenta nelas adiciona ruído à instrução sem mudar o comportamento.

Estruturando o procedimento

Duas etapas If não podem ser colocadas uma após a outra. Inserir uma etapa Tell ou Say sem relação entre elas para cumprir a regra faz o agente dizer algo que não deveria. Em vez disso, incorpore a segunda decisão à primeira etapa If como ramificações Else if adicionais ou mova-a para um subprocedimento.

Etapas If não podem ser aninhadas. Quando uma decisão depende de outra, coloque a decisão interna em seu próprio procedimento estruturado e chame-o com uma etapa Sub-procedure a partir da ramificação que precisa dela.

Uma etapa If sem Else passa para a próxima etapa quando nada corresponde. Se o caso sem correspondência precisar se comportar de outra forma, adicione uma ramificação Else para ele.

Decisões tomadas dentro de uma ramificação If não são lembradas depois. Se uma etapa posterior depender de algo aprendido em uma ramificação, registre isso com uma chamada de ferramenta ou uma variável dinâmica dentro da ramificação.

Condições de expressão testam variáveis dinâmicas. Coloque uma etapa If que as use logo após a etapa Tool que define essas variáveis. Para ramificar com base no que o usuário disse, use uma condição de texto.

Quando vários procedimentos estruturados compartilham a mesma sequência, como encaminhar para uma pessoa, coloque-a em um procedimento estruturado com um gatilho vazio e chame-o a partir de cada um. Sequências copiadas se tornam diferentes com o tempo.

Trabalhando com ferramentas

Uma etapa Tool sempre chama sua ferramenta. Uma condição escrita na instrução, como _pule isto se o ticket já estiver marcado _, não pode impedir a chamada. Se a chamada não deve sempre acontecer, coloque a condição em uma etapa If antes da etapa Tool.

Quando um parâmetro precisa sempre assumir um valor específico, defina-o com uma substituição constant em schema_overrides. Uma instrução como sempre defina o status como pendente pede que o modelo cumpra isso; uma substituição é aplicada e não pode ser ignorada.

Sem on_failure, qualquer falha de ferramenta encerra a conversa. Adicione um manipulador que informa ao usuário o que aconteceu e tenta novamente, encaminha ou continua.

Uma etapa Tool executa apenas a ferramenta; o agente não pode falar nem tomar uma decisão durante ela. Para falar com o usuário ou ramificar com base no que a ferramenta retornou, coloque isso em uma etapa separada antes ou depois da etapa Tool.

Escrevendo instruções

O procedimento controla o que será executado em seguida, e o agente não sabe das etapas posteriores enquanto executa a atual. Deixe que a ordem das etapas faça o sequenciamento.

Frases escritas nas instruções da etapa, como esta é a última mensagem deste turno, pedem ao agente que imponha um limite que a plataforma não oferece. Use uma etapa Ask para esperar pelo usuário ou a ferramenta do sistema end_call para encerrar a conversa.

Tom, formatação, despedidas e políticas de recusa pertencem ao prompt do sistema. A instrução de uma etapa deve informar apenas o que é específico daquela etapa.

Compondo procedimentos

As orientações gerais para compor procedimentos também se aplicam a procedimentos estruturados; consulte Compondo procedimentos na página de procedimentos de formato livre.

Um padrão é específico da combinação de tipos: um procedimento de formato livre pode fazer referência a um estruturado. Mantenha o tratamento aberto em um procedimento de formato livre e delegue as partes que precisam ser executadas sempre da mesma maneira, como verificação de identidade ou encaminhamento, a um procedimento estruturado.

Limitações

  • Etapas If não podem ser aninhadas, e duas etapas If não podem ser colocadas uma após a outra.
  • A única ferramenta de sistema compatível é end_call.
  • Procedimentos estruturados não podem fazer referência a documentos da base de conhecimento.
  • Não há como encerrar o turno atual quando um procedimento é concluído; o agente mantém o turno aberto e pode continuar falando.
  • As arestas do workflow não podem se conectar a um procedimento estruturado nem partir dele. Use uma etapa Sub-procedure para encadear procedimentos estruturados; a entrada e a conclusão são gerenciadas pela plataforma.
  • Iniciar um procedimento adiciona latência: o agente faz uma chamada de ferramenta para entrar nele e depois avança pelo workflow gerado.

Suporte de provedores de modelos

Procedimentos estruturados forçam chamadas internas de ferramentas ao entrar em um subprocedimento e ao concluir um procedimento. As principais famílias de modelos OpenAI, Anthropic, Gemini e Grok oferecem suporte à escolha forçada de ferramenta. Outros modelos ou provedores personalizados podem não garantir isso, o que pode tornar as transições de subprocedimentos ou a conclusão de procedimentos menos confiáveis. Verifique o suporte à escolha forçada de ferramenta ao usar outro provedor de modelos.

Consulte Procedimentos para ver limites que se aplicam a todos os procedimentos, incluindo o limite de tamanho do conteúdo e como os procedimentos estruturados diferem dos de formato livre.