Contrato FALHA_CONSULTA¶
Mecanismo central de comunicação de erro entre as tools e o agente. Sem ele, o LLM tenta adivinhar / inventar horários.
Definição¶
Quando a tool falha por qualquer motivo "controlado" (timeout, dado
inconsistente, convênio não aceito, agenda vazia), retorna uma string
que começa com FALHA_CONSULTA:.
Todos os prefixos conhecidos:
FALHA_CONSULTA: medico 'X' nao possui agendamento automatico
FALHA_CONSULTA: medico 'X' nao encontrado
FALHA_CONSULTA: convenio nao encontrado: Y
FALHA_CONSULTA: procedimento 'Z' nao encontrado
FALHA_CONSULTA: agenda sem horarios disponiveis
FALHA_CONSULTA: nenhum medico tem horarios disponiveis
FALHA_CONSULTA: erro ao consultar horarios apos 2 tentativas
FALHA_CONSULTA: agenda retornada nao bate com o medico esperado
FALHA_CONSULTA: slot indisponivel (pode ter sido ocupado)
FALHA_CONSULTA: cadastro de paciente falhou
FALHA_CONSULTA: erro interno: <detalhe>
FALHA_CONSULTA: resposta vazia
Regras para o agente (no system prompt)¶
SE uma ferramenta retornar string iniciando com "FALHA_CONSULTA":
1. NAO tente chamar a ferramenta novamente no mesmo turno.
2. NAO invente horarios, datas, ou confirmacoes.
3. Responda ao paciente que houve uma dificuldade e transfira.
4. Chame transferir_atendimento(motivo="FALHA_CONSULTA + detalhe").
Tratamento típico pelo agente¶
Paciente: "Pode marcar amanha as 14h com a Dra Joana?"
Tool consultar_horarios(...) -> "FALHA_CONSULTA: agenda sem horarios disponiveis"
Agente (mensagem final):
"Não encontrei horários disponíveis na agenda da Dra. Joana no momento.
Vou te encaminhar para um atendente que consegue verificar alternativas."
Tool transferir_atendimento(motivo="FALHA_CONSULTA: agenda sem horarios") -> OK
Por que não exceção¶
Se a tool lança exceção, o agente aborta (LangGraph transforma em erro). O workflow captura e devolve fallback genérico — mas o agente não tem chance de escolher uma mensagem boa para o paciente.
FALHA_CONSULTA dá ao LLM uma oportunidade de parafrasear o erro em
linguagem natural apropriada ao contexto.
Logs¶
Toda FALHA_CONSULTA deve deixar rastro:
logger.error("FALHA: %s", mensagem)
log_error(error_type="falha_consulta", error_message=mensagem, ...)
Dashboard/alertas podem agrupar por motivo e alertar se volume sobe.
E os erros "não-controlados"?¶
Exceções não previstas (ex: json.JSONDecodeError pois OTIMUS devolveu
HTML) sobem. O run_agent captura, loga em dashboard_errors, e
retorna uma mensagem genérica:
E transfere a sessão.
Não use FALHA_CONSULTA para sucesso-parcial¶
Se a tool tem resposta mas incompleta (ex: 1 slot em vez de 4), retorne o que tem. Deixe o agente decidir o que fazer.
FALHA_CONSULTA é não-actionable: o agente deve transferir, não
tentar continuar.