{"workflow":{"id":14044,"name":"Analyze logs and correlate incidents with OpenAI and Slack","views":72,"recentViews":1,"totalViews":72,"createdAt":"2026-03-14T14:37:30.314Z","description":"## Overview\n\nThis workflow implements an **AI-powered incident investigation and root cause analysis system** that automatically analyzes operational signals when a system incident occurs.\n\nWhen an incident is triggered via webhook, the workflow gathers operational context including **application logs, system metrics, recent deployments, and feature flag changes**. These signals are processed to detect error patterns, cluster similar failures, and correlate them with recent system changes.\n\nThe workflow uses vector embeddings to group similar log messages, allowing it to detect dominant failure patterns across services. It then aligns these failures with contextual events such as deployments, configuration changes, or traffic spikes to identify potential causal relationships.\n\nAn AI agent analyzes all available evidence and generates **structured root cause hypotheses**, including confidence scores, supporting evidence, and recommended remediation actions.\n\nFinally, the workflow posts a detailed incident report directly to Slack, enabling engineering teams to quickly understand the issue and respond faster.\n\nThis architecture helps teams **reduce mean time to resolution (MTTR)** by automating the early stages of incident investigation.\n\n---\n\n## How It Works\n\n### 1. Incident Trigger\n\nThe workflow begins when an incident alert is received through a webhook endpoint.  \nThe webhook payload may include information such as:\n\n- incident ID\n- severity level\n- timestamp\n- affected service\n\nThis event starts the automated investigation process.\n\n---\n\n### 2. Workflow Configuration\n\nA configuration node defines the operational parameters used throughout the workflow, including:\n\n- Logs API endpoint\n- Metrics API endpoint\n- Deployments API endpoint\n- Feature flags API endpoint\n- Time window for analysis\n- Slack channel for incident notifications\n\nThis allows the workflow to be easily adapted to different observability stacks.\n\n---\n\n### 3. Incident Context Collection\n\nThe workflow collects system context from multiple sources:\n\n- application logs\n- infrastructure or service metrics\n- recent deployments\n- active feature flags\n\nGathering this information provides the signals required to understand what happened before and during the incident.\n\n---\n\n### 4. Log Normalization and Denoising\n\nRaw logs are processed to remove low-value entries such as debug or informational messages.\n\nThe workflow extracts structured error information including:\n\n- timestamps\n- log severity\n- services involved\n- request or session IDs\n- error messages and stack traces\n\nThis step ensures that only relevant failure signals are analyzed.\n\n---\n\n### 5. Failure Pattern Clustering\n\nError messages are converted into embeddings using OpenAI.\n\nThe workflow stores these embeddings in an in-memory vector store to group similar log messages together.  \nThis clustering step identifies dominant failure patterns that may appear across multiple sessions or services.\n\n---\n\n### 6. Failure Pattern Analysis\n\nClustered log data is analyzed to detect recurring error types and dominant failure clusters.\n\nThe workflow calculates statistics such as:\n\n- total error volume\n- most common error types\n- error distribution across clusters\n- dominant failure patterns\n\nThese insights help highlight the primary issues affecting the system.\n\n---\n\n### 7. Event Correlation Analysis\n\nFailure patterns are then aligned with contextual events such as:\n\n- deployments\n- configuration changes\n- traffic spikes\n\nThe workflow calculates correlation scores based on temporal proximity and assigns likelihood scores to potential causes.\n\nThis allows the system to identify events that may have triggered the incident.\n\n---\n\n### 8. AI Root Cause Analysis\n\nAn AI agent analyzes the collected signals and generates structured root cause hypotheses.\n\nThe agent considers:\n\n- error clusters\n- deployment timing\n- configuration changes\n- traffic patterns\n- system metrics\n\nThe output includes:\n\n- multiple root cause hypotheses\n- confidence scores\n- supporting evidence\n- recommended remediation actions\n\n---\n\n### 9. Incident Ticket Creation\n\nThe final analysis is formatted into a structured incident report and posted to Slack.\n\nThe Slack message contains:\n\n- incident metadata\n- root cause hypotheses\n- confidence scores\n- evidence\n- recommended actions\n- affected services\n\nThis enables engineers to quickly review the investigation results and take action.\n\n---\n\n## Setup Instructions\n\n### 1. Configure Observability APIs\n\nUpdate the **Workflow Configuration** node with API endpoints for:\n\n- Logs API\n- Metrics API\n- Deployments API\n- Feature Flags API\n\nThese APIs should return JSON responses containing recent operational data.\n\n---\n\n### 2. Configure OpenAI Credentials\n\nAdd OpenAI credentials for:\n\n- OpenAI Embeddings\n- OpenAI Chat Model\n\nThese are used for log clustering and root cause analysis.\n\n---\n\n### 3. Configure Slack Integration\n\nAdd Slack credentials and specify the Slack channel ID in the configuration node.\n\nIncident reports will be posted automatically to this channel.\n\n---\n\n### 4. Configure the Incident Trigger\n\nDeploy the webhook endpoint generated by the **Incident Trigger** node.\n\nYour monitoring or alerting system (PagerDuty, Grafana, Datadog, etc.) can call this webhook when incidents occur.\n\n---\n\n### 5. Activate the Workflow\n\nOnce configured, activate the workflow in n8n.\n\nWhen incidents are triggered, the workflow will automatically run the investigation pipeline and generate a Slack incident report.\n\n---\n\n## Use Cases\n\n### Automated Incident Investigation\n\nAutomatically analyze operational signals when alerts are triggered to identify possible causes.\n\n---\n\n### AI-Assisted Site Reliability Engineering\n\nProvide engineers with AI-generated root cause hypotheses and investigation insights.\n\n---\n\n### Deployment Impact Detection\n\nDetect whether a recent deployment or configuration change caused a system failure.\n\n---\n\n### Observability Signal Correlation\n\nCombine logs, metrics, and system events to produce a unified incident analysis.\n\n---\n\n### Faster Incident Response\n\nReduce mean time to resolution (MTTR) by automating the early stages of incident debugging.\n\n---\n\n## Requirements\n\n- n8n with LangChain nodes enabled\n- OpenAI API credentials\n- Slack credentials\n- APIs for retrieving:\n  - system logs\n  - service metrics\n  - deployment history\n  - feature flag status","workflow":{"meta":{"instanceId":"48aac30adfc5487a33ef16e0e958096f27cef40df3ed0febcbe1ca199e789786"},"nodes":[{"id":"6fcd8c22-a6d3-4ff4-880c-2ce287b4b044","name":"Incident Trigger","type":"n8n-nodes-base.webhook","position":[-672,320],"webhookId":"0cc0d20b-7d38-46a0-8831-069fb016f0fb","parameters":{"path":"incident-trigger","options":{},"httpMethod":"POST","responseMode":"lastNode"},"typeVersion":2.1},{"id":"226c09f3-3d29-49d5-86ce-27dcb4f9a722","name":"Workflow Configuration","type":"n8n-nodes-base.set","position":[-288,320],"parameters":{"options":{},"assignments":{"assignments":[{"id":"id-1","name":"logsApiUrl","type":"string","value":"<__PLACEHOLDER_VALUE__Logs API endpoint URL__>"},{"id":"id-2","name":"metricsApiUrl","type":"string","value":"<__PLACEHOLDER_VALUE__Metrics API endpoint URL__>"},{"id":"id-3","name":"deploymentsApiUrl","type":"string","value":"<__PLACEHOLDER_VALUE__Deployments API endpoint URL__>"},{"id":"id-4","name":"featureFlagsApiUrl","type":"string","value":"<__PLACEHOLDER_VALUE__Feature flags API endpoint URL__>"},{"id":"id-5","name":"timeWindowMinutes","type":"number","value":30},{"id":"id-6","name":"slackChannel","type":"string","value":"<__PLACEHOLDER_VALUE__Slack channel ID for incident tickets__>"}]},"includeOtherFields":true},"typeVersion":3.4},{"id":"00e7e3ac-b665-44aa-b289-04a6b2b7860f","name":"Fetch Logs","type":"n8n-nodes-base.httpRequest","position":[64,-176],"parameters":{"url":"={{ $('Workflow Configuration').first().json.logsApiUrl }}","options":{"response":{"response":{"responseFormat":"json"}}},"sendQuery":true,"queryParameters":{"parameters":[{"name":"minutes","value":"={{ $('Workflow Configuration').first().json.timeWindowMinutes }}"}]}},"typeVersion":4.3},{"id":"4c07f9ae-23e8-4499-8265-8eeb56468660","name":"Fetch Metrics","type":"n8n-nodes-base.httpRequest","position":[160,304],"parameters":{"url":"={{ $('Workflow Configuration').first().json.metricsApiUrl }}","options":{"response":{"response":{"responseFormat":"json"}}},"sendQuery":true,"queryParameters":{"parameters":[{"name":"minutes","value":"={{ $('Workflow Configuration').first().json.timeWindowMinutes }}"}]}},"typeVersion":4.3},{"id":"d66bbe1a-a06b-4fcd-8e17-a275406f077d","name":"Fetch Recent Deployments","type":"n8n-nodes-base.httpRequest","position":[160,464],"parameters":{"url":"={{ $('Workflow Configuration').first().json.deploymentsApiUrl }}","options":{"response":{"response":{"responseFormat":"json"}}},"sendQuery":true,"queryParameters":{"parameters":[{"name":"minutes","value":"={{ $('Workflow Configuration').first().json.timeWindowMinutes }}"}]}},"typeVersion":4.3},{"id":"190f0569-4b04-4967-a49e-5d88fbee73bd","name":"Fetch Feature Flags","type":"n8n-nodes-base.httpRequest","position":[160,624],"parameters":{"url":"={{ $('Workflow Configuration').first().json.featureFlagsApiUrl }}","options":{"response":{"response":{"responseFormat":"json"}}}},"typeVersion":4.3},{"id":"37cf0bea-aa67-4e71-9120-eba1247be59a","name":"Normalize and Denoise Logs","type":"n8n-nodes-base.code","position":[256,-176],"parameters":{"jsCode":"// Normalize and Denoise Logs\n// This code processes raw logs to extract meaningful error information\n\nconst items = $input.all();\nconst normalizedLogs = [];\n\n// Define noise patterns to filter out\nconst noisePatterns = [\n  /debug/i,\n  /info/i,\n  /trace/i,\n  /verbose/i\n];\n\n// Process each log entry\nfor (const item of items) {\n  const logData = item.json;\n  \n  // Skip if log level is noise\n  const logLevel = logData.level || logData.severity || '';\n  const isNoise = noisePatterns.some(pattern => pattern.test(logLevel));\n  \n  if (isNoise) {\n    continue;\n  }\n  \n  // Extract key fields\n  const normalizedLog = {\n    timestamp: logData.timestamp || logData.time || logData['@timestamp'] || new Date().toISOString(),\n    level: (logLevel || 'unknown').toLowerCase(),\n    message: logData.message || logData.msg || logData.text || '',\n    sessionId: logData.sessionId || logData.session_id || logData.requestId || logData.request_id || logData.traceId || 'unknown',\n    service: logData.service || logData.serviceName || logData.app || 'unknown',\n    error: logData.error || logData.exception || logData.stack || null,\n    metadata: {\n      host: logData.host || logData.hostname,\n      environment: logData.environment || logData.env,\n      userId: logData.userId || logData.user_id,\n      endpoint: logData.endpoint || logData.path || logData.url\n    }\n  };\n  \n  // Only include logs with error or warning level\n  if (normalizedLog.level === 'error' || normalizedLog.level === 'warn' || normalizedLog.level === 'warning' || normalizedLog.level === 'fatal' || normalizedLog.level === 'critical') {\n    normalizedLogs.push({\n      json: normalizedLog\n    });\n  }\n}\n\n// Group logs by session/request ID\nconst groupedLogs = {};\nfor (const log of normalizedLogs) {\n  const sessionId = log.json.sessionId;\n  if (!groupedLogs[sessionId]) {\n    groupedLogs[sessionId] = [];\n  }\n  groupedLogs[sessionId].push(log.json);\n}\n\n// Create output with grouped logs\nconst output = [];\nfor (const [sessionId, logs] of Object.entries(groupedLogs)) {\n  // Sort logs by timestamp\n  logs.sort((a, b) => new Date(a.timestamp) - new Date(b.timestamp));\n  \n  output.push({\n    json: {\n      sessionId: sessionId,\n      logCount: logs.length,\n      firstError: logs[0].timestamp,\n      lastError: logs[logs.length - 1].timestamp,\n      service: logs[0].service,\n      errors: logs.map(log => ({\n        timestamp: log.timestamp,\n        level: log.level,\n        message: log.message,\n        error: log.error,\n        metadata: log.metadata\n      }))\n    }\n  });\n}\n\nreturn output.length > 0 ? output : [{ json: { message: 'No error logs found after denoising' } }];"},"typeVersion":2},{"id":"fdb0579f-ae62-43e7-8e62-4c724377d84a","name":"Merge Context Data","type":"n8n-nodes-base.aggregate","position":[448,288],"parameters":{"options":{},"aggregate":"aggregateAllItemData"},"typeVersion":1},{"id":"6b29f617-ee1c-4186-be4c-43ab69ed2c6a","name":"OpenAI Embeddings","type":"@n8n/n8n-nodes-langchain.embeddingsOpenAi","position":[720,496],"parameters":{"options":{}},"typeVersion":1.2},{"id":"e80ba28a-1f81-4405-95b3-4748031f19d9","name":"Cluster Log Messages","type":"@n8n/n8n-nodes-langchain.vectorStoreInMemory","position":[704,288],"parameters":{"mode":"insert","memoryKey":{"__rl":true,"mode":"list","value":"vector_store_key"}},"typeVersion":1.3},{"id":"13ed20a6-ed88-4971-9458-5e94beada3d0","name":"Identify Failure Patterns","type":"n8n-nodes-base.code","position":[1152,288],"parameters":{"jsCode":"// Analyze vector store clusters to identify dominant failure patterns\nconst items = $input.all();\n\n// Group items by cluster or similarity\nconst clusters = {};\nconst errorTypes = {};\n\nfor (const item of items) {\n  const data = item.json;\n  \n  // Extract error information\n  const errorType = data.error_type || data.level || data.severity || 'unknown';\n  const message = data.message || data.log || data.text || '';\n  const timestamp = data.timestamp || data.time || new Date().toISOString();\n  \n  // Count error types\n  if (!errorTypes[errorType]) {\n    errorTypes[errorType] = {\n      count: 0,\n      messages: [],\n      timestamps: []\n    };\n  }\n  errorTypes[errorType].count++;\n  errorTypes[errorType].messages.push(message);\n  errorTypes[errorType].timestamps.push(timestamp);\n  \n  // Group by cluster if available (from vector store)\n  const clusterId = data.cluster_id || data.group || 'default';\n  if (!clusters[clusterId]) {\n    clusters[clusterId] = {\n      id: clusterId,\n      size: 0,\n      errors: [],\n      errorTypes: {}\n    };\n  }\n  clusters[clusterId].size++;\n  clusters[clusterId].errors.push(data);\n  \n  if (!clusters[clusterId].errorTypes[errorType]) {\n    clusters[clusterId].errorTypes[errorType] = 0;\n  }\n  clusters[clusterId].errorTypes[errorType]++;\n}\n\n// Sort error types by frequency\nconst sortedErrorTypes = Object.entries(errorTypes)\n  .map(([type, data]) => ({\n    type,\n    count: data.count,\n    percentage: (data.count / items.length * 100).toFixed(2),\n    sample_messages: data.messages.slice(0, 5),\n    first_occurrence: data.timestamps.sort()[0],\n    last_occurrence: data.timestamps.sort()[data.timestamps.length - 1]\n  }))\n  .sort((a, b) => b.count - a.count);\n\n// Identify dominant patterns in each cluster\nconst clusterAnalysis = Object.values(clusters).map(cluster => {\n  const dominantError = Object.entries(cluster.errorTypes)\n    .sort((a, b) => b[1] - a[1])[0];\n  \n  return {\n    cluster_id: cluster.id,\n    size: cluster.size,\n    dominant_error_type: dominantError ? dominantError[0] : 'unknown',\n    dominant_error_count: dominantError ? dominantError[1] : 0,\n    error_diversity: Object.keys(cluster.errorTypes).length,\n    all_error_types: cluster.errorTypes\n  };\n}).sort((a, b) => b.size - a.size);\n\n// Calculate overall statistics\nconst totalErrors = items.length;\nconst uniqueErrorTypes = Object.keys(errorTypes).length;\nconst largestCluster = clusterAnalysis[0] || { size: 0 };\n\n// Return analysis results\nreturn [{\n  json: {\n    summary: {\n      total_errors: totalErrors,\n      unique_error_types: uniqueErrorTypes,\n      total_clusters: Object.keys(clusters).length,\n      largest_cluster_size: largestCluster.size\n    },\n    top_error_types: sortedErrorTypes.slice(0, 10),\n    cluster_analysis: clusterAnalysis,\n    failure_patterns: {\n      most_frequent_error: sortedErrorTypes[0]?.type || 'none',\n      most_frequent_count: sortedErrorTypes[0]?.count || 0,\n      error_concentration: sortedErrorTypes[0] ? \n        (sortedErrorTypes[0].count / totalErrors * 100).toFixed(2) + '%' : '0%'\n    },\n    raw_data: items.map(item => item.json)\n  }\n}];"},"typeVersion":2},{"id":"9c860f13-1270-44cd-83ae-350ef54b49da","name":"Time-Align Events","type":"n8n-nodes-base.code","position":[1360,288],"parameters":{"jsCode":"// Time-align failure patterns with deployments, config changes, and traffic spikes\n// Correlate timestamps and identify causal relationships\n\nconst items = $input.all();\n\n// Extract and categorize events by type\nconst failurePatterns = [];\nconst deployments = [];\nconst configChanges = [];\nconst trafficSpikes = [];\n\nitems.forEach(item => {\n  const data = item.json;\n  \n  if (data.type === 'failure_pattern') {\n    failurePatterns.push(data);\n  } else if (data.type === 'deployment') {\n    deployments.push(data);\n  } else if (data.type === 'config_change') {\n    configChanges.push(data);\n  } else if (data.type === 'traffic_spike') {\n    trafficSpikes.push(data);\n  }\n});\n\n// Function to parse timestamps\nfunction parseTimestamp(ts) {\n  return new Date(ts).getTime();\n}\n\n// Function to find temporal correlations (within time window)\nfunction findCorrelations(failureEvent, events, windowMinutes = 30) {\n  const failureTime = parseTimestamp(failureEvent.timestamp);\n  const windowMs = windowMinutes * 60 * 1000;\n  \n  return events.filter(event => {\n    const eventTime = parseTimestamp(event.timestamp);\n    const timeDiff = failureTime - eventTime;\n    // Event should occur before or around the same time as failure\n    return timeDiff >= 0 && timeDiff <= windowMs;\n  }).map(event => ({\n    ...event,\n    timeDiffMinutes: Math.round((failureTime - parseTimestamp(event.timestamp)) / 60000),\n    correlationStrength: 1 - ((failureTime - parseTimestamp(event.timestamp)) / windowMs)\n  }));\n}\n\n// Correlate each failure pattern with potential causes\nconst correlatedEvents = failurePatterns.map(failure => {\n  const correlatedDeployments = findCorrelations(failure, deployments, 60);\n  const correlatedConfigChanges = findCorrelations(failure, configChanges, 30);\n  const correlatedTrafficSpikes = findCorrelations(failure, trafficSpikes, 15);\n  \n  // Calculate causal likelihood scores\n  const causalRelationships = [];\n  \n  correlatedDeployments.forEach(dep => {\n    causalRelationships.push({\n      type: 'deployment',\n      event: dep,\n      causalScore: dep.correlationStrength * 0.9, // Deployments are highly likely causes\n      reasoning: `Deployment occurred ${dep.timeDiffMinutes} minutes before failure`\n    });\n  });\n  \n  correlatedConfigChanges.forEach(config => {\n    causalRelationships.push({\n      type: 'config_change',\n      event: config,\n      causalScore: config.correlationStrength * 0.85,\n      reasoning: `Config change occurred ${config.timeDiffMinutes} minutes before failure`\n    });\n  });\n  \n  correlatedTrafficSpikes.forEach(spike => {\n    causalRelationships.push({\n      type: 'traffic_spike',\n      event: spike,\n      causalScore: spike.correlationStrength * 0.7,\n      reasoning: `Traffic spike occurred ${spike.timeDiffMinutes} minutes before failure`\n    });\n  });\n  \n  // Sort by causal score\n  causalRelationships.sort((a, b) => b.causalScore - a.causalScore);\n  \n  return {\n    json: {\n      failurePattern: failure,\n      correlatedEvents: {\n        deployments: correlatedDeployments,\n        configChanges: correlatedConfigChanges,\n        trafficSpikes: correlatedTrafficSpikes\n      },\n      causalRelationships: causalRelationships,\n      topLikelyCause: causalRelationships[0] || null,\n      timestamp: failure.timestamp\n    }\n  };\n});\n\nreturn correlatedEvents;"},"typeVersion":2},{"id":"fd10f16d-5245-4e1c-9ee1-d69a929ca541","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[1616,528],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4.1-mini"},"options":{},"builtInTools":{}},"typeVersion":1.3},{"id":"1fd14fad-204b-4a02-b6f7-e070b74e728e","name":"Root Cause Output Parser","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[1920,496],"parameters":{"schemaType":"manual","inputSchema":"{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"rootCauses\": {\n\t\t\t\"type\": \"array\",\n\t\t\t\"items\": {\n\t\t\t\t\"type\": \"object\",\n\t\t\t\t\"properties\": {\n\t\t\t\t\t\"hypothesis\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t},\n\t\t\t\t\t\"confidence\": {\n\t\t\t\t\t\t\"type\": \"number\",\n\t\t\t\t\t\t\"minimum\": 0,\n\t\t\t\t\t\t\"maximum\": 100\n\t\t\t\t\t},\n\t\t\t\t\t\"evidence\": {\n\t\t\t\t\t\t\"type\": \"array\",\n\t\t\t\t\t\t\"items\": {\n\t\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t\"recommendedAction\": {\n\t\t\t\t\t\t\"type\": \"string\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}"},"typeVersion":1.3},{"id":"8c782c17-209c-4c83-9ec4-01ab32fd5caf","name":"Root Cause Analysis Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[1696,288],"parameters":{"text":"=Analyze the following incident data and generate root cause hypotheses:\n\nFailure Patterns: {{ $json.failurePatterns }}\n\nTime-Aligned Events: {{ $json.correlatedEvents }}\n\nMetrics: {{ $json.metrics }}\n\nDeployments: {{ $json.deployments }}\n\nFeature Flags: {{ $json.featureFlags }}","options":{"systemMessage":"You are an expert Site Reliability Engineer specializing in incident analysis and root cause determination.\n\nYour task is to:\n1. Analyze the provided log clusters, failure patterns, and contextual data\n2. Identify probable root causes based on evidence\n3. Assign confidence scores (0-100) to each hypothesis based on strength of evidence\n4. Provide specific evidence supporting each hypothesis\n5. Recommend concrete actions (rollback, config change, scaling, etc.)\n\nConsider:\n- Temporal correlation between failures and deployments/config changes\n- Traffic patterns and resource utilization\n- Error message patterns and frequency\n- Feature flag changes\n- Historical incident patterns\n\nReturn structured output with multiple hypotheses ranked by confidence."},"promptType":"define","hasOutputParser":true},"typeVersion":3},{"id":"4ce733c6-4bfa-4c0a-9f9c-149965df3be7","name":"Create Incident Ticket","type":"n8n-nodes-base.slack","position":[2224,288],"webhookId":"70232c37-1217-442f-82f4-3f40a1faa76c","parameters":{"text":"=🚨 *Incident Alert - Root Cause Analysis*\n\n*Incident ID:* {{ $('Incident Trigger').first().json.body.incidentId || 'N/A' }}\n*Timestamp:* {{ $now.format('yyyy-MM-dd HH:mm:ss') }}\n*Severity:* {{ $('Incident Trigger').first().json.body.severity || 'Unknown' }}\n\n---\n\n*Root Cause Hypotheses:*\n{{ $('Root Cause Analysis Agent').first().json.hypotheses ? $('Root Cause Analysis Agent').first().json.hypotheses.map((h, i) => `\n${i + 1}. *${h.cause}*\n   • Confidence: ${h.confidence}%\n   • Evidence: ${h.evidence}\n   • Impact: ${h.impact}`).join('\n') : 'No hypotheses generated' }}\n\n---\n\n*Recommended Actions:*\n{{ $('Root Cause Analysis Agent').first().json.recommendations ? $('Root Cause Analysis Agent').first().json.recommendations.map((r, i) => `${i + 1}. ${r}`).join('\n') : 'No recommendations available' }}\n\n---\n\n*Analysis Summary:*\n{{ $('Root Cause Analysis Agent').first().json.summary || 'Analysis in progress...' }}\n\n*Affected Services:* {{ $('Root Cause Analysis Agent').first().json.affectedServices ? $('Root Cause Analysis Agent').first().json.affectedServices.join(', ') : 'Unknown' }}\n*Correlation Score:* {{ $('Root Cause Analysis Agent').first().json.correlationScore || 'N/A' }}","select":"channel","channelId":{"__rl":true,"mode":"id","value":"={{ $('Workflow Configuration').first().json.slackChannel }}"},"otherOptions":{"includeLinkToWorkflow":true}},"typeVersion":2.4},{"id":"a0342a8b-fa71-4094-a5f5-d13a08cd562c","name":"Document Loader","type":"@n8n/n8n-nodes-langchain.documentDefaultDataLoader","position":[912,496],"parameters":{"options":{},"jsonData":"={{ $json.errors }}","jsonMode":"expressionData"},"typeVersion":1.1},{"id":"d35db4d9-a6dd-419c-97bc-2b2abd3b83e8","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-800,144],"parameters":{"color":7,"width":352,"height":384,"content":"## Incident Trigger\n\nThis workflow starts when an incident alert is received through a webhook.\n"},"typeVersion":1},{"id":"896fa1a2-c1c0-4be8-8f98-0fac695ba6df","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-384,144],"parameters":{"color":7,"width":320,"height":368,"content":"## Workflow Configuration\nDefines the API endpoints used to collect logs, metrics, deployments, and feature flag data. It also configures the analysis time window and Slack channel used for incident notifications."},"typeVersion":1},{"id":"426b5dca-2a2f-44b8-89ce-da1ad13e5a28","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[48,80],"parameters":{"color":7,"width":320,"height":704,"content":"## Incident Context Collection\n\nThe workflow gathers operational context from multiple sources including logs, metrics, recent deployments, and feature flag changes."},"typeVersion":1},{"id":"9b81ffea-c472-4025-a0a2-6023f3da9b0d","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-48,-336],"parameters":{"color":7,"width":480,"height":304,"content":"## Log Normalization and Denoising\n\nRaw logs are cleaned and normalized to remove low-value entries such as debug or informational messages."},"typeVersion":1},{"id":"ac4ee442-eb76-40bf-91c3-aa41ce922b84","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[624,128],"parameters":{"color":7,"width":400,"height":464,"content":"## Failure Pattern Clustering\n\nError messages are converted into embeddings and grouped using a vector store."},"typeVersion":1},{"id":"55d9a63c-ef73-49f9-96c9-e08d531361b8","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[1056,144],"parameters":{"color":7,"width":464,"height":368,"content":"## Event Correlation Analysis\n\nFailure patterns are time-aligned with contextual events such as deployments, configuration changes, and traffic spikes."},"typeVersion":1},{"id":"21c8b870-4481-49d1-bdd3-0ff9a70a7e9e","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[2112,144],"parameters":{"color":7,"width":368,"height":352,"content":"The final analysis is posted to Slack as an incident ticket for engineers to review."},"typeVersion":1},{"id":"7329f14e-9970-4716-9d80-da445160fce6","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[1552,112],"parameters":{"color":7,"width":528,"height":544,"content":"## Root Cause Analysis and Incident Ticket\n\nAn AI agent analyzes all collected signals and generates root cause hypotheses."},"typeVersion":1},{"id":"c2a7c381-adda-4003-af89-a581dde6b9bb","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[-1360,80],"parameters":{"width":400,"height":336,"content":"## AI-Powered Incident Root Cause Analysis\n\nThis workflow automates incident investigation using logs, metrics, deployment data, and configuration changes.\n\nIt clusters error logs, identifies failure patterns, correlates them with system events, and uses an AI agent to generate root cause hypotheses and recommended actions. The results are automatically posted to Slack for rapid incident response."},"typeVersion":1}],"pinData":{},"connections":{"Fetch Logs":{"main":[[{"node":"Normalize and Denoise Logs","type":"main","index":0}]]},"Fetch Metrics":{"main":[[{"node":"Merge Context Data","type":"main","index":0}]]},"Document Loader":{"ai_document":[[{"node":"Cluster Log Messages","type":"ai_document","index":0}]]},"Incident Trigger":{"main":[[{"node":"Workflow Configuration","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"Root Cause Analysis Agent","type":"ai_languageModel","index":0}]]},"OpenAI Embeddings":{"ai_embedding":[[{"node":"Cluster Log Messages","type":"ai_embedding","index":0}]]},"Time-Align Events":{"main":[[{"node":"Root Cause Analysis Agent","type":"main","index":0}]]},"Merge Context Data":{"main":[[{"node":"Cluster Log Messages","type":"main","index":0}]]},"Fetch Feature Flags":{"main":[[{"node":"Merge Context Data","type":"main","index":0}]]},"Cluster Log Messages":{"main":[[{"node":"Identify Failure Patterns","type":"main","index":0}]]},"Workflow Configuration":{"main":[[{"node":"Fetch Logs","type":"main","index":0},{"node":"Fetch Metrics","type":"main","index":0},{"node":"Fetch Recent Deployments","type":"main","index":0},{"node":"Fetch Feature Flags","type":"main","index":0}]]},"Fetch Recent Deployments":{"main":[[{"node":"Merge Context Data","type":"main","index":0}]]},"Root Cause Output Parser":{"ai_outputParser":[[{"node":"Root Cause Analysis Agent","type":"ai_outputParser","index":0}]]},"Identify Failure Patterns":{"main":[[{"node":"Time-Align Events","type":"main","index":0}]]},"Root Cause Analysis Agent":{"main":[[{"node":"Create Incident Ticket","type":"main","index":0}]]},"Normalize and Denoise Logs":{"main":[[{"node":"Merge Context Data","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":26,"nodeTypes":{"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":3},"n8n-nodes-base.slack":{"count":1},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.aggregate":{"count":1},"n8n-nodes-base.stickyNote":{"count":9},"n8n-nodes-base.httpRequest":{"count":4},"@n8n/n8n-nodes-langchain.agent":{"count":1},"@n8n/n8n-nodes-langchain.lmChatOpenAi":{"count":1},"@n8n/n8n-nodes-langchain.embeddingsOpenAi":{"count":1},"@n8n/n8n-nodes-langchain.vectorStoreInMemory":{"count":1},"@n8n/n8n-nodes-langchain.outputParserStructured":{"count":1},"@n8n/n8n-nodes-langchain.documentDefaultDataLoader":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"ResilNext","username":"rnair1996","bio":"","verified":true,"links":[""],"avatar":"https://gravatar.com/avatar/c20bc6c3bcdf260fac3c28c556a8db661ee93670037a3ceb857e047851f6f438?r=pg&d=retro&size=200"},"nodes":[{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":40,"icon":"file:slack.svg","name":"n8n-nodes-base.slack","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/slack/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Slack"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Slack","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":47,"icon":"file:webhook.svg","name":"n8n-nodes-base.webhook","codex":{"data":{"alias":["HTTP","API","Build","WH"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"trigger\"]","defaults":{"name":"Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Webhook","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":1119,"icon":"fa:robot","name":"@n8n/n8n-nodes-langchain.agent","codex":{"data":{"alias":["LangChain","Chat","Conversational","Plan and Execute","ReAct","Tools"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"AI Agent","color":"#404040"},"iconData":{"icon":"robot","type":"icon"},"displayName":"AI Agent","typeVersion":3,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1141,"icon":"file:openAiLight.svg","name":"@n8n/n8n-nodes-langchain.embeddingsOpenAi","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.embeddingsopenai/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Embeddings"]}}},"group":"[\"transform\"]","defaults":{"name":"Embeddings OpenAI"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg0IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NyAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MiA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSIjN0Q3RDg3Ii8+Cjwvc3ZnPgo="},"displayName":"Embeddings OpenAI","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1153,"icon":"file:openAiLight.svg","name":"@n8n/n8n-nodes-langchain.lmChatOpenAi","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenai/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"OpenAI Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg0IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NyAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MiA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSIjN0Q3RDg3Ii8+Cjwvc3ZnPgo="},"displayName":"OpenAI Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1179,"icon":"fa:code","name":"@n8n/n8n-nodes-langchain.outputParserStructured","codex":{"data":{"alias":["json","zod"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.outputparserstructured/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Output Parsers"]}}},"group":"[\"transform\"]","defaults":{"name":"Structured Output Parser"},"iconData":{"icon":"code","type":"icon"},"displayName":"Structured Output Parser","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1209,"icon":"fa:database","name":"@n8n/n8n-nodes-langchain.vectorStoreInMemory","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.vectorstoreinmemory/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Vector Stores","Tools","Root Nodes"],"Tools":["Other Tools"],"Vector Stores":["For Beginners"]}}},"group":"[\"transform\"]","defaults":{"name":"Simple Vector Store"},"iconData":{"icon":"database","type":"icon"},"displayName":"Simple Vector Store","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1236,"icon":"file:aggregate.svg","name":"n8n-nodes-base.aggregate","codex":{"data":{"alias":["Aggregate","Combine","Flatten","Transform","Array","List","Item"],"details":"","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.aggregate/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Aggregate"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJub25lIj48ZyBmaWxsPSIjRkY2RDVBIiBjbGlwLXBhdGg9InVybCgjYSkiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMyIDE0OGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDE0NmM2LjYyNyAwIDEyIDUuMzczIDEyIDEydjI0YzAgNi42MjctNS4zNzMgMTItMTIgMTJINDRjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ6bTAgOTZjMC02LjYyNyA1LjM3My0xMiAxMi0xMmgxNDZjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnYyNGMwIDYuNjI3LTUuMzczIDEyLTEyIDEySDQ0Yy02LjYyNyAwLTEyLTUuMzczLTEyLTEyem0wIDk2YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoMTQ2YzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjRjMCA2LjYyNy01LjM3MyAxMi0xMiAxMkg0NGMtNi42MjcgMC0xMi01LjM3My0xMi0xMnoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik03NCA3NmMwIDYuNjI3IDUuMzczIDEyIDEyIDEyaDExNi4yMTdjMTcuNjczIDAgMzIgMTQuMzI3IDMyIDMydjU2YzAgMjYuOTc4IDEwLjI3MiA1MS41NTcgMjcuMTE5IDcwLjAzOSA1LjA1NSA1LjU0NSA1LjA1NSAxNC4zNzcgMCAxOS45MjItMTYuODQ3IDE4LjQ4Mi0yNy4xMTkgNDMuMDYxLTI3LjExOSA3MC4wMzl2NTZjMCAxNy42NzMtMTQuMzI3IDMyLTMyIDMySDg2Yy02LjYyNyAwLTEyIDUuMzczLTEyIDEydjI0YzAgNi42MjcgNS4zNzMgMTIgMTIgMTJoMTE2LjIxN2M0NC4xODMgMCA4MC0zNS44MTcgODAtODB2LTU2YzAtMzAuOTI4IDI1LjA3Mi01NiA1Ni01NmE1Ljc4MyA1Ljc4MyAwIDAgMCA1Ljc4My01Ljc4M3YtMzYuNDM0YTUuNzgzIDUuNzgzIDAgMCAwLTUuNzgzLTUuNzgzYy0zMC45MjggMC01Ni0yNS4wNzItNTYtNTZ2LTU2YzAtNDQuMTgzLTM1LjgxNy04MC04MC04MEg4NmMtNi42MjcgMC0xMiA1LjM3My0xMiAxMnoiLz48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zNzYgMjQ0YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoMTEyYzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjRjMCA2LjYyNy01LjM3MyAxMi0xMiAxMkgzODhjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L2c+PGRlZnM+PGNsaXBQYXRoIGlkPSJhIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDUxMnY1MTJIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4="},"displayName":"Aggregate","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1243,"icon":"file:binary.svg","name":"@n8n/n8n-nodes-langchain.documentDefaultDataLoader","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.documentdefaultdataloader/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Document Loaders"]}}},"group":"[\"transform\"]","defaults":{"name":"Default Data Loader"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI3NjgiIGhlaWdodD0iMTAyNCI+PHBhdGggZmlsbD0iIzdEN0Q4NyIgZD0iTTAgOTYwVjY0aDU3NmwxOTIgMTkydjcwNHptNzA0LTY0MEw1MTIgMTI4SDY0djc2OGg2NDB6TTMyMCA1MTJIMTI4VjI1NmgxOTJ6bS02NC0xOTJoLTY0djEyOGg2NHptMCA0NDhoNjR2NjRIMTI4di02NGg2NFY2NDBoLTY0di02NGgxMjh6bTI1Ni0zMjBoNjR2NjRIMzg0di02NGg2NFYzMjBoLTY0di02NGgxMjh6bTY0IDM4NEgzODRWNTc2aDE5MnptLTY0LTE5MmgtNjR2MTI4aDY0eiIvPjwvc3ZnPg=="},"displayName":"Default Data Loader","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":16,"name":"DevOps"},{"id":48,"name":"AI RAG"}],"image":[]}}