Generar respuestas a clientes empáticas con Claude AI y actualización automática

Avanzado

Este es unTicket Management, Multimodal AIflujo de automatización del dominio deautomatización que contiene 21 nodos.Utiliza principalmente nodos como If, Set, Code, Slack, Webhook. Usar Claude AI y actualizaciones automáticas para generar respuestas de clientes empáticos

Requisitos previos
  • Bot Token de Slack o URL de Webhook
  • Punto final de HTTP Webhook (n8n generará automáticamente)
  • Credenciales de API de Google Sheets
  • Clave de API de Anthropic
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "meta": {
    "instanceId": "cb6a5c207772ff185d6f50424ee0baf7d8ab8449011e139b3b983206d2202a31",
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "ac9638bd-e82e-473c-935d-77387f0827c6",
      "name": "Entrada de prueba (Cámbiame)1",
      "type": "n8n-nodes-base.set",
      "position": [
        832,
        576
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={\n  \"text\": \"I'm really frustrated with your service. This is the third time I've had issues and nobody is helping me!\"\n}"
      },
      "typeVersion": 3.4
    },
    {
      "id": "3972b891-6ef7-4f31-915c-7b290932b36e",
      "name": "Configurar Config1",
      "type": "n8n-nodes-base.set",
      "position": [
        1056,
        576
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "={\n  \"MAX_LEN\": 600,\n  \"ADD_FOLLOWUP_QUESTION\": true,\n  \"FORMALITY\": \"auto\",\n  \"EMOJI_ALLOWED\": false,\n  \"SIGNOFF\": \"\",\n  \"BLOCK_LINKS\": true,\n  \"RISK_WORDS\": [\n    \"refund\",\"chargeback\",\"lawsuit\",\"harassment\",\"self-harm\",\"suicide\",\"abuse\",\n    \"threat\",\"racist\",\"illegal\",\"hate\",\"scam\"\n  ]\n}",
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "546540d3-8889-4a5b-a06f-19322d9b386b",
      "name": "Asegurar Sesión1",
      "type": "n8n-nodes-base.code",
      "position": [
        1280,
        576
      ],
      "parameters": {
        "jsCode": "const j = $input.first().json || {};\nconst sid = j.sessionId || 'test-session-1';\nconst text = j.text || j.message || j.input || JSON.stringify(j);\nreturn [{ json: { ...j, sessionId: String(sid), text } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "9f4b03fa-aa22-4cca-a71b-b8d5fa505e45",
      "name": "Agente de IA (Empatía)1",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1568,
        576
      ],
      "parameters": {
        "text": "=You are an Empathy Reply Assistant for English-language messages.\nAnalyze the incoming text:\n<Text>{{ $json.text || $json.message || $json.input || JSON.stringify($json) }}</Text>\n\nGoals:\n1) Detect `sentiment` (positive|neutral|negative|mixed)\n2) Choose a natural human `tone` that fits the sender (warm, calm, upbeat, apologetic, confident, concise)\n3) Draft a short `reply` (<= {{ $('Set Config1').item.json.MAX_LEN }} chars) that:\n   - acknowledges the emotion first in plain English\n   - provides a practical next step or clarification\n   - {{ $('Set Config1').item.json.ADD_FOLLOWUP_QUESTION ? 'ends with a gentle question' : 'may end without a question' }}\n   - uses **no links**, **no hashtags**\n   - matches formality: {{ $('Set Config1').item.json.FORMALITY }} (auto|casual|polite)\n\nReturn **JSON only** with keys: sentiment, tone, reply, confidence (0.0–1.0), needs_handover (boolean).",
        "options": {
          "systemMessage": "Role: Empathetic, practical, concise. Avoid corporate cliches. Keep it in English. No URLs or hashtags."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.6
    },
    {
      "id": "a9afe8de-3810-4b2b-978e-a30f22f487f5",
      "name": "Anthropic Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        1504,
        800
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-3-5-sonnet-latest",
          "cachedResultName": "Claude 3.5 Sonnet (latest)"
        },
        "options": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "1badd599-1d2a-484f-8219-3f03951c2ad4",
      "name": "Memoria (Recientes 4)",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        1632,
        800
      ],
      "parameters": {
        "contextWindowLength": 4
      },
      "typeVersion": 1.3
    },
    {
      "id": "6799d4c5-da73-4415-9d26-c87adfe0d990",
      "name": "Analizador de salida estructurada",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1760,
        800
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"sentiment\": \"positive|neutral|negative|mixed\",\n  \"tone\": \"warm|calm|upbeat|apologetic|confident|concise\",\n  \"reply\": \"string\",\n  \"confidence\": 0.0,\n  \"needs_handover\": false\n}"
      },
      "typeVersion": 1.2
    },
    {
      "id": "61a412c9-801c-4d5d-822a-8499a26d2607",
      "name": "Post-procesar y sanitizar1",
      "type": "n8n-nodes-base.code",
      "position": [
        1968,
        576
      ],
      "parameters": {
        "jsCode": "// Read config from Set Config node (stable across items)\nconst cfgNode = $nodes['Set Config1']?.data?.json || {};\nconst cfg = {\n  MAX_LEN: Number(cfgNode.MAX_LEN ?? 600),\n  EMOJI_ALLOWED: cfgNode.EMOJI_ALLOWED === false ? false : Boolean(cfgNode.EMOJI_ALLOWED),\n  SIGNOFF: String(cfgNode.SIGNOFF ?? ''),\n  BLOCK_LINKS: cfgNode.BLOCK_LINKS === undefined ? true : Boolean(cfgNode.BLOCK_LINKS)\n};\n\nconst input = $input.first().json || {};\nlet out = { ...input };\n\nout.sentiment = (out.sentiment || '').toLowerCase();\nout.tone = (out.tone || '').toLowerCase();\nout.reply = (out.reply || '').toString();\nout.confidence = (typeof out.confidence === 'number') ? out.confidence : 0.6;\nout.needs_handover = !!out.needs_handover;\n\nif (cfg.BLOCK_LINKS) {\n  out.reply = out.reply\n    .replace(/https?:\\/\\/\\S+/gi, '')\n    .replace(/#[\\w-]+/g, '')\n    .replace(/\\s{2,}/g, ' ');\n}\n\nif (cfg.EMOJI_ALLOWED === false) {\n  out.reply = out.reply.replace(/[\\p{Extended_Pictographic}\\p{Emoji_Component}]/gu, '');\n}\n\nout.reply = out.reply\n  .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/ig, '[email hidden]')\n  .replace(/\\b\\+?\\d[\\d\\s().-]{6,}\\b/g, '[phone hidden]');\n\nconst maxLen = Number(cfg.MAX_LEN || 600);\nif (out.reply.length > maxLen) {\n  out.reply = out.reply.slice(0, maxLen - 1).replace(/\\s+\\S*$/, '') + '…';\n}\n\nif (cfg.SIGNOFF && !/\\b(best|thanks|regards)\\b/i.test(out.reply)) {\n  out.reply = out.reply.trim() + \"\\n\" + cfg.SIGNOFF;\n}\n\nreturn [{ json: out }];"
      },
      "typeVersion": 2
    },
    {
      "id": "c255267c-5dfb-47d9-9c9a-9a7ae4ada264",
      "name": "Reglas de riesgo y transferencia1",
      "type": "n8n-nodes-base.code",
      "position": [
        2192,
        576
      ],
      "parameters": {
        "jsCode": "// Read RISK_WORDS from Set Config node\nconst cfgNode = $nodes['Set Config']?.data?.json || {};\nconst riskWords = Array.isArray(cfgNode.RISK_WORDS) ? cfgNode.RISK_WORDS : [];\n\nconst escapeRegex = (s) => String(s).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\nconst riskPattern = riskWords.length ? '(' + riskWords.map(escapeRegex).join('|') + ')' : '(?!)';\nconst risk = new RegExp(riskPattern, 'i');\n\nconst j = $input.first().json || {};\nconst originalText = j.text || j.message || j.input || '';\n\nconst lowConfidence = (j.confidence || 0) < 0.45;\nconst highRisk = risk.test(originalText) || risk.test(j.reply || '');\nconst veryNegative = (j.sentiment || '') === 'negative';\n\nconst needsHandover = Boolean(j.needs_handover || lowConfidence || highRisk || veryNegative);\n\nreturn [{ json: { ...j, needs_handover: needsHandover, _debug: { lowConfidence, highRisk, veryNegative, originalText: String(originalText).substring(0,120), riskWordsUsed: riskWords } } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "7aae0aff-287e-4c5c-b6d4-c2e5b42e2efb",
      "name": "Si necesita_transferencia1",
      "type": "n8n-nodes-base.if",
      "position": [
        2416,
        576
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e2876b8a-248f-41a9-95f2-cbb235ad7071",
              "operator": {
                "type": "boolean",
                "operation": "true"
              },
              "leftValue": "={{ $json.needs_handover }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "42085b59-d2d1-443b-9699-dbbe3ce86acf",
      "name": "Borrador (Necesita revisión)",
      "type": "n8n-nodes-base.set",
      "position": [
        2640,
        480
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "status",
              "type": "string",
              "value": "REVIEW"
            },
            {
              "id": "a2",
              "name": "note",
              "type": "string",
              "value": "Escalate to human: risk/low-confidence/negative tone detected."
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "529f1815-7913-424d-8908-ff282ceabcdd",
      "name": "Borrador (Auto-OK)",
      "type": "n8n-nodes-base.set",
      "position": [
        2640,
        672
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "b1",
              "name": "status",
              "type": "string",
              "value": "OK"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "9517622f-10ae-4597-81e6-4b426d266e4c",
      "name": "para respuestas en tiempo real",
      "type": "n8n-nodes-base.webhook",
      "position": [
        608,
        672
      ],
      "webhookId": "7a62325a-0000-4724-8fe4-8829e3dea2fb",
      "parameters": {
        "path": "7a62325a-0000-4724-8fe4-8829e3dea2fb",
        "options": {}
      },
      "typeVersion": 2.1
    },
    {
      "id": "50a47075-c245-46f5-a103-9c240c03f519",
      "name": "(5–10 min) para mensajes perdidos o en cola",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        608,
        848
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "66b91934-ac03-4d78-a816-052aebae5d8a",
      "name": "Actualizar un mensaje",
      "type": "n8n-nodes-base.slack",
      "position": [
        2864,
        688
      ],
      "webhookId": "d03b31ff-3de4-4953-a091-7445a6c48be5",
      "parameters": {
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "operation": "update",
        "otherOptions": {},
        "updateFields": {}
      },
      "typeVersion": 2.3
    },
    {
      "id": "0dc9f0d7-38ff-4cf0-919e-c6d87b93168d",
      "name": "Guardar en Google Sheets1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2848,
        464
      ],
      "parameters": {
        "columns": {
          "value": {
            "Nodes": "={{ $json.nodes }}",
            "Stars": "={{ $json.stars }}",
            "File URL": "={{ $json.file_url }}",
            "Repo URL": "={{ $json.repo_url }}",
            "Use Case": "={{ $json.ai_use_case }}",
            "Workflow": "={{ $json.workflow_name }}",
            "Key Nodes": "={{ $json.key_nodes }}",
            "AI Powered": "={{ $json.has_ai }}",
            "AI Summary": "={{ $json.description }}",
            "Difficulty": "={{ $json.ai_difficulty }}",
            "Node Types": "={{ $json.node_types }}",
            "Repository": "={{ $json.repository }}"
          },
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Workflow"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": "={{ $('Config1').item.json.SHEET_NAME }}",
        "documentId": "={{ $('Config1').item.json.SPREADSHEET_ID }}"
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "lQPBplQIZUZ1JZ5k",
          "name": "Google Sheets account 3"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "96ce7708-d101-4cb8-a242-1ca6e8727fd3",
      "name": "para pruebas",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        608,
        480
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "3f86e343-aec8-4bd3-8f8d-ad09a1aae6e5",
      "name": "Nota adhesiva",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        160
      ],
      "parameters": {
        "width": 384,
        "height": 368,
        "content": "## Empathy Reply Assistant\n**What it does**  \nGenerates empathetic reply drafts, sanitizes content, and auto-escalates risky cases.\n\n**Flow**  \n1) Input (Manual / Webhook)  \n2) AI (Claude) → { sentiment, tone, reply, confidence }  \n3) Sanitize (links / PII / length)  \n4) Risk rules (keywords, negativity, low confidence)  \n5) Route → **OK** / **Needs Review**\n\n**Who for**  \nSupport, Community, Sales, CX, Automation builders"
      },
      "typeVersion": 1
    },
    {
      "id": "ab112a1e-bf36-4ee6-b8e5-9b0a500c4a5e",
      "name": "Nota adhesiva1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        608
      ],
      "parameters": {
        "width": 384,
        "height": 352,
        "content": "## Routes & Thresholds\n**Escalate (Needs Review)** when:  \n- negative sentiment  \n- matches `RISK_WORDS`  \n- confidence < 0.45  \n- mentions legal / harassment / self-harm  \n\n**Auto-OK** when:  \n- no risk matched  \n- confidence ≥ 0.45  \n\n**Outputs**  \n- OK → sendable draft  \n- REVIEW → human check required"
      },
      "typeVersion": 1
    },
    {
      "id": "fceb4bb7-0e2b-460e-901f-8dcb415fdb7e",
      "name": "Nota adhesiva2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        160
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 304,
        "content": "## Setup (3–5 min)\n1. Connect **Anthropic** → Anthropic Chat Model  \n2. Edit **Set Config1**:  \n   - `MAX_LEN`, `FORMALITY`, `ADD_FOLLOWUP_QUESTION`  \n   - `EMOJI_ALLOWED`, `BLOCK_LINKS`  \n   - `RISK_WORDS` (add your terms)  \n3. Choose trigger:  \n   - **Manual** → testing  \n   - **Webhook** → real-time replies  \n   - **Schedule** → every 5–10 min  \n\n💡 Tip: keep secrets in **Credentials**, not nodes."
      },
      "typeVersion": 1
    },
    {
      "id": "b789e28c-1349-46fd-bbcd-161102405afa",
      "name": "Nota adhesiva3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        768
      ],
      "parameters": {
        "color": 7,
        "width": 384,
        "height": 224,
        "content": "## Notes / Safety\n- 🔐 No hardcoded API keys → use **Credentials**  \n- 🧪 Treat outputs as **drafts** before sending  \n- 🧹 Remove test data before sharing publicly  \n- ⚙️ Tune thresholds & `RISK_WORDS` to your org policy  \n- 🗂️ Optionally log to Slack / Sheets for review  \n\nAuthor: **Yusuke (@yskautomation)**  \nLicense: **MIT**"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "3972b891-6ef7-4f31-915c-7b290932b36e": {
      "main": [
        [
          {
            "node": "546540d3-8889-4a5b-a06f-19322d9b386b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "546540d3-8889-4a5b-a06f-19322d9b386b": {
      "main": [
        [
          {
            "node": "9f4b03fa-aa22-4cca-a71b-b8d5fa505e45",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1badd599-1d2a-484f-8219-3f03951c2ad4": {
      "ai_memory": [
        [
          {
            "node": "9f4b03fa-aa22-4cca-a71b-b8d5fa505e45",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "7aae0aff-287e-4c5c-b6d4-c2e5b42e2efb": {
      "main": [
        [
          {
            "node": "42085b59-d2d1-443b-9699-dbbe3ce86acf",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "529f1815-7913-424d-8908-ff282ceabcdd",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9f4b03fa-aa22-4cca-a71b-b8d5fa505e45": {
      "main": [
        [
          {
            "node": "61a412c9-801c-4d5d-822a-8499a26d2607",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a9afe8de-3810-4b2b-978e-a30f22f487f5": {
      "ai_languageModel": [
        [
          {
            "node": "9f4b03fa-aa22-4cca-a71b-b8d5fa505e45",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "9517622f-10ae-4597-81e6-4b426d266e4c": {
      "main": [
        [
          {
            "node": "ac9638bd-e82e-473c-935d-77387f0827c6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c255267c-5dfb-47d9-9c9a-9a7ae4ada264": {
      "main": [
        [
          {
            "node": "7aae0aff-287e-4c5c-b6d4-c2e5b42e2efb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ac9638bd-e82e-473c-935d-77387f0827c6": {
      "main": [
        [
          {
            "node": "3972b891-6ef7-4f31-915c-7b290932b36e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "61a412c9-801c-4d5d-822a-8499a26d2607": {
      "main": [
        [
          {
            "node": "c255267c-5dfb-47d9-9c9a-9a7ae4ada264",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6799d4c5-da73-4415-9d26-c87adfe0d990": {
      "ai_outputParser": [
        [
          {
            "node": "9f4b03fa-aa22-4cca-a71b-b8d5fa505e45",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "50a47075-c245-46f5-a103-9c240c03f519": {
      "main": [
        []
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Avanzado - Gestión de tickets, IA Multimodal

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Información del flujo de trabajo
Nivel de dificultad
Avanzado
Número de nodos21
Categoría2
Tipos de nodos13
Descripción de la dificultad

Adecuado para usuarios avanzados, flujos de trabajo complejos con 16+ nodos

Autor

Building AI-driven automation systems that earn, learn, and evolve on their own. n8n | AI Agents | SaaS Integrations.

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34