Files
INDENTIFICAR-TEXTO-EM-IMAGEM/n8n/orcamento-exames-imagem.workflow.json
T
EricandClaude Sonnet 5 294a8923f3 feat(n8n): adiciona lista real de 44 exames e valores no prompt
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>
2026-08-21 11:05:15 -03:00

476 lines
15 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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"
}
}