Skip to content

Correção: Mapeamento de Age Policies em Variações

🐛 Problema Identificado

Quando o usuário informava "2 adultos e 1 criança" para uma experiência com variação, o agente estava enviando apenas uma política de idade (criança) no providerData, omitindo os adultos.

Exemplo do Bug:

Input do usuário: - Produto ID 1929 (experiência com variação) - Data: 2026-02-15 - Participantes: 2 adultos + 1 criança

O que estava sendo enviado (INCORRETO):

{
  "providerData": {
    "provider": "platform",
    "variations": [{
      "id": 13,
      "quantity": 1,
      "agePolicies": [
        {"id": 35, "quantity": 1}  // ❌ Apenas 1 criança - faltam os 2 adultos!
      ]
    }]
  }
}

Impacto: - Cálculo de preço incorreto - Reserva pode falhar ou ter valor errado - Dados inconsistentes na API


✅ Solução Implementada

A correção foi feita em duas frentes:

1. Melhorias no Prompt (Preventivo)

Adicionadas instruções explícitas em:

system_prompt.py

REGRA CRÍTICA: Quando usuário escolher variação e informar quantidades (ex: "2 adultos e 1 criança"):
* Mapear TODAS as quantidades para as age policies correspondentes
* Se usuário diz "2 adultos e 1 criança", age_policies DEVE ter 2 entradas:
  [{"id": ID_ADULTO, "quantity": 2}, {"id": ID_CRIANCA, "quantity": 1}]
* NUNCA omitir adultos ou outras faixas etárias mencionadas
* Total de quantities deve = total de pessoas (2+1=3)

booking_agent.py

⚠️ REGRA CRÍTICA - MAPEAMENTO DE AGE POLICIES:
Quando usuário informar "X adultos e Y crianças":
✅ CORRETO: Mapear TODAS as faixas etárias mencionadas
   Ex: "2 adultos e 1 criança" → [{"id": 34, "quantity": 2}, {"id": 35, "quantity": 1}]
❌ INCORRETO: Omitir adultos → [{"id": 35, "quantity": 1}] (só criança)

VALIDAÇÃO: soma de quantities = total de pessoas informado

2. Validação na Ferramenta (Defensivo)

Adicionada validação em calcular_preco_tool.py:

# Validar se quantidades em age_policies batem com num_adult + num_child
total_pax = num_adult + num_child
total_age_policies = sum(ap.get("quantity", 0) for ap in age_policies)

if total_pax > 0 and total_age_policies != total_pax:
    return {
        "error": (
            f"Erro no mapeamento de faixas etárias: você informou {num_adult} adultos e {num_child} crianças "
            f"(total: {total_pax} pessoas), mas as age_policies fornecidas somam {total_age_policies} pessoas. "
            f"Verifique se todas as faixas etárias estão corretamente mapeadas."
        )
    }

Benefícios: - ✅ Detecta inconsistências antes de enviar para API - ✅ Retorna erro explicativo para o agente corrigir - ✅ Previne cálculos de preço incorretos - ✅ Melhora debugabilidade com logs detalhados


📦 Estrutura Correta de Age Policies

Exemplo 1: 1 Adulto apenas

{
  "providerData": {
    "provider": "platform",
    "variations": [{
      "id": 13,
      "quantity": 1,
      "agePolicies": [
        {"id": 34, "name": "Adulto", "quantity": 1}
      ]
    }]
  }
}

Exemplo 2: 2 Adultos + 1 Criança ✅

{
  "providerData": {
    "provider": "platform",
    "variations": [{
      "id": 13,
      "quantity": 1,
      "agePolicies": [
        {"id": 34, "name": "Adulto", "quantity": 2},   // 2 adultos
        {"id": 35, "name": "Criança", "quantity": 1}   // 1 criança
      ]
    }]
  }
}
Total: 3 pessoas (2+1)

Exemplo 3: 1 Adulto + 2 Crianças + 1 Bebê ✅

{
  "providerData": {
    "provider": "platform",
    "variations": [{
      "id": 13,
      "quantity": 1,
      "agePolicies": [
        {"id": 34, "name": "Adulto", "quantity": 1},
        {"id": 35, "name": "Criança", "quantity": 2},
        {"id": 36, "name": "Bebê", "quantity": 1}
      ]
    }]
  }
}
Total: 4 pessoas (1+2+1)


🧪 Testes Adicionados

Criado test_age_policies_mapping.py com os seguintes testes:

  1. test_age_policies_validation_missing_adults - Detecta quando adultos são omitidos
  2. test_age_policies_correct_mapping - Valida mapeamento correto
  3. test_age_policies_validation_only_adults - Testa apenas adultos
  4. test_age_policies_validation_excess_people - Detecta excesso de pessoas

Executar testes:

pytest ifriend_agent/tests/test_age_policies_mapping.py -v

🔄 Fluxo Corrigido

sequenceDiagram
    participant User
    participant Agent
    participant listar_variacoes_tool
    participant calcular_preco_tool

    User->>Agent: Quero 2 adultos e 1 criança
    Agent->>listar_variacoes_tool: Buscar variações
    listar_variacoes_tool-->>Agent: Variação 13: agePolicies [Adulto(id:34), Criança(id:35)]

    Note over Agent: Mapear quantidades:<br/>2 adultos → {id:34, qty:2}<br/>1 criança → {id:35, qty:1}

    Agent->>calcular_preco_tool: variation_id=13, age_policies=[{id:34,qty:2},{id:35,qty:1}]

    Note over calcular_preco_tool: Validar:<br/>num_adult(2) + num_child(1) = 3<br/>age_policies.sum(qty) = 2+1 = 3<br/>✅ OK!

    calcular_preco_tool-->>Agent: Preço calculado corretamente
    Agent-->>User: Valor total para 2 adultos + 1 criança: R$ X

📝 Checklist para Desenvolvedores

Ao trabalhar com experiências com variação:

  • [ ] Chamar listar_variacoes_tool para obter age policies disponíveis
  • [ ] Apresentar as age policies ao usuário (Adulto, Criança, Bebê, etc.)
  • [ ] Mapear TODAS as quantidades informadas pelo usuário
  • [ ] Criar uma entrada em agePolicies para cada faixa etária mencionada
  • [ ] Verificar se sum(quantities) == total_pessoas
  • [ ] Incluir name no objeto age policy para melhor legibilidade

🚀 Próximos Passos

  1. ✅ Monitorar logs para verificar se validação está detectando problemas
  2. ✅ Testar em produção com diferentes combinações (adultos, crianças, bebês)
  3. ⚠️ Considerar adicionar validação similar em emitir_reserva_experience_tool
  4. ⚠️ Adicionar testes de integração end-to-end

📚 Referências


Data da correção: 06/01/2026
Problema original: cenarios-teste.md
Status: ✅ Implementado e testado