Pular para conteúdo

Resolver convênio por nome

Transforma nome livre do convênio → convenio_id numérico.

Estrutura de dados

# scheduling.py:64-71 (MEDCENTER)
CONVENIOS = [
    {"id": 1,  "convenio": "PARTICULAR"},
    {"id": 19, "convenio": "NOTREDAME"},
    {"id": 26, "convenio": "SEPACO"},
    {"id": 30, "convenio": "VALE"},
    {"id": 39, "convenio": "AURA SAUDE"},
]
# agendamento.py:38-51 (CLINFETO)
CONVENIOS = {
    212: "PARTICULAR",
    213: "DIGNA",
    214: "BRADESCO SAUDE",
    215: "UNIMED - CAMPINA GRANDE",
    217: "APSEF SAUDE",
    218: "A VIAGEM",
    219: "PLAFAM",
    220: "SAFVIDA",
    221: "UNIMED - INTERCAMBIO",
    224: "FUSEX",
    230: "GEAP",
    231: "SAUDE CAIXA",
}

Use o formato dict (CLINFETO). É mais compacto e lookup por ID fica O(1).

Função de busca

def buscar_convenio(nome: str) -> int | None:
    norm = _normalize(nome)
    # Match exato
    for cid, cname in CONVENIOS.items():
        if _normalize(cname) == norm:
            return cid
    # Match parcial (substring em qualquer direção)
    for cid, cname in CONVENIOS.items():
        cn = _normalize(cname)
        if norm in cn or cn in norm:
            return cid
    return None

Mapeamento convênio → lista para o LLM

No system prompt, mostre a lista exata de convênios aceitos:

Convênios disponíveis:
- PARTICULAR
- DIGNA
- BRADESCO SAUDE
- UNIMED - CAMPINA GRANDE
- APSEF SAUDE
- FUSEX
- GEAP
- SAUDE CAIXA

Se o paciente disser um convênio não listado, a tool retorna FALHA_CONSULTA e o agente transfere para humano.

Particular é um convênio

Sempre cadastre "PARTICULAR" como convênio no OTIMUS e na lista. O fluxo é idêntico aos demais. Na clínica, ele só muda o preço / forma de pagamento — no chatbot, é só mais um convenio_id.

Normalização e acentos

Convênios nos projetos atuais estão em caixa alta sem acentos:

"UNIMED - CAMPINA GRANDE"    # ok
"Unimed Nacional"            # ruim — inconsistente
"SAÚDE CAIXA"                # ruim — acento

O _normalize() remove acentos e uppercase, então tecnicamente funciona, mas manter o dado-fonte já normalizado evita bug.

Como descobrir os IDs

O OTIMUS não expõe endpoint público de listagem de convênios no padrão de integração. Os IDs foram fornecidos pela clínica via suporte OTIMUS.

Processo para novo projeto:

  1. Pedir à clínica (ou ao contato OTIMUS) a lista de convênios ativos com id e nome.
  2. Popular CONVENIOS.
  3. Se faltar convênio importante, a tool retorna FALHA_CONSULTA e o agente transfere — o humano atende e pode voltar à clínica para atualizar a lista.

Aliases para convênios

Não usamos aliases explícitos para convênios (diferente de procedimentos) — o match parcial costuma resolver. Se em produção aparecerem casos como "Bradesco Prime" vs "BRADESCO SAUDE", adicionar normalização específica:

CONV_ALIASES = {
    "BRADESCO PRIME":      "BRADESCO SAUDE",
    "BRADESCO TOP NACIONAL": "BRADESCO SAUDE",
}