AutomationFlowsAI & RAG › Good AI Triage

Good AI Triage

good-ai-triage. Uses executeWorkflowTrigger, agent, lmChatOpenAi, chainLlm. Event-driven trigger; 7 nodes.

Event trigger★★★★☆ complexityAI-powered7 nodesExecute Workflow TriggerAgentOpenAI ChatChain LlmLm Chat Deep SeekPostgres
AI & RAG Trigger: Event Nodes: 7 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Agent → Chainllm recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "goodaitriage0001",
  "name": "good-ai-triage",
  "nodes": [
    {
      "parameters": {},
      "id": "d0000000-0000-4000-8000-000000000001",
      "name": "Manual",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.ticket }}",
        "hasOutputParser": false,
        "needsFallback": false,
        "options": {
          "maxIterations": 3
        }
      },
      "id": "d0000000-0000-4000-8000-000000000002",
      "name": "Classify",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        220,
        0
      ],
      "retryOnFail": true,
      "maxTries": 2,
      "onError": "stopWorkflow"
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "id",
          "value": "primary-model"
        },
        "responsesApiEnabled": false,
        "options": {
          "timeout": 20000,
          "temperature": 0
        }
      },
      "id": "d0000000-0000-4000-8000-000000000003",
      "name": "Primary Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.3,
      "position": [
        160,
        200
      ],
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "const SCHEMA = { category: ['billing', 'technical'] };\nlet parsed = null;\nconst errors = [];\ntry { parsed = JSON.parse(String($json.output).replace(/```json|```/g, '').trim()); }\ncatch (e) { errors.push('not valid JSON'); }\nfunction validate(v) { return v && typeof v.category === 'string' && SCHEMA.category.includes(v.category); }\nreturn [{ json: { valid: errors.length === 0 && validate(parsed), triage: parsed, errors } }];"
      },
      "id": "d0000000-0000-4000-8000-000000000004",
      "name": "Validate",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        440,
        0
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.ticket }}",
        "needsFallback": false
      },
      "id": "d0000000-0000-4000-8000-000000000005",
      "name": "Fallback Chain",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.9,
      "position": [
        440,
        240
      ],
      "retryOnFail": true,
      "maxTries": 2,
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "model": "deepseek-chat",
        "options": {
          "timeout": 20000,
          "temperature": 0
        }
      },
      "id": "d0000000-0000-4000-8000-000000000006",
      "name": "Fallback Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatDeepSeek",
      "typeVersion": 1,
      "position": [
        380,
        440
      ],
      "credentials": {
        "deepSeekApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "INSERT INTO triage_result (ticket_id, execution_id, category, urgency, summary, requires_human, provider) VALUES ($1, $2, $3, $4, $5, $6::boolean, $7) RETURNING id;",
        "options": {
          "queryReplacement": "={{ [$json.id, $execution.id, $json.triage.category, 'normal', 'summary', false, 'primary'] }}"
        }
      },
      "id": "d0000000-0000-4000-8000-000000000007",
      "name": "Store",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.7,
      "position": [
        660,
        0
      ],
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Manual": {
      "main": [
        [
          {
            "node": "Classify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Classify": {
      "main": [
        [
          {
            "node": "Validate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate": {
      "main": [
        [
          {
            "node": "Store",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Fallback Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fallback Chain": {
      "main": [
        [
          {
            "node": "Validate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Primary Model": {
      "ai_languageModel": [
        [
          {
            "node": "Classify",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Fallback Model": {
      "ai_languageModel": [
        [
          {
            "node": "Fallback Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "errorWorkflow": "errhandler0000001",
    "timezone": "Australia/Brisbane"
  },
  "active": false
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

good-ai-triage. Uses executeWorkflowTrigger, agent, lmChatOpenAi, chainLlm. Event-driven trigger; 7 nodes.

Source: https://github.com/jarrod-wright/n8n-workflow-hardening/blob/main/linter/fixtures/good/ai-triage-clean.workflow.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

bad-r10-llm-output-unvalidated. Uses executeWorkflowTrigger, agent, lmChatOpenAi, lmChatDeepSeek. Event-driven trigger; 6 nodes.

Execute Workflow Trigger, Agent, OpenAI Chat +3
AI & RAG

Bitlab-Chatbot. Uses telegramTrigger, telegram, snowflake, httpRequest. Event-driven trigger; 87 nodes.

Telegram Trigger, Telegram, Snowflake +13
AI & RAG

The best content automation template in the market is now even better—with “deep research” on time-sensitive topics\! Unlike most n8n content automation templates that are mainly for “demo purposes,”

OpenAI, HTTP Request, XML +11
AI & RAG

Typeform IA - YT. Uses typeformTrigger, agent, lmChatOpenAi, toolWorkflow. Event-driven trigger; 75 nodes.

Typeform Trigger, Agent, OpenAI Chat +7
AI & RAG

Agent Nodes. Uses lmChatOpenAi, slack, stopAndError, errorTrigger. Event-driven trigger; 72 nodes.

OpenAI Chat, Slack, Stop And Error +12