O WhatsApp é o canal de atendimento mais usado no Brasil e o mais hostil para qualquer classificador. A mensagem não chega como um e-mail bem formado: chega em cinco balões seguidos, sem pontuação, com gíria regional, com abreviação, com um áudio de quarenta segundos que virou uma transcrição sem vírgulas e com uma palavra trocada.
O Jev, modelo da TypeSafe AI, devolve decisões tipadas com probabilidade em vez de texto gerado — e, para esse canal, o valor não está só em acertar: está em avisar quando não sabe. Uma confiança baixa em um balão ambíguo é a diferença entre mandar o cliente para o time errado e pedir que ele explique melhor.
O que muda neste canal
Três coisas, e todas afetam o desenho antes de afetar o resultado.
A mensagem é fragmentada. “Oi” / “boa tarde” / “é sobre o pedido” / “número 8842” / “chegou quebrado” são cinco eventos e uma intenção. Classificar cada um isoladamente produz cinco decisões ruins.
O áudio vira texto imperfeito. A transcrição perde entonação, que é onde
mora metade do sentido em português falado, e às vezes troca palavras. Vale
marcar no state que aquele trecho é transcrição.
O registro do cliente existe e é curto. Diferentemente de um e-mail de contato, aqui você quase sempre sabe quem é. Isso permite mandar dois ou três campos úteis — e tenta você a mandar o histórico inteiro, o que piora a resposta.
O desenho das perguntas
Junte a janela de mensagens, transcreva o áudio antes e faça uma chamada por janela.
{
"state": {
"mensagens": [
"Oxe, boa tarde",
"baixei o aplicativo e num abre de jeito nenhum",
"fica só rodando aquela bolinha",
"[transcrição de áudio] meu celular é simples mas os outros aplicativos abrem tudo direitinho dá uma força aí por favor"
],
"cliente": {"plano": "Pré-pago", "meses_de_casa": 14},
"tem_pedido_aberto": false
},
"questions": {
"assunto": {
"type": "choice",
"instructions": "Qual o assunto principal desta conversa?",
"criteria": {
"duvida_tecnica": "Algo não funciona, dá erro, ou a pessoa não sabe usar.",
"pedido_e_entrega": "Status, prazo, endereço ou problema com uma entrega.",
"cobranca": "Fatura, valor, estorno, plano ou pagamento.",
"cancelamento": "Quer encerrar o serviço ou desfazer a compra.",
"elogio_ou_agradecimento": "Agradece ou elogia, sem pedir nada.",
"outro": "Não se encaixa em nenhum dos assuntos acima."
}
},
"urgencia": {
"type": "score",
"instructions": "Qual a urgência que a conversa expressa?",
"criteria": [
"Sem pressa declarada.",
"Quer resposta hoje ou amanhã.",
"Cita prazo curto ou prejuízo em andamento.",
"Situação parada agora, com impacto imediato."
]
},
"irritacao": {
"type": "score",
"instructions": "Qual o nível de irritação demonstrado pela pessoa?",
"criteria": [
"Cordial ou neutro.",
"Impaciente, mas educado.",
"Claramente irritado, com reclamação direta.",
"Hostil, com xingamento ou ameaça."
]
},
"quer_falar_com_humano": {
"type": "noul",
"instructions": "A pessoa pede para falar com um atendente, com uma pessoa ou com um supervisor?"
},
"cita_procon_ou_juridico": {
"type": "noul",
"instructions": "A conversa menciona Procon, advogado, processo ou órgão de defesa do consumidor?"
}
}
}
O array de mensagens é um formato aceito oficialmente para o state, e ele
preserva a ordem — que é informação. O detalhe de marcar a transcrição entre
colchetes é nosso: serve para lembrar quem lê o log depois, e para você poder
medir separadamente o desempenho em texto digitado e em áudio transcrito.
O que o código faz com a resposta
Piso de confiança primeiro. Neste canal o piso importa mais que nos outros, porque a mensagem é curta e ambígua com frequência. Abaixo do piso, a resposta certa não é adivinhar o setor: é perguntar. Um menu curto — “é sobre entrega, pagamento ou uso do aplicativo?” — resolve, e o custo de perguntar em uma conversa é muito menor que num e-mail.
Regras determinísticas depois. quer_falar_com_humano acima do corte
transfere, e ponto: ignorar um pedido explícito de atendente é o defeito mais
odiado de chatbot no Brasil. cita_procon_ou_juridico marca o caso e muda a
fila.
Combinação por último. Urgência e irritação ordenam a fila de atendimento humano.
a = r.answers["assunto"]
if r.answers["quer_falar_com_humano"].noul > 0.6:
return transferir_para_atendente(conversa)
if r.answers["cita_procon_ou_juridico"].noul > 0.6:
return fila_prioritaria(conversa, marcar="risco formal")
if a.confidence < PISO or a.choice == "outro":
return perguntar_menu(conversa)
prioridade = 0.6 * (r.answers["urgencia"].score / 3) \
+ 0.4 * (r.answers["irritacao"].score / 3)
rotear(conversa, fila=FILAS[a.choice], prioridade=prioridade)
O que medimos em português
Em 18 de setembro de 2026 fizemos cinco chamadas à API oficial com seis
perguntas cada, sobre textos de atendimento escritos em português do Brasil. O
modelo que respondeu foi o jev-1.13.0. A média de entrada foi 955 tokens e as
latências de ida e volta, medidas por quem chamou e portanto incluindo a rede,
ficaram entre 270 e 802 milissegundos. Cinco chamadas não são benchmark.
Três resultados importam para este canal:
- Regionalismo. “Oxe, baixei o aplicativo e num abre de jeito nenhum, fica só rodando aquela bolinha” saiu como dúvida técnica com 100% de probabilidade e 100% de confiança. Nenhuma dessas expressões aparecia nas descrições das opções.
- Ironia. “Nota dez para o atendimento, viu? Nunca vi tanta eficiência na minha vida” recebeu sentimento negativo com 98%, mas a categoria caiu em “Outro” com 79% e confiança 0,72. O modelo entendeu o tom e avisou que o enquadramento estava incerto.
- Ameaça de Procon. “Quero o estorno da cobrança indevida ou vou registrar reclamação no Procon” subiu o risco de cancelamento para 3,13 de 5, mas a pergunta sobre cancelamento ficou em 0,17 — o modelo separou “reclamar” de “cancelar”. A confiança de 0,63 na urgência é o aviso de que esse caso merece regra própria, e é por isso que ele virou um Noul no desenho acima.
Os cinco casos completos, com o texto de cada um, estão em o Jev funciona em português. Dá para rodar o seu próprio texto em playground.
Onde entra a pessoa
Sempre que o cliente pedir, sempre na faixa de irritação alta e sempre quando a confiança do assunto cai. O limiar acompanha o risco: transferir por engano custa alguns minutos de atendente; manter um cliente irritado conversando com um robô custa a conta e um print nas redes sociais.
Custo
Assumindo cem mil janelas de conversa por mês — suposição deste artigo — com 955 tokens de entrada por chamada: ao preço oficial de US$ 0,042 por milhão de tokens de entrada, com saída gratuita, e o dólar estimado em R$ 5,40, cada janela sai por cerca de R$ 0,00022 e o mês por cerca de R$ 21,66. A fórmula está em quanto custa uma decisão.
A latência importa tanto quanto o preço neste canal, e as nossas cinco medições ficaram entre 270 e 802 milissegundos de ida e volta — dentro do tempo de uma resposta que parece imediata em uma conversa.
Onde isso quebra
Mensagem curta demais. “Oi” não sustenta classificação nenhuma, e o modelo vai dizer isso pela confiança. A janela de agrupamento é a defesa.
Áudio mal transcrito. O erro entra antes do modelo. Se a transcrição trocou “não consigo pagar” por “não consigo pegar”, nenhuma pergunta conserta. Meça a qualidade da transcrição separadamente.
State grande. A tentação de mandar a conversa inteira dos últimos seis meses
é grande, e a documentação lista state grande cheio de detalhe irrelevante entre
os nove modos de falha declarados do jev-1.13. Mande a janela atual e dois ou
três campos do cadastro; o efeito está em
context rot.
Datas e valores. “A fatura venceu?” e “quanto ele já pagou?” são perguntas para o seu banco. O modelo lê data como texto e não é calculadora.
Emoji e figurinha. Entram como texto ou não entram; o modelo aceita texto apenas. Decida na sua camada de ingestão o que fazer com eles e seja consistente.
A lista completa dos limites está em limites do Jev, e os outros fluxos em casos de uso.
Perguntas frequentes
O modelo entende português informal do Brasil?
No nosso teste, sim, mas com ressalva. Em 18/09/2026 rodamos cinco chamadas contra a API oficial: um texto com 'oxe', 'num abre' e 'aquela bolinha' foi classificado como dúvida técnica com 100% de probabilidade e 100% de confiança. Cinco chamadas não são benchmark, e a documentação da TypeSafe declara que o inglês é a língua principal de treino.
Como lidar com mensagens quebradas em várias linhas?
Juntando antes de perguntar. Uma janela de alguns segundos que agrupa as mensagens seguidas do mesmo contato em um array de textos no state resolve quase tudo, e o formato de lista é aceito oficialmente. Classificar cada fragmento isolado é o erro mais comum desse canal.
Dá para usar áudio direto?
Não. O jev-1.13 aceita texto apenas: string, objeto JSON ou lista de textos, sem imagem, áudio ou vídeo. O áudio precisa passar por transcrição antes, e vale marcar no state que aquele trecho é transcrição, porque ela vem sem pontuação e com erro de palavra.
O modelo escreve a resposta para o cliente?
Não. Ele decide categoria, urgência e intenção; escrever é tarefa de um modelo generativo ou de um atendente. A documentação diz que o jev-1.13 não é treinado para gerar texto.
Quanto custa classificar cem mil mensagens por mês?
Com o perfil das nossas medições, 955 tokens de entrada por chamada, ao preço oficial de US$ 0,042 por milhão de tokens de entrada e com o dólar estimado em R$ 5,40, cem mil chamadas saem por cerca de R$ 21,66.
Ironia atrapalha a classificação?
Pode atrapalhar a categoria mais que o sentimento. No nosso teste com um texto irônico, o sentimento saiu negativo com 98% — a ironia passou — mas a categoria caiu em 'Outro' com 79% e confiança 0,72. Esse é exatamente o caso que deve ir para uma pessoa.