agent-agendamento
Especificação completa do agente de Agendamento.
Resumo executivo
Agenda, remarca, cancela e confirma compromissos via WhatsApp. Reduz no-show em 40-60% com lembretes ativos 24h e 2h antes. Integra com Google Calendar, Outlook ou sistemas verticais (Doctoralia, Trinks, AgendaPro). Usa modelo Haiku — barato e suficiente para tarefa estruturada.
Mercado e ICP
Setores ideais
- Saúde (clínicas, terapeutas, dentistas, fisioterapeutas)
- Beleza (salões, barbearias, esmalterias, clínicas de estética)
- Fitness (personal trainers, pilates, crossfit)
- Consultoria (agendamento de calls)
- Educação presencial (aulas particulares)
- Pet care (veterinários, banho/tosa)
Cliente NÃO ideal
- Agendas extremamente complexas com múltiplos profissionais e regras especiais (mais barato custom)
- Volume muito baixo (< 50 agendamentos/mês não justifica)
Casos de uso típicos
Caso 1: Clínica (Dra. Milena)
- Paciente quer agendar consulta
- Agente pergunta tipo (primeira vez ou retorno)
- Consulta disponibilidade da Dra
- Propõe 2-3 horários
- Confirma e cria evento
- Envia lembretes automáticos
Caso 2: Salão de beleza
- Cliente quer hidratação
- Agente pergunta dia preferido
- Consulta disponibilidade da profissional preferida
- Confirma e bloqueia slot
- Cliente recebe lembrete 24h antes
Caso 3: Personal trainer
- Aluno quer agendar próxima sessão
- Agente já sabe preferência (manhã, terça/quinta)
- Mostra slots disponíveis na próxima semana
- Confirma
Estrutura específica do código
agent-agendamento/├── src/│ ├── prompts/│ │ ├── system_base.md│ │ └── fragments/│ │ ├── tipos_servico.md│ │ ├── politica_cancelamento.md│ │ └── lembrete_preparo.md│ ││ ├── tools/│ │ ├── consultar_disponibilidade.py│ │ ├── agendar_compromisso.py│ │ ├── remarcar_compromisso.py│ │ ├── cancelar_compromisso.py│ │ ├── confirmar_presenca.py│ │ ├── enviar_lembrete_preparo.py│ │ └── _registry.py│ ││ ├── flows/│ │ ├── agendamento.py│ │ ├── remarcacao.py│ │ ├── cancelamento.py│ │ ├── confirmacao_24h.py│ │ └── confirmacao_2h.py│ ││ ├── jobs/ ← Cron jobs│ │ ├── lembrete_24h.py│ │ ├── lembrete_2h.py│ │ └── lembrete_preparo.py│ ││ └── config/│ └── default_config.yaml│└── tenants/_template/ ├── config.yaml ← Tem seção 'agendamento' detalhada └── knowledge/ ├── profissionais.md ← Lista, especialidades ├── servicos.md ← Tipos de procedimento ├── localizacao.md ← Endereço, instruções de chegada ├── preparos.md ← Por tipo de serviço └── politicas.md ← Cancelamento, atraso, etcTools específicas
@tool@trace_tool("consultar_disponibilidade")async def consultar_disponibilidade( profissional_id: Optional[str] = None, tipo_servico: Optional[str] = None, data_inicio: Optional[str] = None, dias_a_buscar: int = 7, *, tenant: dict) -> str: """ Consulta horários disponíveis.
USE QUANDO: cliente quer agendar e precisa ver opções. """ calendar = CalendarFactory.create(tenant)
# Determina serviço (duracão e buffer) servico_config = tenant.agendamento.tipos_servico.get(tipo_servico, {}) duracao = servico_config.get("duracao_minutos", 30) buffer = servico_config.get("buffer_minutos", 0)
# Determina horário comercial horario = tenant.horario
# Busca slots livres slots = await calendar.find_available_slots( calendar_id=tenant.agendamento.profissionais[profissional_id]["calendar_id"], duration_minutes=duracao + buffer, start_date=data_inicio or "today", days=dias_a_buscar, business_hours=horario, max_slots=5 )
if not slots: return "Nenhum horário disponível nos próximos {dias_a_buscar} dias. Posso verificar mais dias?"
return format_slots_for_user(slots[:3]) # mostra apenas 3
# src/tools/agendar_compromisso.py@tool@trace_tool("agendar_compromisso")async def agendar_compromisso( cliente_telefone: str, cliente_nome: str, profissional_id: str, tipo_servico: str, data_hora_iso: str, observacoes: Optional[str] = None, *, tenant: dict) -> str: """ Cria evento na agenda do profissional.
USE QUANDO: cliente confirmou horário específico. """ calendar = CalendarFactory.create(tenant) profissional = tenant.agendamento.profissionais[profissional_id] servico = tenant.agendamento.tipos_servico[tipo_servico]
# Valida que slot ainda está livre (race condition) is_available = await calendar.check_slot_available( calendar_id=profissional.calendar_id, start=data_hora_iso, duration_minutes=servico.duracao_minutos )
if not is_available: return "Esse horário acabou de ser ocupado. Vou verificar outras opções."
# Cria evento event = await calendar.create_event( calendar_id=profissional.calendar_id, title=f"{tipo_servico} — {cliente_nome}", description=f"Telefone: {cliente_telefone}\n{observacoes or ''}", start=data_hora_iso, duration_minutes=servico.duracao_minutos, )
# Registra no CRM crm = CRMFactory.create(tenant) await crm.add_appointment( client_phone=cliente_telefone, appointment_id=event.id, date=data_hora_iso, service=tipo_servico )
# Agenda lembretes (jobs) await schedule_reminder(event.id, tenant.tenant_id, hours_before=24) await schedule_reminder(event.id, tenant.tenant_id, hours_before=2)
# Se houver preparo, agenda envio if servico.requer_preparo: await schedule_preparo_reminder(event.id, tenant.tenant_id, hours_before=48)
return f"Agendado: {format_datetime_pt(data_hora_iso)} com {profissional.nome}."
# src/tools/cancelar_compromisso.py@tool@trace_tool("cancelar_compromisso")async def cancelar_compromisso( appointment_id: str, motivo: Optional[str] = None, *, tenant: dict) -> str: """ Cancela compromisso, respeitando política de antecedência. """ calendar = CalendarFactory.create(tenant) event = await calendar.get_event(appointment_id)
# Verifica antecedência horas_ate_evento = (event.start - now()).total_hours() antec_minima = tenant.agendamento.politica_cancelamento.antecedencia_minima_horas
if horas_ate_evento < antec_minima: return ( f"Cancelamento com menos de {antec_minima}h. " f"Conforme política, pode haver cobrança. " f"Quer confirmar mesmo assim?" )
await calendar.delete_event(appointment_id)
return f"Cancelado. Quer reagendar para outro dia?"Job: Lembrete 24h
"""Cron job que roda a cada hora.Encontra agendamentos para amanhã e dispara lembrete."""async def run_lembrete_24h(): """Roda a cada hora, busca agendamentos para 24h à frente."""
for tenant_id in get_active_tenants(): tenant = TenantLoader.load(tenant_id)
if not tenant.features.lembrete_24h: continue
calendar = CalendarFactory.create(tenant) appointments = await calendar.list_events( start=now() + timedelta(hours=23), end=now() + timedelta(hours=25) )
for appt in appointments: # Skip se já foi lembrado if await was_reminded(appt.id, "24h"): continue
telefone = extract_phone_from_event(appt) if not telefone: continue
messaging = MessagingFactory.create(tenant) await messaging.send_text( to=telefone, text=tenant.agendamento.mensagens.lembrete_24h.format( data=format_pt(appt.start), profissional=appt.organizer.name, endereco=tenant.endereco ) )
await mark_reminded(appt.id, "24h")System prompt template
# IdentidadeVocê é {{agente_nome}}, {{agente_cargo}} da {{nome_empresa}}.Atende clientes via WhatsApp para gerenciamento de agenda.
# Empresa{{empresa_descricao}}
# Seu objetivoAgendar, remarcar, cancelar ou confirmar compromissos com agilidade.Sempre confirmar antes de criar/alterar/deletar.
# Como você atua
## Para agendamento novo:1. Identifique tipo de serviço desejado2. Pergunte preferência de profissional (se aplicável)3. Pergunte preferência de dia/horário4. Use consultar_disponibilidade para ver opções5. Apresente 2-3 horários disponíveis6. Confirme escolha7. Use agendar_compromisso
## Para remarcação:1. Identifique compromisso atual2. Pergunte novo dia/horário3. Verifique disponibilidade4. Confirme antes de remarcar
## Para cancelamento:1. Identifique compromisso2. Avise sobre política de antecedência (se < {{antec_minima}}h, pode cobrar)3. Confirme intenção4. Cancele e ofereça reagendamento
## Para confirmação 24h/2h antes:1. Pergunte: "Confirma sua presença?"2. Se sim → marca confirmed3. Se não consegue → oferece remarcar
# Suas ferramentas- consultar_disponibilidade- agendar_compromisso- remarcar_compromisso- cancelar_compromisso- confirmar_presenca- enviar_lembrete_preparo
# Regras invioláveis- Sempre confirme antes de criar/alterar/cancelar- Respeite buffer entre atendimentos ({{buffer_minutos}}min)- Não sobreponha horários- Política de antecedência: {{antec_minima}}h mínimas para cancelar sem custo- Se cliente faltou (no-show), avise política e ofereça reagendamento- Para emergências, sempre handoff humano
# Mensagens padrão
## Confirmação de agendamento"Pronto! {data} às {hora} com {profissional}.Endereço: {endereco}Vou te lembrar 24h antes. Qualquer coisa, é só me avisar."
## Lembrete 24h"Oi! Lembrando que amanhã ({data}) às {hora} você tem {servico} com {profissional}.Endereço: {endereco}Confirma sua presença?"
## Lembrete 2h"Oi! Te esperamos em 2h ({hora}) com {profissional}.Endereço: {endereco}Já está vindo?"
# TomProfissional, ágil, organizado. Não enrole muito.{{include: fragments/tom_direto.md}}Configuração default
agent_type: agendamentodefault_model: claude-haiku-4-5 # Tarefa estruturada, Haiku é suficientedefault_temperature: 0.3 # Baixa para previsibilidade
agendamento: duracao_padrao_minutos: 30 buffer_padrao_minutos: 10
politica_cancelamento: antecedencia_minima_horas: 24 cobranca_no_show_percent: 50 # cobrar 50% se não comparecer
lembrete_24h: enabled: true horario_envio_padrao: "18:00" # noite anterior
lembrete_2h: enabled: true
preparo: enviar_h_antes: 48 # 2 dias antes
confirmacao_ativa: requer_resposta_24h_antes: true se_nao_responder: "manter_agendamento"
response: delay_between_messages_ms: 1000 # Ágil max_messages_per_minute: 30KPIs
| Métrica | Meta |
|---|---|
| Taxa de agendamento bem-sucedido | > 90% |
| Redução de no-show | -40 a -60% |
| Taxa de remarcação proativa | > 80% |
| Ocupação da agenda | Cliente-dependente |
| Tempo médio de agendamento | < 2 min |
Pricing
| Item | Faixa |
|---|---|
| Setup | R$ 3.500 a R$ 5.500 |
| Mensalidade | R$ 900 a R$ 1.500 |
| Volume API | Baixo (Haiku) + 30% |
Tempo de implementação
| Fase | Duração |
|---|---|
| Levantamento de profissionais e serviços | 2 dias |
| Integração calendar | 3 dias |
| Customização prompts | 2 dias |
| Configuração de jobs (lembretes) | 3 dias |
| Testes com agendamentos reais | 3 dias |
| Calibração | 5 dias |
| Total primeiro cliente | 2-3 semanas |
| Clientes seguintes | 1 semana |