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 →
{
"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"
}
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .
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
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.
📡 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