Pular para conteúdo

Integração com OpenAI real

tests/integration/test_scenarios.py executa conversas por process_message() com AgentInvokerImpl e o cliente OpenAI reais. As asserções são estruturais: estado, serviço, motivo de handoff, dados derivados e demandas. Elas não comparam literalmente toda a resposta do agente, pois a geração pode variar.

Ativação real

O módulo declara pytest.mark.integration e skipif(not os.environ.get("OPENAI_API_KEY")). Não há flag separada RUN_INTEGRATION_TESTS; uma chave presente já remove o skip. Pytest não carrega .env por conta própria neste arquivo. A chave deve ser disponibilizada no ambiente do processo por um mecanismo local seguro, sem colocá-la em um comando versionado.

O helper _deps() chama build_dependencies(load_settings(), table=table). A tabela vem de moto, mas providers HTTP habilitados em settings continuam podendo ser construídos. Para isolar a avaliação da OpenAI, desabilite WhatsApp, CRM, eGestor e notificador reais antes da execução.

$env:WHATSAPP_CLOUD_ENABLED = "false"
$env:HUBSPOT_ENABLED = "false"
$env:EGESTOR_ENABLED = "false"
$env:HANDOFF_NOTIFIER_ENABLED = "false"
python -m pytest -m integration tests/integration/test_scenarios.py -v --no-cov
WHATSAPP_CLOUD_ENABLED=false HUBSPOT_ENABLED=false EGESTOR_ENABLED=false \
  HANDOFF_NOTIFIER_ENABLED=false \
  python -m pytest -m integration tests/integration/test_scenarios.py -v --no-cov

Esses comandos pressupõem chave, modelos e settings obrigatórios já configurados no processo. Não executar esta suite automaticamente em tarefas de documentação. As chamadas consomem tokens e os resultados dependem de disponibilidade, permissões do projeto OpenAI, modelo e configuração.

Cenários e limites

drive_conversation() gera uma sequência de turnos por um telefone novo; seed_session() permite dados cadastrais e instância pré-configurados. Os cenários incluem identificação de serviço, pedido de humano, reclamação, saída do portfólio, qualificação e mecanismos globais. A quantidade efetiva é a coletada no checkout atual:

python -m pytest tests/integration/test_scenarios.py --collect-only -q
python -m pytest -m integration tests/integration/test_scenarios.py -k tc06 -v --no-cov

--collect-only não executa os corpos dos testes. test_tc05_audio_intercept_belongs_to_webhook é explicitamente ignorado: mídia é responsabilidade do webhook, não de process_message().

Algumas asserções aceitam mais de um estado legítimo; por exemplo, TC-02 aceita HANDOFF_PENDING como fallback de formato além do encaminhamento bem sucedido. Um verde nesse cenário, isoladamente, não comprova que a qualificação comercial seguiu o melhor caminho. Inspecione motivo de handoff e eventos de reparo do parser.

Evidência de uma execução

Registre commit, data, seleção, modelos, reasoning effort, quantidade de passes/skips/falhas e síntese sanitizada das divergências. Não copie chave, telefone, documento ou histórico cadastral. Separe uma falha de autenticação/rede de uma decisão errada do agente. Uma nova resposta inadequada deve virar fixture de regressão depois de anonimizada.

Não execute quando o objetivo for somente validar Markdown, quando não houver ambiente/projeto de teste autorizado, ou quando o ambiente estiver carregando integrações reais não desejadas. Para esses casos, use unit tests e replay explícito.