Dashboard local¶
scripts/dashboard.py inicia o emulador FastAPI com um contexto moto de processo inteiro, cria a tabela DynamoDB em memória e executa Uvicorn. Não exige Docker, DynamoDB Local nem conta AWS para esse armazenamento. O chat usa o LLM configurado e pode chamar OpenAI real; adapters HTTP habilitados também podem produzir efeitos externos.
Iniciar e verificar¶
Faça o setup Python e configure o .env local com credenciais fora do Git. Para explorar apenas armazenamento local e chat OpenAI, mantenha WHATSAPP_CLOUD_ENABLED, HUBSPOT_ENABLED, EGESTOR_ENABLED e HANDOFF_NOTIFIER_ENABLED em false.
.\start.bat
Invoke-RestMethod http://localhost:8080/healthz
./start
curl --fail http://localhost:8080/healthz
O resultado esperado do health é {"ok":true}. Esse endpoint comprova somente que o processo HTTP respondeu; não consulta DynamoDB, OpenAI, Meta ou CRM. Abra http://localhost:8080 para as ferramentas de desenvolvimento e http://localhost:8080/atendimento para o fluxo autenticado de operadores.
Para ver o processo e os erros diretamente no terminal, use o ambiente Python ativo:
python scripts/dashboard.py
O runner carrega .env com os.environ.setdefault: variáveis previamente exportadas prevalecem. Configura DEV_UI_ENABLED=true somente se ainda não definido, remove overrides de endpoint DynamoDB que interfeririam no moto, e desliga o reload do Uvicorn para preservar o contexto simulado.
O contexto mock_aws() também alcança outros clientes boto3, como SES e SSM. Ele não bloqueia tráfego HTTP dos providers externos. Resultado de e-mail no contexto moto e entrega real por SES são evidências diferentes; use a CLI de smoke fora do runner para uma validação real autorizada.
Interface e ações¶
| Área | Implementação / uso | Efeito |
|---|---|---|
| Chat | POST /chat, formulário phone-input e content |
Processa síncrono, faz buffer/flush imediato e pode chamar OpenAI/adapters reais |
| Mídia | POST /media |
Exercita interceptação local e resposta fixa |
| Live logs | GET /dashboard/logs |
Exibe buffer de logs do processo |
| Scenarios | /dashboard/run-fixture/{name}, /dashboard/run-all-fixtures |
Replay com respostas gravadas e tabela temporária no moto |
| Knowledge | /dashboard/knowledge/{package_id} |
GET lê; POST altera CONTENT no arquivo Python do package e tenta recarregar módulo |
| Prompts | /dashboard/prompts/{agent_id} |
Visualiza prompt; gerenciamento de overrides versionados usa APIs admin separadas |
| Smokes | /dashboard/run-smoke/{target}, /dashboard/run-all-smokes |
Preflight ou execução real conforme formulário; ver flags de smoke |
| Atendimento | /atendimento |
Login por WhatsApp, fila colaborativa e envio humano |
| Admin | /admin, /admin/demands, /admin/llm-costs, /admin/alerts |
Inspeção e ferramentas locais; APIs JSON requerem chave |
chat_send() recebe instance-input e cliente-conhecido, mas atualmente ignora os dois parâmetros e infere pelo fluxo/sessão. Não use esses seletores como evidência de que o teste exercitou uma instância específica.
Limpar e encerrar¶
Clear chat chama POST /dashboard/clear-chat, apaga todos os itens de SESSION#<telefone> e o buffer DEBOUNCE#<telefone>/BUFFER. Isso inclui sessões e histórico nessa partição. Não é um mecanismo completo de apagamento de dados: projeções CRM, demandas e registros com outras PKs não são abrangidos.
POST /admin/reset tenta encerrar a sessão e substitui o ponteiro ativo por <reset>; não apaga todo o histórico. Limpar Live logs esvazia somente o buffer de memória, não arquivos nem CloudWatch. Reiniciar scripts/dashboard.py perde a tabela moto e seus dados.
.\stop.bat
./stop
Com o runner em primeiro plano, Ctrl+C encerra Uvicorn e fecha moto.
Limites operacionais encontrados¶
DASHBOARD_PORT é respeitada pelo runner (default 8080), mas os scripts start, start.bat e o fallback de stop.bat usam 8080 fixo. stop.bat encerra qualquer processo escutando nessa porta; confirme o processo se a porta foi reutilizada por outro serviço. O runner escuta 0.0.0.0, por isso ferramentas locais podem ficar acessíveis na rede da máquina se o firewall permitir.
Os launchers imprimem um prefixo de OPENAI_API_KEY no console. Use execução direta para evitar essa saída e não compartilhe logs brutos dos launchers. Em Linux, start usa open para abrir o navegador, comando típico do macOS; abra a URL manualmente quando ele não existir.
DEV_UI_ENABLED=false retorna 404 para superfícies de desenvolvimento. /healthz, /atendimento* e /admin/api/* passam pelo gate; as APIs admin mantêm sua própria validação de chave. Conhecimento salvo pela dashboard altera código-fonte: revise o diff e os testes antes de incorporar a alteração.
Testes relevantes: tests/unit/lambdas/test_emulator.py, especialmente chat síncrono, limpeza, fixtures, gate de desenvolvimento e atendimento. Diagnósticos: troubleshooting.