Quick Start¶
Este guia dá o caminho mais curto para rodar localmente um projeto OTIMUS existente (MEDCENTER ou CLINFETO). Para começar um projeto novo do zero, vá direto para o checklist.
Pré-requisitos¶
- Docker + Docker Compose
- Acesso às credenciais:
OPENAI_API_KEY,GEMINI_API_KEY,WTS_API_TOKEN, token OTIMUS da clínica - Acesso SSH ao servidor de produção (se for replicar config)
1. Clone do repositório de um projeto existente¶
2. Arquivo .env¶
Crie baseado no .env.template:
# --- LLMs ---
OPENAI_API_KEY=sk-...
GEMINI_API_KEY=AI...
# --- WTS Chat ---
WTS_API_TOKEN=...
WTS_BASE_URL=https://api.wts.chat
WTS_CHANNEL_ID=...
WTS_DEPARTMENT_HUMAN_ID=...
WTS_DEPARTMENT_AI_ID=...
# --- Workflow ---
ALLOWED_INSTANCE=+5599999999999
ALLOWED_TEAM=IA ATENDIMENTOS
MESSAGE_DEBOUNCE_SECONDS=2
CONTEXT_WINDOW_LENGTH=50
# --- Database ---
DATABASE_URL=postgresql://user:pass@host:5432/projeto
# --- OTIMUS ---
OTIMUS_API_URL=https://<subdominio>.otimusclinic.com:<porta>
OTIMUS_TOKEN=<token-da-clinica>
Token OTIMUS
Nunca commitar. No MEDCENTER o token está hardcoded em scheduling.py
— esse é um débito técnico, ver problema.
3. Subir o stack¶
Container expõe :8000. Verifique:
4. Schema do banco¶
O init.sql roda na inicialização do container Postgres via volume ou manualmente:
As tabelas LangGraph (checkpoint*) são criadas em runtime pelo
PostgresSaver.setup() — primeiro boot pode demorar mais.
5. Registrar webhooks no WTS¶
No painel WTS Chat:
- Message received →
https://<seu-dominio>/webhook/message - Transfer request (se aplicável) →
https://<seu-dominio>/webhook/transfer
6. Testar ponta-a-ponta¶
Enviar mensagem de um número de paciente para a instância WhatsApp e verificar:
- Logs do container (
docker logs -f medcenter-chatbot) - Linha em
dashboard_sessionscom phone + status - Linha em
dashboard_token_usagecom modelo e custo - Histórico em
dados_cliente_<projeto>(ou tabelas checkpoint LangGraph)
7. Simular chamada OTIMUS isoladamente¶
Para debugar só o cliente OTIMUS, sem WhatsApp:
# medcenter
from scheduling import consultar_horarios
print(consultar_horarios("MAURICIO", "CONSULTA ORTOPEDISTA", "PARTICULAR"))
# clinfeto
from agendamento import consultar_horarios_workflow
print(consultar_horarios_workflow({
"nome_medico": "JOANA",
"nome_procedimento": "US ABDOME TOTAL",
"nome_convenio": "PARTICULAR",
}))
8. Logs úteis¶
- Webhook recebido:
workflow.pyimprime o payload filtrado. - Tool do agente:
scheduling.py/agendamento.pyloga=== CONSULTAR HORARIOS ===e=== AGENDAR CONSULTA ===. - OTIMUS raw: quando der erro, inspecione
resp.text— o OTIMUS às vezes retorna 200 comdatasendo string de erro (ex:"O CPF informado não foi encontrado.").