AutomationFlowsWeb Scraping › AI Workflow Orchestrator - Mvp

AI Workflow Orchestrator - Mvp

AI Workflow Orchestrator - MVP. Uses httpRequest, github. Webhook trigger; 10 nodes.

Webhook trigger★★★★☆ complexity10 nodesHTTP RequestGitHub
Web Scraping Trigger: Webhook Nodes: 10 Complexity: ★★★★☆ Added:

This workflow follows the GitHub → HTTP Request 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": "AI Workflow Orchestrator - MVP",
  "nodes": [
    {
      "parameters": {
        "path": "github-webhook",
        "options": {}
      },
      "id": "github-webhook-trigger",
      "name": "GitHub Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.action }}",
              "operation": "equals",
              "value2": "labeled"
            },
            {
              "value1": "={{ $json.label.name }}",
              "operation": "equals",
              "value2": "ai:needs-research"
            }
          ]
        }
      },
      "id": "filter-ai-label",
      "name": "Filter: AI Label Added",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "// Extract issue data\nconst issue = $input.item.json.issue;\nconst repository = $input.item.json.repository;\n\nreturn {\n  json: {\n    workflow_id: Date.now().toString(),\n    issue_number: issue.number,\n    issue_title: issue.title,\n    issue_body: issue.body,\n    issue_author: issue.user.login,\n    issue_labels: issue.labels.map(l => l.name),\n    repository_full_name: repository.full_name,\n    repository_owner: repository.owner.login,\n    repository_name: repository.name,\n    timestamp: new Date().toISOString(),\n    state: 'initialized'\n  }\n};"
      },
      "id": "extract-issue-data",
      "name": "Extract Issue Data",
      "type": "n8n-nodes-base.code",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "url": "http://vllm-qwen-coder.ai-workflows.svc.cluster.local:8000/v1/chat/completions",
        "method": "POST",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "qwen-coder-32b"
            },
            {
              "name": "messages",
              "value": "={{ [{\"role\": \"system\", \"content\": \"You are an expert Go software engineer analyzing GitHub issues. Provide 2-3 solution approaches with pros/cons and recommend the best approach.\"}, {\"role\": \"user\", \"content\": `Issue: ${$json.issue_title}\\n\\nDescription: ${$json.issue_body}`}] }}"
            },
            {
              "name": "temperature",
              "value": "0.3"
            },
            {
              "name": "max_tokens",
              "value": "2000"
            }
          ]
        },
        "options": {}
      },
      "id": "research-analyst-agent",
      "name": "Research Analyst Agent (vLLM)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 3,
      "position": [
        850,
        300
      ]
    },
    {
      "parameters": {
        "functionCode": "// Parse LLM response\nconst response = $input.item.json.choices[0].message.content;\n\n// Create proposal content\nconst proposal = `# Proposal for Issue #${$input.item.json.issue_number}\n\n## Problem Statement\n${$input.item.json.issue_title}\n\n${$input.item.json.issue_body}\n\n## Analysis\n${response}\n\n## Next Steps\n1. Review and approve this proposal\n2. Comment \\`/ai approve\\` to proceed with implementation\n3. Comment \\`/ai reject \"reason\"\\` to cancel\n\n---\n*Generated by AI Research Analyst*\n*Workflow ID: ${$input.item.json.workflow_id}*\n`;\n\nreturn {\n  json: {\n    ...$input.item.json,\n    research_summary: response,\n    proposal_content: proposal,\n    state: 'research_completed'\n  }\n};"
      },
      "id": "create-proposal",
      "name": "Create Proposal",
      "type": "n8n-nodes-base.code",
      "typeVersion": 1,
      "position": [
        1050,
        300
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "owner": "={{ $json.repository_owner }}",
        "repository": "={{ $json.repository_name }}",
        "title": "=[AI] Proposal for #{{ $json.issue_number }}: {{ $json.issue_title }}",
        "body": "={{ $json.proposal_content }}",
        "branch": "=ai/issue-{{ $json.issue_number }}-proposal",
        "labels": [
          "ai:proposal-ready",
          "proposal"
        ],
        "assignees": [
          "dahendel"
        ]
      },
      "id": "create-proposal-pr",
      "name": "Create Proposal PR (GitHub)",
      "type": "n8n-nodes-base.github",
      "typeVersion": 1,
      "position": [
        1250,
        300
      ]
    },
    {
      "parameters": {
        "url": "={{ $env.SLACK_WEBHOOK_URL }}",
        "method": "POST",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "channel",
              "value": "#alerts"
            },
            {
              "name": "text",
              "value": "=:robot_face: *AI Workflow: Proposal Ready*\\n\\n*Issue:* #{{ $json.issue_number }} - {{ $json.issue_title }}\\n*Repository:* {{ $json.repository_full_name }}\\n*PR:* {{ $json.html_url }}\\n*Action Required:* Review and approve proposal"
            },
            {
              "name": "username",
              "value": "AI Workflows Bot"
            }
          ]
        }
      },
      "id": "notify-slack-proposal",
      "name": "Notify Slack (#alerts)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 3,
      "position": [
        1450,
        300
      ]
    },
    {
      "parameters": {
        "authentication": "oAuth2",
        "owner": "={{ $json.repository_owner }}",
        "repository": "={{ $json.repository_name }}",
        "issueNumber": "={{ $json.issue_number }}",
        "labels": {
          "labels": [
            "ai:research-in-progress",
            "ai:proposal-ready"
          ]
        },
        "labelsUi": {
          "labelValues": [
            {
              "name": "ai:research-in-progress"
            },
            {
              "name": "ai:proposal-ready"
            }
          ]
        }
      },
      "id": "update-issue-labels",
      "name": "Update Issue Labels",
      "type": "n8n-nodes-base.github",
      "typeVersion": 1,
      "position": [
        1250,
        500
      ]
    },
    {
      "parameters": {
        "url": "http://influxdb.ai-workflows.svc.cluster.local:8086/api/v2/write?org=ai-workflows&bucket=metrics",
        "method": "POST",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Token {{ $env.INFLUXDB_TOKEN }}"
            },
            {
              "name": "Content-Type",
              "value": "text/plain"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "body",
              "value": "=workflow_started,repository={{ $json.repository_name }},issue_number={{ $json.issue_number }} value=1"
            }
          ]
        }
      },
      "id": "log-metrics-influxdb",
      "name": "Log Metrics (InfluxDB)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 3,
      "position": [
        850,
        500
      ]
    },
    {
      "parameters": {
        "url": "={{ $env.SLACK_WEBHOOK_URL }}",
        "method": "POST",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "channel",
              "value": "#alerts"
            },
            {
              "name": "text",
              "value": "=:x: *AI Workflow: Error*\\n\\n*Issue:* #{{ $json.issue_number }} - {{ $json.issue_title }}\\n*Error:* {{ $json.error }}\\n*State:* {{ $json.state }}"
            },
            {
              "name": "username",
              "value": "AI Workflows Bot"
            }
          ]
        }
      },
      "id": "notify-slack-error",
      "name": "Notify Slack (Error)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 3,
      "position": [
        1050,
        500
      ]
    }
  ],
  "connections": {
    "GitHub Webhook": {
      "main": [
        [
          {
            "node": "Filter: AI Label Added",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter: AI Label Added": {
      "main": [
        [
          {
            "node": "Extract Issue Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Issue Data": {
      "main": [
        [
          {
            "node": "Research Analyst Agent (vLLM)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Log Metrics (InfluxDB)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Research Analyst Agent (vLLM)": {
      "main": [
        [
          {
            "node": "Create Proposal",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Proposal": {
      "main": [
        [
          {
            "node": "Create Proposal PR (GitHub)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Proposal PR (GitHub)": {
      "main": [
        [
          {
            "node": "Notify Slack (#alerts)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Update Issue Labels",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": "notify-slack-error"
  },
  "staticData": null,
  "tags": [
    {
      "name": "ai-workflows",
      "id": "1"
    },
    {
      "name": "mvp",
      "id": "2"
    }
  ],
  "versionId": "1.0.0-mvp"
}
Pro

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

About this workflow

AI Workflow Orchestrator - MVP. Uses httpRequest, github. Webhook trigger; 10 nodes.

Source: https://github.com/axyzlabs/workflows-example/blob/8e15ed6c3f9927b105f3677be614e75753c1292e/n8n-workflows/orchestrator-workflow.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

This n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di

n8n, Execute Workflow Trigger, HTTP Request +1
Web Scraping

This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .

HTTP Request, Ssh
Web Scraping

This workflow acts as a central API gateway for all technical indicator agents in the Binance Spot Market Quant AI system. It listens for incoming webhook requests and dynamically routes them to the c

HTTP Request
Web Scraping

Sign PDF documents with legally-compliant digital signatures using X.509 certificates. Supports multiple PAdES signature levels (B, T, LT, LTA) with optional visible stamps.

Execute Command, HTTP Request, Read Write File +1
Web Scraping

📡 This workflow serves as the central Alpha Vantage API fetcher for Tesla trading indicators, delivering cleaned 20-point JSON outputs for three timeframes: , , and . It is required by the following a

HTTP Request