Agente agendador
Assistente de agendamento que busca os serviços da empresa, explica as regras de reserva em português, verifica disponibilidade e cria eventos para um fluxo de agendamento estilo salão.
agent llm openai appointments scheduling services portuguese
O que está incluído
| Campo | Valor |
|---|---|
| Nome | Agente agendador |
| Tipo | Agent |
| Tipo de Assistant | llm |
| Plataforma | openai |
| Modelo | gpt-4.1 |
| Ferramentas | 4 |
Dependências Incluídas
informação
O ZIP para download inclui todas as dependências listadas abaixo. Todas as referências cruzadas são vinculadas automaticamente durante a importação.
Serviços: Agendador Environment
Insira estes serviços junto com o agente para que suas preActions possam listar as ofertas e preços disponíveis.
| # | Nome |
|---|---|
| 1 | Corte de cabelo |
| 2 | Barba |
| 3 | Corte + Barba |
| 4 | Hidratação capilar |
| 5 | Sobrancelha |
JSON Completo
Clique para expandir
{
"description": "Scheduling assistant that fetches company services, explains booking rules in Portuguese, checks availability, and creates events for a salon-style appointment flow.",
"tags": [
"agent",
"llm",
"openai",
"appointments",
"scheduling",
"services",
"portuguese"
],
"linkedExamples": [
{
"type": "services",
"variant": "agendador-environment",
"relationship": "Seed these services alongside the agent so its preActions can list available offerings and prices."
}
],
"document": {
"name": "Agente agendador",
"assistantType": "llm",
"options": {
"log_level": "debug"
},
"platform": {
"openAi": {
"model": "gpt-4.1",
"temperature": 1,
"maxCharsPerMessage": 1024,
"preActions": [
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/security/auth/jwt/generate",
"actions/security/auth/jwt/generate": {
"is_advanced": false,
"duration": 300,
"ips": []
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/state/session/memory/mutate",
"actions/state/session/memory/mutate": {
"operation": "set",
"key": "apiToken",
"value": {
"expr": "step(0).jwt",
"onFailure": "keep"
}
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/state/session/memory/mutate",
"actions/state/session/memory/mutate": {
"operation": "set",
"key": "apiUrl",
"value": {
"expr": "\"https://api.autotalk.io/v1\"",
"onFailure": "keep"
}
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/data/company/resource/search",
"actions/data/company/resource/search": {
"dynadataItemType": "employees",
"filter": {
"expr": "{\"aclInfo.tenantId\": company._id}",
"onFailure": "throw"
},
"limit": 1,
"skip": 0
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/state/session/memory/mutate",
"actions/state/session/memory/mutate": {
"operation": "set",
"key": "employee",
"value": {
"expr": "step(3).data[0]",
"onFailure": "keep"
}
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/state/session/memory/mutate",
"actions/state/session/memory/mutate": {
"operation": "set",
"key": "today",
"value": {
"expr": "employee.workingSchedule[lowerAscii(format_datetime(now(), \"dddd\"))]",
"onFailure": "keep"
}
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/state/session/memory/mutate",
"actions/state/session/memory/mutate": {
"operation": "set",
"key": "now",
"value": {
"expr": "now()",
"onFailure": "keep"
}
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/state/session/memory/mutate",
"actions/state/session/memory/mutate": {
"operation": "set",
"key": "workingTime",
"value": {
"expr": "{\n \"openTime\": zoned_datetime(format_datetime(now(), \"YYYY-MM-DD\"), today.startTime, \"America/Sao_Paulo\"),\n \"closeTime\": zoned_datetime(format_datetime(now(), \"YYYY-MM-DD\"), today.endTime, \"America/Sao_Paulo\")\n}",
"onFailure": "keep"
}
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/network/http/request/send",
"actions/network/http/request/send": {
"method": "POST",
"purpose": "load available services",
"url": {
"expr": "apiUrl + \"/dynadata/type/services/list\"",
"onFailure": "keep"
},
"headers": [
{
"key": {
"expr": "\"x-jwt-token\""
},
"value": {
"expr": "apiToken"
}
}
],
"body": {
"expr": "{\n \"projection\": {\n \"_id\": 1,\n \"name\": 1,\n \"value\": 1,\n \"durationMinutes\": 1\n }\n}",
"onFailure": "keep"
},
"cache": true
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/state/session/memory/mutate",
"actions/state/session/memory/mutate": {
"operation": "set",
"key": "services",
"value": {
"expr": "step(8).data.items",
"onFailure": "keep"
}
}
}
}
],
"systemRoleMessages": [
{
"expr": "\"Voce e um assistente virtual do \" + employee.name + \", você é capaz de fazer agendamentos, voce esta conversando com um cliente chamado '\" + client.name + \"', se recuse a responder qualquer coisa não relacionada ao horário de atendimento, o endereço de atendimento, e os agendamentos do cliente. Caso seja um assunto que você não pode tratar, chame a função 'finaliza_atendimento'\"",
"onFailure": "throw"
},
{
"expr": "'O horário de funcionamento é: ' + toon_encode(employee.workingSchedule)",
"onFailure": "throw"
},
{
"expr": "\"Os serviços prestados são \\n\" + toon_encode(services)",
"onFailure": "throw"
},
{
"expr": "\"Agora são \" + format_datetime(now(), \"DD/MM/YYYY HH:mm\") + \", hoje é \" + format_datetime(now(), \"dddd\", \"America/Sao_Paulo\", \"pt-BR\") + \", \" +\n (today.isDayOff ? ('estamos fechados') : \" e agora são '\" + format_datetime(now(), \"HH:mm\", \"America/Sao_Paulo\", \"pt-BR\") + \", então \" + (is_before(now(), workingTime.openTime) ? \"ainda não estamos abertos\" : (is_after(now(), workingTime.closeTime) ? \"já estamos fechados\" : \"estamos abertos\"))) + \"!\"",
"onFailure": "throw"
},
{
"expr": "\"Antes de registrar o agendamento, descreva o agendamento em detalhes, com o preço total, se o cliente aprovar chame a 'fazer_agendamento'.\"",
"onFailure": "keep"
},
{
"expr": "\"Use a moeda 'BRL', mas utilize a notação humana. Para 'BRL' use 'R$' por exemplo.\"",
"onFailure": "keep"
},
{
"expr": "\"O fuso horário do cliente é America/Sao_Paulo -0300, o fuso horário do estabelecimento é America/Sao_Paulo -0300\"",
"onFailure": "keep"
},
{
"expr": "\"Seja gentil, use emojis\"",
"onFailure": "keep"
},
{
"expr": "\"Caso você perceba que o cliente \" + client.name + \" está querendo falar diretamente com o profissional \" + employee.name + \" ou querendo tratar de uma questão pessoal, finalize o atendimento chamando a função 'finaliza_atendimento'\"",
"onFailure": "throw"
},
{
"expr": "\"Caso o cliente queira marcar um agendamento envie para ele a lista de serviços disponíveis, não envie o ID do serviço.\"",
"onFailure": "keep"
},
{
"expr": "\"Não utilize Markdown nas respostas\"",
"onFailure": "keep"
}
],
"actions": [],
"tools": [
{
"type": "function",
"function": {
"name": "faz_agendamento",
"description": "Marca um agendamento de um cliente",
"parameters": [
{
"name": "horario",
"type": "string",
"description": "\"Horario do agendamento, deve ser no formato ISO 8601, 'YYYY-MM-DDTHH:mm:ssZ', exemplo: 2014-09-08T08:02:17-05:00\"",
"isRequired": true
},
{
"name": "servicos",
"type": "array",
"description": "IDs do serviços que serão feitos no agendamento",
"arrayItems": {
"name": "id_do_servico",
"type": "string",
"description": "ID do serviço a ser realizado no agendamento",
"isRequired": true
},
"isRequired": true
}
],
"actions": [
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/network/http/request/send",
"actions/network/http/request/send": {
"method": "POST",
"url": {
"expr": "apiUrl + \"/dynadata/type/events/create\"",
"onFailure": "keep"
},
"headers": [
{
"key": {
"expr": "\"Content-Type\""
},
"value": {
"expr": "\"application/json\""
}
},
{
"key": {
"expr": "\"x-jwt-token\""
},
"value": {
"expr": "apiToken"
}
}
],
"body": {
"expr": "{\n \"data\": {\n \"employeeId\": employee._id,\n \"startTimestamp\": horario,\n \"services\": servicos,\n \"contactId\": client._id\n },\n \"userOptions\": {\n \"notifyEmployee\": true,\n \"allowReminderCreation\": true\n }\n}",
"onFailure": "throw",
"strict": true
}
}
}
}
],
"output": {
"main": {
"expr": "(\n step(0).status == 200\n ? (\"Agendamento realizado com sucesso\")\n : (\n step(0).data.error == \"not_available\"\n ? \"Agendamento não realizado, \" +\n employee.name +\n \" não estará disponível \" +\n (step(0).data.reason != null ? step(0).data.reason : \"\")\n : \"Ocorreu um erro ao tentar fazer o agendamento\"\n )\n)",
"onFailure": "throw"
},
"execute_extra_completion": true
}
}
},
{
"type": "function",
"function": {
"name": "consulta_horarios_disponiveis",
"description": "Consulta horários disponíveis num determinado dia. Não leva um consideração a duração de um possível agendamento, dessa forma pode ser que um agendamento não possa ser realizado em um determinado horário dependendo de sua duração.",
"parameters": [
{
"name": "dia",
"type": "string",
"description": "Dia a ser consultado, no formato YYYY-MM-DD, exemplo: 2025-05-30",
"isRequired": true
}
],
"actions": [
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/network/http/request/send",
"actions/network/http/request/send": {
"method": "POST",
"url": {
"expr": "apiUrl + \"/dynadata/type/employees/item/\" + employee._id + \"/executeFunction/giveEmployeeSchedule\"",
"onFailure": "keep"
},
"headers": [
{
"key": {
"expr": "\"Content-Type\""
},
"value": {
"expr": "\"application/json\""
}
},
{
"key": {
"expr": "\"x-jwt-token\""
},
"value": {
"expr": "apiToken"
}
}
],
"body": {
"expr": "{\n \"date\": dia,\n \"lang\": \"pt-BR\"\n}",
"onFailure": "keep"
}
}
}
}
],
"output": {
"main": {
"expr": "step(0).status == 200 ? step(0).data.result.text : \"Não foi possível consultar a agenda\"",
"onFailure": "keep"
},
"execute_extra_completion": true
}
}
},
{
"type": "function",
"function": {
"isZodTool": true,
"zodToolSchema": {
"expr": "{\n \"name\": \"finaliza_atendimento\",\n \"description\": \"Finaliza o atendimento automatizado do GPT e notifica o profissional\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"texto_da_notificacao\": {\n \"type\": \"string\",\n \"description\": \"O texto da mensagem que o profissional receberá explicando o motivo da finalização.\"\n }\n },\n \"required\": [\"texto_da_notificacao\"], // Obrigatório seguir este formato\n \"additionalProperties\": false // Recomendado para o modo 'Strict'\n }\n}",
"onFailure": "throw"
},
"actions": [
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/assistant/lifecycle/session/finalize",
"actions/assistant/lifecycle/session/finalize": {
"cooldown_minutes": 30
}
}
},
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/notifications/company/notification/create",
"actions/notifications/company/notification/create": {
"title": {
"expr": "client.name + \" solicita atendimento\"",
"onFailure": "keep"
},
"text": {
"expr": "texto_da_notificacao",
"onFailure": "keep"
},
"buttons": []
}
}
}
],
"output": {
"main": {
"expr": "\"O atendimento foi finalizado o profissional foi notificado\"",
"onFailure": "keep"
}
},
"parameters": []
}
},
{
"type": "function",
"function": {
"name": "busca_agendamentos",
"description": "Busca os ultimos agendamentos do cliente",
"parameters": [],
"actions": [
{
"condition": {
"expr": "true",
"onFailure": "keep"
},
"action": {
"actionType": "actions/network/http/request/send",
"actions/network/http/request/send": {
"method": "POST",
"url": {
"expr": "apiUrl + \"/dynadata/type/Event/list\"",
"onFailure": "keep"
},
"headers": [
{
"key": {
"expr": "\"Content-Type\""
},
"value": {
"expr": "\"application/json\""
}
},
{
"key": {
"expr": "\"x-jwt-token\""
},
"value": {
"expr": "userSpace.apiToken"
}
}
],
"body": {
"expr": "{\n \"page\": 1,\n \"pageSize\": 5,\n \"filter\": {\n \"contactId\": {\n \"$eq\": string(client._id)\n }\n },\n \"sort\": {\n \"startTimestamp\": -1\n }\n}",
"onFailure": "keep"
}
}
}
}
],
"output": {
"main": {
"expr": "step(0).status == 200 ? toon_encode(step(0).data.items) : \"Não foi possível buscar os agendamentos\"",
"onFailure": "throw"
},
"execute_extra_completion": true
}
}
}
]
}
},
"platformType": "openai"
}
}
Como Importar
- Baixe o arquivo ZIP usando o botão acima
- Navegue até Configurações da Empresa → Transferência de Dados no seu painel AutoTalk
- Clique em Importar e selecione o arquivo ZIP baixado
- Revise o resumo da importação e confirme
- Todos os IDs de documentos são remapeados automaticamente — nenhuma edição manual de IDs é necessária
dica
Este pacote inclui tanto o agente quanto suas dependências. Todas as referências cruzadas (IDs de workflow nas ações de ferramentas) são vinculadas automaticamente durante a importação.