OpenAI Assistant with custom n8n tools
Automate intelligent conversations with an OpenAI Assistant, empowering it with custom n8n tools to retrieve and process information. This workflow connects a manual chat trigger to an OpenAI Assistant, which then leverages an n8n Execute Workflow Trigger node to call a custom tool for specific data retrieval. For instance, it can list countries by concatenating country names using a dedicated "Concatenate country names" node or fetch details about a specific country's capital, demonstrating how the AI can interact with structured data sources. This setup is ideal for businesses and developers needing to extend the capabilities of their AI assistants beyond their initial training data, allowing them to access real-time information or perform custom operations within n8n. It significantly reduces the development time and complexity of building sophisticated AI-powered applications by providing a flexible framework for integrating external data and logic, ultimately saving resources and enhancing the assistant's utility.
Workflow JSON
{"id": "aVTi7K9mFjK5OjAV", "meta": {"instanceId": "b3a8efae31a34c2224655b66499bee098263a56d266da574e8820468780b7ddd"}, "name": "OpenAI Assistant with custom n8n tools", "tags": [], "nodes": [{"id": "d15e7634-408b-43c5-a8d6-afcbc83479a9", "name": "On new manual Chat Message", "type": "@n8n/n8n-nodes-langchain.manualChatTrigger", "position": [600, 300], "parameters": {}, "typeVersion": 1.1}, {"id": "5d9ad043-adbe-4970-aa4e-b81dfcb9e255", "name": "OpenAI Assistant", "type": "@n8n/n8n-nodes-langchain.openAiAssistant", "position": [820, 300], "parameters": {"options": {}, "assistantId": "asst_BWy0154vMGMdrX7MjCYaYv6a"}, "credentials": {"openAiApi": {"id": "", "name": "[Your openAiApi]"}}, "typeVersion": 1}, {"id": "0c3aded2-886d-4c9f-8d6e-2729f12b6711", "name": "Execute Workflow Trigger", "type": "n8n-nodes-base.executeWorkflowTrigger", "position": [600, 960], "parameters": {}, "typeVersion": 1}, {"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\u00fbr\"\n },\n {\n \"country\": \"Latveria\",\n \"capital\": \"Doomstadt\"\n },\n {\n \"country\": \"Atlantis\",\n \"capital\": \"Poseidonis\"\n }\n]\n"}, "typeVersion": 2}, {"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}, {"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\u00fbr\"\n },\n {\n \"country\": \"Latveria\",\n \"capital\": \"Doomstadt\"\n },\n {\n \"country\": \"Atlantis\",\n \"capital\": \"Poseidonis\"\n }\n]\n"}, "typeVersion": 2}, {"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}, {"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}, {"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}, {"id": "bdf7c927-deb4-4a73-a015-43797c6cf816", "name": "Tool to call the workflow below", "type": "@n8n/n8n-nodes-langchain.toolWorkflow", "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}, {"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}, {"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}, {"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}, {"id": "01ab30c3-3951-4652-b706-72af1cad4f22", "name": "Tool: Get current date and time", "type": "@n8n/n8n-nodes-langchain.toolCode", "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}], "active": false, "pinData": {"Execute Workflow Trigger": [{"json": {"query": "list"}}]}, "settings": {"callerPolicy": "workflowsFromSameOwner", "executionOrder": "v0", "executionTimeout": -1, "saveManualExecutions": true}, "versionId": "c867ebb5-ceeb-45a7-ad29-7ee3f1102bed", "connections": {"Mapping data": {"main": [[{"node": "Concatenate country names", "type": "main", "index": 0}]]}, "Mapping data1": {"main": [[{"node": "Get the matching country's details", "type": "main", "index": 1}]]}, "List countries?": {"main": [[{"node": "Mapping data", "type": "main", "index": 0}], [{"node": "Get the matching country's details", "type": "main", "index": 0}]]}, "Execute Workflow Trigger": {"main": [[{"node": "List countries?", "type": "main", "index": 0}]]}, "Concatenate country names": {"main": [[{"node": "Return country list", "type": "main", "index": 0}]]}, "On new manual Chat Message": {"main": [[{"node": "OpenAI Assistant", "type": "main", "index": 0}]]}, "Tool to call the workflow below": {"ai_tool": [[{"node": "OpenAI Assistant", "type": "ai_tool", "index": 0}]]}, "Tool: Get current date and time": {"ai_tool": [[{"node": "OpenAI Assistant", "type": "ai_tool", "index": 0}]]}, "Get the matching country's details": {"main": [[{"node": "Return specific capital", "type": "main", "index": 0}]]}}}How to Import This Workflow
- 1Copy the workflow JSON above using the Copy Workflow JSON button.
- 2Open your n8n instance and go to Workflows.
- 3Click Import from JSON and paste the copied workflow.
Don't have an n8n instance? Start your free trial at n8nautomation.cloud
Related Templates
Text to Speech (OpenAI)
Converts text into natural-sounding speech using OpenAI's Text-to-Speech API. It sends your input text to OpenAI and receives an audio file in return. This is useful for creating audio versions of articles, generating voiceovers for videos, or providing accessibility features for web content. Quickly transform written content into engaging audio.
LangChain - Example - Code Node Example
Explore a basic LangChain agent that answers questions using a custom tool. This workflow connects n8n's AI nodes and custom code nodes to OpenAI for language model interactions. It's useful for developers building custom AI assistants or researchers experimenting with agentic workflows. This saves development time by providing a ready-to-use example of a LangChain agent.
AI-Powered Candidate Shortlisting Automation for ERPNext
Automate AI-powered candidate shortlisting for ERPNext job applications. This workflow connects ERPNext, Google Gemini, WhatsApp, and Outlook to process resumes, evaluate candidates, and communicate outcomes. Recruiters and HR departments can use this to efficiently screen applicants, automatically reject unqualified candidates, and send acceptance notifications. It significantly reduces manual review time and streamlines the hiring process.