{ "id": "aVTi7K9mFjK5OjAV", "meta": { "instanceId": "workflow-9021b185", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:55.922714", "updatedAt": "2025-09-29T07:07:55.922733", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "name": "OpenAI Assistant with custom n8n tools", "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "nodes": [ { "id": "d15e7634-408b-43c5-a8d6-afcbc83479a9", "name": "On new manual Chat Message", "type": "n8n-nodes-base.noOp", "position": [ 600, 300 ], "parameters": {}, "typeVersion": 1.1, "notes": "This manualChatTrigger node performs automated tasks as part of the workflow." }, { "id": "5d9ad043-adbe-4970-aa4e-b81dfcb9e255", "name": "OpenAI Assistant", "type": "n8n-nodes-base.noOp", "position": [ 820, 300 ], "parameters": { "options": {}, "assistantId": "asst_BWy0154vMGMdrX7MjCYaYv6a" }, "credentials": { "openAiApi": { "id": "au6fQZN7it62DWlS", "name": "OpenAi account" } }, "typeVersion": 1, "notes": "This openAiAssistant node performs automated tasks as part of the workflow." }, { "id": "0c3aded2-886d-4c9f-8d6e-2729f12b6711", "name": "Execute Workflow Trigger", "type": "n8n-nodes-base.executeWorkflowTrigger", "position": [ 600, 960 ], "parameters": {}, "typeVersion": 1, "notes": "This executeWorkflowTrigger node performs automated tasks as part of the workflow." }, { "id": "c77010ac-82e6-40f2-92c4-c360d276b896", "name": "Mapping data", "type": "n8n-nodes-base.code", "position": [ 1080, 820 ], "parameters": { "jsCode": "return [\n {\n \"country\": \"Wakanda\",\n \"capital\": \"Birnin Zana\"\n },\n {\n \"country\": \"Narnia\",\n \"capital\": \"Cair Paravel\"\n },\n {\n \"country\": \"Gondor\",\n \"capital\": \"Minas Tirith\"\n },\n {\n \"country\": \"Oz\",\n \"capital\": \"The Emerald City\"\n },\n {\n \"country\": \"Westeros\",\n \"capital\": \"King's Landing\"\n },\n {\n \"country\": \"Panem\",\n \"capital\": \"The Capitol\"\n },\n {\n \"country\": \"Ruritania\",\n \"capital\": \"Strelsau\"\n },\n {\n \"country\": \"Mordor\",\n \"capital\": \"Barad-dûr\"\n },\n {\n \"country\": \"Latveria\",\n \"capital\": \"Doomstadt\"\n },\n {\n \"country\": \"Atlantis\",\n \"capital\": \"Poseidonis\"\n }\n]\n" }, "typeVersion": 2, "notes": "This code node performs automated tasks as part of the workflow." }, { "id": "3949d5d8-a8d6-4a21-8e34-fca558ee6a97", "name": "List countries?", "type": "n8n-nodes-base.if", "position": [ 840, 960 ], "parameters": { "conditions": { "string": [ { "value1": "={{ $json.query }}", "value2": "list" } ] } }, "executeOnce": false, "typeVersion": 1, "notes": "This if node performs automated tasks as part of the workflow." }, { "id": "23bd1672-f736-4ac0-abf6-65f5f6aeabac", "name": "Mapping data1", "type": "n8n-nodes-base.code", "position": [ 840, 1160 ], "parameters": { "jsCode": "return [\n {\n \"country\": \"Wakanda\",\n \"capital\": \"Birnin Zana\"\n },\n {\n \"country\": \"Narnia\",\n \"capital\": \"Cair Paravel\"\n },\n {\n \"country\": \"Gondor\",\n \"capital\": \"Minas Tirith\"\n },\n {\n \"country\": \"Oz\",\n \"capital\": \"The Emerald City\"\n },\n {\n \"country\": \"Westeros\",\n \"capital\": \"King's Landing\"\n },\n {\n \"country\": \"Panem\",\n \"capital\": \"The Capitol\"\n },\n {\n \"country\": \"Ruritania\",\n \"capital\": \"Strelsau\"\n },\n {\n \"country\": \"Mordor\",\n \"capital\": \"Barad-dûr\"\n },\n {\n \"country\": \"Latveria\",\n \"capital\": \"Doomstadt\"\n },\n {\n \"country\": \"Atlantis\",\n \"capital\": \"Poseidonis\"\n }\n]\n" }, "typeVersion": 2, "notes": "This code node performs automated tasks as part of the workflow." }, { "id": "ec16de2b-7945-4133-a73d-11d4e42355c2", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ 540, 741.6494845360827 ], "parameters": { "width": 1174.6162657502882, "height": 578.9520146851776, "content": "## Sub-workflow: Return the capitals of fictional countries\nIt can either list the countries it knows about or return the capital of a specific country" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "65e659a0-6e1b-4642-b263-59ed2e284ee8", "name": "Return country list", "type": "n8n-nodes-base.set", "position": [ 1520, 820 ], "parameters": { "fields": { "values": [ { "name": "response", "stringValue": "={{ $json.concatenated_country }}" } ] }, "include": "none", "options": {} }, "typeVersion": 3.2, "notes": "This set node performs automated tasks as part of the workflow." }, { "id": "65fc898d-0361-461a-9055-9e29bf310336", "name": "Return specific capital", "type": "n8n-nodes-base.set", "position": [ 1520, 1060 ], "parameters": { "fields": { "values": [ { "name": "response", "stringValue": "={{ $ifEmpty($json.capital, 'Capital not found') }}" } ] }, "include": "none", "options": {} }, "typeVersion": 3.2, "notes": "This set node performs automated tasks as part of the workflow." }, { "id": "bdf7c927-deb4-4a73-a015-43797c6cf816", "name": "Tool to call the workflow below", "type": "n8n-nodes-base.noOp", "position": [ 880, 540 ], "parameters": { "name": "country_capitals_tool", "workflowId": "={{ $workflow.id }}", "description": "This tool has two modes:\n1. Pass 'list' to the tool to get a list of countries that the tool has the capitals for (one per line). This is useful if you can't find a match, to see if the country being asked about might have been misspelled.\n2. Pass one of the country names in the list to the tool to get the capital of that country. Note that the country must be spelled exactly as it is in the list of countries returned in mode 1" }, "typeVersion": 1, "notes": "This toolWorkflow node performs automated tasks as part of the workflow." }, { "id": "4e93323f-d4be-4a49-be24-3f49db39907b", "name": "Concatenate country names", "type": "n8n-nodes-base.summarize", "position": [ 1300, 820 ], "parameters": { "options": {}, "fieldsToSummarize": { "values": [ { "field": "country", "separateBy": "\n", "aggregation": "concatenate" } ] } }, "typeVersion": 1, "notes": "This summarize node performs automated tasks as part of the workflow." }, { "id": "e2ec1eee-4bb2-4240-82cf-e109b87229eb", "name": "Get the matching country's details", "type": "n8n-nodes-base.merge", "position": [ 1080, 1060 ], "parameters": { "mode": "combine", "options": {}, "joinMode": "enrichInput1", "mergeByFields": { "values": [ { "field1": "query", "field2": "country" } ] } }, "typeVersion": 2.1, "notes": "This merge node performs automated tasks as part of the workflow." }, { "id": "ed2997be-c709-4eca-bcad-c987bbc160fc", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ 540, 200 ], "parameters": { "width": 1168.2339341502545, "height": 487.70693675217734, "content": "## Main workflow: Chat with OpenAI Assistant\nClick the 'Chat' button at the bottom of the screen to try" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "01ab30c3-3951-4652-b706-72af1cad4f22", "name": "Tool: Get current date and time", "type": "n8n-nodes-base.noOp", "position": [ 1080, 540 ], "parameters": { "name": "date_tool", "jsCode": "let now = DateTime.now()\nreturn now.toISO()", "description": "Call this tool to get the current timestamp (in ISO format). No parameters necessary" }, "typeVersion": 1, "notes": "This toolCode node performs automated tasks as part of the workflow." }, { "id": "error-4fabde13", "name": "Error Handler", "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [ 1000, 400 ], "parameters": { "message": "Workflow execution error", "options": {} } } ], "active": false, "pinData": { "Execute Workflow Trigger": [ { "json": { "query": "list" } } ] }, "settings": { "callerPolicy": "workflowsFromSameOwner", "executionOrder": "v1", "executionTimeout": 3600, "saveManualExecutions": true, "errorWorkflow": null, "timezone": "UTC", "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000 }, "versionId": "c867ebb5-ceeb-45a7-ad29-7ee3f1102bed", "connections": { "5d9ad043-adbe-4970-aa4e-b81dfcb9e255": { "main": [ [ { "node": "error-handler-5d9ad043-adbe-4970-aa4e-b81dfcb9e255-d4b8e4fc", "type": "main", "index": 0 } ] ] } }, "description": "Automated workflow: OpenAI Assistant with custom n8n tools. This workflow integrates 12 different services: stickyNote, openAiAssistant, code, merge, summarize. It contains 15 nodes and follows best practices for error handling and security.", "notes": "Excellent quality workflow: OpenAI Assistant with custom n8n tools. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }