AutomationFlowsAI & RAG › OpenAI Assistant with Custom n8n Tools Workflow

OpenAI Assistant with Custom n8n Tools Workflow

Original n8n title: Openai Assistant with Custom N8n Tools

OpenAI Assistant with custom n8n tools. Uses manualChatTrigger, openAiAssistant, executeWorkflowTrigger, stickyNote. Chat trigger; 14 nodes.

Chat trigger trigger★★★★☆ complexityAI-powered14 nodesManual Chat TriggerOpen Ai AssistantExecute Workflow TriggerTool WorkflowTool Code
AI & RAG Trigger: Chat trigger Nodes: 14 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Execute Workflow Trigger → Toolworkflow 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
{
  "id": "aVTi7K9mFjK5OjAV",
  "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": {
          "name": "<your credential>"
        }
      },
      "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,
  "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
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

How this works

This workflow enables seamless interaction with an OpenAI Assistant that leverages custom n8n tools to handle complex queries dynamically, saving you time on repetitive tasks by automating intelligent responses and actions. It's ideal for developers and automation enthusiasts building AI-driven chatbots or assistants that need to execute specific functions, such as listing countries based on user input. The key step involves the OpenAI Assistant node processing the chat message from the manualChatTrigger, then invoking tools like executeWorkflowTrigger to run tailored sub-workflows for accurate, context-aware outputs.

Use this workflow when creating interactive AI agents that require on-demand tool execution, like querying databases or performing calculations within a chat interface, especially if you're already using OpenAI integrations. Avoid it for simple, non-AI chat responses or high-volume production environments without scaling the 14-node chain. Common variations include swapping the country-listing tool for custom integrations like weather APIs or data lookups to fit diverse automation needs.

About this workflow

OpenAI Assistant with custom n8n tools. Uses manualChatTrigger, openAiAssistant, executeWorkflowTrigger, stickyNote. Chat trigger; 14 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

Airtable AI Agent. Uses lmChatOpenAi, agent, toolWorkflow, toolCode. Chat trigger; 42 nodes.

OpenAI Chat, Agent, Tool Workflow +6
AI & RAG

Ai Agent To Chat With Airtable And Analyze Data. Uses lmChatOpenAi, agent, stickyNote, memoryBufferWindow. Chat trigger; 41 nodes.

OpenAI Chat, Agent, Memory Buffer Window +6
AI & RAG

I prepared a detailed guide that shows the entire process of building an AI agent that integrates with Airtable data in n8n. This template covers everything from data preparation to advanced configura

OpenAI Chat, Agent, Memory Buffer Window +6
AI & RAG

Example workflow pass page content to LLM. Uses manualChatTrigger, lmChatOpenAi, httpRequest, executeWorkflowTrigger. Chat trigger; 24 nodes.

Manual Chat Trigger, OpenAI Chat, HTTP Request +3
AI & RAG

Agent with custom HTTP Request. Uses manualChatTrigger, lmChatOpenAi, httpRequest, executeWorkflowTrigger. Chat trigger; 20 nodes.

Manual Chat Trigger, OpenAI Chat, HTTP Request +3