AutomationFlowsAI & RAG › Prompt Qa Lab Claude

Prompt Qa Lab Claude

prompt-qa-lab-claude. Uses lmChatAnthropic, slack. Webhook trigger; 7 nodes.

Webhook trigger★★★★☆ complexityAI-powered7 nodesAnthropic ChatSlack
AI & RAG Trigger: Webhook Nodes: 7 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Anthropic Chat → Slack 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": "prompt-qa-lab-claude",
  "nodes": [
    {
      "id": "f6a7b8c9-0001-4000-8000-000000000001",
      "name": "Webhook Trigger",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        300
      ],
      "parameters": {
        "httpMethod": "POST",
        "path": "prompt-qa-lab",
        "responseMode": "onReceived",
        "options": {}
      }
    },
    {
      "id": "f6a7b8c9-0002-4000-8000-000000000002",
      "name": "Run Prompt: Claude Sonnet",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1,
      "position": [
        220,
        160
      ],
      "parameters": {
        "model": "claude-3-5-sonnet-20241022",
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "={{ $json.system_prompt }}"
            },
            {
              "role": "user",
              "content": "={{ $json.user_input }}"
            }
          ]
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "id": "f6a7b8c9-0003-4000-8000-000000000003",
      "name": "Run Prompt: Claude Haiku",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1,
      "position": [
        220,
        440
      ],
      "parameters": {
        "model": "claude-haiku-4-5-20251001",
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "={{ $('Webhook Trigger').item.json.system_prompt }}"
            },
            {
              "role": "user",
              "content": "={{ $('Webhook Trigger').item.json.user_input }}"
            }
          ]
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "id": "f6a7b8c9-0004-4000-8000-000000000004",
      "name": "Collect Outputs",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [
        440,
        300
      ],
      "parameters": {
        "mode": "manual",
        "fields": {
          "values": [
            {
              "name": "prompt_label",
              "type": "expression",
              "value": "={{ $('Webhook Trigger').item.json.prompt_label }}"
            },
            {
              "name": "system_prompt",
              "type": "expression",
              "value": "={{ $('Webhook Trigger').item.json.system_prompt }}"
            },
            {
              "name": "user_input",
              "type": "expression",
              "value": "={{ $('Webhook Trigger').item.json.user_input }}"
            },
            {
              "name": "rubric",
              "type": "expression",
              "value": "={{ $('Webhook Trigger').item.json.rubric }}"
            },
            {
              "name": "output_sonnet",
              "type": "expression",
              "value": "={{ $('Run Prompt: Claude Sonnet').item.json.message.content[0].text }}"
            },
            {
              "name": "output_haiku",
              "type": "expression",
              "value": "={{ $('Run Prompt: Claude Haiku').item.json.message.content[0].text }}"
            }
          ]
        }
      }
    },
    {
      "id": "f6a7b8c9-0005-4000-8000-000000000005",
      "name": "Score Outputs",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1,
      "position": [
        660,
        300
      ],
      "parameters": {
        "model": "claude-3-5-sonnet-20241022",
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are a prompt quality evaluator. Score two model outputs against a rubric. Return ONLY valid JSON:\n{\n  \"scores\": {\n    \"claude_sonnet\": {\"score\": 8, \"rationale\": \"one sentence\"},\n    \"claude_haiku\": {\"score\": 6, \"rationale\": \"one sentence\"}\n  },\n  \"winner\": \"claude_sonnet\",\n  \"recommendation\": \"one sentence on which model to use and why\"\n}"
            },
            {
              "role": "user",
              "content": "Rubric: {{ $json.rubric }}\n\nOutput A (claude-sonnet):\n{{ $json.output_sonnet }}\n\nOutput B (claude-haiku):\n{{ $json.output_haiku }}"
            }
          ]
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "id": "f6a7b8c9-0006-4000-8000-000000000006",
      "name": "Build Report",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3,
      "position": [
        880,
        300
      ],
      "parameters": {
        "mode": "manual",
        "fields": {
          "values": [
            {
              "name": "report",
              "type": "expression",
              "value": "={{ JSON.parse($json.message.content[0].text) }}"
            },
            {
              "name": "prompt_label",
              "type": "expression",
              "value": "={{ $('Collect Outputs').item.json.prompt_label }}"
            },
            {
              "name": "output_sonnet",
              "type": "expression",
              "value": "={{ $('Collect Outputs').item.json.output_sonnet }}"
            },
            {
              "name": "output_haiku",
              "type": "expression",
              "value": "={{ $('Collect Outputs').item.json.output_haiku }}"
            }
          ]
        }
      }
    },
    {
      "id": "f6a7b8c9-0007-4000-8000-000000000007",
      "name": "Post Results to Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 2,
      "position": [
        1100,
        300
      ],
      "parameters": {
        "operation": "post",
        "select": "channel",
        "channelId": {
          "value": "#prompt-lab"
        },
        "text": "Prompt QA Results: {{ $json.prompt_label }}\n\nClaude Sonnet: {{ $json.report.scores.claude_sonnet.score }}/10 - {{ $json.report.scores.claude_sonnet.rationale }}\nClaude Haiku: {{ $json.report.scores.claude_haiku.score }}/10 - {{ $json.report.scores.claude_haiku.rationale }}\n\nWinner: {{ $json.report.winner }}\nRecommendation: {{ $json.report.recommendation }}",
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Run Prompt: Claude Sonnet",
            "type": "main",
            "index": 0
          },
          {
            "node": "Run Prompt: Claude Haiku",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run Prompt: Claude Sonnet": {
      "main": [
        [
          {
            "node": "Collect Outputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run Prompt: Claude Haiku": {
      "main": [
        [
          {
            "node": "Collect Outputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Collect Outputs": {
      "main": [
        [
          {
            "node": "Score Outputs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Score Outputs": {
      "main": [
        [
          {
            "node": "Build Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Report": {
      "main": [
        [
          {
            "node": "Post Results to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [],
  "triggerCount": 1,
  "updatedAt": "2026-05-17T00:00:00.000Z",
  "versionId": "v1"
}

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

prompt-qa-lab-claude. Uses lmChatAnthropic, slack. Webhook trigger; 7 nodes.

Source: https://github.com/sondersos/n8n-workflows/blob/main/workflows/05-prompt-qa-lab/prompt-qa-lab-claude.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

cold-outbound-engine-claude. Uses httpRequest, lmChatAnthropic, airtable, slack. Webhook trigger; 10 nodes.

HTTP Request, Anthropic Chat, Airtable +1
AI & RAG

meeting-intelligence-claude. Uses lmChatAnthropic, notion, slack. Webhook trigger; 6 nodes.

Anthropic Chat, Notion, Slack
AI & RAG

proposal-assistant-claude. Uses lmChatAnthropic, googleDrive, slack. Webhook trigger; 5 nodes.

Anthropic Chat, Google Drive, Slack
AI & RAG

strategy-generator-claude. Uses lmChatAnthropic, notion, slack. Webhook trigger; 5 nodes.

Anthropic Chat, Notion, Slack
AI & RAG

GitHub PR Opened → AI Review Summary → Slack. Uses lmChatAnthropic, slack. Webhook trigger; 4 nodes.

Anthropic Chat, Slack