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 →
{
"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.
googlePalmApiopenRouterApi
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This is the core AI agent used for queryverify.com.
n8n-ejentum-harness-integration-patterns. Uses lmChatOpenRouter, memoryBufferWindow, chatTrigger, mcpClientTool. Chat trigger; 37 nodes.
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.
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
⚠️ Important: This workflow uses community nodes (JsonCut, Blotato) and requires a self-hosted n8n instance.