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
]
}]
}
}
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}
]
}]
}
}
🧪 Testes Adicionados¶
Criado test_age_policies_mapping.py com os seguintes testes:
- ✅
test_age_policies_validation_missing_adults- Detecta quando adultos são omitidos - ✅
test_age_policies_correct_mapping- Valida mapeamento correto - ✅
test_age_policies_validation_only_adults- Testa apenas adultos - ✅
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_toolpara 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
agePoliciespara cada faixa etária mencionada - [ ] Verificar se
sum(quantities) == total_pessoas - [ ] Incluir
nameno objeto age policy para melhor legibilidade
🚀 Próximos Passos¶
- ✅ Monitorar logs para verificar se validação está detectando problemas
- ✅ Testar em produção com diferentes combinações (adultos, crianças, bebês)
- ⚠️ Considerar adicionar validação similar em
emitir_reserva_experience_tool - ⚠️ Adicionar testes de integração end-to-end
📚 Referências¶
- system_prompt.py - Instruções do agente principal
- booking_agent.py - Agente de reservas
- calcular_preco_tool.py - Validação implementada
- listar_variacoes_tool.py - Lista age policies
- test_age_policies_mapping.py - Testes
Data da correção: 06/01/2026
Problema original: cenarios-teste.md
Status: ✅ Implementado e testado