Pular para conteúdo

Hardcoding crítico

Lista de dados que deveriam ser externos (env, DB, config) mas estão hardcoded em código ou prompt. Essa página serve de inventário para eliminar dívida em refatorações futuras.

Token OTIMUS

Status: só o Medcenter.

# scheduling.py:26-32 (MEDCENTER)
OTIMUS_BASE_URL = "https://medcenteracai-node.otimusclinic.com/api/v1"
OTIMUS_HEADERS = {
    "sistema": "AGENTPRO",
    "token": "aWqBPKOwKwMZW8iyuiHb7A5SDtccTDwESrDEJ697774a4b1e96",
    ...
}

Risco: token em git history. Se o repo for compartilhado, token vaza.

Correção: mover para .env e config.OTIMUS_TOKEN — padrão do Clinfeto.

Clinfeto também hardcoda como default

config.py:55 tem:

OTIMUS_TOKEN = os.getenv("OTIMUS_TOKEN", "P5cZSLEqzMHHKVuBGj51TLtuxlgpaXaQP55fA697d03ecf0142")
O default em código é um antipadrão — ajustar para os.getenv("OTIMUS_TOKEN", "") e falhar em tempo de boot se vazio.

"id": 123 no cadastro de paciente

Status: ambos os projetos.

payload = {
    "pacientes": [
        {"id": 123, "nome": ..., ...}
    ]
}

Risco: OTIMUS aparentemente ignora, mas contrato não garante. Se em alguma versão passar a respeitar, todos os pacientes novos ficam com id=123 ou o cadastro falha silenciosamente.

Correção: testar em stage com "id": 0 ou omitir o campo. Confirmar comportamento com contato OTIMUS. Remover valor mágico.

Lista de médicos / convênios / procedimentos

Status: ambos — é por design hoje.

Em scheduling.py (MEDCENTER) e agendamento.py (CLINFETO), todos os IDs OTIMUS estão em constantes Python.

Risco:

  • Qualquer mudança (médico novo, preço novo, convênio removido) = redeploy.
  • Fricção alta para atualizar → instrução desatualizada no prompt → agente diz coisa errada.

Correção (evolução):

  • Carregar de YAML em disco no start do container:
    import yaml
    with open("clinica.yaml") as f:
        clinica = yaml.safe_load(f)
    PROCEDIMENTOS = clinica["procedimentos"]
    CONVENIOS = clinica["convenios"]
    
  • Ou, melhor: carregar de uma tabela Postgres clinica_config atualizada via painel admin. Recarregar com um endpoint POST /admin/reload.

Tabela de preços no prompt (MEDCENTER)

Status: agent.py:339-649 — ~311 linhas.

Juliana Dos Santos Araujo - R$500,00 em ate 2x ou R$450,00 a vista.
Felipe Xavier - R$350,00 em ate 2x ou R$320,00 a vista.
...
USG abdome inferior - R$200,00 (R$180,00 a vista).

Risco:

  • Atualização de preço requer redeploy.
  • Tabela no prompt ocupa ~8k tokens → custo 7-10% maior por chamada.
  • Prompt fica gigante → dificulta manutenção.

Correção: criar tool get_preco(procedimento: str, convenio: str) -> str que consulta uma tabela no DB. O agente chama sob demanda. Prompt fica 300 linhas mais curto.

Telefones exclusivos (MEDCENTER)

Status: agent.py:226-230.

- (99) 99144-0979 → SOMENTE para agendar com a Dra. Ana Claudia
- (99) 98489-3521 → SOMENTE com a Dra. Silvana

Risco: se o número muda, paciente é direcionado para o lugar errado.

Correção: mover para tabela clinica_contatos no DB. Tool get_contato(medico: str) devolve.

Horários de atendimento de cada médico (MEDCENTER)

Status: agent.py:652-662.

Mauricio Siqueira Camilo (Ortopedia): Quarta (manha) as 08h00;
Segunda, terca, quinta e sexta (tarde) as 13h00.

Risco: médico muda horário → prompt desatualizado → agente oferece horário que não existe.

Correção: esta informação já vem do OTIMUS via /agendamento/horarios. O prompt deveria apenas instruir o LLM a consultar a ferramenta em vez de listar horários estáticos.

Regras de exceção (médicos desativados)

Status: MEDCENTER — agent.py:215-221 (Ellen Thais, Diogo Sales).

Risco: médico volta e alguém esquece de remover do prompt.

Correção: flag ativo: bool na config da clínica. Médicos inativos aparecem no prompt como "de licença" dinamicamente.

ALLOWED_INSTANCE com default hardcoded

Status: config.py:26 (MEDCENTER).

ALLOWED_INSTANCES = [i.strip() for i in os.getenv("ALLOWED_INSTANCE", "+5599991220558").split(",") ...]

Risco: se esquecer de setar a env em staging/dev, o container aceita webhooks do número de produção. Pode processar mensagens de pacientes reais em ambiente errado.

Correção: default "" e falhar no boot se vazio.

timezone hardcoded

Status: ambos — "America/Sao_Paulo".

Risco: se uma clínica for implantada fora do Brasil, horários quebram.

Correção: env CLINIC_TZ=America/Sao_Paulo e usar em zoneinfo.ZoneInfo(CLINIC_TZ).

Taxa USD → BRL no tracking

Status: tracking.py — valor 5.70 fixo.

Risco: cálculo de custo BRL desvia da realidade com variação cambial.

Correção: env USD_BRL_RATE ou consumir API de cotação uma vez por dia.

Resumo executivo

Item Urgência Esforço
Token OTIMUS em git alta baixo
"id": 123 no cadastro média baixo
Lista médicos/convênios fora do prompt média alto
Preços fora do prompt alta médio
Horários do prompt média baixo
Médicos desativados como flag baixa baixo
ALLOWED_INSTANCE default alta trivial
TZ configurável baixa trivial
Taxa USD/BRL dinâmica baixa médio