Files
INDENTIFICAR-TEXTO-EM-IMAGEM/n8n/orcamento-exames-imagem.workflow.json
T

399 lines
11 KiB
JSON

{
"id": "6FU0jjPwEKDBrFSW",
"name": "Orçamento de Exames - GChat - Z-PRO (IA Visão)",
"active": false,
"nodes": [
{
"id": "webhook-orcamento",
"name": "Webhook - Foto Exame",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [
-600,
0
],
"parameters": {
"httpMethod": "POST",
"path": "orcamento-exames-zpro",
"responseMode": "onReceived",
"options": {}
},
"webhookId": "5ea5f89e-7351-4d45-a881-0055009423a0",
"onError": "continueRegularOutput"
},
{
"id": "extrair-campos",
"name": "Extrair campos do webhook",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-360,
0
],
"parameters": {
"assignments": {
"assignments": [
{
"id": "campo-sessionid",
"name": "sessionId",
"type": "string",
"value": "={{ $json.body.protocol }}"
},
{
"id": "campo-telefone",
"name": "telefone",
"type": "string",
"value": "={{ $json.body.number }}"
},
{
"id": "campo-nomecontato",
"name": "nomeContato",
"type": "string",
"value": "={{ $json.body.contactName }}"
},
{
"id": "campo-imagemurl",
"name": "imagemUrl",
"type": "string",
"value": "={{ $json.body.mediaUrl || $json.body.fileUrl || $json.body.file || '' }}"
},
{
"id": "campo-tipomidia",
"name": "tipoMidia",
"type": "string",
"value": "={{ $json.body.mediaType || $json.body.type || '' }}"
}
]
},
"options": {}
}
},
{
"id": "if-e-imagem",
"name": "É mensagem de imagem?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.3,
"position": [
-120,
0
],
"parameters": {
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-tem-imagem",
"leftValue": "={{ $json.imagemUrl }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
}
}
]
},
"options": {}
}
},
{
"id": "noop-nao-imagem",
"name": "Não é imagem - encerra",
"type": "n8n-nodes-base.noOp",
"typeVersion": 1,
"position": [
120,
160
],
"parameters": {}
},
{
"id": "baixar-imagem",
"name": "Baixar imagem",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
120,
-120
],
"parameters": {
"method": "GET",
"url": "={{ $json.imagemUrl }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
},
"timeout": 20000
}
},
"onError": "continueErrorOutput"
},
{
"id": "openai-chat-model-orcamento",
"name": "OpenAI Chat Model - Orçamento",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.3,
"position": [
360,
-280
],
"parameters": {
"model": {
"mode": "id",
"value": "gpt-4o"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "h16jFm10cTU15k6M",
"name": "OpenAI - Orçamento de Exames"
}
}
},
{
"id": "ai-agent-orcamento",
"name": "AI Agent - Orçamento",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"position": [
360,
-120
],
"parameters": {
"promptType": "define",
"text": "Segue a imagem do pedido de exames do cliente. Monte o orçamento conforme as instruções do system prompt.",
"options": {
"systemMessage": "Você é o assistente de orçamentos de exames de uma clínica, respondendo automaticamente por WhatsApp.\n\nTABELA DE EXAMES E VALORES (lista de exemplo — será substituída pela lista real depois):\n- Hemograma completo — R$ 35,00\n- Glicemia de jejum — R$ 20,00\n- Colesterol total e frações — R$ 45,00\n- Triglicérideos — R$ 25,00\n- TSH (hormônio tireoidiano) — R$ 40,00\n- Exame de urina (EAS) — R$ 30,00\n- Ultrassonografia abdominal — R$ 150,00\n- Raio-X de tórax — R$ 90,00\n- Eletrocardiograma (ECG) — R$ 80,00\n- Papanicolau — R$ 60,00\n\nINSTRUÇÕES:\n1. Leia a imagem anexada, que é a foto de um pedido médico de exames (pode estar manuscrita ou impressa).\n2. Identifique cada exame solicitado na imagem.\n3. 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, inclua na resposta o nome do exame e o valor.\n4. Para exames identificados na imagem que NÃO correspondem a nenhum item da tabela, ou que você não conseguiu ler com confiança, liste-os separadamente avisando que um atendente vai confirmar o valor.\n5. Nunca deixe de responder por causa de um item não reconhecido — sempre orçe o que for possível reconhecer.\n6. Calcule e mostre o valor total somando apenas os itens com preço confirmado na tabela.\n7. Responda 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.\n8. Sua resposta deve conter SOMENTE o texto final a ser enviado ao cliente — nada de comentários extras, explicações do seu raciocínio, ou texto fora do orçamento.",
"passthroughBinaryImages": true
}
},
"onError": "continueErrorOutput"
},
{
"id": "montar-corpo-resposta",
"name": "Montar corpo da resposta",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
640,
-120
],
"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": "enviar-orcamento-zpro",
"name": "Enviar orçamento (Z-PRO)",
"type": "n8n-nodes-base.executeWorkflow",
"typeVersion": 1.3,
"position": [
900,
-120
],
"parameters": {
"workflowId": {
"__rl": true,
"mode": "id",
"value": "Y4ndG7GuIUrmVRxV",
"cachedResultName": "MCP Server - Mensageria ZPRO - enviar_texto"
},
"workflowInputs": {
"mappingMode": "defineBelow",
"value": {
"number": "={{ $json.number }}",
"body": "={{ $json.body }}",
"externalKey": "={{ $json.externalKey }}",
"isClosed": "={{ $json.isClosed }}"
},
"matchingColumns": [],
"schema": [
{
"id": "number",
"displayName": "number",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string"
},
{
"id": "body",
"displayName": "body",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string"
},
{
"id": "externalKey",
"displayName": "externalKey",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "string"
},
{
"id": "isClosed",
"displayName": "isClosed",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true,
"type": "boolean"
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
}
}
}
],
"connections": {
"Webhook - Foto Exame": {
"main": [
[
{
"node": "Extrair campos do webhook",
"type": "main",
"index": 0
}
]
]
},
"Extrair campos do webhook": {
"main": [
[
{
"node": "É mensagem de imagem?",
"type": "main",
"index": 0
}
]
]
},
"É mensagem de imagem?": {
"main": [
[
{
"node": "Baixar imagem",
"type": "main",
"index": 0
}
],
[
{
"node": "Não é imagem - encerra",
"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
}
]
]
},
"Montar corpo da resposta": {
"main": [
[
{
"node": "Enviar orçamento (Z-PRO)",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1",
"saveDataErrorExecution": "all",
"saveDataSuccessExecution": "all",
"saveManualExecutions": true,
"saveExecutionProgress": true
}
}