AutomationFlowsAI & RAG › Agentqa

Agentqa

AgentQA. Uses chatTrigger, lmChatOpenRouter, agent, memoryBufferWindow. Chat trigger; 9 nodes.

Chat trigger trigger★★★★☆ complexityAI-powered9 nodesChat TriggerOpenRouter ChatAgentMemory Buffer WindowGoogle Gemini
AI & RAG Trigger: Chat trigger Nodes: 9 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Agent → Chat Trigger 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
{
  "name": "AgentQA",
  "nodes": [
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.3,
      "position": [
        -2304,
        -1392
      ],
      "id": "26d0da89-d27a-4ed1-a89f-5d925de502f6",
      "name": "When chat message received"
    },
    {
      "parameters": {
        "model": "google/gemini-2.5-flash",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        -2400,
        -1152
      ],
      "id": "cfaf1368-1a8a-4b61-a286-3436ff60bace",
      "name": "OpenRouter Chat Model2",
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "options": {
          "systemMessage": "=\u0422\u044b \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430.\n\n\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0441\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u0441\u0442 \u043a\u0435\u0439\u0441\u044b, \u0432\u044b\u043f\u043e\u043b\u043d\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\n\u041e\u0442\u043f\u0440\u0430\u0432\u044c \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 agentDesignerTestCases. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0439 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 agentDesignerTestCases \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u0437\u0434\u0430\u0447\u0438."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 2.2,
      "position": [
        -2112,
        -1392
      ],
      "id": "b45c7dc4-9741-40ea-9f47-c93a623209bc",
      "name": "AI Agent"
    },
    {
      "parameters": {
        "contextWindowLength": 10
      },
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "typeVersion": 1.3,
      "position": [
        -2016,
        -1216
      ],
      "id": "877ca6fe-e894-4792-8467-29e3f54aa33e",
      "name": "Simple Memory"
    },
    {
      "parameters": {
        "resource": "document",
        "modelId": {
          "__rl": true,
          "value": "models/gemini-2.5-pro",
          "mode": "list",
          "cachedResultName": "models/gemini-2.5-pro"
        },
        "text": "\u0420\u043e\u043b\u044c: \u0422\u044b \u2014 \u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e (QA Engineer) \u0441 \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u043b\u043e\u0433\u0438\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0447\u0435\u0440\u043d\u044b\u0439 \u044f\u0449\u0438\u043a, \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u043e\u0435/\u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e\u0435, \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435). \u0422\u0432\u043e\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f (\u0438\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0445 \u0430\u043d\u0430\u043b\u0438\u0437\u0430) \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439, \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442-\u043a\u0435\u0439\u0441\u043e\u0432.\n\n\u0426\u0435\u043b\u044c: \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442-\u043a\u0435\u0439\u0441\u044b, \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0438, \u0433\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e, \u043d\u0435\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439.\n\n\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438:\n\n\u041f\u043e\u043a\u0440\u044b\u0442\u0438\u0435: \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439 \u0442\u0435\u0441\u0442-\u043a\u0435\u0439\u0441\u044b \u0434\u043b\u044f \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432, \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 (boundary value analysis) \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438 (equivalence partitioning).\n\n\u0414\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: \u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0441\u0442-\u043a\u0435\u0439\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c, \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u043c \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u043c.\n\n\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0437\u0430\u0446\u0438\u044f: \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442-\u043a\u0435\u0439\u0441\u0430, \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0435\u0433\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438.\n\n\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 (\u0438\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0430\u043d\u0430\u043b\u0438\u0437\u0430) \u0434\u043b\u044f \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432.\n\n\u0424\u043e\u0440\u043c\u0430\u0442: \u041e\u0442\u0432\u0435\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON.\n{\n  \"project_name\": \"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\",\n  \"test_suite_title\": \"\u0422\u0435\u0441\u0442-\u0441\u044c\u044e\u0442 \u0434\u043b\u044f [\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438]\",\n  \"test_cases\": [\n    {\n      \"test_case_id\": \"TC-001\",\n      \"title\": \"...\",\n      \"requirement_id\": \"...\",\n      \"priority\": \"...\",\n      \"type\": \"...\",\n      \"preconditions\": [\n        \"...\"\n      ],\n      \"steps\": [\n        \"...\"\n      ],\n      \"test_data\": {\n        \"key1\": \"value1\"\n      },\n      \"expected_result\": \"...\",\n      \"scenario_type\": \"...\"\n    },\n    // ... \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442-\u043a\u0435\u0439\u0441\u044b\n  ]\n}",
        "documentUrls": "https://docs.google.com/document/d/1u8-y8Tn65mJtrmgr03plFjmnycb6fO1PpFvlBYp7kRI/edit?tab=t.0#heading=h.58anaqenjho1",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "typeVersion": 1,
      "position": [
        -1744,
        -1392
      ],
      "id": "f319779b-69de-4def-910f-1d20b8f6a551",
      "name": "agentDesigner",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// \u041a\u043e\u0434 \u0434\u043b\u044f \u0443\u0437\u043b\u0430 Code (Execution Mode: Run Once for All Items)\n\nconst agentResponse = items[0].json;\n\n// 1. \u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e JSON\nconst rawText = agentResponse.content.parts[0].text;\n\n// 2. \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u0442 Markdown \u043e\u0431\u0435\u0440\u0442\u043a\u0438 (```json\\n \u0438 \\n```)\nlet jsonString = rawText.trim();\n\nif (jsonString.startsWith('```json\\n')) {\n    jsonString = jsonString.substring('```json\\n'.length);\n} \n\nif (jsonString.endsWith('\\n```')) {\n    jsonString = jsonString.substring(0, jsonString.length - '\\n```'.length);\n} else if (jsonString.endsWith('```')) {\n    jsonString = jsonString.substring(0, jsonString.length - '```'.length);\n}\n\n// \ud83d\udca5 \u041d\u041e\u0412\u042b\u0419 \u0428\u0410\u0413 \u0418\u0421\u041f\u0420\u0410\u0412\u041b\u0415\u041d\u0418\u042f: \u0417\u0430\u043c\u0435\u043d\u0430 JS-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u043b\u0438\u0442\u0435\u0440\u0430\u043b\u044b\n// \u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0449\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d: \"\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\".repeat(N)\n// \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u043b\u0438\u0442\u0435\u0440\u0430\u043b \u0441 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \"a...a\")\njsonString = jsonString.replace(/\"(.)\"\\.repeat\\((\\d+)\\)/g, (match, char, count) => {\n    // char - \u0441\u0438\u043c\u0432\u043e\u043b \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \"a\")\n    // count - \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 50)\n    const repeatCount = parseInt(count, 10);\n    // \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 N \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0438 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u0434\u043b\u044f JSON\n    return JSON.stringify(char.repeat(repeatCount));\n});\n\n// 3. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0447\u0438\u0449\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 JSON \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\nlet parsedObject;\ntry {\n    parsedObject = JSON.parse(jsonString);\n} catch (error) {\n    console.error(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON (\u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f):\", error);\n    throw new Error(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c JSON, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442 \u0430\u0433\u0435\u043d\u0442\u0430-\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0430. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430.\");\n}\n\n// 4. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\nreturn [{ json: parsedObject }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1584,
        -1392
      ],
      "id": "bbb215ce-77a6-4d6a-bc6b-f6203efcac1a",
      "name": "parsing_data_agent_predesign2"
    },
    {
      "parameters": {
        "operation": "xlsx",
        "options": {}
      },
      "type": "n8n-nodes-base.convertToFile",
      "typeVersion": 1.1,
      "position": [
        -1408,
        -1392
      ],
      "id": "af821d6c-5f8c-4b3e-8c28-a7b08f1f7adc",
      "name": "Convert to File"
    },
    {
      "parameters": {
        "jsCode": "// \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f TMS \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438\nconst parsedData = $input.item.json;\n\n// \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442-\u043a\u0435\u0439\u0441\u044b \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432\nlet testCases = [];\n\nif (Array.isArray(parsedData)) {\n  testCases = parsedData[0]?.test_cases || parsedData[0]?.data?.test_cases || [];\n} else if (parsedData.test_cases) {\n  testCases = parsedData.test_cases;\n} else if (parsedData.data?.test_cases) {\n  testCases = parsedData.data.test_cases;\n} else if (parsedData[0]?.test_cases) {\n  testCases = parsedData[0].test_cases;\n}\n\n// \u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f\nif (!Array.isArray(testCases) || testCases.length === 0) {\n  throw new Error('No test cases found in parsed data');\n}\n\n// \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f TMS\nreturn [{\n  json: {\n    project_id: 'ai-agent-tests',\n    project_name: 'AI Agent Test Cases',\n    test_cases: testCases,\n    source: 'agentDesigner',\n    generated_at: new Date().toISOString(),\n    workflow_id: $workflow.id,\n    execution_id: $execution.id\n  }\n}];"
      },
      "id": "352c5804-67d8-4191-baa9-f32021070995",
      "name": "Prepare for TMS",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1384,
        -1392
      ]
    },
    {
      "parameters": {
        "workflowId": {
          "__rl": true,
          "value": "TMS Integration",
          "mode": "list"
        },
        "source": "workflow",
        "waitForExecution": true,
        "inputData": "json",
        "inputDataJson": "={{ $json }}",
        "options": {}
      },
      "id": "b0501eae-f216-4d96-adf0-b4a3704709f3",
      "name": "Execute Workflow (TMS)",
      "type": "n8n-nodes-base.executeWorkflow",
      "typeVersion": 1.1,
      "position": [
        -1184,
        -1392
      ]
    }
  ],
  "connections": {
    "When chat message received": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model2": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Simple Memory": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "agentDesigner",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "agentDesigner": {
      "main": [
        [
          {
            "node": "parsing_data_agent_predesign2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "parsing_data_agent_predesign2": {
      "main": [
        [
          {
            "node": "Prepare for TMS",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare for TMS": {
      "main": [
        [
          {
            "node": "Execute Workflow (TMS)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Workflow (TMS)": {
      "main": [
        [
          {
            "node": "Convert to File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [],
  "triggerCount": 1,
  "updatedAt": null,
  "versionId": "56e9a31f-9417-4e3d-b476-9b43f70b0552"
}

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

AgentQA. Uses chatTrigger, lmChatOpenRouter, agent, memoryBufferWindow. Chat trigger; 9 nodes.

Source: https://github.com/Sonimi7/qa-agent-pipeline/blob/dbb72dd8654867d737f7ec2b67c310b0e28b5e4f/AgentQA-simplified.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

This is the core AI agent used for queryverify.com.

Chat Trigger, Memory Buffer Window, Postgres +4
AI & RAG

n8n-ejentum-harness-integration-patterns. Uses lmChatOpenRouter, memoryBufferWindow, chatTrigger, mcpClientTool. Chat trigger; 37 nodes.

OpenRouter Chat, Memory Buffer Window, Chat Trigger +3
AI & RAG

Send an AI a few details about your "Dream Customer" in normal english, then have it search the web and give you a "Dream 100" - 100 ideal prospects to connect with in your industry.

Agent, OpenRouter Chat, Chat Trigger +7
AI & RAG

Turn any YouTube channel into a searchable knowledge base. The AI agent understands relationships between videos, topics, tools, and concepts - enabling powerful queries like "Which videos talk about

OpenRouter Chat, Agent, Chat Trigger +8
AI & RAG

⚠️ Important: This workflow uses community nodes (JsonCut, Blotato) and requires a self-hosted n8n instance.

HTTP Request, OpenAI, Google Gemini +7