Substitui a tabela de exemplo pela lista real fornecida pelo usuario. Item 'Sorologia para outras doencas' tratado como sob consulta (nao entra no total automatico, sempre avisa que um atendente confirma o valor). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
476 lines
15 KiB
JSON
476 lines
15 KiB
JSON
{
|
||
"id": "6FU0jjPwEKDBrFSW",
|
||
"name": "Orçamento de Exames - GChat - Z-PRO (IA Visão)",
|
||
"active": true,
|
||
"nodes": [
|
||
{
|
||
"id": "webhook-canal-zpro",
|
||
"name": "Webhook - Canal Z-PRO",
|
||
"type": "n8n-nodes-base.webhook",
|
||
"typeVersion": 2.1,
|
||
"position": [
|
||
-608,
|
||
320
|
||
],
|
||
"parameters": {
|
||
"httpMethod": "POST",
|
||
"path": "orcamento-exames-canal-zpro",
|
||
"responseMode": "onReceived",
|
||
"options": {}
|
||
},
|
||
"webhookId": "a00a2a36-f7ec-4e8e-a98f-93d3f93dfe45",
|
||
"onError": "continueRegularOutput"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"id": "campo-sessionid",
|
||
"name": "sessionId",
|
||
"type": "string",
|
||
"value": "={{ $json.body.ticket.protocol }}"
|
||
},
|
||
{
|
||
"id": "campo-telefone",
|
||
"name": "telefone",
|
||
"type": "string",
|
||
"value": "={{ $json.body.msg.from }}"
|
||
},
|
||
{
|
||
"id": "campo-nomecontato",
|
||
"name": "nomeContato",
|
||
"type": "string",
|
||
"value": "={{ $json.body.ticket.contact.name }}"
|
||
},
|
||
{
|
||
"id": "campo-entrada",
|
||
"name": "entrada",
|
||
"type": "string",
|
||
"value": "={{ ($json.body.msg.text && $json.body.msg.text.body) || '' }}"
|
||
},
|
||
{
|
||
"id": "campo-imagemurl",
|
||
"name": "imagemUrl",
|
||
"type": "string",
|
||
"value": "={{ ($json.body.msg.image && $json.body.msg.image.url) || '' }}"
|
||
},
|
||
{
|
||
"id": "campo-tipomidia",
|
||
"name": "tipoMidia",
|
||
"type": "string",
|
||
"value": "={{ $json.body.msg.type || '' }}"
|
||
},
|
||
{
|
||
"id": "campo-mediatoken",
|
||
"name": "mediaToken",
|
||
"type": "string",
|
||
"value": "={{ ($json.body.ticket.whatsapp && $json.body.ticket.whatsapp.bmToken) || '' }}"
|
||
},
|
||
{
|
||
"id": "campo-stepchatflow",
|
||
"name": "stepChatFlow",
|
||
"type": "string",
|
||
"value": "={{ $json.body.ticket.stepChatFlow || '' }}"
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"id": "extrair-campos",
|
||
"name": "Extrair campos do webhook",
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3.4,
|
||
"position": [
|
||
-368,
|
||
0
|
||
]
|
||
},
|
||
{
|
||
"id": "if-esta-em-orcamento",
|
||
"name": "Está no fluxo de Orçamento?",
|
||
"type": "n8n-nodes-base.if",
|
||
"typeVersion": 2.3,
|
||
"position": [
|
||
-240,
|
||
0
|
||
],
|
||
"parameters": {
|
||
"conditions": {
|
||
"options": {
|
||
"version": 2,
|
||
"leftValue": "",
|
||
"caseSensitive": true,
|
||
"typeValidation": "strict"
|
||
},
|
||
"combinator": "or",
|
||
"conditions": [
|
||
{
|
||
"id": "cond-step-menu-orcamento-1",
|
||
"leftValue": "={{ $json.stepChatFlow }}",
|
||
"rightValue": "node-1787312722889",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals"
|
||
}
|
||
},
|
||
{
|
||
"id": "cond-step-menu-orcamento-2",
|
||
"leftValue": "={{ $json.stepChatFlow }}",
|
||
"rightValue": "node-1787312980617",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "equals"
|
||
}
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
}
|
||
},
|
||
{
|
||
"id": "noop-fora-orcamento",
|
||
"name": "Não é fluxo de Orçamento - ignora",
|
||
"type": "n8n-nodes-base.noOp",
|
||
"typeVersion": 1,
|
||
"position": [
|
||
-240,
|
||
200
|
||
],
|
||
"parameters": {}
|
||
},
|
||
{
|
||
"parameters": {
|
||
"conditions": {
|
||
"options": {
|
||
"caseSensitive": true,
|
||
"leftValue": "",
|
||
"typeValidation": "strict",
|
||
"version": 2
|
||
},
|
||
"combinator": "and",
|
||
"conditions": [
|
||
{
|
||
"id": "cond-tem-imagem",
|
||
"leftValue": "={{ $json.imagemUrl }}",
|
||
"rightValue": "",
|
||
"operator": {
|
||
"type": "string",
|
||
"operation": "notEmpty",
|
||
"singleValue": true
|
||
}
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"id": "if-e-imagem",
|
||
"name": "É mensagem de imagem?",
|
||
"type": "n8n-nodes-base.if",
|
||
"typeVersion": 2.3,
|
||
"position": [
|
||
-128,
|
||
0
|
||
]
|
||
},
|
||
{
|
||
"parameters": {
|
||
"url": "={{ $json.imagemUrl }}",
|
||
"options": {
|
||
"response": {
|
||
"response": {
|
||
"responseFormat": "file"
|
||
}
|
||
},
|
||
"timeout": 20000
|
||
},
|
||
"sendHeaders": true,
|
||
"headerParameters": {
|
||
"parameters": [
|
||
{
|
||
"name": "Authorization",
|
||
"value": "=Bearer {{ $json.mediaToken }}"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"id": "baixar-imagem",
|
||
"name": "Baixar imagem",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4.4,
|
||
"position": [
|
||
64,
|
||
-288
|
||
],
|
||
"onError": "continueErrorOutput"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"model": {
|
||
"__rl": true,
|
||
"mode": "id",
|
||
"value": "gpt-5.6-luna"
|
||
},
|
||
"builtInTools": {},
|
||
"options": {}
|
||
},
|
||
"id": "openai-chat-model-orcamento",
|
||
"name": "OpenAI Chat Model - Orçamento",
|
||
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
|
||
"typeVersion": 1.3,
|
||
"position": [
|
||
96,
|
||
128
|
||
],
|
||
"credentials": {
|
||
"openAiApi": {
|
||
"id": "h16jFm10cTU15k6M",
|
||
"name": "OpenAI - Orçamento de Exames"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"parameters": {
|
||
"promptType": "define",
|
||
"text": "={{ $('Extrair campos do webhook').item.json.entrada || 'O cliente enviou uma imagem. Veja a imagem anexada, que é o pedido médico dele.' }}",
|
||
"options": {
|
||
"systemMessage": "Você é o assistente de orçamentos de exames de uma clínica, atendendo automaticamente pelo WhatsApp, numa conversa com várias mensagens (não só uma).\n\nTABELA DE EXAMES E VALORES:\n- Hemograma — R$ 35,00\n- Sódio e Potássio — R$ 35,00\n- Ureia e Creatinina — R$ 40,00\n- 25OH / Vitamina D — R$ 80,00\n- Glicemia de Jejum — R$ 20,00\n- Teste Oral de Tolerância à Glicose — R$ 70,00\n- Hemoglobina Glicada — R$ 40,00\n- Colesterol Total e Frações — R$ 50,00\n- Triglicerídeos — R$ 20,00\n- TSH e T4 Livre — R$ 60,00\n- CK — R$ 30,00\n- TGO/TGP — R$ 30,00\n- Gama GT — R$ 20,00\n- Bilirrubina Total e Frações — R$ 30,00\n- Amilase — R$ 30,00\n- Lipase — R$ 35,00\n- Fosfatase Alcalina — R$ 20,00\n- Proteínas Totais e Frações — R$ 25,00\n- Ferro, Ferritina e Transferrina — R$ 100,00\n- Cálcio Total — R$ 20,00\n- Cálcio Ionizado — R$ 30,00\n- Selênio — R$ 100,00\n- Magnésio — R$ 20,00\n- Fósforo — R$ 20,00\n- Ácido Úrico — R$ 20,00\n- VHS — R$ 20,00\n- PCR — R$ 35,00\n- APTT / TTPa — R$ 25,00\n- VDRL — R$ 25,00\n- Dosagem de Vitamina B12 — R$ 60,00\n- Dosagem de Ácido Fólico — R$ 55,00\n- Sorologia para Hepatites A, B e C — R$ 180,00\n- Sorologia para outras doenças (fora hepatites A, B e C) — sob consulta, valor confirmado por um atendente\n- PSA Total e Livre — R$ 60,00\n- Alfa-Fetoproteína + CEA + CA 19-9 — R$ 180,00\n- CA 125 + CA 15-3 — R$ 130,00\n- Eletroforese de Proteínas — R$ 60,00\n- Eletroforese de Hemoglobina — R$ 70,00\n- Tipo Sanguíneo — R$ 30,00\n- Urina I — R$ 25,00\n- Urocultura — R$ 50,00\n- Urina de 24 horas (Creatinina, Albumina e Cálcio) — R$ 90,00\n- Protoparasitológico de Fezes – 1 amostra — R$ 30,00\n- Sangue Oculto nas Fezes — R$ 30,00\n\nCOMO CONVERSAR:\n1. O cliente pode mandar uma foto do pedido médico (com ou sem legenda), digitar os nomes dos exames, ou fazer as duas coisas em mensagens separadas, em qualquer ordem — use também o histórico da conversa (mensagens anteriores) pra juntar as informações, não só a mensagem atual. Uma imagem anexada a esta mensagem (quando houver) é o pedido médico do cliente.\n2. Se o cliente ainda não mandou, nem agora nem antes nesta conversa, nenhuma foto de pedido nem nomes de exames, NÃO invente orçamento — cumprimente rapidamente e peça pra ele mandar a foto do pedido médico ou digitar os nomes dos exames.\n3. Assim que tiver pelo menos um exame identificável (considerando a imagem atual, o texto atual E o histórico da conversa), identifique cada exame pedido.\n4. Para cada exame identificado que corresponde (mesmo com sinônimo, abreviação comum ou pequena diferença de grafia) a um item da tabela acima com valor fixo, inclua na resposta o nome do exame e o valor.\n5. Para exames que caírem em itens \"sob consulta\" (como sorologias fora de Hepatites A, B e C), ou que NÃO correspondem a nenhum item da tabela, ou que você não conseguiu ler/entender com confiança, liste-os separadamente avisando que um atendente vai confirmar o valor.\n6. Nunca deixe de orçar por causa de um item não reconhecido — sempre orçe o que for possível reconhecer.\n7. Calcule e mostre o valor total somando apenas os itens com preço fixo confirmado na tabela (nunca inclua itens \"sob consulta\" no total).\n8. Responda sempre em português, tom cordial e objetivo, formatado para WhatsApp: texto simples, sem markdown (nada de ** ou #), pode usar emojis com moderação e quebras de linha para organizar.\n9. Sua resposta deve conter SOMENTE o texto a ser enviado ao cliente nesta mensagem — nada de comentários extras, explicações do seu raciocínio, ou texto fora da conversa com o cliente.",
|
||
"passthroughBinaryImages": true
|
||
}
|
||
},
|
||
"id": "ai-agent-orcamento",
|
||
"name": "AI Agent - Orçamento",
|
||
"type": "@n8n/n8n-nodes-langchain.agent",
|
||
"typeVersion": 3.1,
|
||
"position": [
|
||
160,
|
||
-96
|
||
],
|
||
"onError": "continueErrorOutput"
|
||
},
|
||
{
|
||
"parameters": {
|
||
"assignments": {
|
||
"assignments": [
|
||
{
|
||
"id": "resp-number",
|
||
"name": "number",
|
||
"type": "string",
|
||
"value": "={{ $('Extrair campos do webhook').item.json.telefone }}"
|
||
},
|
||
{
|
||
"id": "resp-body",
|
||
"name": "body",
|
||
"type": "string",
|
||
"value": "={{ $json.output ? $json.output : 'Recebemos sua solicitação de exames! Nossa equipe vai confirmar os valores e te retornar em breve.' }}"
|
||
},
|
||
{
|
||
"id": "resp-externalkey",
|
||
"name": "externalKey",
|
||
"type": "string",
|
||
"value": "={{ 'orcamento-' + $execution.id }}"
|
||
},
|
||
{
|
||
"id": "resp-isclosed",
|
||
"name": "isClosed",
|
||
"type": "boolean",
|
||
"value": false
|
||
}
|
||
]
|
||
},
|
||
"options": {}
|
||
},
|
||
"id": "montar-corpo-resposta",
|
||
"name": "Montar corpo da resposta",
|
||
"type": "n8n-nodes-base.set",
|
||
"typeVersion": 3.4,
|
||
"position": [
|
||
640,
|
||
-128
|
||
]
|
||
},
|
||
{
|
||
"parameters": {
|
||
"sessionIdType": "customKey",
|
||
"sessionKey": "={{ 'orcamento-' + ($('Extrair campos do webhook').item.json.sessionId || $('Extrair campos do webhook').item.json.telefone) }}",
|
||
"contextWindowLength": 20
|
||
},
|
||
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
|
||
"typeVersion": 1.4,
|
||
"position": [
|
||
240,
|
||
112
|
||
],
|
||
"id": "aa58f6fd-5d98-43ed-b645-eeb7e3494564",
|
||
"name": "Simple Memory"
|
||
},
|
||
{
|
||
"id": "enviar-orcamento-zpro-http",
|
||
"name": "Enviar orçamento (Z-PRO)",
|
||
"type": "n8n-nodes-base.httpRequest",
|
||
"typeVersion": 4.4,
|
||
"position": [
|
||
900,
|
||
-128
|
||
],
|
||
"parameters": {
|
||
"method": "POST",
|
||
"url": "https://apigchat.gtigrupo.com.br/v2/api/external/fc30a773-0089-43b9-8b05-a5d92c48eb9b/",
|
||
"authentication": "genericCredentialType",
|
||
"genericAuthType": "httpHeaderAuth",
|
||
"sendBody": true,
|
||
"contentType": "json",
|
||
"specifyBody": "json",
|
||
"jsonBody": "={{ JSON.stringify({ body: $json.body, number: $json.number, externalKey: $json.externalKey, isClosed: $json.isClosed }) }}",
|
||
"options": {
|
||
"timeout": 15000
|
||
}
|
||
},
|
||
"credentials": {
|
||
"httpHeaderAuth": {
|
||
"id": "6IxSBH9y4fXsIoyA",
|
||
"name": "ZPRO API Token - Orçamento de Exames"
|
||
}
|
||
},
|
||
"onError": "continueErrorOutput"
|
||
}
|
||
],
|
||
"connections": {
|
||
"É mensagem de imagem?": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Baixar imagem",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
],
|
||
[
|
||
{
|
||
"node": "AI Agent - Orçamento",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Baixar imagem": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "AI Agent - Orçamento",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
],
|
||
[
|
||
{
|
||
"node": "Montar corpo da resposta",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"OpenAI Chat Model - Orçamento": {
|
||
"ai_languageModel": [
|
||
[
|
||
{
|
||
"node": "AI Agent - Orçamento",
|
||
"type": "ai_languageModel",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"AI Agent - Orçamento": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Montar corpo da resposta",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
],
|
||
[
|
||
{
|
||
"node": "Montar corpo da resposta",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Simple Memory": {
|
||
"ai_memory": [
|
||
[
|
||
{
|
||
"node": "AI Agent - Orçamento",
|
||
"type": "ai_memory",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Extrair campos do webhook": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Está no fluxo de Orçamento?",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Montar corpo da resposta": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Enviar orçamento (Z-PRO)",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Webhook - Canal Z-PRO": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "Extrair campos do webhook",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
},
|
||
"Está no fluxo de Orçamento?": {
|
||
"main": [
|
||
[
|
||
{
|
||
"node": "É mensagem de imagem?",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
],
|
||
[
|
||
{
|
||
"node": "Não é fluxo de Orçamento - ignora",
|
||
"type": "main",
|
||
"index": 0
|
||
}
|
||
]
|
||
]
|
||
}
|
||
},
|
||
"settings": {
|
||
"executionOrder": "v1",
|
||
"saveDataErrorExecution": "all",
|
||
"saveDataSuccessExecution": "all",
|
||
"saveManualExecutions": true,
|
||
"saveExecutionProgress": true,
|
||
"binaryMode": "separate"
|
||
}
|
||
}
|