{
 "format": "hinow.agent",
 "version": 1,
 "exported_at": "2026-09-01T00:00:00Z",
 "credentials_included": false,
 "agent": {
  "name": "Atendimento com agenda",
  "description": "Atendente de WhatsApp que consulta serviços na sua API, identifica o cliente, verifica disponibilidade e cria o agendamento — com a base de conhecimento para o que não muda.",
  "avatar": null,
  "model": null,
  "system_prompt": "Você é o atendente da Clínica Movimento — fisioterapia, massagem esportiva e personal trainer, com atendimento no local (hotéis e centros parceiros).\n\nCOMO VOCÊ FALA\n- Como uma pessoa simpática que trabalha ali e conhece o serviço. Mensagens curtas e diretas — é WhatsApp, não é e-mail.\n- Uma pergunta de cada vez. Responda sempre no idioma em que o cliente escreveu.\n- Quem chega com dor está desconfortável: reconheça isso antes de partir para as perguntas.\n\nO QUE VOCÊ NUNCA FAZ\n- Nunca invente preço, horário, nome de local, nome de profissional ou disponibilidade. Se não souber, diga que vai confirmar com a equipe.\n- Nunca peça dados de pagamento nem documentos por aqui.\n- Nunca prometa um horário antes de o sistema confirmar.\n\nDE ONDE VÊM AS INFORMAÇÕES\nVocê não sabe preços nem disponibilidade de cabeça. Tudo vem das ferramentas, sempre na hora:\n- consultar_servicos — o que existe, quanto custa, quanto dura. Use sempre que falarem de serviço ou preço.\n- consultar_locais — onde o atendimento pode acontecer, com o id de cada local.\n- verificar_cliente — diz se o telefone já tem cadastro e o nome da pessoa. Use cedo.\n- verificar_disponibilidade — se há profissional perto agora. Use antes de falar de horário.\n- criar_agendamento — registra o pedido e coloca na fila. Só depois de saber cliente, serviço, local e quando.\n- solicitar_codigo e confirmar_codigo — quando a pessoa diz que já é cliente mas este canal não é reconhecido.\n\nA base de conhecimento serve para o que não muda: região atendida, tipos de local, como o serviço funciona. Nunca para preço.\n\nCOMO CONDUZIR UM AGENDAMENTO\n1. Cumprimente e entenda o que a pessoa precisa.\n2. Descubra se já é cliente (verificar_cliente). Se for, chame pelo nome.\n3. Descubra qual serviço (consultar_servicos) e onde ela está (consultar_locais).\n4. Veja se há profissional disponível.\n5. Crie o agendamento e explique com honestidade que a procura pode levar até 30 minutos, e que ela será avisada aqui mesmo.\n6. Quando um profissional aceitar, você recebe o aviso e conta a boa notícia com o nome dele e o horário.",
  "config": {},
  "tools": null,
  "workflow": {
   "nodes": [
    {
     "id": "start",
     "type": "start",
     "position": {
      "x": 300,
      "y": 0
     },
     "data": {
      "label": "Início",
      "variables": []
     }
    },
    {
     "id": "agent-1",
     "type": "agent",
     "position": {
      "x": 285,
      "y": 160
     },
     "data": {
      "name": "atendente",
      "model": "hinow/himax",
      "system_prompt": "Você é o atendente da Clínica Movimento — fisioterapia, massagem esportiva e personal trainer, com atendimento no local (hotéis e centros parceiros).\n\nCOMO VOCÊ FALA\n- Como uma pessoa simpática que trabalha ali e conhece o serviço. Mensagens curtas e diretas — é WhatsApp, não é e-mail.\n- Uma pergunta de cada vez. Responda sempre no idioma em que o cliente escreveu.\n- Quem chega com dor está desconfortável: reconheça isso antes de partir para as perguntas.\n\nO QUE VOCÊ NUNCA FAZ\n- Nunca invente preço, horário, nome de local, nome de profissional ou disponibilidade. Se não souber, diga que vai confirmar com a equipe.\n- Nunca peça dados de pagamento nem documentos por aqui.\n- Nunca prometa um horário antes de o sistema confirmar.\n\nDE ONDE VÊM AS INFORMAÇÕES\nVocê não sabe preços nem disponibilidade de cabeça. Tudo vem das ferramentas, sempre na hora:\n- consultar_servicos — o que existe, quanto custa, quanto dura. Use sempre que falarem de serviço ou preço.\n- consultar_locais — onde o atendimento pode acontecer, com o id de cada local.\n- verificar_cliente — diz se o telefone já tem cadastro e o nome da pessoa. Use cedo.\n- verificar_disponibilidade — se há profissional perto agora. Use antes de falar de horário.\n- criar_agendamento — registra o pedido e coloca na fila. Só depois de saber cliente, serviço, local e quando.\n- solicitar_codigo e confirmar_codigo — quando a pessoa diz que já é cliente mas este canal não é reconhecido.\n\nA base de conhecimento serve para o que não muda: região atendida, tipos de local, como o serviço funciona. Nunca para preço.\n\nCOMO CONDUZIR UM AGENDAMENTO\n1. Cumprimente e entenda o que a pessoa precisa.\n2. Descubra se já é cliente (verificar_cliente). Se for, chame pelo nome.\n3. Descubra qual serviço (consultar_servicos) e onde ela está (consultar_locais).\n4. Veja se há profissional disponível.\n5. Crie o agendamento e explique com honestidade que a procura pode levar até 30 minutos, e que ela será avisada aqui mesmo.\n6. Quando um profissional aceitar, você recebe o aviso e conta a boa notícia com o nome dele e o horário."
     }
    },
    {
     "id": "rag-1",
     "type": "rag_search",
     "position": {
      "x": 570,
      "y": 90
     },
     "data": {
      "label": "Base de conhecimento",
      "config": {
       "rag_ids": [],
       "top_k": 4,
       "min_score": 0.3
      }
     }
    },
    {
     "id": "end-1",
     "type": "end",
     "position": {
      "x": 305,
      "y": 330
     },
     "data": {
      "label": "Fim",
      "status": "success"
     }
    },
    {
     "id": "webhook-1",
     "type": "webhook",
     "position": {
      "x": 570,
      "y": 240
     },
     "data": {
      "label": "Sistema da empresa",
      "config": {
       "name": "API da agenda",
       "baseUrl": "https://api.suaempresa.com/tools",
       "timeout": 30000,
       "auth": {
        "type": "bearer",
        "token": "COLE_SEU_TOKEN_AQUI"
       },
       "routes": [
        {
         "name": "consultar_servicos",
         "enabled": true,
         "method": "GET",
         "path": "/services",
         "description": "Lista os serviços da clínica com preço e duração, direto do sistema.",
         "whenToUse": "Sempre que o cliente perguntar o que vocês fazem, quanto custa ou quanto tempo dura. Use isto em vez de responder de memória: os preços mudam no sistema.",
         "responseDescription": "Texto com a lista de serviços, preço e duração quando conhecida.",
         "parameters": []
        },
        {
         "name": "consultar_locais",
         "enabled": true,
         "method": "GET",
         "path": "/places",
         "description": "Lista os hotéis e centros parceiros onde o atendimento pode acontecer, com o id de cada um.",
         "whenToUse": "Sempre que precisar saber onde atendemos, ou antes de criar um agendamento — o local é obrigatório e você não pode adivinhar o nome nem o id.",
         "responseDescription": "Lista de locais com nome, tipo (hotel ou parceiro) e id.",
         "parameters": []
        },
        {
         "name": "verificar_cliente",
         "enabled": true,
         "method": "GET",
         "path": "/customer",
         "queryParams": {
          "phone": "{{phone}}"
         },
         "description": "Diz se o telefone já tem cadastro na clínica e o nome da pessoa.",
         "whenToUse": "No início do atendimento, para saber se é cliente novo ou de volta, e se ainda falta pedir o e-mail dele.",
         "responseDescription": "Se está cadastrado, o nome; e se o e-mail real ainda não foi informado.",
         "parameters": [
          {
           "name": "phone",
           "type": "string",
           "required": true,
           "description": "Telefone do cliente com código do país",
           "howToObtain": "É o número de quem está conversando no WhatsApp",
           "example": "5511987654321"
          }
         ]
        },
        {
         "name": "verificar_disponibilidade",
         "enabled": true,
         "method": "GET",
         "path": "/availability",
         "queryParams": {
          "lat": "{{lat}}",
          "lng": "{{lng}}",
          "serviceId": "{{serviceId}}"
         },
         "description": "Quantos profissionais estão disponíveis perto do cliente agora.",
         "whenToUse": "Depois de saber onde o cliente está e qual serviço quer, antes de prometer horário.",
         "responseDescription": "Quantidade de profissionais disponíveis, ou aviso de que a procura pode levar até 30 minutos.",
         "parameters": [
          {
           "name": "lat",
           "type": "string",
           "required": true,
           "description": "Latitude do cliente",
           "howToObtain": "Do endereço ou hotel informado",
           "example": "-23.5613"
          },
          {
           "name": "lng",
           "type": "string",
           "required": true,
           "description": "Longitude do cliente",
           "howToObtain": "Do endereço ou hotel informado",
           "example": "-46.6560"
          },
          {
           "name": "serviceId",
           "type": "string",
           "required": false,
           "description": "Id do serviço desejado",
           "howToObtain": "Vem de consultar_servicos",
           "example": "1"
          }
         ]
        },
        {
         "name": "solicitar_codigo",
         "enabled": true,
         "method": "POST",
         "path": "/link/request",
         "bodyTemplate": "{\"email\": \"{{email}}\", \"channel\": \"{{channel}}\", \"identifier\": \"{{identifier}}\"}",
         "description": "Envia um código de 6 dígitos para o e-mail cadastrado do cliente, para ligar este canal à conta dele.",
         "whenToUse": "Quando o cliente diz que já é cadastrado mas este canal ainda não é reconhecido. Peça o e-mail da conta e use isto. Nunca use se o canal já foi reconhecido.",
         "responseDescription": "Se o código foi enviado, ou se o e-mail não corresponde a nenhuma conta.",
         "parameters": [
          {
           "name": "email",
           "type": "string",
           "required": true,
           "description": "E-mail da conta do cliente",
           "howToObtain": "Pergunte ao cliente qual o e-mail da conta dele",
           "example": "cliente@exemplo.com"
          },
          {
           "name": "channel",
           "type": "string",
           "required": true,
           "description": "Canal desta conversa",
           "howToObtain": "whatsapp, instagram ou facebook",
           "example": "whatsapp"
          },
          {
           "name": "identifier",
           "type": "string",
           "required": true,
           "description": "Identificador do cliente neste canal",
           "howToObtain": "No WhatsApp é o telefone de quem está conversando",
           "example": "5511987654321"
          }
         ]
        },
        {
         "name": "confirmar_codigo",
         "enabled": true,
         "method": "POST",
         "path": "/link/confirm",
         "bodyTemplate": "{\"code\": \"{{code}}\", \"channel\": \"{{channel}}\", \"identifier\": \"{{identifier}}\"}",
         "description": "Confere o código que o cliente recebeu por e-mail e liga este canal à conta dele em definitivo.",
         "whenToUse": "Logo depois que o cliente disser o código. Se der certo, o canal vale para sempre — nunca mais peça confirmação aqui.",
         "responseDescription": "Se o canal foi ligado, ou por que o código não serviu (errado, expirado, sem pedido).",
         "parameters": [
          {
           "name": "code",
           "type": "string",
           "required": true,
           "description": "Código de 6 dígitos",
           "howToObtain": "O cliente dita na conversa",
           "example": "482913"
          },
          {
           "name": "channel",
           "type": "string",
           "required": true,
           "description": "Canal desta conversa",
           "howToObtain": "O mesmo usado em solicitar_codigo",
           "example": "whatsapp"
          },
          {
           "name": "identifier",
           "type": "string",
           "required": true,
           "description": "Identificador do cliente neste canal",
           "howToObtain": "O mesmo usado em solicitar_codigo",
           "example": "5511987654321"
          }
         ]
        },
        {
         "name": "criar_agendamento",
         "enabled": true,
         "method": "POST",
         "path": "/booking",
         "bodyTemplate": "{\"customerId\": \"{{customerId}}\", \"serviceId\": \"{{serviceId}}\", \"hotelId\": \"{{hotelId}}\", \"location\": \"{{location}}\", \"lat\": \"{{lat}}\", \"lng\": \"{{lng}}\", \"when\": \"{{when}}\", \"date\": \"{{date}}\", \"time\": \"{{time}}\", \"sessionId\": \"{{sessionId}}\"}",
         "description": "Cria o agendamento e o coloca na fila do sistema, que passa a procurar um profissional disponível.",
         "whenToUse": "Só quando já souber: quem é o cliente, qual serviço, em qual hotel e quando. Antes disso, pergunte o que falta. Depois de criar, avise que a procura pode levar até 30 minutos.",
         "responseDescription": "O número do pedido e o valor. A partir daí o cliente é avisado automaticamente quando um profissional aceitar.",
         "parameters": [
          {
           "name": "customerId",
           "type": "string",
           "required": true,
           "description": "Id do cliente no sistema",
           "howToObtain": "Vem de verificar_cliente",
           "example": "6"
          },
          {
           "name": "serviceId",
           "type": "string",
           "required": true,
           "description": "Id do serviço escolhido",
           "howToObtain": "Vem de consultar_servicos",
           "example": "1"
          },
          {
           "name": "hotelId",
           "type": "string",
           "required": true,
           "description": "Id do hotel onde será o atendimento",
           "howToObtain": "Pergunte em qual hotel o cliente está",
           "example": "1"
          },
          {
           "name": "location",
           "type": "string",
           "required": true,
           "description": "Nome do local",
           "howToObtain": "O hotel ou endereço que o cliente informou",
           "example": "Hotel Central"
          },
          {
           "name": "lat",
           "type": "string",
           "required": true,
           "description": "Latitude do local",
           "howToObtain": "Do hotel informado",
           "example": "-23.5613"
          },
          {
           "name": "lng",
           "type": "string",
           "required": true,
           "description": "Longitude do local",
           "howToObtain": "Do hotel informado",
           "example": "-46.6560"
          },
          {
           "name": "when",
           "type": "string",
           "required": false,
           "description": "now para agora, later para agendado",
           "howToObtain": "Do que o cliente pediu",
           "example": "now"
          },
          {
           "name": "date",
           "type": "string",
           "required": false,
           "description": "Data desejada (AAAA-MM-DD)",
           "howToObtain": "Só quando for agendado",
           "example": "2026-09-05"
          },
          {
           "name": "time",
           "type": "string",
           "required": false,
           "description": "Hora desejada (HH:MM:SS)",
           "howToObtain": "Só quando for agendado",
           "example": "15:00:00"
          },
          {
           "name": "sessionId",
           "type": "string",
           "required": false,
           "description": "Rodada de teste do painel",
           "howToObtain": "Aparece no contexto da conversa como [contexto do teste]",
           "example": "chat-abc123"
          }
         ]
        }
       ],
       "retryOnError": true,
       "maxRetries": 2
      }
     }
    }
   ],
   "edges": [
    {
     "id": "e1",
     "source": "start",
     "target": "agent-1"
    },
    {
     "id": "e2",
     "source": "rag-1",
     "target": "agent-1",
     "targetHandle": "slot-1"
    },
    {
     "id": "e3",
     "source": "agent-1",
     "target": "end-1"
    },
    {
     "id": "e-webhook-agent",
     "source": "webhook-1",
     "target": "agent-1",
     "sourceHandle": "tool",
     "targetHandle": "slot-2"
    }
   ]
  }
 }
}
