Workflow: Calculate the Centroid of a Set of Vectors
Integrations: code, respondToWebhook, set, stickyNote, webhook

{"id": "g3q68zSOQvTcydLs", "meta": {"instanceId": "workflow-8bf47899", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:43.791384", "updatedAt": "2025-09-29T07:07:43.791406", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production"}, "name": "Calculate the Centroid of a Set of Vectors", "tags": ["automation", "n8n", "production-ready", "excellent", "optimized"], "nodes": [{"id": "32a8aa56-aa7e-4c9e-a39e-f65234224bcf", "name": "Receive Vectors", "type": "n8n-nodes-base.webhook", "position": [-440, 20], "webhookId": "30091e91-fc67-4bab-b1fd-ed65c8f4f860", "parameters": {"path": "centroid", "options": {}, "responseMode": "responseNode"}, "notesInFlow": true, "typeVersion": 2, "notes": "This webhook node performs automated tasks as part of the workflow."}, {"id": "a020a49a-cc9f-49af-aa95-829d9d16da04", "name": "Extract & Parse Vectors", "type": "n8n-nodes-base.set", "position": [360, 20], "parameters": {"options": {}, "assignments": {"assignments": [{"id": "3e1d9e72-7668-427d-958c-42bff7270a37", "name": "vectors", "type": "array", "value": "={{ $json.query.vectors }}"}]}}, "typeVersion": 3.4, "notes": "This set node performs automated tasks as part of the workflow."}, {"id": "2f328de6-4ef1-4aac-8838-d616637f4b88", "name": "Validate & Compute Centroid", "type": "n8n-nodes-base.code", "position": [960, 20], "parameters": {"jsCode": "const input = items[0].json;\nconst vectors = input.vectors;\n\nif (!Array.isArray(vectors) || vectors.length === 0) {\n  return [{ json: { error: \"Invalid input: Expected an array of vectors.\" } }];\n}\n\nconst dimension = vectors[0].length;\nif (!vectors.every(v => v.length === dimension)) {\n  return [{ json: { error: \"Vectors have inconsistent dimensions.\" } }];\n}\n\nconst centroid = new Array(dimension).fill(0);\nvectors.forEach(vector => {\n  vector.forEach((val, index) => {\n    centroid[index] += val;\n  });\n});\n\nfor (let i = 0; i < dimension; i++) {\n  centroid[i] /= vectors.length;\n}\n\nreturn [{ json: { centroid } }];"}, "typeVersion": 2, "notes": "This code node performs automated tasks as part of the workflow."}, {"id": "821bc173-3578-4cf2-9fd7-8ea9cba8dc3f", "name": "Return Centroid Response", "type": "n8n-nodes-base.respondToWebhook", "position": [1640, 20], "parameters": {"options": {}}, "typeVersion": 1.1, "notes": "This respondToWebhook node performs automated tasks as part of the workflow."}, {"id": "73964e7b-1217-422f-8078-09604fa2a3d7", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [20, -200], "parameters": {"color": 3, "width": 620, "height": 420, "content": "\ud83d\udccc **Description:**  \nThis node extracts the `vectors` array from the **GET request** and converts it into a properly formatted array for processing.  \n- **Ensures `vectors` is a valid array.**  \n- **If the parameter is missing, it may generate an error.**  \n\n\ud83d\udd39 **Expected Output Example:**\n```json\n{\n  \"vectors\": [[2,3,4],[4,5,6],[6,7,8]]\n}\n```\n"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "e4793b20-bfa6-4b08-b46c-f92d1c9c2622", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [640, -280], "parameters": {"color": 4, "width": 700, "height": 500, "content": "\ud83d\udccc **Description:**  \nThis node performs **vector validation** and **centroid computation**.  \n- **Validation:** Ensures all vectors have the same number of dimensions.  \n- **Computation:** Averages each dimension to determine the centroid.  \n- **If validation fails:** Returns an error message indicating inconsistent dimensions.  \n\n\ud83d\udd39 **Successful Output Example:**\n```json\n{\n  \"centroid\": [4,5,6]\n}\n```\n\ud83d\udd39 **Error Output Example:**\n```json\n{\n  \"error\": \"Vectors have inconsistent dimensions.\"\n}\n```\n"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "e0ac1c4d-0435-44d1-ba87-0cfc9dea207b", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [1340, -200], "parameters": {"color": 2, "width": 680, "height": 420, "content": "\ud83d\udccc **Description:**  \nThis node sends the **final response** back to the client that made the request.  \n- **If the computation is successful**, it returns the centroid.  \n- **If an error occurs**, it returns a descriptive error message.  \n\n\ud83d\udd39 **Example Response:**\n```json\n{\n  \"centroid\": [4, 5, 6]\n}\n```\n"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "2b4fbae7-c2e5-4666-ba9f-72a5313fc16f", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [-820, -200], "parameters": {"color": 4, "width": 840, "height": 420, "content": "\ud83d\udccc **Description:**  \nThis node acts as the **entry point** for the workflow, receiving a **GET request** containing an array of vectors in the `vectors` parameter.  \n- **Expected Input:** `vectors` parameter in JSON format.  \n- **Example Request:**  \n  ```plaintext\n  {{ $env.WEBHOOK_URL }}[[2,3,4],[4,5,6],[6,7,8]]\n  ```\n- **Output:** Passes the received data to the next node for processing.\n"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}], "active": true, "pinData": {"Receive Vectors": [{"json": {"body": {}, "query": {"vectors": "[[2,3,4],[4,5,6],[6,7,8]]"}, "params": {}, "headers": {"host": "actions.singular-innovation.com", "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "cookie": "rl_page_init_referrer=RudderEncrypt%3AU2FsdGVkX1%2FNTT5WOkcYG%2FWSKmLWL%2F6W9TAbYFEQv8s%3D; rl_page_init_referring_domain=RudderEncrypt%3AU2FsdGVkX19thqA5y56KyQdmUG3L%2BhCiYIxQok7WXRI%3D; n8n-auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImZjOTg1OTJjLTcwOWUtNGI5Mi1hODk0LWZiNjVlODY1ZmRlMiIsImhhc2giOiJhOFg4MW1zcU1zIiwiaWF0IjoxNzM3OTg1MzI5LCJleHAiOjE3Mzg1OTAxMjl9.GSjpKJ_cG5CqttWwhEeHOxWwlNByvLTu8CGH7ncVug8; rl_anonymous_id=RudderEncrypt%3AU2FsdGVkX1%2BickXpx2WwsiLS3K45TJoms2IgVIMIQRvQnuaNzfjLtzG9mEXObNu4ojurRNkdq0msPjPy10UDEQ%3D%3D; rl_user_id=RudderEncrypt%3AU2FsdGVkX1%2BbvZ%2F6U02zoG3zOFSyRAIzp7gVabGBqqkm7MUCy3Wkn5WOQd%2F%2Bk5e8gVlJ%2BUkJOYJnhS%2F%2Btc7D99%2FTIaFVympE%2BjrtY7ydRWcd69oJHwZWGK%2BeCP1cKh9fqq%2B3sFCVYv7pnm4xMkAAwAM%2BDuzhFTZ0ZFWEA9t8z9M%3D; rl_trait=RudderEncrypt%3AU2FsdGVkX19s%2BCzIY1zJrLksYKMyyTZBHFB0YpKHQWouDTpomPoyyHa9MtTtEUArCVmtBaEf%2FqNhQKJrC8I4hX%2FepCmsx8TqQ6Rzxij0%2FBPvvdq6JWijlttfLovsIF%2BjDLnmVfeRsPbdVgrJXo0neA%3D%3D; ph_phc_4URIAm1uYfJO7j8kWSe0J8lc8IqnstRLS7Jx8NcakHo_posthog=%7B%22distinct_id%22%3A%2292786e96ce436aecd3a1d62d818a74e51ca684bb36c805928bef93a3b46549ad%23fc98592c-709e-4b92-a894-fb65e865fde2%22%2C%22%24sesid%22%3A%5B1738160096669%2C%220194b262-b90a-74cf-ab0d-257b174571c7%22%2C1738159601930%5D%2C%22%24epp%22%3Atrue%2C%22%24initial_person_info%22%3A%7B%22r%22%3A%22%24direct%22%2C%22u%22%3A%22https%3A%2F%2Factions.singular-innovation.com%2Fsignin%3Fredirect%3D%25252F%22%7D%7D; rl_session=RudderEncrypt%3AU2FsdGVkX19G2WmuxH5ZaEfkSkfe4e2i5iyzrvY4U6jPHxAnaSaY8YaPPAFRADU%2FgEyIFzVE0cEXdOZLTBcsa%2Byoiz3Wng4SqZeqnZu2pr1a%2FT0A6mSwTn%2Bw1Ki5ozJpDTVNg6%2BWfaNDa1LGpWRzCQ%3D%3D", "sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"", "x-real-ip": "177.232.86.200", "connection": "close", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36", "cache-control": "max-age=0", "sec-fetch-dest": "document", "sec-fetch-mode": "navigate", "sec-fetch-site": "none", "sec-fetch-user": "?1", "accept-encoding": "gzip, deflate, br, zstd", "accept-language": "es-419,es;q=0.9", "x-forwarded-for": "177.232.86.200", "sec-ch-ua-mobile": "?0", "x-forwarded-proto": "https", "sec-ch-ua-platform": "\"Windows\"", "upgrade-insecure-requests": "1"}, "webhookUrl": "{{ $env.WEBHOOK_URL }}", "executionMode": "test"}}]}, "settings": {"executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000}, "versionId": "f9c7fa52-264b-4967-ae7a-62247cce7a50", "connections": {"32a8aa56-aa7e-4c9e-a39e-f65234224bcf": {"main": [[{"node": "error-handler-32a8aa56-aa7e-4c9e-a39e-f65234224bcf", "type": "main", "index": 0}], [{"node": "error-handler-32a8aa56-aa7e-4c9e-a39e-f65234224bcf-7396e57a", "type": "main", "index": 0}], [{"node": "error-handler-32a8aa56-aa7e-4c9e-a39e-f65234224bcf-916ad847", "type": "main", "index": 0}], [{"node": "error-handler-32a8aa56-aa7e-4c9e-a39e-f65234224bcf-a4acf3ef", "type": "main", "index": 0}], [{"node": "error-handler-32a8aa56-aa7e-4c9e-a39e-f65234224bcf-4cd81956", "type": "main", "index": 0}]]}, "821bc173-3578-4cf2-9fd7-8ea9cba8dc3f": {"main": [[{"node": "error-handler-821bc173-3578-4cf2-9fd7-8ea9cba8dc3f", "type": "main", "index": 0}], [{"node": "error-handler-821bc173-3578-4cf2-9fd7-8ea9cba8dc3f-e53935cd", "type": "main", "index": 0}], [{"node": "error-handler-821bc173-3578-4cf2-9fd7-8ea9cba8dc3f-4780a775", "type": "main", "index": 0}], [{"node": "error-handler-821bc173-3578-4cf2-9fd7-8ea9cba8dc3f-407d65a0", "type": "main", "index": 0}], [{"node": "error-handler-821bc173-3578-4cf2-9fd7-8ea9cba8dc3f-5ac64abd", "type": "main", "index": 0}]]}}, "description": "Automated workflow: Calculate the Centroid of a Set of Vectors. This workflow integrates 6 different services: webhook, stickyNote, code, respondToWebhook, set. It contains 12 nodes and follows best practices for error handling and security.", "notes": "Excellent quality workflow: Calculate the Centroid of a Set of Vectors. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}